summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/sync-github-releases.yaml1
-rw-r--r--.gitignore2
-rw-r--r--erts/doc/src/erl_cmd.xml9
-rw-r--r--erts/emulator/beam/erl_bif_re.c7
-rw-r--r--erts/emulator/beam/erl_binary.h32
-rw-r--r--erts/emulator/beam/erl_db_util.c243
-rw-r--r--erts/emulator/beam/erl_gc.c15
-rw-r--r--erts/emulator/beam/erl_map.c38
-rw-r--r--erts/emulator/beam/erl_map.h1
-rw-r--r--erts/emulator/beam/erl_message.c8
-rw-r--r--erts/emulator/beam/erl_nif.c2
-rw-r--r--erts/emulator/beam/erl_process.c9
-rw-r--r--erts/emulator/beam/erl_trace.c3
-rw-r--r--erts/emulator/beam/external.c8
-rw-r--r--erts/emulator/beam/global.h17
-rw-r--r--erts/emulator/beam/module.c1
-rw-r--r--erts/emulator/internal_doc/AutomaticYieldingOfCCode.md161
-rw-r--r--erts/emulator/internal_doc/BeamAsm.md5
-rw-r--r--erts/emulator/test/binary_SUITE.erl16
-rw-r--r--erts/emulator/test/dirty_nif_SUITE.erl29
-rw-r--r--erts/emulator/test/exception_SUITE.erl13
-rw-r--r--erts/emulator/test/gc_SUITE.erl33
-rw-r--r--erts/emulator/test/match_spec_SUITE.erl46
-rw-r--r--erts/emulator/valgrind/suppress.patched.3.6.02
-rw-r--r--erts/emulator/valgrind/suppress.standard2
-rw-r--r--erts/lib_src/yielding_c_fun/README.md11
-rw-r--r--lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl122
-rw-r--r--lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl8
-rw-r--r--lib/crypto/c_src/crypto.c1
-rw-r--r--lib/crypto/c_src/engine.c49
-rw-r--r--lib/crypto/src/crypto.erl27
-rw-r--r--lib/crypto/test/engine_SUITE.erl33
-rw-r--r--lib/debugger/src/dbg_ieval.erl106
-rw-r--r--lib/debugger/src/dbg_iload.erl904
-rw-r--r--lib/debugger/src/dbg_iserver.erl8
-rw-r--r--lib/debugger/src/dbg_wx_code.erl4
-rw-r--r--lib/debugger/src/dbg_wx_mon.erl2
-rw-r--r--lib/debugger/src/dbg_wx_trace.erl41
-rw-r--r--lib/debugger/src/dbg_wx_trace_win.erl122
-rw-r--r--lib/debugger/src/dbg_wx_win.erl4
-rw-r--r--lib/debugger/src/debugger.app.src4
-rw-r--r--lib/debugger/test/record_SUITE.erl44
-rw-r--r--lib/dialyzer/src/erl_types.erl82
-rw-r--r--lib/dialyzer/test/erl_types_SUITE.erl120
-rw-r--r--lib/erl_docgen/src/docgen_xml_to_chunk.erl19
-rw-r--r--lib/kernel/doc/src/file.xml7
-rw-r--r--lib/kernel/src/code.erl2
-rw-r--r--lib/kernel/src/erl_erts_errors.erl22
-rw-r--r--lib/kernel/src/gen_tcp_socket.erl66
-rw-r--r--lib/kernel/src/gen_udp_socket.erl35
-rw-r--r--lib/kernel/src/inet_dns.erl430
-rw-r--r--lib/kernel/src/inet_parse.erl13
-rw-r--r--lib/kernel/src/socket.erl2
-rw-r--r--lib/kernel/test/inet_SUITE.erl50
-rw-r--r--lib/megaco/doc/src/megaco_tcp.xml38
-rw-r--r--lib/megaco/doc/src/megaco_udp.xml34
-rw-r--r--lib/megaco/src/tcp/megaco_tcp.erl93
-rw-r--r--lib/megaco/src/tcp/megaco_tcp.hrl9
-rw-r--r--lib/megaco/src/tcp/megaco_tcp_accept.erl22
-rw-r--r--lib/megaco/src/udp/megaco_udp.erl44
-rw-r--r--lib/megaco/src/udp/megaco_udp.hrl5
-rw-r--r--lib/megaco/src/udp/megaco_udp_server.erl31
-rw-r--r--lib/megaco/test/megaco_load_SUITE.erl125
-rw-r--r--lib/megaco/test/megaco_mreq_SUITE.erl123
-rw-r--r--lib/megaco/test/megaco_tcp_SUITE.erl197
-rw-r--r--lib/megaco/test/megaco_test_lib.erl92
-rw-r--r--lib/megaco/test/megaco_test_lib.hrl12
-rw-r--r--lib/megaco/test/megaco_test_mg.erl121
-rw-r--r--lib/megaco/test/megaco_test_mgc.erl107
-rw-r--r--lib/megaco/test/megaco_udp_SUITE.erl150
-rw-r--r--lib/mnesia/src/mnesia_index.erl23
-rw-r--r--lib/mnesia/test/mnesia_trans_access_test.erl34
-rw-r--r--lib/runtime_tools/doc/src/dbg.xml55
-rw-r--r--lib/snmp/doc/src/snmp_app.xml18
-rw-r--r--lib/snmp/doc/src/snmp_config.xml16
-rw-r--r--lib/snmp/src/agent/snmpa_net_if.erl205
-rw-r--r--lib/snmp/src/manager/snmpm_net_if.erl139
-rw-r--r--lib/snmp/src/misc/snmp_misc.erl2
-rw-r--r--lib/snmp/test/snmp_agent_SUITE.erl459
-rw-r--r--lib/snmp/test/snmp_agent_test_lib.erl55
-rw-r--r--lib/snmp/test/snmp_manager_SUITE.erl534
-rw-r--r--lib/snmp/test/snmp_test_global_sys_monitor.erl6
-rw-r--r--lib/snmp/test/snmp_test_lib.erl78
-rw-r--r--lib/snmp/test/snmp_test_lib.hrl3
-rw-r--r--lib/snmp/test/snmp_test_mgr.erl2
-rw-r--r--lib/ssh/src/ssh.erl72
-rw-r--r--lib/ssh/src/ssh_acceptor.erl82
-rw-r--r--lib/ssh/src/ssh_connection_handler.erl52
-rw-r--r--lib/ssh/src/ssh_sftpd.erl5
-rw-r--r--lib/ssl/doc/src/ssl.xml231
-rw-r--r--lib/ssl/doc/src/standards_compliance.xml26
-rw-r--r--lib/ssl/src/dtls_connection.erl2
-rw-r--r--lib/ssl/src/dtls_handshake.erl13
-rw-r--r--lib/ssl/src/dtls_v1.erl29
-rw-r--r--lib/ssl/src/ssl.erl58
-rw-r--r--lib/ssl/src/ssl_certificate.erl44
-rw-r--r--lib/ssl/src/ssl_cipher.erl250
-rw-r--r--lib/ssl/src/ssl_handshake.erl337
-rw-r--r--lib/ssl/src/tls_dtls_connection.erl39
-rw-r--r--lib/ssl/src/tls_handshake.erl24
-rw-r--r--lib/ssl/src/tls_handshake_1_3.erl18
-rw-r--r--lib/ssl/src/tls_v1.erl329
-rw-r--r--lib/ssl/test/ssl_api_SUITE.erl8
-rw-r--r--lib/ssl/test/ssl_basic_SUITE.erl138
-rw-r--r--lib/ssl/test/ssl_cert_SUITE.erl200
-rw-r--r--lib/ssl/test/ssl_cert_tests.erl54
-rw-r--r--lib/ssl/test/ssl_handshake_SUITE.erl16
-rw-r--r--lib/ssl/test/ssl_session_SUITE.erl33
-rw-r--r--lib/ssl/test/ssl_session_cache_SUITE.erl24
-rw-r--r--lib/ssl/test/ssl_test_lib.erl5
-rw-r--r--lib/ssl/test/tls_1_3_version_SUITE.erl2
-rw-r--r--lib/stdlib/doc/src/c.xml87
-rw-r--r--lib/stdlib/src/epp.erl3
-rw-r--r--lib/stdlib/src/shell_docs.erl22
-rw-r--r--lib/stdlib/test/epp_SUITE.erl21
-rw-r--r--lib/stdlib/test/epp_SUITE_data/file_macro.erl9
-rw-r--r--lib/stdlib/test/epp_SUITE_data/file_macro.hrl0
-rw-r--r--lib/wx/api_gen/wx_gen.erl40
-rw-r--r--lib/wx/api_gen/wx_gen_erl.erl3
-rw-r--r--lib/wx/api_gen/wx_gen_nif.erl1
-rw-r--r--lib/wx/api_gen/wxapi.conf8
-rw-r--r--lib/wx/c_src/gen/wxe_func_table.cpp4150
-rw-r--r--lib/wx/c_src/gen/wxe_macros.h1
-rw-r--r--lib/wx/c_src/gen/wxe_wrapper_4.cpp4
-rw-r--r--lib/wx/c_src/gen/wxe_wrapper_7.cpp212
-rw-r--r--lib/wx/doc/src/wxImageList.xml4
-rw-r--r--lib/wx/doc/src/wxTextAttr.xml105
-rw-r--r--lib/wx/src/gen/wxAuiDockArt.erl4
-rw-r--r--lib/wx/src/gen/wxAuiTabArt.erl6
-rw-r--r--lib/wx/src/gen/wxBrush.erl8
-rw-r--r--lib/wx/src/gen/wxCalendarCtrl.erl8
-rw-r--r--lib/wx/src/gen/wxCalendarDateAttr.erl8
-rw-r--r--lib/wx/src/gen/wxColourData.erl6
-rw-r--r--lib/wx/src/gen/wxColourPickerCtrl.erl4
-rw-r--r--lib/wx/src/gen/wxDC.erl18
-rw-r--r--lib/wx/src/gen/wxFontData.erl4
-rw-r--r--lib/wx/src/gen/wxGraphicsContext.erl8
-rw-r--r--lib/wx/src/gen/wxGraphicsGradientStops.erl8
-rw-r--r--lib/wx/src/gen/wxGrid.erl20
-rw-r--r--lib/wx/src/gen/wxGridCellAttr.erl6
-rw-r--r--lib/wx/src/gen/wxImageList.erl26
-rw-r--r--lib/wx/src/gen/wxListCtrl.erl10
-rw-r--r--lib/wx/src/gen/wxListItem.erl6
-rw-r--r--lib/wx/src/gen/wxListItemAttr.erl8
-rw-r--r--lib/wx/src/gen/wxMask.erl6
-rw-r--r--lib/wx/src/gen/wxPen.erl8
-rw-r--r--lib/wx/src/gen/wxRegion.erl6
-rw-r--r--lib/wx/src/gen/wxStyledTextCtrl.erl40
-rw-r--r--lib/wx/src/gen/wxTextAttr.erl151
-rw-r--r--lib/wx/src/gen/wxTreeCtrl.erl6
-rw-r--r--lib/wx/src/gen/wxWindow.erl10
-rw-r--r--lib/wx/src/gen/wxe_funcs.hrl3629
-rw-r--r--lib/wx/src/wxe.hrl2
-rw-r--r--system/doc/design_principles/events.xml2
154 files changed, 10097 insertions, 6555 deletions
diff --git a/.github/workflows/sync-github-releases.yaml b/.github/workflows/sync-github-releases.yaml
index 7aafeae283..d3d3cf901c 100644
--- a/.github/workflows/sync-github-releases.yaml
+++ b/.github/workflows/sync-github-releases.yaml
@@ -12,6 +12,7 @@ jobs:
# Wait for up to a minute for previous runs to complete, abort if not done by then
pre-ci:
+ if: github.repository == 'erlang/otp'
runs-on: ubuntu-latest
timeout-minutes: 1
steps:
diff --git a/.gitignore b/.gitignore
index e90bf591f3..794d384b4d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -221,11 +221,13 @@ JAVADOC-GENERATED
/lib/*/test/*_SUITE_make.erl
/lib/*/test/*_SUITE_data/Makefile
+/lib/*/make_test_dir/
/erts/emulator/test/*_SUITE_make.erl
/erts/emulator/test/*_native_SUITE.erl
/erts/emulator/test/*_SUITE_data/Makefile
/erts/test/install_SUITE_data/install_bin
/erts/test/autoimport_SUITE_data/erlang.xml
+/erts/emulator/make_test_dir/
# common_test
diff --git a/erts/doc/src/erl_cmd.xml b/erts/doc/src/erl_cmd.xml
index 5220663f92..7ef3ca88f9 100644
--- a/erts/doc/src/erl_cmd.xml
+++ b/erts/doc/src/erl_cmd.xml
@@ -304,10 +304,13 @@ $ <input>erl \
<item>
<p>Useful for debugging. Prints the arguments sent to the emulator.</p>
</item>
- <tag><c><![CDATA[-emu_flavor Flavor]]></c></tag>
+ <tag><c><![CDATA[-emu_flavor emu|jit|smp]]></c></tag>
<item>
- <p>Start an emulator of a different flavor. The current available flavors
- are: <c>emu</c> and <c>jit</c>. You can combine this flag with
+ <p>Start an emulator of a different flavor. Normally only one flavor is
+ available, more can be added by building specific flavors. The currently
+ available flavors are: <c>emu</c> and <c>jit</c>.
+ The <c>smp</c> flavor is an alias for the current default flavor.
+ You can combine this flag with
<c>--emu_type</c>. You can get the current flavor at run-time using
<seeerl marker="erlang#system_info_emu_flavor">
<c>erlang:system_info(emu_flavor)</c></seeerl>.
diff --git a/erts/emulator/beam/erl_bif_re.c b/erts/emulator/beam/erl_bif_re.c
index ae0bc2ebe2..53634afcfe 100644
--- a/erts/emulator/beam/erl_bif_re.c
+++ b/erts/emulator/beam/erl_bif_re.c
@@ -1285,7 +1285,7 @@ re_run(Process *p, Eterm arg1, Eterm arg2, Eterm arg3, int first)
}
/* Optimized - if already in binary off heap, keep that and avoid
- copying, also binary returns can be sub binaries in that case */
+ copying, also binary returns can be sub binaries in that case. */
restart.flags = 0;
if (is_binary(arg1)) {
@@ -1300,7 +1300,10 @@ re_run(Process *p, Eterm arg1, Eterm arg2, Eterm arg3, int first)
slength = binary_size(arg1);
bptr = binary_val(real_bin);
- if (bitsize != 0 || bitoffs != 0 || (*bptr != HEADER_PROC_BIN)) {
+ if (bitsize != 0 || bitoffs != 0 || slength <= ERL_ONHEAP_BIN_LIMIT) {
+ /* If this is an unaligned subbinary,
+ or the binary is smaller than the ERL_ONHEAP_BIN_LIMIT
+ we make a copy of the binary. */
goto handle_iolist;
}
pb = (ProcBin *) bptr;
diff --git a/erts/emulator/beam/erl_binary.h b/erts/emulator/beam/erl_binary.h
index bd3669d896..bd3a0632d2 100644
--- a/erts/emulator/beam/erl_binary.h
+++ b/erts/emulator/beam/erl_binary.h
@@ -358,12 +358,8 @@ erts_free_aligned_binary_bytes(byte* buf)
*
* This check also ensures, indirectly, that there won't be an overflow when
* the size is bumped by CHICKEN_PAD and the binary struct itself. */
-#define BINARY_OVERFLOW_CHECK(BYTE_SIZE) \
- do { \
- if (ERTS_UNLIKELY(BYTE_SIZE > ERTS_UWORD_MAX / CHAR_BIT)) { \
- return NULL; \
- } \
- } while(0)
+#define IS_BINARY_SIZE_OK(BYTE_SIZE) \
+ ERTS_LIKELY(BYTE_SIZE <= ERTS_UWORD_MAX / CHAR_BIT)
/* Explicit extra bytes allocated to counter buggy drivers.
** These extra bytes where earlier (< R13B04) added by an alignment-bug
@@ -381,7 +377,8 @@ erts_bin_drv_alloc_fnf(Uint size)
Binary *res;
Uint bsize;
- BINARY_OVERFLOW_CHECK(size);
+ if (!IS_BINARY_SIZE_OK(size))
+ return NULL;
bsize = ERTS_SIZEOF_Binary(size) + CHICKEN_PAD;
res = (Binary *)erts_alloc_fnf(ERTS_ALC_T_DRV_BINARY, bsize);
@@ -414,8 +411,9 @@ erts_bin_nrml_alloc_fnf(Uint size)
Binary *res;
Uint bsize;
- BINARY_OVERFLOW_CHECK(size);
- bsize = ERTS_SIZEOF_Binary(size) + CHICKEN_PAD;
+ if (!IS_BINARY_SIZE_OK(size))
+ return NULL;
+ bsize = ERTS_SIZEOF_Binary(size);
res = (Binary *)erts_alloc_fnf(ERTS_ALC_T_BINARY, bsize);
ERTS_CHK_BIN_ALIGNMENT(res);
@@ -432,7 +430,7 @@ erts_bin_nrml_alloc_fnf(Uint size)
ERTS_GLB_INLINE Binary *
erts_bin_nrml_alloc(Uint size)
{
- Binary *res = erts_bin_drv_alloc_fnf(size);
+ Binary *res = erts_bin_nrml_alloc_fnf(size);
if (res) {
return res;
@@ -448,12 +446,18 @@ erts_bin_realloc_fnf(Binary *bp, Uint size)
Binary *nbp;
Uint bsize;
- type = (bp->intern.flags & BIN_FLAG_DRV) ? ERTS_ALC_T_DRV_BINARY
- : ERTS_ALC_T_BINARY;
ASSERT((bp->intern.flags & BIN_FLAG_MAGIC) == 0);
+ if (!IS_BINARY_SIZE_OK(size))
+ return NULL;
+ bsize = ERTS_SIZEOF_Binary(size);
- BINARY_OVERFLOW_CHECK(size);
- bsize = ERTS_SIZEOF_Binary(size) + CHICKEN_PAD;
+ if (bp->intern.flags & BIN_FLAG_DRV) {
+ type = ERTS_ALC_T_DRV_BINARY;
+ bsize += CHICKEN_PAD;
+ }
+ else {
+ type = ERTS_ALC_T_BINARY;
+ }
nbp = (Binary *)erts_realloc_fnf(type, (void *) bp, bsize);
ERTS_CHK_BIN_ALIGNMENT(nbp);
diff --git a/erts/emulator/beam/erl_db_util.c b/erts/emulator/beam/erl_db_util.c
index 70b300c69a..eb3134b8fe 100644
--- a/erts/emulator/beam/erl_db_util.c
+++ b/erts/emulator/beam/erl_db_util.c
@@ -2029,6 +2029,9 @@ Eterm db_prog_match(Process *c_p,
BIF_RETTYPE (*bif)(BIF_ALIST);
Eterm bif_args[3];
int fail_label;
+#ifdef DEBUG
+ Eterm *orig_esp;
+#endif
#ifdef DMC_DEBUG
Uint *heap_fence;
Uint *stack_fence;
@@ -2082,6 +2085,7 @@ restart:
esdp->current_process = psp;
#ifdef DEBUG
+ orig_esp = esp;
ASSERT(variables == mpsp->u.variables);
for (i=0; i<prog->num_bindings; i++) {
variables[i].term = THE_NON_VALUE;
@@ -2314,6 +2318,7 @@ restart:
while (n--) {
*ehp++ = *--esp;
}
+ erts_usort_flatmap((flatmap_t*)flatmap_val(t));
*esp++ = t;
break;
case matchMkHashMap:
@@ -2329,6 +2334,48 @@ restart:
erts_factory_proc_init(&factory, build_proc);
t = erts_hashmap_from_array(&factory, ehp, n, 0);
erts_factory_close(&factory);
+
+ /* There were duplicate keys in hashmap so we
+ may have to recreate the hashmap as a flatmap */
+ if (hashmap_size(t) <= MAP_SMALL_MAP_LIMIT) {
+ DECLARE_WSTACK(wstack);
+ Eterm *kv;
+ Eterm *ks;
+ Eterm *vs;
+ flatmap_t *mp;
+ Eterm keys, *hp;
+ Uint n = hashmap_size(t);
+ erts_factory_proc_init(&factory, build_proc);
+
+ /* build flat structure */
+ hp = erts_produce_heap(&factory, 3 + 1 + (2 * n), 0);
+ keys = make_tuple(hp);
+ *hp++ = make_arityval(n);
+ ks = hp;
+ hp += n;
+ mp = (flatmap_t*)hp;
+ hp += MAP_HEADER_FLATMAP_SZ;
+ vs = hp;
+
+ mp->thing_word = MAP_HEADER_FLATMAP;
+ mp->size = n;
+ mp->keys = keys;
+
+ hashmap_iterator_init(&wstack, t, 0);
+
+ while ((kv=hashmap_iterator_next(&wstack)) != NULL) {
+ *ks++ = CAR(kv);
+ *vs++ = CDR(kv);
+ }
+
+ /* it cannot have multiple keys */
+ erts_validate_and_sort_flatmap(mp);
+
+ t = make_flatmap(mp);
+
+ DESTROY_WSTACK(wstack);
+ erts_factory_close(&factory);
+ }
}
*esp++ = t;
break;
@@ -2767,6 +2814,7 @@ fail:
}
ret = THE_NON_VALUE;
success:
+ ASSERT(ret == THE_NON_VALUE || esp == orig_esp);
#ifdef DMC_DEBUG
if (*heap_fence != FENCE_PATTERN) {
@@ -3920,39 +3968,70 @@ dmc_tuple(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text,
return retOk;
}
+/*
+ * For maps we only expand the values of the map. The keys remain as they are.
+ * So the map #{ {const,a} => {const,b} } will be transformed to #{ {const,a} => b }.
+ */
static DMCRet
dmc_map(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text,
Eterm t, int *constant)
{
int nelems;
- int constant_values;
+ int constant_values, constant_keys;
DMCRet ret;
if (is_flatmap(t)) {
flatmap_t *m = (flatmap_t *)flatmap_val(t);
Eterm *values = flatmap_get_values(m);
+ int textpos = DMC_STACK_NUM(*text);
+ int stackpos = context->stack_used;
nelems = flatmap_get_size(m);
- ret = dmc_array(context, heap, text, values, nelems, &constant_values);
- if (ret != retOk) {
+ if ((ret = dmc_array(context, heap, text, values, nelems, &constant_values)) != retOk) {
return ret;
}
- if (constant_values) {
+
+ if ((ret = dmc_tuple(context, heap, text, m->keys, &constant_keys)) != retOk) {
+ return ret;
+ }
+
+ if (constant_values && constant_keys) {
*constant = 1;
return retOk;
}
- DMC_PUSH2(*text, matchPushC, dmc_private_copy(context, m->keys));
- if (++context->stack_used > context->stack_need) {
- context->stack_need = context->stack_used;
+
+ /* If all values were constants, then nothing was emitted by the
+ first dmc_array, so we reset the pc and emit all values as
+ constants and then re-emit the keys. */
+ if (constant_values) {
+ DMC_STACK_NUM(*text) = textpos;
+ context->stack_used = stackpos;
+ ASSERT(!constant_keys);
+ for (int i = nelems; i--;) {
+ do_emit_constant(context, text, values[i]);
+ }
+ dmc_tuple(context, heap, text, m->keys, &constant_keys);
+ } else if (constant_keys) {
+ Eterm *p = tuple_val(m->keys);
+ Uint nelems = arityval(*p);
+ ASSERT(!constant_values);
+ p++;
+ for (int i = nelems; i--;)
+ do_emit_constant(context, text, p[i]);
+ DMC_PUSH2(*text, matchMkTuple, nelems);
+ context->stack_used -= nelems - 1;
}
+
DMC_PUSH2(*text, matchMkFlatMap, nelems);
- context->stack_used -= nelems;
+ context->stack_used -= nelems; /* n values + 1 key-tuple => 1 map */
*constant = 0;
return retOk;
} else {
DECLARE_WSTACK(wstack);
Eterm *kv;
int c;
+ int textpos = DMC_STACK_NUM(*text);
+ int stackpos = context->stack_used;
ASSERT(is_hashmap(t));
@@ -3960,7 +4039,14 @@ dmc_map(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text,
constant_values = 1;
nelems = hashmap_size(t);
- while ((kv=hashmap_iterator_prev(&wstack)) != NULL) {
+ /* Check if all keys and values are constants */
+ while ((kv=hashmap_iterator_prev(&wstack)) != NULL && constant_values) {
+ if ((ret = dmc_expr(context, heap, text, CAR(kv), &c)) != retOk) {
+ DESTROY_WSTACK(wstack);
+ return ret;
+ }
+ if (!c)
+ constant_values = 0;
if ((ret = dmc_expr(context, heap, text, CDR(kv), &c)) != retOk) {
DESTROY_WSTACK(wstack);
return ret;
@@ -3970,11 +4056,16 @@ dmc_map(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text,
}
if (constant_values) {
+ ASSERT(DMC_STACK_NUM(*text) == textpos);
*constant = 1;
DESTROY_WSTACK(wstack);
return retOk;
}
+ /* reset the program to the original position and re-emit everything */
+ DMC_STACK_NUM(*text) = textpos;
+ context->stack_used = stackpos;
+
*constant = 0;
hashmap_iterator_init(&wstack, t, 1);
@@ -3988,6 +4079,7 @@ dmc_map(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text,
if (c) {
do_emit_constant(context, text, CAR(kv));
}
+
/* push value */
if ((ret = dmc_expr(context, heap, text, CDR(kv), &c)) != retOk) {
DESTROY_WSTACK(wstack);
@@ -3998,7 +4090,7 @@ dmc_map(DMCContext *context, DMCHeap *heap, DMC_STACK_TYPE(UWord) *text,
}
}
DMC_PUSH2(*text, matchMkHashMap, nelems);
- context->stack_used -= nelems;
+ context->stack_used -= 2*nelems - 1; /* n keys & values => 1 map */
DESTROY_WSTACK(wstack);
return retOk;
}
@@ -5159,8 +5251,8 @@ static int match_compact(ErlHeapFragment *expr, DMCErrInfo *err_info)
}
/*
-** Simple size object that takes care of function calls and constant tuples
-*/
+ ** Simple size object that takes care of function calls and constant tuples
+ */
static Uint my_size_object(Eterm t)
{
Uint sum = 0;
@@ -5172,30 +5264,60 @@ static Uint my_size_object(Eterm t)
my_size_object(CDR(list_val(t)));
break;
case TAG_PRIMARY_BOXED:
- if ((((*boxed_val(t)) &
- _TAG_HEADER_MASK) >> _TAG_PRIMARY_SIZE) !=
- (_TAG_HEADER_ARITYVAL >> _TAG_PRIMARY_SIZE)) {
- goto simple_term;
- }
-
- if (tuple_val(t)[0] == make_arityval(1) && is_tuple(tmp = tuple_val(t)[1])) {
- Uint i,n;
- p = tuple_val(tmp);
- n = arityval(p[0]);
- sum += 1 + n;
- for (i = 1; i <= n; ++i)
- sum += my_size_object(p[i]);
- } else if (tuple_val(t)[0] == make_arityval(2) &&
- is_atom(tmp = tuple_val(t)[1]) &&
- tmp == am_const) {
- sum += size_object(tuple_val(t)[2]);
- } else {
- erts_exit(ERTS_ERROR_EXIT,"Internal error, sizing unrecognized object in "
- "(d)ets:match compilation.");
- }
- break;
+ if (is_tuple(t)) {
+ if (tuple_val(t)[0] == make_arityval(1) && is_tuple(tmp = tuple_val(t)[1])) {
+ Uint i,n;
+ p = tuple_val(tmp);
+ n = arityval(p[0]);
+ sum += 1 + n;
+ for (i = 1; i <= n; ++i)
+ sum += my_size_object(p[i]);
+ } else if (tuple_val(t)[0] == make_arityval(2) &&
+ is_atom(tmp = tuple_val(t)[1]) &&
+ tmp == am_const) {
+ sum += size_object(tuple_val(t)[2]);
+ } else {
+ erts_exit(ERTS_ERROR_EXIT,"Internal error, sizing unrecognized object in "
+ "(d)ets:match compilation.");
+ }
+ break;
+ } else if (is_map(t)) {
+ if (is_flatmap(t)) {
+ Uint n;
+ flatmap_t *mp;
+ mp = (flatmap_t*)flatmap_val(t);
+
+ /* Calculate size of keys */
+ p = tuple_val(mp->keys);
+ n = arityval(p[0]);
+ sum += 1 + n;
+ for (int i = 1; i <= n; ++i)
+ sum += my_size_object(p[i]);
+
+ /* Calculate size of values */
+ p = (Eterm *)mp;
+ n = flatmap_get_size(mp);
+ sum += n + 3;
+ p += 3; /* hdr + size + keys words */
+ while (n--) {
+ sum += my_size_object(*p++);
+ }
+ } else {
+ Eterm *head = (Eterm *)hashmap_val(t);
+ Eterm hdr = *head;
+ Uint sz;
+ sz = hashmap_bitcount(MAP_HEADER_VAL(hdr));
+ sum += 1 + sz + header_arity(hdr);
+ head += 1 + header_arity(hdr);
+
+ while(sz-- > 0) {
+ sum += my_size_object(head[sz]);
+ }
+ }
+ break;
+ }
+ /* fall through */
default:
- simple_term:
sum += size_object(t);
break;
}
@@ -5225,7 +5347,7 @@ static Eterm my_copy_struct(Eterm t, Eterm **hp, ErlOffHeap* off_heap)
n = arityval(p[0]);
*hp += n + 1;
*savep++ = make_arityval(n);
- for(i = 1; i <= n; ++i)
+ for(i = 1; i <= n; ++i)
*savep++ = my_copy_struct(p[i], hp, off_heap);
}
else if (tuple_val(t)[0] == make_arityval(2) &&
@@ -5238,6 +5360,55 @@ static Eterm my_copy_struct(Eterm t, Eterm **hp, ErlOffHeap* off_heap)
erts_exit(ERTS_ERROR_EXIT, "Trying to constant-copy non constant expression "
"0x%bex in (d)ets:match compilation.", t);
}
+ } else if (is_map(t)) {
+ if (is_flatmap(t)) {
+ Uint i,n;
+ flatmap_t *mp;
+ Eterm *savep;
+ Eterm keys;
+
+ mp = (flatmap_t*)flatmap_val(t);
+
+ /* Copy keys */
+ savep = *hp;
+ keys = make_tuple(savep);
+ p = tuple_val(mp->keys);
+ n = arityval(p[0]);
+ *hp += n + 1;
+ *savep++ = make_arityval(n);
+ for(i = 1; i <= n; ++i)
+ *savep++ = my_copy_struct(p[i], hp, off_heap);
+
+ savep = *hp;
+ ret = make_flatmap(savep);
+ n = flatmap_get_size(mp);
+ p = (Eterm *)mp;
+ *hp += n + 3;
+ *savep++ = mp->thing_word;
+ *savep++ = mp->size;
+ *savep++ = keys;
+ p += 3; /* hdr + size + keys words */
+ for (i = 0; i < n; i++)
+ *savep++ = my_copy_struct(p[i], hp, off_heap);
+ erts_usort_flatmap((flatmap_t*)flatmap_val(ret));
+ } else {
+ Eterm *head = hashmap_val(t);
+ Eterm hdr = *head;
+ Uint sz;
+ Eterm *savep = *hp;
+ sz = hashmap_bitcount(MAP_HEADER_VAL(hdr));
+ *hp += 1 + sz + header_arity(hdr);
+
+ ret = make_hashmap(savep);
+
+ *savep++ = *head++; /* map header */
+ if (header_arity(hdr) == 1)
+ *savep++ = *head++; /* map size */
+
+ for (int i = 0; i < sz; i++) {
+ *savep++ = my_copy_struct(head[i],hp,off_heap);
+ }
+ }
} else {
sz = size_object(t);
ret = copy_struct(t,sz,hp,off_heap);
diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c
index d3d79959df..07a7b6c9e8 100644
--- a/erts/emulator/beam/erl_gc.c
+++ b/erts/emulator/beam/erl_gc.c
@@ -456,17 +456,19 @@ erts_gc_after_bif_call(Process* p, Eterm result, Eterm* regs, Uint arity)
result, regs, arity);
}
-static ERTS_INLINE void reset_active_writer(Process *p)
+static ERTS_INLINE void assert_no_active_writers(Process *p)
{
+#ifdef DEBUG
struct erl_off_heap_header* ptr;
ptr = MSO(p).first;
while (ptr) {
if (ptr->thing_word == HEADER_PROC_BIN) {
ProcBin *pbp = (ProcBin*) ptr;
- pbp->flags &= ~PB_ACTIVE_WRITER;
+ ERTS_ASSERT(!(pbp->flags & PB_ACTIVE_WRITER));
}
ptr = ptr->next;
}
+#endif
}
#define ERTS_DELAY_GC_EXTRA_FREE 40
@@ -771,7 +773,7 @@ do_major_collection:
ERTS_MSACC_SET_STATE_CACHED_X(ERTS_MSACC_STATE_GC);
}
- reset_active_writer(p);
+ assert_no_active_writers(p);
/*
* Finish.
@@ -2809,13 +2811,10 @@ link_live_proc_bin(struct shrink_cand_data *shrink,
*currpp = pbp->next;
if (pbp->flags & (PB_ACTIVE_WRITER|PB_IS_WRITABLE)) {
- ASSERT(((pbp->flags & (PB_ACTIVE_WRITER|PB_IS_WRITABLE))
- == (PB_ACTIVE_WRITER|PB_IS_WRITABLE))
- || ((pbp->flags & (PB_ACTIVE_WRITER|PB_IS_WRITABLE))
- == PB_IS_WRITABLE));
-
+ ASSERT(pbp->flags & PB_IS_WRITABLE);
if (pbp->flags & PB_ACTIVE_WRITER) {
+ pbp->flags &= ~PB_ACTIVE_WRITER;
shrink->no_of_active++;
}
else { /* inactive */
diff --git a/erts/emulator/beam/erl_map.c b/erts/emulator/beam/erl_map.c
index d0d455e2d0..395c4d9ca9 100644
--- a/erts/emulator/beam/erl_map.c
+++ b/erts/emulator/beam/erl_map.c
@@ -3018,6 +3018,44 @@ int erts_validate_and_sort_flatmap(flatmap_t* mp)
return 1;
}
+void erts_usort_flatmap(flatmap_t* mp)
+{
+ Eterm *ks = flatmap_get_keys(mp);
+ Eterm *vs = flatmap_get_values(mp);
+ Uint sz = flatmap_get_size(mp);
+ Uint ix,jx;
+ Eterm tmp;
+ Sint c;
+
+ /* sort and shrink */
+
+ for (ix = 1; ix < sz; ix++) {
+ jx = ix;
+ while( jx > 0 && (c = CMP_TERM(ks[jx],ks[jx-1])) <= 0 ) {
+ /* identical key -> remove it */
+ if (c == 0) {
+ sys_memmove(ks+jx-1,ks+jx,(sz-ix)*sizeof(Eterm));
+ sys_memmove(vs+jx-1,vs+jx,(sz-ix)*sizeof(Eterm));
+ sz--;
+ ix--;
+ break;
+ }
+
+ tmp = ks[jx];
+ ks[jx] = ks[jx - 1];
+ ks[jx - 1] = tmp;
+
+ tmp = vs[jx];
+ vs[jx] = vs[jx - 1];
+ vs[jx - 1] = tmp;
+
+ jx--;
+ }
+ }
+ mp->size = sz;
+ *tuple_val(mp->keys) = make_arityval(sz);
+}
+
#if 0 /* Can't get myself to remove this beautiful piece of code
for probabilistic overestimation of nr of nodes in a hashmap */
diff --git a/erts/emulator/beam/erl_map.h b/erts/emulator/beam/erl_map.h
index 980cf246c4..c54a516af0 100644
--- a/erts/emulator/beam/erl_map.h
+++ b/erts/emulator/beam/erl_map.h
@@ -91,6 +91,7 @@ Eterm erts_hashmap_insert_up(Eterm *hp, Eterm key, Eterm value,
Uint upsz, struct ErtsEStack_ *sp);
int erts_validate_and_sort_flatmap(flatmap_t* map);
+void erts_usort_flatmap(flatmap_t* map);
void hashmap_iterator_init(struct ErtsWStack_* s, Eterm node, int reverse);
Eterm* hashmap_iterator_next(struct ErtsWStack_* s);
Eterm* hashmap_iterator_prev(struct ErtsWStack_* s);
diff --git a/erts/emulator/beam/erl_message.c b/erts/emulator/beam/erl_message.c
index 5d52b0b8aa..a6eecfabdc 100644
--- a/erts/emulator/beam/erl_message.c
+++ b/erts/emulator/beam/erl_message.c
@@ -1073,7 +1073,10 @@ void erts_factory_proc_init(ErtsHeapFactory* factory, Process* p)
factory->p = p;
factory->hp_start = HEAP_TOP(p);
factory->hp = factory->hp_start;
- factory->hp_end = HEAP_LIMIT(p);
+ if (factory->hp)
+ factory->hp_end = HEAP_LIMIT(p);
+ else
+ factory->hp_end = NULL;
factory->off_heap = &p->off_heap;
factory->message = NULL;
factory->off_heap_saved.first = p->off_heap.first;
@@ -1083,7 +1086,8 @@ void erts_factory_proc_init(ErtsHeapFactory* factory, Process* p)
factory->heap_frags = NULL; /* not used */
factory->alloc_type = 0; /* not used */
- HEAP_TOP(p) = HEAP_LIMIT(p);
+ if (HEAP_TOP(p))
+ HEAP_TOP(p) = HEAP_LIMIT(p);
}
void erts_factory_proc_prealloc_init(ErtsHeapFactory* factory,
diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c
index 70b18b9ff1..79121f2651 100644
--- a/erts/emulator/beam/erl_nif.c
+++ b/erts/emulator/beam/erl_nif.c
@@ -908,6 +908,8 @@ int enif_send(ErlNifEnv* env, const ErlNifPid* to_pid,
from = c_p ? c_p->common.id : am_undefined;
if (!env || !env->tracee) {
+ /* This clause is taken when enif_send is called in a nif
+ that is not a erl_tracer nif. */
if (c_p) {
ASSERT(env);
if (IS_TRACED_FL(c_p, F_TRACE_SEND)) {
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index 76a9232159..61f3c6b088 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -10067,9 +10067,12 @@ Process *erts_schedule(ErtsSchedulerData *esdp, Process *p, int calls)
static void
trace_schedule_in(Process *p, erts_aint32_t state)
{
+ ErtsThrPrgrDelayHandle dhndl;
ASSERT(IS_TRACED(p));
ERTS_LC_ASSERT(erts_proc_lc_my_proc_locks(p) == ERTS_PROC_LOCK_MAIN);
+ dhndl = erts_thr_progress_unmanaged_delay();
+
/* Clear tracer if it has been removed */
if (erts_is_tracer_proc_enabled(p, ERTS_PROC_LOCK_MAIN, &p->common)) {
@@ -10085,14 +10088,17 @@ trace_schedule_in(Process *p, erts_aint32_t state)
if (IS_TRACED_FL(p, F_TRACE_CALLS))
erts_schedule_time_break(p, ERTS_BP_CALL_TIME_SCHEDULE_IN);
}
-
+ erts_thr_progress_unmanaged_continue(dhndl);
}
static void
trace_schedule_out(Process *p, erts_aint32_t state)
{
+ ErtsThrPrgrDelayHandle dhndl;
ASSERT(IS_TRACED(p));
ERTS_LC_ASSERT(erts_proc_lc_my_proc_locks(p) == ERTS_PROC_LOCK_MAIN);
+
+ dhndl = erts_thr_progress_unmanaged_delay();
if (IS_TRACED_FL(p, F_TRACE_CALLS) && !(state & ERTS_PSFLG_FREE))
erts_schedule_time_break(p, ERTS_BP_CALL_TIME_SCHEDULE_OUT);
@@ -10106,6 +10112,7 @@ trace_schedule_out(Process *p, erts_aint32_t state)
ARE_TRACE_FLAGS_ON(p, F_TRACE_SCHED_PROCS))
trace_sched(p, ERTS_PROC_LOCK_MAIN, am_out);
}
+ erts_thr_progress_unmanaged_continue(dhndl);
}
static int
diff --git a/erts/emulator/beam/erl_trace.c b/erts/emulator/beam/erl_trace.c
index 904013a8f5..132d27d01b 100644
--- a/erts/emulator/beam/erl_trace.c
+++ b/erts/emulator/beam/erl_trace.c
@@ -1362,6 +1362,7 @@ trace_gc(Process *p, Eterm what, Uint size, Eterm msg)
Eterm* hp;
Uint sz = 0;
Eterm tup;
+ ErtsThrPrgrDelayHandle dhndl = erts_thr_progress_unmanaged_delay();
if (is_tracer_enabled(p, ERTS_PROC_LOCK_MAIN, &p->common, &tnif,
TRACE_FUN_E_GC, what)) {
@@ -1381,6 +1382,7 @@ trace_gc(Process *p, Eterm what, Uint size, Eterm msg)
if (o_hp)
erts_free(ERTS_ALC_T_TMP, o_hp);
}
+ erts_thr_progress_unmanaged_continue(dhndl);
}
void
@@ -2631,6 +2633,7 @@ lookup_tracer_nif(const ErtsTracer tracer)
ErtsTracerNif tnif_tmpl;
ErtsTracerNif *tnif;
tnif_tmpl.module = ERTS_TRACER_MODULE(tracer);
+ ERTS_LC_ASSERT(erts_thr_progress_lc_is_delaying() || erts_get_scheduler_id() > 0);
erts_rwmtx_rlock(&tracer_mtx);
if ((tnif = hash_get(tracer_hash, &tnif_tmpl)) == NULL) {
erts_rwmtx_runlock(&tracer_mtx);
diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c
index 6bfd9fa825..f6bb7f3816 100644
--- a/erts/emulator/beam/external.c
+++ b/erts/emulator/beam/external.c
@@ -2101,7 +2101,8 @@ BIF_RETTYPE binary_to_term_2(BIF_ALIST_2)
return binary_to_term_int(BIF_P, BIF_ARG_1, &ctx);
error:
- BIF_ERROR(BIF_P, BADARG);
+ BIF_P->fvalue = am_badopt;
+ BIF_ERROR(BIF_P, BADARG | EXF_HAS_EXT_INFO);
}
Eterm
@@ -4894,7 +4895,6 @@ dec_term_atom_common:
(void) PSTACK_POP(hamt_array);
} while (!PSTACK_IS_EMPTY(hamt_array));
- PSTACK_DESTROY(hamt_array);
}
/* Iterate through all the (flat)maps and check for validity and sort keys
@@ -4906,6 +4906,9 @@ dec_term_atom_common:
if (!erts_validate_and_sort_flatmap((flatmap_t*)next))
goto error;
}
+
+ /* Now that no more errors can occur, the stacks can be destroyed safely. */
+ PSTACK_DESTROY(hamt_array);
WSTACK_DESTROY(flat_maps);
ASSERT((Eterm*)*dbg_resultp != NULL);
@@ -5619,6 +5622,7 @@ init_done:
if (n <= MAP_SMALL_MAP_LIMIT) {
heap_size += 3 + n + 1 + n;
} else {
+ CHKSIZE(2*n); /* Conservative size check */
heap_size += HASHMAP_ESTIMATED_HEAP_SIZE(n);
}
break;
diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h
index 1dcfbf3a71..904d394fca 100644
--- a/erts/emulator/beam/global.h
+++ b/erts/emulator/beam/global.h
@@ -1391,9 +1391,13 @@ void erts_qsort(void *base,
size_t nr_of_items,
size_t item_size,
erts_void_ptr_cmp_t compare);
-/* YCF generated functions for yielding of erts_qsort
- See: $ERL_TOP/erts/emulator/internal_doc/AutomaticYieldingOfCCode.md
+/* YCF generated functions for yielding of erts_qsort. This means that
+ the following three functions can be used when one needs a yieldable
+ sorting function. See
+ $ERL_TOP/erts/emulator/internal_doc/AutomaticYieldingOfCCode.md for
+ information about using YCF generated functions.
+
!!!!
Note that the erts_qsort_swap that is used by erts_qsort does
not have yielding enabled. If the array items are large erts_qsort
@@ -1404,15 +1408,16 @@ void erts_qsort(void *base,
void erts_qsort_ycf_gen_destroy(void* ycf_my_trap_state);
void erts_qsort_ycf_gen_continue(long* ycf_number_of_reduction_param,
void** ycf_trap_state,
- void* ycf_extra_context);
+ void* ycf_extra_context /* Not used, can be NULL */);
void erts_qsort_ycf_gen_yielding(long* ycf_nr_of_reductions_param,
void** ycf_trap_state,
- void* ycf_extra_context,
+ void* ycf_extra_context, /* Not used, can be NULL */
void* (*ycf_yield_alloc_fun) (size_t,void*),
void (*ycf_yield_free_fun) (void*,void*),
void* ycf_yield_alloc_free_context,
- size_t ycf_stack_alloc_size_or_max_size,
- void* ycf_stack_alloc_data,void *base,
+ size_t ycf_stack_alloc_size_or_max_size, /* Not used, can be 0 */
+ void* ycf_stack_alloc_data, /* Not used, can be NULL */
+ void *base,
size_t nr_of_items,
size_t item_size,
erts_void_ptr_cmp_t compare);
diff --git a/erts/emulator/beam/module.c b/erts/emulator/beam/module.c
index 1b37725cf5..81ae74be9e 100644
--- a/erts/emulator/beam/module.c
+++ b/erts/emulator/beam/module.c
@@ -130,6 +130,7 @@ erts_get_module(Eterm mod, ErtsCodeIndex code_ix)
IndexTable* mod_tab;
ASSERT(is_atom(mod));
+ ERTS_LC_ASSERT(erts_get_scheduler_id() > 0 || erts_thr_progress_lc_is_delaying());
mod_tab = &module_tables[code_ix];
diff --git a/erts/emulator/internal_doc/AutomaticYieldingOfCCode.md b/erts/emulator/internal_doc/AutomaticYieldingOfCCode.md
index e68a57a7ab..1497c95642 100644
--- a/erts/emulator/internal_doc/AutomaticYieldingOfCCode.md
+++ b/erts/emulator/internal_doc/AutomaticYieldingOfCCode.md
@@ -55,8 +55,159 @@ of YCF documentation can be found
Yielding C Fun in the Erlang Run-time System
-------------------------------------------
-YCF is used to implement yielding in the BIFs for the `ets:insert/2`
-and `ets:insert_new/2` functions when these two functions get a list
-as their second parameter. The implementation of these two functions
-is a good starting point if one wants to use YCF to implement
-something else inside ERTS.
+At the time of writing, YCF is used for the following in ERTS:
+
+* `ets:insert/2` and`ets:insert_new/2` (when these two functions get a list as their second parameter)
+* `maps:from_keys/2`, `maps:from_list/1`, `maps:keys/1` and `maps:values/1`
+* The functions `erts_qsort_ycf_gen_yielding`,
+ `erts_qsort_ycf_gen_continue` and `erts_qsort_ycf_gen_destroy`
+ implements a general purpose yieldable sorting routine that is used
+ in the implementation of `erlang:term_to_binary/2`
+
+Best Practices for YCF in the ERTS
+-------------------------------------------
+
+First of all, before starting to use YCF it is recommended to read
+through its documentation in
+[erts/lib_src/yielding_c_fun/README.md](https://github.com/erlang/otp/erts/lib_src/yielding_c_fun/README.md)
+to understand what limitations and functionalities YCF has.
+
+### Mark YCF Transformed Functions
+
+It is important that it is easy to see what functions are transformed
+by YCF so that a programmer that edits these function are aware that
+they have to follow certain restrictions. The convention for making
+this clear is to have a comment above the function that explains that
+the function is transformed by YCF (see `maps_values_1_helper` in
+`erl_map.c` for an example). If only the transformed version of the
+function is used, the convention is to "comment out" the source for the
+function by surrounding it with the following `#ifdef` (this way, one
+will not get warnings about unused functions):
+
+
+```
+#ifdef INCLUDE_YCF_TRANSFORMED_ONLY_FUNCTIONS
+void my_fun() {
+ ...
+}
+#endif /* INCLUDE_YCF_TRANSFORMED_ONLY_FUNCTIONS */
+```
+
+While editing the function one can define
+`INCLUDE_YCF_TRANSFORMED_ONLY_FUNCTIONS` so that one can see errors
+and warnings in the non-transformed source.
+
+
+### Where to Place YCF Transformed Functions
+
+The convention is to place the non-transformed source for the functions
+that are transformed by YCF in the source file where they naturally
+belong. For example, the functions for the map BIFs are placed in
+`erl_map.c` together with the other map-related functions. When
+building, YCF is invoked to generate the transformed versions of the
+functions into a header file that is included in the source file that
+contains the the non-transformed version of the function (search for
+YCF in `$ERL_TOP/erts/emulator/Makefile.in` to see examples of how YCF
+can be invoked).
+
+If a function `F1` that is transformed by one YCF invocation depends
+on a function `F2` that is transformed by another YCF invocation, one
+needs to tell YCF that `F2` is an YCF transformed function so that
+`F1` can call the transformed version (see the documentation of
+`-fexternal` in [YCF's documentation](https://github.com/erlang/otp/erts/lib_src/yielding_c_fun/README.md)
+for more information about how to do that).
+
+
+### Reduce Boilerplate Code with `erts_ycf_trap_driver`
+
+The `erts_ycf_trap_driver` is a C function that implements common code
+that is needed by all BIFs that do their yielding with YCF. It is
+recommended to use this function when possible. A good way to learn
+how to use `erts_ycf_trap_driver` is to look at the implementations of
+the BIFs `maps:from_keys/2`, `maps:from_list/1`, `maps:keys/1` and
+`maps:values/1`.
+
+Some BIFs may not be able to use `erts_ycf_trap_driver` as they need
+to do some custom work after yielding. Examples of that are the BIFs
+`ets:insert/2` and`ets:insert_new/2` that publish the yield state in
+the ETS table structure so that other threads can help in completing
+the operation.
+
+
+### Testing and Finding Problems in YCF Generated Code
+
+A good way to test both code with manual yielding and YCF generated
+yielding is to write test cases that cover the places where the code
+can yield (yielding points) and setting the yield limit so that it
+yields every time the yielding points are reached. With YCF this can
+be accomplished by passing a pointer to the value 1 as the
+`ycf_nr_of_reductions` parameter (i.e., the first parameter of the
+`*_ycf_gen_yielding` and `*_ycf_gen_continue` functions).
+
+The YCF flag `-debug` makes YCF generate code that checks for pointers
+to the C stack when yielding. When such a pointer is found the
+location of the found pointer will be printed out and the program will
+crash. This can save a lot (!) of time when porting already existing C
+code to yield with YCF. To make the `-debug` option work as intended,
+one has to tell YCF where the stack starts before calling the YCF
+generated function. The functions `ycf_debug_set_stack_start` and
+`ycf_debug_reset_stack_start` has been created to make this easier
+(see the implementation of `erts_ycf_trap_driver` for how to use these
+functions). It is recommended to set up building of ERTS so that debug
+builds of ERTS runs with YCF code generated with the `-debug` flag
+while production code runs with YCF code that has been generated
+without the `-debug` flag.
+
+It is a good practice to look through the code generated by YCF to try
+to find things that are not correctly transformed. Before doing that
+one should format the generated code with an automatic source code
+formatter (the generated code is quite unreadable otherwise). If YCF
+does not transform something correctly, it is almost certainly possible
+to fix that by rewriting the code (see the YCF documentation for what
+is supported and what is not supported). For example, if you have a
+inline struct variable declaration (for example,
+`struct {int field1; int field2;} mystructvar;`), YCF will not recognize this
+as a variable declaration but you can fix this by creating a `typedef`
+for the struct.
+
+YCF's hooks can be useful when debugging code that has been transformed
+by YCF. For examples, the hooks can be used to print the value of a
+variable when yielding and when resuming after yielding.
+
+Unfortunately, YCF does not handle C code with syntactical errors very
+well and can crash or produce bad output without giving any useful
+error message when given syntactically incorrect C code (for example,
+a missing parenthesis). Therefore, it is recommended to always check
+the code with a normal C compiler before transforming it with YCF.
+
+### Common Pitfalls
+
+* **Pointers to the stack** The stack might be located somewhere else
+ when a yielded function continues to execute so pointers to
+ variables that are located on the stack can be a problem. As
+ mentioned in the previous section, the `-debug` option is a good way
+ to detect such pointers. YCF has functionality to make it easier to
+ port code that has pointers to the stack (see the documentation of
+ `YCF_STACK_ALLOC` in the YCF documentation for more
+ information). Another way to fix pointers to the stack, that
+ sometimes can be convenient, is to use YCF's hooks to set up
+ pointers to the stack correctly when a yielded function resumes.
+
+* **Macros** YCF does not expand macros so variable declarations,
+ return statements, and gotos etc that are "hidden" by macros can be
+ a problem. It is therefore smart to check all macros in code that is
+ transformed by YCF so that they do not contain anything that YCF
+ needs to transform.
+
+* **Memory Allocation in Yielding Code** If a process is killed while
+ executing a BIF that is yielded, one has to make sure that memory
+ and other resources that is allocated by the yielded code is
+ freed. This can be done, e.g., by calling the generated
+ `*_ycf_gen_destroy` function from the `dtor` of a magic binary that
+ holds a reference to trap state. YCF's `ON_DESTROY_STATE` and
+ `ON_DESTROY_STATE_OR_RETURN` hooks can be used to free any resources
+ that has been manually allocated inside a yielding function when the
+ function's `*_ycf_gen_destroy` function is executed. The
+ `erts_ycf_trap_driver` takes care of calling the `*_ycf_gen_destroy`
+ function so you do not need to worry about that if you are using
+ `erts_ycf_trap_driver`.
diff --git a/erts/emulator/internal_doc/BeamAsm.md b/erts/emulator/internal_doc/BeamAsm.md
index 4988126e62..3b4ac619ce 100644
--- a/erts/emulator/internal_doc/BeamAsm.md
+++ b/erts/emulator/internal_doc/BeamAsm.md
@@ -407,6 +407,11 @@ we have found useful:
Create an archive with all the artifacts needed to inspect the data
on another host. In early version of perf this command does not work,
instead you can use [this bash script](https://github.com/torvalds/linux/blob/master/tools/perf/perf-archive.sh).
+* `perf report` gives "failed to process sample" and/or "failed to process type: 68"
+ This probably means that you are running a bugge version of perf. We have
+ seen this when running Ubuntu 18.04 with kernel version 4. If you update
+ to Ubuntu 20.04 or use Ubuntu 18.04 with kernel version 5 the problem
+ should go away.
## FAQ
diff --git a/erts/emulator/test/binary_SUITE.erl b/erts/emulator/test/binary_SUITE.erl
index 46434a8c1f..d8a4e6cddf 100644
--- a/erts/emulator/test/binary_SUITE.erl
+++ b/erts/emulator/test/binary_SUITE.erl
@@ -1442,6 +1442,22 @@ test_terms(Test_Func) ->
Test_Func(FF = fun binary_SUITE:all/0),
Test_Func(lists:duplicate(32, FF)),
+ %% Maps.
+ SmallMap = #{a => 1, b => 2, c => 3},
+ LargeMap1 = maps:from_list([{list_to_atom(integer_to_list(36#cafe+N*N*N, 36)),N} ||
+ N <- lists:seq(1, 33)]),
+ LargeMap2 = maps:from_list([{list_to_atom(integer_to_list(36#dead+N, 36)),N} ||
+ N <- lists:seq(1, 50)]),
+ MapWithMap = LargeMap1#{SmallMap => a, LargeMap1 => LargeMap2, LargeMap2 => LargeMap1,
+ [LargeMap1,LargeMap2] => LargeMap1,
+ <<"abc">> => SmallMap, <<"qrs">> => LargeMap1,
+ <<"xyz">> => LargeMap2 },
+ Test_Func(#{}),
+ Test_Func(SmallMap),
+ Test_Func(LargeMap1),
+ Test_Func(LargeMap2),
+ Test_Func(MapWithMap),
+
ok.
test_floats(Test_Func) ->
diff --git a/erts/emulator/test/dirty_nif_SUITE.erl b/erts/emulator/test/dirty_nif_SUITE.erl
index 71cfb3f944..fc4c9a514a 100644
--- a/erts/emulator/test/dirty_nif_SUITE.erl
+++ b/erts/emulator/test/dirty_nif_SUITE.erl
@@ -447,10 +447,10 @@ dirty_nif_send_traced(Config) when is_list(Config) ->
{ok, Rcvr} = send_wait_from_dirty_nif(Rcvr),
Parent ! {self(), sent}
end),
- 1 = erlang:trace(Sndr, true, [send]),
+ 1 = erlang:trace(Sndr, true, [send, running, exiting]),
Start = erlang:monotonic_time(),
Sndr ! {self(), go},
- receive {trace, Sndr, send, {ok, Rcvr}, Rcvr} -> ok end,
+
receive {Rcvr, received} -> ok end,
End1 = erlang:monotonic_time(),
Time1 = erlang:convert_time_unit(End1-Start, native, 1000),
@@ -461,8 +461,33 @@ dirty_nif_send_traced(Config) when is_list(Config) ->
Time2 = erlang:convert_time_unit(End2-Start, native, 1000),
io:format("Time2: ~p milliseconds~n", [Time2]),
true = Time2 >= 1900,
+
+ %% Make sure that the send trace is
+ %% in between an in and and out trace
+ (fun F() ->
+ %% We got an in trace, look for out or send
+ {trace,Sndr,in,_} = recv_trace_from(Sndr),
+ case recv_trace_from(Sndr) of
+ {trace,Sndr,out,_} ->
+ %% We got an out, look for another in
+ F();
+ {trace,Sndr,send,_,_} ->
+ %% We got a send, look for another out
+ {trace,Sndr,out,_} = recv_trace_from(Sndr),
+ ok
+ end
+ end)(),
+
ok.
+recv_trace_from(Sndr) ->
+ receive
+ M when element(1, M) =:= trace;
+ element(1, M) =:= trace_ts,
+ element(2, M) =:= Sndr ->
+ M
+ end.
+
dirty_literal_test_code() ->
"
-module(dirty_literal_code_test).
diff --git a/erts/emulator/test/exception_SUITE.erl b/erts/emulator/test/exception_SUITE.erl
index 18a5dda447..746993bf34 100644
--- a/erts/emulator/test/exception_SUITE.erl
+++ b/erts/emulator/test/exception_SUITE.erl
@@ -680,7 +680,7 @@ do_error_3(Reason, Args, Options) ->
error_info(_Config) ->
DeadProcess = dead_process(),
- NewAtom = non_existing_atom(),
+ {NewAtom,NewAtomExt} = non_existing_atom(),
Eons = 1 bsl 50,
%% We'll need an incorrect memory type for erlang:memory/1. We want to test an
@@ -767,9 +767,14 @@ error_info(_Config) ->
{binary_to_list, [<<1,2,3>>, 4, 5]},
{binary_to_term, [abc]},
- {binary_to_term, [<<"abc">>]},
+ {binary_to_term, [<<"bad">>]},
+
{binary_to_term, [term_to_binary(a), abc]},
{binary_to_term, [<<"bad">>, abc]},
+ {binary_to_term, [<<"bad">>, [bad]]},
+ {binary_to_term, [<<"bad">>, []]},
+ {binary_to_term, [<<"bad">>, [safe]]},
+ {binary_to_term, [NewAtomExt, [safe]]},
{bit_size, [abc]},
{bitstring_to_list, [abc]},
@@ -1322,7 +1327,9 @@ non_existing_atom(Atom) ->
non_existing_atom([Char|Atom])
catch
error:badarg ->
- Atom
+ AtomBin = list_to_binary(Atom),
+ AtomExt = <<131,100,(byte_size(AtomBin)):16,AtomBin/binary>>,
+ {Atom,AtomExt}
end.
do_error_info(L0) ->
diff --git a/erts/emulator/test/gc_SUITE.erl b/erts/emulator/test/gc_SUITE.erl
index 9b7488d21b..6e78eff420 100644
--- a/erts/emulator/test/gc_SUITE.erl
+++ b/erts/emulator/test/gc_SUITE.erl
@@ -213,6 +213,13 @@ minor_major_gc_option_self(_Config) ->
Pid ! {gc, Ref, major}
end, [gc_major_start, gc_major_end]),
+ %% Try as major dirty, the test process will self-trigger GC
+ check_gc_tracing_around(
+ fun(Pid, Ref) ->
+ Pid ! {gc, Ref, major}
+ end, [gc_major_start, gc_major_end],
+ lists:seq(1,128 * 1024)),
+
%% Try as minor, the test process will self-trigger GC
check_gc_tracing_around(
fun(Pid, Ref) ->
@@ -293,19 +300,23 @@ gc_dirty_exec_proc(Config) when is_list(Config) ->
%% it results in any unexpected messages or if the expected trace tags are not
%% received.
check_gc_tracing_around(Fun, ExpectedTraceTags) ->
+ check_gc_tracing_around(Fun, ExpectedTraceTags, []).
+check_gc_tracing_around(Fun, ExpectedTraceTags, State) ->
Ref = erlang:make_ref(),
Pid = spawn(
- fun Endless() ->
- receive
- {gc, Ref, Type} ->
- erlang:garbage_collect(self(), [{type, Type}]);
- {dirty_exec, Time} ->
- erts_debug:dirty_io(wait, 1000)
- after 100 ->
- ok
- end,
- Endless()
- end),
+ fun() ->
+ (fun Endless(S) ->
+ receive
+ {gc, Ref, Type} ->
+ erlang:garbage_collect(self(), [{type, Type}]);
+ {dirty_exec, Time} ->
+ erts_debug:dirty_io(wait, Time)
+ after 100 ->
+ ok
+ end,
+ Endless(S)
+ end)(State)
+ end),
erlang:garbage_collect(Pid, []),
erlang:trace(Pid, true, [garbage_collection]),
Fun(Pid, Ref),
diff --git a/erts/emulator/test/match_spec_SUITE.erl b/erts/emulator/test/match_spec_SUITE.erl
index ac132c1912..75aae473bd 100644
--- a/erts/emulator/test/match_spec_SUITE.erl
+++ b/erts/emulator/test/match_spec_SUITE.erl
@@ -918,6 +918,52 @@ maps(Config) when is_list(Config) ->
ok = maps_check_loop(M0),
M2 = maps:from_list([{integer_to_list(K),V} || {K,V} <- Ls0]),
ok = maps_check_loop(M2),
+
+ %% Maps in guards
+ {ok,#{a:=1},[],[]} = erlang:match_spec_test(#{a=>1}, [{'$1',[{'==','$1',#{a=>1}}],['$1']}], table),
+ {ok,#{a:='$1'},[],[]} = erlang:match_spec_test(#{a=>'$1'}, [{'$1',[{'==','$1',#{a=>{const,'$1'}}}],['$1']}], table),
+ {ok,#{a:=1},[],[]} = erlang:match_spec_test(#{a=>1}, [{'$1',[{'==','$1',#{{const,a}=>1}}],['$1']}], table),
+ {ok,#{20:=1,b:=2},[],[]} = erlang:match_spec_test({11,#{20=>1,b=>2}},[{{'$1','$2'},[{'==','$2',#{{'+','$1',9}=>{'-','$1',10},b=>{const,2}}}],['$2']}], table),
+ %% Test that maps with duplicate keys work. This depends on the iteration order of small maps.
+ true = lists:any(
+ fun(N) ->
+ {ok,#{1=>1,2=>N},[],[]} ==
+ erlang:match_spec_test(#{1=>1,2=>N},[{'$1',[{'==','$1',#{1=>1,2=>2,{const,2}=>3,{'+',1,1}=>4,{'+',2,0}=>5}}],['$1']}],table)
+ end,[2,3,4,5]),
+ %% Test what happens when a map is collapsed from hash to flatmap
+ {ok,#{0:=1},[],[]} = erlang:match_spec_test(#{0=>1},[{'$1',[{'==','$1',maps:from_list([{{'-',I,I},1} || I <- lists:seq(1,100)])}],['$1']}], table),
+
+ %% Large maps in guards
+ {ok,#{a:=1},[],[]} = erlang:match_spec_test(M0#{a=>1}, [{'$1',[{'==','$1',M0#{a=>1}}],['$1']}], table),
+ {ok,#{a:='$1'},[],[]} = erlang:match_spec_test(M0#{a=>'$1'}, [{'$1',[{'==','$1',M0#{a=>{const,'$1'}}}],['$1']}], table),
+ {ok,#{520:=1,b:=2},[],[]} = erlang:match_spec_test({11,M0#{520=>1,b=>2}},[{{'$1','$2'},[{'==','$2',M0#{{'+','$1',509}=>{'-','$1',10},b=>{const,2}}}],['$2']}], table),
+ %% Test that maps with duplicate keys work. This depends on the iteration order of hash maps.
+ true = lists:any(
+ fun(N) ->
+ {ok,M0#{1:=1,2:=N},[],[]} == erlang:match_spec_test(M0#{1=>1,2=>N},[{'$1',[{'==','$1',M0#{1=>1,2=>2,{const,2}=>3,{'+',1,1}=>4,{'+',2,0}=>5}}],['$1']}], table)
+ end, [2,3,4,5]),
+
+ %% Maps in body
+ {ok,#{a:=1,b:=2},[],[]} = erlang:match_spec_test(#{a=>1},[{#{a=>'$1'},[],[#{a=>'$1',b=>{const,2}}]}], table),
+ {ok,#{a:=1,b:=#{a:='$1'}},[],[]} = erlang:match_spec_test(#{a=>1},[{#{a=>'$1'},[],[#{a=>'$1',b=>#{a=>{const,'$1'}}}]}], table),
+ {ok,#{a:=1,b:=#{a:='$1'}},[],[]} = erlang:match_spec_test(#{a=>1},[{#{a=>'$1'},[],[#{a=>'$1',{const,b}=>#{a=>{const,'$1'}}}]}], table),
+ %% Test that maps with duplicate keys work. This depends on the iteration order of small maps.
+ true = lists:any(
+ fun(N) ->
+ {ok,#{2=>N},[],[]} == erlang:match_spec_test(#{a=>1},[{#{a=>'$1'},[],[#{{'+',3,-1}=>1,2=>2,{const,2}=>3,{'+',1,'$1'}=>4,{'+',2,0}=>5}]}], table)
+ end,[1,2,3,4,5]),
+ %% Test what happens when a map is collapsed from hash to flatmap
+ {ok,#{0:=1},[],[]} = erlang:match_spec_test(#{0=>1},[{'$1',[],[maps:from_list([{{'-',I,I},1} || I <- lists:seq(1,100)])]}], table),
+
+ %% Large maps in body
+ {ok,#{a:=1,b:=#{a:='$1'}},[],[]} = erlang:match_spec_test(M0#{a=>1},[{#{a=>'$1'},[],[M0#{a=>'$1',b=>M0#{a=>{const,'$1'}}}]}], table),
+ {ok,#{a:=1,b:=#{a:='$1'}},[],[]} = erlang:match_spec_test(M0#{a=>1},[{#{a=>'$1'},[],[M0#{a=>'$1',{const,b}=>M0#{a=>{const,'$1'}}}]}], table),
+ %% Test that maps with duplicate keys work. This depends on the iteration order of hash maps.
+ true = lists:any(
+ fun(N) ->
+ {ok,M0#{1:=1,2:=N},[],[]} == erlang:match_spec_test(M0#{1=>1,2=>5},[{'$1',[],[M0#{1=>1,2=>2,{const,2}=>3,{'+',1,1}=>4,{'*',2,1}=>5}]}], table)
+ end,[2,3,4,5]),
+
ok.
maps_check_loop(M) ->
diff --git a/erts/emulator/valgrind/suppress.patched.3.6.0 b/erts/emulator/valgrind/suppress.patched.3.6.0
index 29f2d3d62d..d3489e5b27 100644
--- a/erts/emulator/valgrind/suppress.patched.3.6.0
+++ b/erts/emulator/valgrind/suppress.patched.3.6.0
@@ -371,7 +371,7 @@ fun:erts_print_scheduler_info
fun:erts_exit
fun:broken_halt_test
fun:erts_debug_set_internal_state_2
-fun:process_main
+...
}
{
diff --git a/erts/emulator/valgrind/suppress.standard b/erts/emulator/valgrind/suppress.standard
index d71033982b..85548e0869 100644
--- a/erts/emulator/valgrind/suppress.standard
+++ b/erts/emulator/valgrind/suppress.standard
@@ -399,7 +399,7 @@ fun:erts_print_scheduler_info
fun:erts_exit
fun:broken_halt_test
fun:erts_debug_set_internal_state_2
-fun:process_main
+...
}
{
diff --git a/erts/lib_src/yielding_c_fun/README.md b/erts/lib_src/yielding_c_fun/README.md
index 9da4711a85..8e47fbcacc 100644
--- a/erts/lib_src/yielding_c_fun/README.md
+++ b/erts/lib_src/yielding_c_fun/README.md
@@ -335,10 +335,13 @@ void original_fun_name_ycf_gen_destroy(void * ycf_yield_state);
```
The `_gen_destroy` function frees the state of a yieldable function
-that has been suspended. Note that the parameter `ycf_yield_state`
-points directly to the yield state, unlike the parameter of the
-`_ycf_gen_yielding` and `_ycf_gen_continue` functions with the same
-name.
+that has been suspended. This function should only be called when one
+wants to cancel a yielded call before completion. Notice that the
+parameter `ycf_yield_state` points directly to the yield state, unlike
+the parameter of the `_ycf_gen_yielding` and `_ycf_gen_continue`
+functions with the same name. The `_gen_destroy` function
+automatically calls the destroy function for active subcalls to
+yieldable functions.
diff --git a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl
index 5610000bee..f36092713e 100644
--- a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl
+++ b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl
@@ -44,70 +44,64 @@ suite() ->
}].
all() ->
- case os:find_executable("ssh") of
- false ->
- {skip, "SSH not installed on host"};
- _ ->
- [hello,
- hello_from_server_first,
- hello_named,
- hello_configured,
- hello_configured_extraopts,
- hello_required,
- hello_required_exists,
- hello_global_pwd,
- hello_no_session_id,
- hello_incomp_base_vsn,
- hello_no_base_cap,
- hello_no_caps,
- no_server_hello,
- no_client_hello,
- get_session_id,
- get_capabilities,
- faulty_user,
- faulty_passwd,
- faulty_port,
- no_host,
- no_port,
- invalid_opt,
- timeout_close_session,
- get,
- get_a_lot,
- timeout_get,
- flush_timeout_get,
- get_xpath,
- get_config,
- get_config_xpath,
- edit_config,
- edit_config_opt_params,
- copy_config,
- delete_config,
- lock,
- unlock,
- kill_session,
- get_no_such_client,
- action,
- send_any_rpc,
- send_any,
- hide_password,
- not_proper_xml,
- prefixed_namespace,
- receive_chunked_data,
- timeout_receive_chunked_data,
- close_while_waiting_for_chunked_data,
- connection_crash,
- get_event_streams,
- create_subscription,
- receive_one_event,
- receive_two_events,
- receive_multiple_events,
- receive_event_and_rpc,
- receive_event_and_rpc_in_chunks,
- multiple_channels,
- kill_session_same_connection
- ]
- end.
-
+ [hello,
+ hello_from_server_first,
+ hello_named,
+ hello_configured,
+ hello_configured_extraopts,
+ hello_required,
+ hello_required_exists,
+ hello_global_pwd,
+ hello_no_session_id,
+ hello_incomp_base_vsn,
+ hello_no_base_cap,
+ hello_no_caps,
+ no_server_hello,
+ no_client_hello,
+ get_session_id,
+ get_capabilities,
+ faulty_user,
+ faulty_passwd,
+ faulty_port,
+ no_host,
+ no_port,
+ invalid_opt,
+ timeout_close_session,
+ get,
+ get_a_lot,
+ timeout_get,
+ flush_timeout_get,
+ get_xpath,
+ get_config,
+ get_config_xpath,
+ edit_config,
+ edit_config_opt_params,
+ copy_config,
+ delete_config,
+ lock,
+ unlock,
+ kill_session,
+ get_no_such_client,
+ action,
+ send_any_rpc,
+ send_any,
+ hide_password,
+ not_proper_xml,
+ prefixed_namespace,
+ receive_chunked_data,
+ timeout_receive_chunked_data,
+ close_while_waiting_for_chunked_data,
+ connection_crash,
+ get_event_streams,
+ create_subscription,
+ receive_one_event,
+ receive_two_events,
+ receive_multiple_events,
+ receive_event_and_rpc,
+ receive_event_and_rpc_in_chunks,
+ multiple_channels,
+ kill_session_same_connection
+ ].
groups() ->
[].
diff --git a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl
index cbdb4cf11a..15e4b2b00b 100644
--- a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl
+++ b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl
@@ -30,13 +30,7 @@ suite() ->
{ct_hooks, [{cth_conn_log,[{ct_netconfc,[{log_type,html}]}]}]}].
all() ->
- case os:find_executable("ssh") of
- false ->
- {skip, "SSH not installed on host"};
- _ ->
- [remote_crash
- ]
- end.
+ [remote_crash].
groups() ->
[].
diff --git a/lib/crypto/c_src/crypto.c b/lib/crypto/c_src/crypto.c
index 5c0a1ccf6a..16d1e3a020 100644
--- a/lib/crypto/c_src/crypto.c
+++ b/lib/crypto/c_src/crypto.c
@@ -111,7 +111,6 @@ static ErlNifFunc nif_funcs[] = {
{"engine_by_id_nif", 1, engine_by_id_nif, 0},
{"engine_init_nif", 1, engine_init_nif, 0},
- {"engine_finish_nif", 1, engine_finish_nif, 0},
{"engine_free_nif", 1, engine_free_nif, 0},
{"engine_load_dynamic_nif", 0, engine_load_dynamic_nif, 0},
{"engine_ctrl_cmd_strings_nif", 3, engine_ctrl_cmd_strings_nif, 0},
diff --git a/lib/crypto/c_src/engine.c b/lib/crypto/c_src/engine.c
index 82ba50e4bd..263acd483d 100644
--- a/lib/crypto/c_src/engine.c
+++ b/lib/crypto/c_src/engine.c
@@ -208,44 +208,27 @@ ERL_NIF_TERM engine_free_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]
// Get Engine
ASSERT(argc == 1);
- if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)
- || ctx->is_functional)
- goto bad_arg;
-
- if (!ENGINE_free(ctx->engine))
- goto err;
- ctx->engine = NULL;
- return atom_ok;
-
- bad_arg:
- err:
- return enif_make_badarg(env);
-#else
- return atom_notsup;
-#endif
-}
-
-ERL_NIF_TERM engine_finish_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
-{/* (Engine) */
-#ifdef HAS_ENGINE_SUPPORT
- struct engine_ctx *ctx;
-
- // Get Engine
- ASSERT(argc == 1);
-
- if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx)
- || !ctx->is_functional)
+ if (!enif_get_resource(env, argv[0], engine_ctx_rtype, (void**)&ctx))
goto bad_arg;
- if (!ENGINE_finish(ctx->engine))
- goto err;
- ctx->is_functional = 0;
+ if (ctx->engine) {
+ if (ctx->is_functional) {
+ if (!ENGINE_finish(ctx->engine))
+ goto err;
+ ctx->is_functional = 0;
+ }
+ if (!ENGINE_free(ctx->engine))
+ goto err;
+ ctx->engine = NULL;
+ }
+ else {
+ ASSERT(!ctx->is_functional);
+ }
return atom_ok;
bad_arg:
err:
return enif_make_badarg(env);
-
#else
return atom_notsup;
#endif
@@ -645,6 +628,10 @@ ERL_NIF_TERM engine_get_next_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
|| !ctx->engine)
goto bad_arg;
+ if (ctx->is_functional) {
+ ENGINE_finish(ctx->engine);
+ ctx->is_functional = 0;
+ }
engine = ENGINE_get_next(ctx->engine);
ctx->engine = NULL;
diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl
index d917caeae9..6a64774f71 100644
--- a/lib/crypto/src/crypto.erl
+++ b/lib/crypto/src/crypto.erl
@@ -1781,7 +1781,7 @@ engine_load_2(Engine, PostCmds, EngineMethods) ->
catch
throw:Error ->
%% The engine registration failed, release the functional reference
- ok = engine_finish_nif(Engine),
+ ok = engine_free_nif(Engine),
throw(Error)
end.
@@ -1800,9 +1800,7 @@ engine_unload(Engine, EngineMethods) ->
try
[ok = engine_nif_wrapper(engine_unregister_nif(Engine, engine_method_atom_to_int(Method))) ||
Method <- EngineMethods],
- %% Release the functional reference from engine_init_nif
- ok = engine_nif_wrapper(engine_finish_nif(Engine)),
- %% Release the structural reference from engine_by_id_nif
+ %% Release the reference from engine_by_id_nif
ok = engine_nif_wrapper(engine_free_nif(Engine))
catch
throw:Error ->
@@ -1981,7 +1979,7 @@ ensure_engine_loaded_2(Engine, Methods) ->
catch
throw:Error ->
%% The engine registration failed, release the functional reference
- ok = engine_finish_nif(Engine),
+ ok = engine_free_nif(Engine),
throw(Error)
end.
%%----------------------------------------------------------------------
@@ -2000,13 +1998,21 @@ ensure_engine_unloaded(Engine) ->
EngineMethods :: [engine_method_type()],
Result :: ok | {error, Reason::term()}.
ensure_engine_unloaded(Engine, EngineMethods) ->
- case engine_remove(Engine) of
- ok ->
- engine_unload(Engine, EngineMethods);
- {error, E} ->
- {error, E}
+ List = crypto:engine_list(),
+ EngineId = crypto:engine_get_id(Engine),
+ case lists:member(EngineId, List) of
+ true ->
+ case engine_remove(Engine) of
+ ok ->
+ engine_unload(Engine, EngineMethods);
+ {error, Error} ->
+ {error, Error}
+ end;
+ false ->
+ engine_unload(Engine, EngineMethods)
end.
+
%%--------------------------------------------------------------------
%%% On load
%%--------------------------------------------------------------------
@@ -2395,7 +2401,6 @@ packed_openssl_version(MAJ, MIN, FIX, P0) ->
%% Engine nifs
engine_by_id_nif(_EngineId) -> ?nif_stub.
engine_init_nif(_Engine) -> ?nif_stub.
-engine_finish_nif(_Engine) -> ?nif_stub.
engine_free_nif(_Engine) -> ?nif_stub.
engine_load_dynamic_nif() -> ?nif_stub.
engine_ctrl_cmd_strings_nif(_Engine, _Cmds, _Optional) -> ?nif_stub.
diff --git a/lib/crypto/test/engine_SUITE.erl b/lib/crypto/test/engine_SUITE.erl
index de902ca3f0..e4bba9c3a8 100644
--- a/lib/crypto/test/engine_SUITE.erl
+++ b/lib/crypto/test/engine_SUITE.erl
@@ -715,8 +715,8 @@ ensure_load(Config) when is_list(Config) ->
Md5Hash1 = crypto:hash(md5, "Don't panic"),
Md5Hash2 = <<0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15>>,
case crypto:ensure_engine_loaded(<<"MD5">>, Engine) of
- {ok, E} ->
- {ok, _E1} = crypto:ensure_engine_loaded(<<"MD5">>, Engine),
+ {ok, E1} ->
+ {ok, E2} = crypto:ensure_engine_loaded(<<"MD5">>, Engine),
case crypto:hash(md5, "Don't panic") of
Md5Hash1 ->
ct:fail(fail_to_load_still_original_engine);
@@ -725,11 +725,37 @@ ensure_load(Config) when is_list(Config) ->
_ ->
ct:fail(fail_to_load_engine)
end,
- ok = crypto:ensure_engine_unloaded(E),
+
+ {ok, E3} = crypto:engine_by_id(<<"MD5">>),
+
+ ok = crypto:ensure_engine_unloaded(E3),
+ case crypto:hash(md5, "Don't panic") of
+ Md5Hash1 ->
+ ok;
+ Md5Hash2 ->
+ ct:fail(fail_to_unload_still_test_engine);
+ _ ->
+ ct:fail(load_engine)
+ end,
+
+ %% ToDo: Why doesn't this work?
+ %% {ok, E4} = crypto:ensure_engine_loaded(<<"MD5">>, Engine),
+ %% case crypto:hash(md5, "Don't panic") of
+ %% Md5Hash1 ->
+ %% ct:fail(fail_to_load_still_original_engine);
+ %% Md5Hash2 ->
+ %% ok;
+ %% _ ->
+ %% ct:fail(fail_to_load_engine)
+ %% end,
+
+ ok = crypto:ensure_engine_unloaded(E1),
case crypto:hash(md5, "Don't panic") of
Md5Hash2 ->
ct:fail(fail_to_unload_still_test_engine);
Md5Hash1 ->
+ ok = crypto:ensure_engine_unloaded(E2),
+ %% ok = crypto:ensure_engine_unloaded(E4);
ok;
_ ->
ct:fail(fail_to_unload_engine)
@@ -743,6 +769,7 @@ ensure_load(Config) when is_list(Config) ->
end
end.
+
%%%----------------------------------------------------------------
%%% Pub/priv key storage tests. Those are for testing the crypto.erl
%%% support for using priv/pub keys stored in an engine.
diff --git a/lib/debugger/src/dbg_ieval.erl b/lib/debugger/src/dbg_ieval.erl
index 9f9682dedb..3185b1e9e3 100644
--- a/lib/debugger/src/dbg_ieval.erl
+++ b/lib/debugger/src/dbg_ieval.erl
@@ -87,12 +87,14 @@ exit_info(Int, AttPid, OrigPid, Reason, ExitInfo) ->
%% Evalute a shell expression in the real process.
%% Called (dbg_icmd) in response to a user request.
%%--------------------------------------------------------------------
-eval_expr(Expr, Bs, Ieval) ->
+eval_expr(Expr0, Bs, Ieval) ->
%% Save current exit info
ExitInfo = get(exit_info),
Stacktrace = get(stacktrace),
+ Expr = expand_records(Expr0, Ieval#ieval.module),
+
%% Emulate a surrounding catch
try debugged_cmd({eval,Expr,Bs}, Bs, Ieval)
catch
@@ -664,6 +666,16 @@ expr({map,Line,E0,Fs0}, Bs0, Ieval0) ->
({map_exact,K,V}, Mi) -> maps:update(K,V,Mi)
end, E, Fs),
{value,Value,merge_bindings(Bs2, Bs1, Ieval)};
+
+%% Record update
+expr({record_update,Line,Es},Bs,#ieval{level=Le}=Ieval0) ->
+ %% Incr Level, we don't need to step (next) trough temp
+ %% variables creation and matching
+ Ieval = Ieval0#ieval{top=false, line=Line, level=Le+1},
+ Seq = fun(E, {_, _, Bs1}) -> expr(E, Bs1, Ieval) end,
+ {value,Value,Bs1} = lists:foldl(Seq, {value, true, Bs}, Es),
+ {value,Value,remove_temporary_bindings(Bs1)};
+
%% A block of statements
expr({block,Line,Es},Bs,Ieval) ->
seq(Es, Bs, Ieval#ieval{line=Line});
@@ -1732,6 +1744,9 @@ add_binding(N,Val,[B1|Bs]) ->
add_binding(N,Val,[]) ->
[{N,Val}].
+remove_temporary_bindings(Bs0) ->
+ [{Var,Val} || {Var, Val} <- Bs0, hd(atom_to_list(Var)) =/= $%].
+
%% get_stacktrace() -> Stacktrace
%% Return the latest stacktrace for the process.
get_stacktrace() ->
@@ -1747,3 +1762,92 @@ get_stacktrace() ->
Stk when is_list(Stk) ->
Stk
end.
+
+%%% eval record exprs
+%%% copied from stdlib/src/shell.erl
+
+expand_records(Expr, Mod) ->
+ try
+ expand_records_1(used_record_defs(Expr, Mod), Expr)
+ catch _:_Err:_ST ->
+ Expr
+ end.
+
+expand_records_1([], Expr) ->
+ Expr;
+expand_records_1(UsedRecords, Expr) ->
+ A = erl_anno:new(1),
+ RecordDefs = [{attribute, A, record,
+ {Name, [{record_field,A,{atom,A,F}} || F <- Fields]}
+ } || {Name,Fields} <- UsedRecords],
+ Forms0 = RecordDefs ++ [{function,A,foo,0,[{clause,A,[],[],[Expr]}]}],
+ Forms = erl_expand_records:module(Forms0, [strict_record_tests]),
+ {function,A,foo,0,[{clause,A,[],[],[NE]}]} = lists:last(Forms),
+ NE.
+
+used_record_defs(E, Mod) ->
+ case mod_recs(Mod) of
+ [] -> [];
+ Recs0 ->
+ Recs = [{Name, Fields} || {{_,_,Name,_}, Fields} <- Recs0],
+ L0 = used_record_defs(E, maps:from_list(Recs), [], []),
+ L1 = lists:zip(L0, lists:seq(1, length(L0))),
+ L2 = lists:keysort(2, lists:ukeysort(1, L1)),
+ [R || {R, _} <- L2]
+ end.
+
+used_record_defs(E, Recs, Skip, Used) ->
+ case used_records(E) of
+ {name,Name,E1} ->
+ case lists:member(Name, Skip) of
+ true ->
+ used_record_defs(E1, Recs, Skip, Used);
+ false ->
+ case maps:get(Name, Recs, undefined) of
+ undefined ->
+ used_record_defs(E1, Recs, [Name|Skip], Used);
+ Fields ->
+ used_record_defs(E1, Recs, [Name|Skip], [{Name, Fields}|Used])
+ end
+ end;
+ {expr,[E1 | Es]} ->
+ used_record_defs(Es, Recs, Skip, used_record_defs(E1, Recs, Skip, Used));
+ _ ->
+ Used
+ end.
+
+mod_recs(Mod) ->
+ case db_ref(Mod) of
+ not_found ->
+ [];
+ ModDb ->
+ dbg_idb:match_object(ModDb, {{record, Mod, '_', '_'}, '_'})
+ end.
+
+used_records({record_index,_,Name,F}) ->
+ {name, Name, F};
+used_records({record,_,Name,Is}) ->
+ {name, Name, Is};
+used_records({record_field,_,R,Name,F}) ->
+ {name, Name, [R | F]};
+used_records({record,_,R,Name,Ups}) ->
+ {name, Name, [R | Ups]};
+used_records({record_field,_,R,F}) -> % illegal
+ {expr, [R | F]};
+used_records({call,_,{atom,_,record},[A,{atom,_,Name}]}) ->
+ {name, Name, A};
+used_records({call,_,{atom,_,is_record},[A,{atom,_,Name}]}) ->
+ {name, Name, A};
+used_records({call,_,{remote,_,{atom,_,erlang},{atom,_,is_record}},
+ [A,{atom,_,Name}]}) ->
+ {name, Name, A};
+used_records({call,_,{atom,_,record_info},[A,{atom,_,Name}]}) ->
+ {name, Name, A};
+used_records({call,A,{tuple,_,[M,F]},As}) ->
+ used_records({call,A,{remote,A,M,F},As});
+used_records({type,_,record,[{atom,_,Name}|Fs]}) ->
+ {name, Name, Fs};
+used_records(T) when is_tuple(T) ->
+ {expr, tuple_to_list(T)};
+used_records(E) ->
+ {expr, E}.
diff --git a/lib/debugger/src/dbg_iload.erl b/lib/debugger/src/dbg_iload.erl
index d15292d51d..e7b74370fc 100644
--- a/lib/debugger/src/dbg_iload.erl
+++ b/lib/debugger/src/dbg_iload.erl
@@ -65,15 +65,14 @@ load_mod1(Mod, File, Binary, Db) ->
store_module(Mod, File, Binary, Db) ->
{interpreter_module, Exp, Abst, Src, MD5} = binary_to_term(Binary),
- Forms = case abstr(Abst) of
- {abstract_v1,_} ->
- exit({Mod,too_old_beam_file});
- {abstract_v2,_} ->
- exit({Mod,too_old_beam_file});
- {raw_abstract_v1,Code0} ->
- Code = interpret_file_attribute(Code0),
- standard_transforms(Code)
- end,
+ Forms0 = case abstr(Abst) of
+ {abstract_v1,_} ->
+ exit({Mod,too_old_beam_file});
+ {abstract_v2,_} ->
+ exit({Mod,too_old_beam_file});
+ {raw_abstract_v1,Code} ->
+ Code
+ end,
dbg_idb:insert(Db, mod_file, File),
dbg_idb:insert(Db, defs, []),
@@ -81,7 +80,11 @@ store_module(Mod, File, Binary, Db) ->
put(fun_count, 0),
put(funs, []),
put(mod_md5, MD5),
- store_forms(Forms, Mod, Db, Exp),
+
+ Forms1 = interpret_file_attribute(Forms0),
+ {Forms,Ctype} = standard_transforms(Forms1),
+ store_forms(Forms, Mod, Db, #{exp=>Exp, ctype => Ctype}),
+
erase(mod_md5),
erase(current_function),
%% store_funs(Db, Mod),
@@ -94,9 +97,24 @@ store_module(Mod, File, Binary, Db) ->
dbg_idb:insert(Db, mod_raw, <<Src/binary,0:8>>). %% Add eos
standard_transforms(Forms0) ->
- Forms = erl_expand_records:module(Forms0, []),
- erl_internal:add_predefined_functions(Forms).
-
+ Forms = erl_internal:add_predefined_functions(Forms0),
+ Ctype = init_calltype(Forms),
+ {Forms, Ctype}.
+
+init_calltype(Forms) ->
+ Locals = [{{Name,Arity},local} || {function,_,Name,Arity,_} <- Forms],
+ Ctype = maps:from_list(Locals),
+ init_calltype_imports(Forms, Ctype).
+
+init_calltype_imports([{attribute,_,import,{Mod,Fs}}|T], Ctype0) ->
+ true = is_atom(Mod),
+ Ctype = lists:foldl(fun(FA, Acc) ->
+ Acc#{FA=>{imported,Mod}}
+ end, Ctype0, Fs),
+ init_calltype_imports(T, Ctype);
+init_calltype_imports([_|T], Ctype) ->
+ init_calltype_imports(T, Ctype);
+init_calltype_imports([], Ctype) -> Ctype.
%% Adjust line numbers using the file/2 attribute.
%% Also take the absolute value of line numbers.
@@ -118,18 +136,24 @@ abstr(Term) -> Term.
% store_funs_1(Fs, Db, Mod);
% store_funs_1([], _, _) -> ok.
-store_forms([{function,_,Name,Arity,Cs0}|Fs], Mod, Db, Exp) ->
+store_forms([{function,_,Name,Arity,Cs0}|Fs], Mod, Db, #{exp:=Exp} = St) ->
FA = {Name,Arity},
put(current_function, FA),
- Cs = clauses(Cs0),
+ Cs = clauses(Cs0,St),
Exported = lists:member(FA, Exp),
dbg_idb:insert(Db, {Mod,Name,Arity,Exported}, Cs),
- store_forms(Fs, Mod, Db, Exp);
-store_forms([{attribute,_,_Name,_Val}|Fs], Mod, Db, Exp) ->
- store_forms(Fs, Mod, Db, Exp);
-store_forms([_|Fs], Mod, Db, Exp) ->
+ store_forms(Fs, Mod, Db, St);
+store_forms([{attribute,_,record,{Name,Defs}}|Fs], Mod, Db, St) ->
+ NDefs = normalise_rec_fields(Defs),
+ Fields = [F || {record_field, _, {atom, _, F}, _} <- NDefs],
+ dbg_idb:insert(Db, {record,Mod,Name,length(Fields)}, Fields),
+ Recs = maps:get(recs, St, #{}),
+ store_forms(Fs, Mod, Db, St#{recs => Recs#{Name => NDefs}});
+store_forms([{attribute,_,_Name,_Val}|Fs], Mod, Db, St) ->
+ store_forms(Fs, Mod, Db, St);
+store_forms([_|Fs], Mod, Db, St) ->
%% Ignore other forms such as {eof,_} or {warning,_}.
- store_forms(Fs, Mod, Db, Exp);
+ store_forms(Fs, Mod, Db, St);
store_forms([], _, _, _) ->
ok.
@@ -155,6 +179,21 @@ spaces(P, Acc) when P > 0 ->
spaces(P-1, [$\s|Acc]);
spaces(_, Acc) -> Acc.
+
+%% normalise_rec_fields([RecDef]) -> [Field].
+%% Normalise the field definitions to always have a default value. If
+%% none has been given then use 'undefined'.
+
+normalise_rec_fields(Fs) ->
+ lists:map(fun ({record_field,Anno,Field}) ->
+ {record_field,Anno,Field,{atom,Anno,undefined}};
+ ({typed_record_field,{record_field,Anno,Field},_Type}) ->
+ {record_field,Anno,Field,{atom,Anno,undefined}};
+ ({typed_record_field,Field,_Type}) ->
+ Field;
+ (F) -> F
+ end, Fs).
+
get_nl([10|T],Pos,Head) -> {lists:reverse([10|Head]),T,Pos};
get_nl([H|T],Pos,Head) ->
get_nl(T,Pos+1,[H|Head]);
@@ -163,82 +202,88 @@ get_nl([],Pos,Head) -> {lists:reverse(Head),[],Pos}.
%%% Rewrite the abstract syntax tree to that it will be easier (== faster)
%%% to interpret.
-clauses([C0|Cs]) ->
- C1 = clause(C0, true),
- [C1|clauses(Cs)];
-clauses([]) -> [].
+clauses([C0|Cs],St) ->
+ C1 = clause(C0, true, St),
+ [C1|clauses(Cs, St)];
+clauses([], _St) -> [].
-clause({clause,Anno,H0,G0,B0}, Lc) ->
- H1 = head(H0),
- G1 = guard(G0),
- B1 = exprs(B0, Lc),
+clause({clause,Anno,H0,G0,B0}, Lc, St) ->
+ H1 = head(H0, St),
+ G1 = guard(G0, St),
+ B1 = exprs(B0, Lc, St),
{clause,ln(Anno),H1,G1,B1}.
-head(Ps) -> patterns(Ps).
+head(Ps, St) -> patterns(Ps, St).
%% These patterns are processed "sequentially" for purposes of variable
%% definition etc.
-patterns([P0|Ps]) ->
- P1 = pattern(P0),
- [P1|patterns(Ps)];
-patterns([]) -> [].
+patterns([P0|Ps], St) ->
+ P1 = pattern(P0, St),
+ [P1|patterns(Ps, St)];
+patterns([], _St) -> [].
%% N.B. Only valid patterns are included here.
-pattern({var,Anno,V}) -> {var,ln(Anno),V};
-pattern({char,Anno,I}) -> {value,ln(Anno),I};
-pattern({integer,Anno,I}) -> {value,ln(Anno),I};
-pattern({match,Anno,Pat1,Pat2}) ->
- {match,ln(Anno),pattern(Pat1),pattern(Pat2)};
-pattern({float,Anno,F}) -> {value,ln(Anno),F};
-pattern({atom,Anno,A}) -> {value,ln(Anno),A};
-pattern({string,Anno,S}) -> {value,ln(Anno),S};
-pattern({nil,Anno}) -> {value,ln(Anno),[]};
-pattern({cons,Anno,H0,T0}) ->
- H1 = pattern(H0),
- T1 = pattern(T0),
+pattern({var,Anno,V}, _St) -> {var,ln(Anno),V};
+pattern({char,Anno,I}, _St) -> {value,ln(Anno),I};
+pattern({integer,Anno,I}, _St) -> {value,ln(Anno),I};
+pattern({match,Anno,Pat1,Pat2}, St) ->
+ {match,ln(Anno),pattern(Pat1, St),pattern(Pat2, St)};
+pattern({float,Anno,F}, _St) -> {value,ln(Anno),F};
+pattern({atom,Anno,A}, _St) -> {value,ln(Anno),A};
+pattern({string,Anno,S}, _St) -> {value,ln(Anno),S};
+pattern({nil,Anno}, _St) -> {value,ln(Anno),[]};
+pattern({cons,Anno,H0,T0}, St) ->
+ H1 = pattern(H0, St),
+ T1 = pattern(T0, St),
{cons,ln(Anno),H1,T1};
-pattern({tuple,Anno,Ps0}) ->
- Ps1 = pattern_list(Ps0),
+pattern({tuple,Anno,Ps0}, St) ->
+ Ps1 = pattern_list(Ps0, St),
{tuple,ln(Anno),Ps1};
-pattern({map,Anno,Fs0}) ->
+pattern({record_index,Anno,Name,Field}, St) ->
+ index_expr(Anno, Field, Name, record_fields(Name, Anno, St));
+pattern({record,Anno,Name,Pfs}, St0) ->
+ Fs = record_fields(Name, Anno, St0),
+ TMs = pattern_list(pattern_fields(Fs, Pfs), St0),
+ {tuple,ln(Anno),[{value,ln(Anno),Name} | TMs]};
+pattern({map,Anno,Fs0}, St) ->
Fs1 = lists:map(fun ({map_field_exact,L,K,V}) ->
- {map_field_exact,L,gexpr(K),pattern(V)}
+ {map_field_exact,L,gexpr(K, St),pattern(V, St)}
end, Fs0),
{map,ln(Anno),Fs1};
-pattern({op,_,'-',{integer,Anno,I}}) ->
+pattern({op,_,'-',{integer,Anno,I}}, _St) ->
{value,ln(Anno),-I};
-pattern({op,_,'+',{integer,Anno,I}}) ->
+pattern({op,_,'+',{integer,Anno,I}}, _St) ->
{value,ln(Anno),I};
-pattern({op,_,'-',{char,Anno,I}}) ->
+pattern({op,_,'-',{char,Anno,I}}, _St) ->
{value,ln(Anno),-I};
-pattern({op,_,'+',{char,Anno,I}}) ->
+pattern({op,_,'+',{char,Anno,I}}, _St) ->
{value,ln(Anno),I};
-pattern({op,_,'-',{float,Anno,I}}) ->
+pattern({op,_,'-',{float,Anno,I}}, _St) ->
{value,ln(Anno),-I};
-pattern({op,_,'+',{float,Anno,I}}) ->
+pattern({op,_,'+',{float,Anno,I}}, _St) ->
{value,ln(Anno),I};
-pattern({bin,Anno,Grp}) ->
- Grp1 = pattern_list(bin_expand_strings(Grp)),
+pattern({bin,Anno,Grp}, St) ->
+ Grp1 = pattern_list(bin_expand_strings(Grp), St),
{bin,ln(Anno),Grp1};
-pattern({bin_element,Anno,Expr0,Size0,Type0}) ->
+pattern({bin_element,Anno,Expr0,Size0,Type0}, St) ->
{Size1,Type} = make_bit_type(Anno, Size0, Type0),
- Expr1 = pattern(Expr0),
+ Expr1 = pattern(Expr0,St),
Expr = coerce_to_float(Expr1, Type0),
- Size = expr(Size1, false),
+ Size = expr(Size1, false, St),
{bin_element,ln(Anno),Expr,Size,Type};
%% Evaluate compile-time expressions.
-pattern({op,_,'++',{nil,_},R}) ->
- pattern(R);
-pattern({op,_,'++',{cons,Li,H,T},R}) ->
- pattern({cons,Li,H,{op,Li,'++',T,R}});
-pattern({op,_,'++',{string,Li,L},R}) ->
- pattern(string_to_conses(Li, L, R));
-pattern({op,_Line,_Op,_A}=Op) ->
- pattern(erl_eval:partial_eval(Op));
-pattern({op,_Line,_Op,_L,_R}=Op) ->
- pattern(erl_eval:partial_eval(Op)).
+pattern({op,_,'++',{nil,_},R}, St) ->
+ pattern(R, St);
+pattern({op,_,'++',{cons,Li,H,T},R}, St) ->
+ pattern({cons,Li,H,{op,Li,'++',T,R}}, St);
+pattern({op,_,'++',{string,Li,L},R}, St) ->
+ pattern(string_to_conses(Li, L, R), St);
+pattern({op,_Line,_Op,_A}=Op, St) ->
+ pattern(erl_eval:partial_eval(Op), St);
+pattern({op,_Line,_Op,_L,_R}=Op, St) ->
+ pattern(erl_eval:partial_eval(Op), St).
string_to_conses(Anno, Cs, Tail) ->
lists:foldr(fun (C, T) -> {cons,Anno,{char,Anno,C},T} end, Tail, Cs).
@@ -254,203 +299,268 @@ coerce_to_float(E, _) -> E.
%% These patterns are processed "in parallel" for purposes of variable
%% definition etc.
-pattern_list([P0|Ps]) ->
- P1 = pattern(P0),
- [P1|pattern_list(Ps)];
-pattern_list([]) -> [].
-
-guard([G0|Gs]) ->
- G1 = and_guard(G0),
- [G1|guard(Gs)];
-guard([]) -> [].
-
-and_guard([G0|Gs]) ->
- G1 = guard_test(G0),
- [G1|and_guard(Gs)];
-and_guard([]) -> [].
-
-guard_test({call,Anno,{remote,_,{atom,_,erlang},{atom,_,F}},As0}) ->
- As = gexpr_list(As0),
+pattern_list([P0|Ps], St) ->
+ P1 = pattern(P0, St),
+ [P1|pattern_list(Ps, St)];
+pattern_list([], _St) -> [].
+
+guard([G0|Gs], St) ->
+ G1 = and_guard(G0, St),
+ [G1|guard(Gs, St)];
+guard([], _St) -> [].
+
+and_guard([G0|Gs], St) ->
+ G1 = guard_test(G0, St),
+ [G1|and_guard(Gs, St)];
+and_guard([], _St) -> [].
+
+
+guard_test({call,Anno,{atom,_,is_record},[A,{atom,_,Name}]}, St) ->
+ record_test_in_guard(Anno, A, Name, St);
+guard_test({call,Anno,{remote,_,{atom,_,erlang},{atom,_,is_record}}, [A,{atom,_,Name}]},
+ St) ->
+ record_test_in_guard(Anno, A, Name, St);
+guard_test({call,Anno,{tuple,_,[{atom,_,erlang},{atom,_,is_record}]},
+ [A,{atom,_,Name}]}, St) ->
+ record_test_in_guard(Anno, A, Name, St);
+guard_test({call,Anno,{remote,_,{atom,_,erlang},{atom,_,F}},As0}, St) ->
+ As = gexpr_list(As0, St),
+ {safe_bif,ln(Anno),erlang,F,As};
+guard_test({call,Anno,{atom,_, F0},As0}, St) ->
+ F = normalise_test(F0, length(As0)),
+ true = erl_internal:bif(F,length(As0)),
+ As = gexpr_list(As0, St),
{safe_bif,ln(Anno),erlang,F,As};
-guard_test({op,Anno,Op,L0}) ->
+guard_test({op,Anno,Op,L0}, St) ->
true = erl_internal:arith_op(Op, 1) orelse %Assertion.
erl_internal:bool_op(Op, 1),
- L1 = gexpr(L0),
+ L1 = gexpr(L0, St),
{safe_bif,ln(Anno),erlang,Op,[L1]};
-guard_test({op,Anno,Op,L0,R0}) when Op =:= 'andalso'; Op =:= 'orelse' ->
- L1 = gexpr(L0),
- R1 = gexpr(R0), %They see the same variables
+guard_test({op,Anno,Op,L0,R0}, St) when Op =:= 'andalso'; Op =:= 'orelse' ->
+ L1 = gexpr(L0, St),
+ R1 = gexpr(R0, St), %They see the same variables
{Op,ln(Anno),L1,R1};
-guard_test({op,Anno,Op,L0,R0}) ->
+guard_test({op,Anno,Op,L0,R0}, St) ->
true = erl_internal:comp_op(Op, 2) orelse %Assertion.
erl_internal:bool_op(Op, 2) orelse
erl_internal:arith_op(Op, 2),
- L1 = gexpr(L0),
- R1 = gexpr(R0), %They see the same variables
+ L1 = gexpr(L0, St),
+ R1 = gexpr(R0, St), %They see the same variables
{safe_bif,ln(Anno),erlang,Op,[L1,R1]};
-guard_test({var,_,_}=V) ->V; % Boolean var
-guard_test({atom,Anno,true}) -> {value,ln(Anno),true};
+guard_test({record_field,_A,R,Name,F}, St) ->
+ Anno = erl_parse:first_anno(R),
+ get_record_field_guard(Anno, R, F, Name, St);
+guard_test({var,_,_}=V, _St) ->V; % Boolean var
+guard_test({atom,Anno,true}, _St) -> {value,ln(Anno),true};
%% All other constants at this level means false.
-guard_test({atom,Anno,_}) -> {value,ln(Anno),false};
-guard_test({integer,Anno,_}) -> {value,ln(Anno),false};
-guard_test({char,Anno,_}) -> {value,ln(Anno),false};
-guard_test({float,Anno,_}) -> {value,ln(Anno),false};
-guard_test({string,Anno,_}) -> {value,ln(Anno),false};
-guard_test({nil,Anno}) -> {value,ln(Anno),false};
-guard_test({cons,Anno,_,_}) -> {value,ln(Anno),false};
-guard_test({tuple,Anno,_}) -> {value,ln(Anno),false};
-guard_test({map,Anno,_}) -> {value,ln(Anno),false};
-guard_test({map,Anno,_,_}) -> {value,ln(Anno),false};
-guard_test({bin,Anno,_}) -> {value,ln(Anno),false}.
-
-gexpr({var,Anno,V}) -> {var,ln(Anno),V};
-gexpr({integer,Anno,I}) -> {value,ln(Anno),I};
-gexpr({char,Anno,I}) -> {value,ln(Anno),I};
-gexpr({float,Anno,F}) -> {value,ln(Anno),F};
-gexpr({atom,Anno,A}) -> {value,ln(Anno),A};
-gexpr({string,Anno,S}) -> {value,ln(Anno),S};
-gexpr({nil,Anno}) -> {value,ln(Anno),[]};
-gexpr({cons,Anno,H0,T0}) ->
- case {gexpr(H0),gexpr(T0)} of
+guard_test({atom,Anno,_}, _St) -> {value,ln(Anno),false};
+guard_test({integer,Anno,_}, _St) -> {value,ln(Anno),false};
+guard_test({char,Anno,_}, _St) -> {value,ln(Anno),false};
+guard_test({float,Anno,_}, _St) -> {value,ln(Anno),false};
+guard_test({string,Anno,_}, _St) -> {value,ln(Anno),false};
+guard_test({nil,Anno}, _St) -> {value,ln(Anno),false};
+guard_test({cons,Anno,_,_}, _St) -> {value,ln(Anno),false};
+guard_test({tuple,Anno,_}, _St) -> {value,ln(Anno),false};
+guard_test({map,Anno,_}, _St) -> {value,ln(Anno),false};
+guard_test({map,Anno,_,_}, _St) -> {value,ln(Anno),false};
+guard_test({bin,Anno,_}, _St) -> {value,ln(Anno),false}.
+
+gexpr({var,Anno,V}, _St) -> {var,ln(Anno),V};
+gexpr({integer,Anno,I}, _St) -> {value,ln(Anno),I};
+gexpr({char,Anno,I}, _St) -> {value,ln(Anno),I};
+gexpr({float,Anno,F}, _St) -> {value,ln(Anno),F};
+gexpr({atom,Anno,A}, _St) -> {value,ln(Anno),A};
+gexpr({string,Anno,S}, _St) -> {value,ln(Anno),S};
+gexpr({nil,Anno}, _St) -> {value,ln(Anno),[]};
+gexpr({cons,Anno,H0,T0}, St) ->
+ case {gexpr(H0, St),gexpr(T0, St)} of
{{value,Line,H1},{value,Line,T1}} -> {value,Line,[H1|T1]};
{H1,T1} -> {cons,ln(Anno),H1,T1}
end;
-gexpr({tuple,Anno,Es0}) ->
- Es1 = gexpr_list(Es0),
+gexpr({tuple,Anno,Es0}, St) ->
+ Es1 = gexpr_list(Es0, St),
{tuple,ln(Anno),Es1};
-gexpr({map,Anno,Fs0}) ->
- new_map(Fs0, Anno, fun gexpr/1);
-gexpr({map,Anno,E0,Fs0}) ->
- E1 = gexpr(E0),
- Fs1 = map_fields(Fs0, fun gexpr/1),
+gexpr({record, _, _, _}=Rec, St) ->
+ expr(Rec, false, St);
+gexpr({map,Anno,Fs0}, St) ->
+ new_map(Fs0, Anno, St, fun(F) -> gexpr(F,St) end);
+gexpr({map,Anno,E0,Fs0}, St) ->
+ E1 = gexpr(E0, St),
+ Fs1 = map_fields(Fs0, St, fun(F) -> gexpr(F,St) end),
{map,ln(Anno),E1,Fs1};
-gexpr({bin,Anno,Flds0}) ->
- Flds = gexpr_list(bin_expand_strings(Flds0)),
+gexpr({bin,Anno,Flds0}, St) ->
+ Flds = gexpr_list(bin_expand_strings(Flds0), St),
{bin,ln(Anno),Flds};
-gexpr({bin_element,Anno,Expr0,Size0,Type0}) ->
+gexpr({bin_element,Anno,Expr0,Size0,Type0}, St) ->
{Size1,Type} = make_bit_type(Anno, Size0, Type0),
- Expr = gexpr(Expr0),
- Size = gexpr(Size1),
+ Expr = gexpr(Expr0, St),
+ Size = gexpr(Size1, St),
{bin_element,ln(Anno),Expr,Size,Type};
-%%% The erl_expand_records pass has added the module name 'erlang' to
-%%% all BIF calls, even in guards.
-gexpr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,self}},[]}) ->
+gexpr({call,Anno,{atom,_,is_record},[A,{atom,_,Name}]}, St) ->
+ record_test_in_guard(Anno, A, Name, St);
+gexpr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,is_record}}, [A,{atom,_,Name}]},
+ St) ->
+ record_test_in_guard(Anno, A, Name, St);
+gexpr({call,Anno,{tuple,_,[{atom,_,erlang},{atom,_,is_record}]},
+ [A,{atom,_,Name}]}, St) ->
+ record_test_in_guard(Anno, A, Name, St);
+gexpr({record_field,_A,R,Name,F}, St) ->
+ Anno = erl_parse:first_anno(R),
+ get_record_field_guard(Anno, R, F, Name, St);
+gexpr({record_index,Anno,Name,F}, St) ->
+ I = index_expr(Anno, F, Name, record_fields(Name, Anno, St)),
+ gexpr(I, St);
+gexpr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,self}},[]}, _St) ->
{dbg,ln(Anno),self,[]};
-gexpr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,F}},As0}) ->
- As = gexpr_list(As0),
+gexpr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,F}},As0}, St) ->
+ As = gexpr_list(As0, St),
{safe_bif,ln(Anno),erlang,F,As};
-gexpr({op,Anno,Op,A0}) ->
+gexpr({call,Anno,{atom,_,self},[]}, _St) ->
+ {dbg,ln(Anno),self,[]};
+gexpr({call,Anno,{atom,_, F},As0}, St) ->
+ true = erl_internal:bif(F,length(As0)),
+ As = gexpr_list(As0, St),
+ {safe_bif,ln(Anno),erlang,F,As};
+gexpr({op,Anno,Op,A0}, St) ->
erl_internal:arith_op(Op, 1),
- A1 = gexpr(A0),
+ A1 = gexpr(A0, St),
{safe_bif,ln(Anno),erlang,Op,[A1]};
-gexpr({op,Anno,Op,L0,R0}) when Op =:= 'andalso'; Op =:= 'orelse' ->
- L1 = gexpr(L0),
- R1 = gexpr(R0), %They see the same variables
+gexpr({op,Anno,Op,L0,R0}, St) when Op =:= 'andalso'; Op =:= 'orelse' ->
+ L1 = gexpr(L0, St),
+ R1 = gexpr(R0, St), %They see the same variables
{Op,ln(Anno),L1,R1};
-gexpr({op,Anno,Op,L0,R0}) ->
+gexpr({op,Anno,Op,L0,R0}, St) ->
true = erl_internal:arith_op(Op, 2) orelse erl_internal:comp_op(Op, 2)
orelse erl_internal:bool_op(Op, 2),
- L1 = gexpr(L0),
- R1 = gexpr(R0), %They see the same variables
+ L1 = gexpr(L0, St),
+ R1 = gexpr(R0, St), %They see the same variables
{safe_bif,ln(Anno),erlang,Op,[L1,R1]}.
%% These expressions are processed "in parallel" for purposes of variable
%% definition etc.
-gexpr_list([E0|Es]) ->
- E1 = gexpr(E0),
- [E1|gexpr_list(Es)];
-gexpr_list([]) -> [].
+gexpr_list([E0|Es], St) ->
+ E1 = gexpr(E0, St),
+ [E1|gexpr_list(Es, St)];
+gexpr_list([], _St) -> [].
%% These expressions are processed "sequentially" for purposes of variable
%% definition etc.
-exprs([E], Lc) ->
- [expr(E, Lc)];
-exprs([E0|Es], Lc) ->
- E1 = expr(E0, false),
- [E1|exprs(Es, Lc)];
-exprs([], _Lc) -> [].
-
-expr({var,Anno,V}, _Lc) -> {var,ln(Anno),V};
-expr({integer,Anno,I}, _Lc) -> {value,ln(Anno),I};
-expr({char,Anno,I}, _Lc) -> {value,ln(Anno),I};
-expr({float,Anno,F}, _Lc) -> {value,ln(Anno),F};
-expr({atom,Anno,A}, _Lc) -> {value,ln(Anno),A};
-expr({string,Anno,S}, _Lc) -> {value,ln(Anno),S};
-expr({nil,Anno}, _Lc) -> {value,ln(Anno),[]};
-expr({cons,Anno,H0,T0}, _Lc) ->
- case {expr(H0, false),expr(T0, false)} of
+exprs([E], Lc, St) ->
+ [expr(E, Lc, St)];
+exprs([E0|Es], Lc, St) ->
+ E1 = expr(E0, false, St),
+ [E1|exprs(Es, Lc, St)];
+exprs([], _Lc, _St) -> [].
+
+expr({var,Anno,V}, _Lc, _St) -> {var,ln(Anno),V};
+expr({integer,Anno,I}, _Lc, _St) -> {value,ln(Anno),I};
+expr({char,Anno,I}, _Lc, _St) -> {value,ln(Anno),I};
+expr({float,Anno,F}, _Lc, _St) -> {value,ln(Anno),F};
+expr({atom,Anno,A}, _Lc, _St) -> {value,ln(Anno),A};
+expr({string,Anno,S}, _Lc, _St) -> {value,ln(Anno),S};
+expr({nil,Anno}, _Lc, _St) -> {value,ln(Anno),[]};
+expr({cons,Anno,H0,T0}, _Lc, St) ->
+ case {expr(H0, false, St),expr(T0, false, St)} of
{{value,Line,H1},{value,Line,T1}} -> {value,Line,[H1|T1]};
{H1,T1} -> {cons,ln(Anno),H1,T1}
end;
-expr({tuple,Anno,Es0}, _Lc) ->
- Es1 = expr_list(Es0),
+expr({tuple,Anno,Es0}, _Lc, St) ->
+ Es1 = expr_list(Es0, St),
{tuple,ln(Anno),Es1};
-expr({map,Anno,Fs}, _Lc) ->
- new_map(Fs, Anno, fun (E) -> expr(E, false) end);
-expr({map,Anno,E0,Fs0}, _Lc) ->
- E1 = expr(E0, false),
- Fs1 = map_fields(Fs0),
+expr({record_index,Anno,Name,F}, Lc, St) ->
+ I = index_expr(Anno, F, Name, record_fields(Name, Anno, St)),
+ expr(I, Lc, St);
+expr({record_field,_A,R,Name,F}, _Lc, St) ->
+ Anno = erl_parse:first_anno(R),
+ get_record_field_body(Anno, R, F, Name, St);
+expr({record,Anno,R,Name,Us}, Lc, St) ->
+ Ue = record_update(R, Name, record_fields(Name, Anno, St), Us, St),
+ expr(Ue, Lc, St);
+expr({record,Anno,Name,Is}, Lc, St) ->
+ expr({tuple,Anno,[{atom,Anno,Name} |
+ record_inits(record_fields(Name, Anno, St), Is)]},
+ Lc, St);
+expr({record_update, Anno, Es0}, Lc, St) ->
+ %% Unfold block into a sequence.
+ Es1 = exprs(Es0, Lc, St),
+ {record_update,ln(Anno),Es1};
+expr({map,Anno,Fs}, _Lc, St) ->
+ new_map(Fs, Anno, St, fun (E) -> expr(E, false, St) end);
+expr({map,Anno,E0,Fs0}, _Lc, St) ->
+ E1 = expr(E0, false, St),
+ Fs1 = map_fields(Fs0, St),
{map,ln(Anno),E1,Fs1};
-expr({block,Anno,Es0}, Lc) ->
+expr({block,Anno,Es0}, Lc, St) ->
%% Unfold block into a sequence.
- Es1 = exprs(Es0, Lc),
+ Es1 = exprs(Es0, Lc, St),
{block,ln(Anno),Es1};
-expr({'if',Anno,Cs0}, Lc) ->
- Cs1 = icr_clauses(Cs0, Lc),
+expr({'if',Anno,Cs0}, Lc, St) ->
+ Cs1 = icr_clauses(Cs0, Lc, St),
{'if',ln(Anno),Cs1};
-expr({'case',Anno,E0,Cs0}, Lc) ->
- E1 = expr(E0, false),
- Cs1 = icr_clauses(Cs0, Lc),
+expr({'case',Anno,E0,Cs0}, Lc, St) ->
+ E1 = expr(E0, false, St),
+ Cs1 = icr_clauses(Cs0, Lc, St),
{'case',ln(Anno),E1,Cs1};
-expr({'receive',Anno,Cs0}, Lc) ->
- Cs1 = icr_clauses(Cs0, Lc),
+expr({'receive',Anno,Cs0}, Lc, St) ->
+ Cs1 = icr_clauses(Cs0, Lc, St),
{'receive',ln(Anno),Cs1};
-expr({'receive',Anno,Cs0,To0,ToEs0}, Lc) ->
- To1 = expr(To0, false),
- ToEs1 = exprs(ToEs0, Lc),
- Cs1 = icr_clauses(Cs0, Lc),
+expr({'receive',Anno,Cs0,To0,ToEs0}, Lc, St) ->
+ To1 = expr(To0, false, St),
+ ToEs1 = exprs(ToEs0, Lc, St),
+ Cs1 = icr_clauses(Cs0, Lc, St),
{'receive',ln(Anno),Cs1,To1,ToEs1};
-expr({'fun',Anno,{clauses,Cs0}}, _Lc) ->
+expr({'fun',Anno,{clauses,Cs0}}, _Lc, St) ->
%% New R10B-2 format (abstract_v2).
- Cs = fun_clauses(Cs0),
+ Cs = fun_clauses(Cs0, St),
Name = new_fun_name(),
{make_fun,ln(Anno),Name,Cs};
-expr({'fun',Anno,{function,F,A}}, _Lc) ->
+expr({'fun',Anno,{function,F,A}}, _Lc, _St) ->
%% New R8 format (abstract_v2).
Line = ln(Anno),
As = new_vars(A, Line),
Name = new_fun_name(),
Cs = [{clause,Line,As,[],[{local_call,Line,F,As,true}]}],
{make_fun,Line,Name,Cs};
-expr({named_fun,Anno,FName,Cs0}, _Lc) ->
- Cs = fun_clauses(Cs0),
+expr({named_fun,Anno,FName,Cs0}, _Lc, St) ->
+ Cs = fun_clauses(Cs0, St),
Name = new_fun_name(),
{make_named_fun,ln(Anno),Name,FName,Cs};
-expr({'fun',Anno,{function,{atom,_,M},{atom,_,F},{integer,_,A}}}, _Lc)
+expr({'fun',Anno,{function,{atom,_,M},{atom,_,F},{integer,_,A}}}, _Lc, _St)
when 0 =< A, A =< 255 ->
%% New format in R15 for fun M:F/A (literal values).
{value,ln(Anno),erlang:make_fun(M, F, A)};
-expr({'fun',Anno,{function,M,F,A}}, _Lc) ->
+expr({'fun',Anno,{function,M,F,A}}, _Lc, St) ->
%% New format in R15 for fun M:F/A (one or more variables).
- MFA = expr_list([M,F,A]),
+ MFA = expr_list([M,F,A], St),
{make_ext_fun,ln(Anno),MFA};
-expr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,self}},[]}, _Lc) ->
+expr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,self}},[]}, _Lc, _St) ->
{dbg,ln(Anno),self,[]};
-expr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,throw}},[_]=As}, _Lc) ->
- {dbg,ln(Anno),throw,expr_list(As)};
-expr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,error}},[_]=As}, _Lc) ->
- {dbg,ln(Anno),error,expr_list(As)};
-expr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,exit}},[_]=As}, _Lc) ->
- {dbg,ln(Anno),exit,expr_list(As)};
-expr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,raise}},[_,_,_]=As}, _Lc) ->
- {dbg,ln(Anno),raise,expr_list(As)};
-expr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,apply}},[_,_,_]=As0}, Lc) ->
- As = expr_list(As0),
+expr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,throw}},[_]=As}, _Lc, St) ->
+ {dbg,ln(Anno),throw,expr_list(As, St)};
+expr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,error}},[_]=As}, _Lc, St) ->
+ {dbg,ln(Anno),error,expr_list(As, St)};
+expr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,exit}},[_]=As}, _Lc, St) ->
+ {dbg,ln(Anno),exit,expr_list(As, St)};
+expr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,raise}},[_,_,_]=As}, _Lc, St) ->
+ {dbg,ln(Anno),raise,expr_list(As, St)};
+expr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,apply}},[_,_,_]=As0}, Lc, St) ->
+ As = expr_list(As0, St),
{apply,ln(Anno),As,Lc};
-expr({call,Anno,{remote,_,{atom,_,Mod},{atom,_,Func}},As0}, Lc) ->
- As = expr_list(As0),
+expr({call,Anno,{atom,_,is_record},[A,{atom,_,Name}]}, Lc, St) ->
+ record_test_in_body(Anno, A, Name, Lc, St);
+expr({call,Anno,{remote,_,{atom,_,erlang},{atom,_,is_record}}, [A,{atom,_,Name}]},
+ Lc, St) ->
+ record_test_in_body(Anno, A, Name, Lc, St);
+expr({call,Anno,{tuple,_,[{atom,_,erlang},{atom,_,is_record}]},
+ [A,{atom,_,Name}]}, Lc, St) ->
+ record_test_in_body(Anno, A, Name, Lc, St);
+expr({call,Anno,{atom,_AnnoA,record_info},[_,_]=As0}, Lc, St) ->
+ As = expr_list(As0, St),
+ expr(record_info_call(Anno, As, St), Lc, St);
+expr({call,Anno,{remote,_,{atom,_,Mod},{atom,_,Func}},As0}, Lc, St) ->
+ As = expr_list(As0, St),
case erlang:is_builtin(Mod, Func, length(As)) of
false ->
{call_remote,ln(Anno),Mod,Func,As,Lc};
@@ -460,68 +570,84 @@ expr({call,Anno,{remote,_,{atom,_,Mod},{atom,_,Func}},As0}, Lc) ->
unsafe ->{bif,ln(Anno),Mod,Func,As}
end
end;
-expr({call,Anno,{remote,_,Mod0,Func0},As0}, Lc) ->
+expr({call,Anno,{remote,_,Mod0,Func0},As0}, Lc, St) ->
%% New R8 format (abstract_v2).
- Mod = expr(Mod0, false),
- Func = expr(Func0, false),
- As = consify(expr_list(As0)),
+ Mod = expr(Mod0, false, St),
+ Func = expr(Func0, false, St),
+ As = consify(expr_list(As0, St)),
{apply,ln(Anno),[Mod,Func,As],Lc};
-expr({call,Anno,{atom,_,Func},As0}, Lc) ->
- As = expr_list(As0),
- {local_call,ln(Anno),Func,As,Lc};
-expr({call,Anno,Fun0,As0}, Lc) ->
- Fun = expr(Fun0, false),
- As = expr_list(As0),
+expr({call,Anno,{atom,_,Func}=F,As0}, Lc, #{ctype:=Ctypes} = St) ->
+ As = expr_list(As0, St),
+ Ar = length(As),
+ NA = {Func,Ar},
+ Special = lists:member(Func, [self,throw,error,exit,raise,apply]),
+ case maps:get(NA, Ctypes, undefined) of
+ local ->
+ {local_call,ln(Anno),Func,As,Lc};
+ {imported, Mod} ->
+ {call_remote,ln(Anno),Mod,Func,As,Lc};
+ undefined when Special ->
+ expr({call,Anno,{remote,Anno,{atom,Anno,erlang},F},As0}, Lc, St);
+ undefined ->
+ case erl_internal:bif(Func, Ar) andalso bif_type(erlang, Func, Ar) of
+ false -> {local_call,ln(Anno),Func,As,Lc};
+ safe -> {safe_bif,ln(Anno),erlang,Func,As};
+ unsafe -> {bif,ln(Anno),erlang,Func,As}
+ end
+ end;
+expr({call,Anno,Fun0,As0}, Lc, St) ->
+ Fun = expr(Fun0, false, St),
+ As = expr_list(As0, St),
{apply_fun,ln(Anno),Fun,As,Lc};
-expr({'catch',Anno,E0}, _Lc) ->
+expr({'catch',Anno,E0}, _Lc, St) ->
%% No new variables added.
- E1 = expr(E0, false),
+ E1 = expr(E0, false, St),
{'catch',ln(Anno),E1};
-expr({'try',Anno,Es0,CaseCs0,CatchCs0,As0}, Lc) ->
+expr({'try',Anno,Es0,CaseCs0,CatchCs0,As0}, Lc, St) ->
%% No new variables added.
- Es = expr_list(Es0),
- CaseCs = icr_clauses(CaseCs0, Lc),
- CatchCs = icr_clauses(CatchCs0, Lc),
- As = expr_list(As0),
+ Es = expr_list(Es0, St),
+ CaseCs = icr_clauses(CaseCs0, Lc, St),
+ CatchCs = icr_clauses(CatchCs0, Lc, St),
+ As = expr_list(As0, St),
{'try',ln(Anno),Es,CaseCs,CatchCs,As};
-expr({lc,_,_,_}=Compr, _Lc) ->
- expr_lc_bc(Compr);
-expr({bc,_,_,_}=Compr, _Lc) ->
- expr_lc_bc(Compr);
-expr({match,Anno,P0,E0}, _Lc) ->
- E1 = expr(E0, false),
- P1 = pattern(P0),
+expr({lc,_,_,_}=Compr, _Lc, St) ->
+ expr_lc_bc(Compr, St);
+expr({bc,_,_,_}=Compr, _Lc, St) ->
+ expr_lc_bc(Compr, St);
+expr({match,Anno,P0,E0}, _Lc, St) ->
+ E1 = expr(E0, false, St),
+ P1 = pattern(P0, St),
{match,ln(Anno),P1,E1};
-expr({op,Anno,Op,A0}, _Lc) ->
- A1 = expr(A0, false),
+expr({op,Anno,Op,A0}, _Lc, St) ->
+ A1 = expr(A0, false, St),
{op,ln(Anno),Op,[A1]};
-expr({op,Anno,'++',L0,R0}, _Lc) ->
- L1 = expr(L0, false),
- R1 = expr(R0, false), %They see the same variables
+expr({op,Anno,'++',L0,R0}, _Lc, St) ->
+ L1 = expr(L0, false, St),
+ R1 = expr(R0, false, St), %They see the same variables
{op,ln(Anno),append,[L1,R1]};
-expr({op,Anno,'--',L0,R0}, _Lc) ->
- L1 = expr(L0, false),
- R1 = expr(R0, false), %They see the same variables
+expr({op,Anno,'--',L0,R0}, _Lc, St) ->
+ L1 = expr(L0, false, St),
+ R1 = expr(R0, false, St), %They see the same variables
{op,ln(Anno),subtract,[L1,R1]};
-expr({op,Anno,'!',L0,R0}, _Lc) ->
- L1 = expr(L0, false),
- R1 = expr(R0, false), %They see the same variables
+expr({op,Anno,'!',L0,R0}, _Lc, St) ->
+ L1 = expr(L0, false, St),
+ R1 = expr(R0, false, St), %They see the same variables
{send,ln(Anno),L1,R1};
-expr({op,Anno,Op,L0,R0}, _Lc) when Op =:= 'andalso'; Op =:= 'orelse' ->
- L1 = expr(L0, false),
- R1 = expr(R0, false), %They see the same variables
+expr({op,Anno,Op,L0,R0}, _Lc, St) when Op =:= 'andalso'; Op =:= 'orelse' ->
+ L1 = expr(L0, false, St),
+ R1 = expr(R0, false, St), %They see the same variables
{Op,ln(Anno),L1,R1};
-expr({op,Anno,Op,L0,R0}, _Lc) ->
- L1 = expr(L0, false),
- R1 = expr(R0, false), %They see the same variables
+expr({op,Anno,Op,L0,R0}, _Lc, St) ->
+ L1 = expr(L0, false, St),
+ R1 = expr(R0, false, St), %They see the same variables
{op,ln(Anno),Op,[L1,R1]};
-expr({bin,Anno,Grp}, _Lc) ->
- Grp1 = expr_list(bin_expand_strings(Grp)),
+expr({bin,Anno,Grp}, _Lc, St) ->
+ Grp1 = expr_list(bin_expand_strings(Grp), St),
{bin,ln(Anno),Grp1};
-expr({bin_element,Anno,Expr0,Size0,Type0}, _Lc) ->
+expr({bin_element,Anno,Expr0,Size0,Type0}, _Lc, St) ->
{Size1,Type} = make_bit_type(Anno, Size0, Type0),
- Expr = expr(Expr0, false),
- Size = expr(Size1, false),
+ Expr = expr(Expr0, false, St),
+ Size = expr(Size1, false, St),
{bin_element,ln(Anno),Expr,Size,Type}.
consify([A|As]) ->
@@ -538,23 +664,240 @@ make_bit_type(_Line, Size, Type0) -> %Integer or 'all'
{ok,Size,Bt} = erl_bits:set_bit_type(Size, Type0),
{Size,erl_bits:as_list(Bt)}.
-expr_lc_bc({Tag,Anno,E0,Gs0}) ->
+expr_lc_bc({Tag,Anno,E0,Gs0}, St) ->
Gs = lists:map(fun ({generate,L,P0,Qs}) ->
- {generate,L,pattern(P0),expr(Qs, false)};
+ {generate,L,pattern(P0, St),expr(Qs, false, St)};
({b_generate,L,P0,Qs}) -> %R12.
- {b_generate,L,pattern(P0),expr(Qs, false)};
+ {b_generate,L,pattern(P0, St),expr(Qs, false, St)};
(Expr) ->
- case is_guard_test(Expr) of
- true -> {guard,guard([[Expr]])};
- false -> expr(Expr, false)
+ case is_guard_test(Expr, St) of
+ true -> {guard,guard([[Expr]], St)};
+ false -> expr(Expr, false, St)
end
end, Gs0),
- {Tag,ln(Anno),expr(E0, false),Gs}.
-
-is_guard_test(Expr) ->
- IsOverridden = fun({_,_}) -> true end,
+ {Tag,ln(Anno),expr(E0, false, St),Gs}.
+
+is_guard_test(Expr, #{ctype:=Ctypes}) ->
+ IsOverridden = fun(NA) ->
+ case maps:get(NA, Ctypes, undefined) of
+ local -> true;
+ {imported,_} -> true;
+ undefined -> false
+ end
+ end,
erl_lint:is_guard_test(Expr, [], IsOverridden).
+normalise_test(atom, 1) -> is_atom;
+normalise_test(binary, 1) -> is_binary;
+normalise_test(float, 1) -> is_float;
+normalise_test(function, 1) -> is_function;
+normalise_test(integer, 1) -> is_integer;
+normalise_test(list, 1) -> is_list;
+normalise_test(number, 1) -> is_number;
+normalise_test(pid, 1) -> is_pid;
+normalise_test(port, 1) -> is_port;
+normalise_test(record, 2) -> is_record;
+normalise_test(reference, 1) -> is_reference;
+normalise_test(tuple, 1) -> is_tuple;
+normalise_test(Name, _) -> Name.
+
+%% As Expr may have side effects, we must evaluate it
+%% first and bind the value to a new variable.
+%% We must use also handle the case that Expr does not
+%% evaluate to a tuple properly.
+
+record_test_in_body(Anno, Expr, Name, Lc, St) ->
+ Fs = record_fields(Name, Anno, St),
+ Var = {var, Anno, new_var_name()},
+ expr({block,Anno,
+ [{match,Anno,Var,Expr},
+ {call,Anno,{remote,Anno,{atom,Anno,erlang},
+ {atom,Anno,is_record}},
+ [Var,{atom,Anno,Name},{integer,Anno,length(Fs)+1}]}]}, Lc, St).
+
+record_test_in_guard(Anno, Term, Name, St) ->
+ Fs = record_fields(Name, Anno, St),
+ expr({call,Anno,{remote,Anno,{atom,Anno,erlang},{atom,Anno,is_record}},
+ [Term,{atom,Anno,Name},{integer,Anno,length(Fs)+1}]}, false, St).
+
+%% Expand a call to record_info/2. We have checked that it is not
+%% shadowed by an import.
+
+record_info_call(Anno, [{value,_AnnoI,Info},{value,_AnnoN,Name}], St) ->
+ case Info of
+ size ->
+ {integer,Anno,1+length(record_fields(Name, Anno, St))};
+ fields ->
+ Fs = lists:map(fun({record_field,_,Field,_Val}) -> Field end,
+ record_fields(Name, Anno, St)),
+ lists:foldr(fun (H, T) -> {cons,Anno,H,T} end, {nil,Anno}, Fs)
+ end.
+
+record_fields(R, Anno, #{recs := Recs}) ->
+ Fields = maps:get(R, Recs),
+ [{record_field,Anno,{atom,Anno,F},copy_expr(Di, Anno)} ||
+ {record_field,_Anno,{atom,_AnnoA,F},Di} <- Fields].
+
+
+%% record_inits([RecDefField], [Init]) -> [InitExpr].
+%% Build a list of initialisation expressions for the record tuple
+%% elements. This expansion must be passed through expr
+%% again. N.B. We are scanning the record definition field list!
+
+record_inits(Fs, Is) ->
+ WildcardInit = record_wildcard_init(Is),
+ lists:map(fun ({record_field,_,{atom,_,F},D}) ->
+ case find_field(F, Is) of
+ {ok,Init} -> Init;
+ error when WildcardInit =:= none -> D;
+ error -> WildcardInit
+ end
+ end, Fs).
+
+record_wildcard_init([{record_field,_,{var,_,'_'},D} | _]) -> D;
+record_wildcard_init([_ | Is]) -> record_wildcard_init(Is);
+record_wildcard_init([]) -> none.
+
+%% copy_expr(Expr, Anno) -> Expr.
+%% Make a copy of Expr converting all annotations to Anno.
+copy_expr(Expr, Anno) ->
+ erl_parse:map_anno(fun(_A) -> Anno end, Expr).
+
+find_field(F, [{record_field,_,{atom,_,F},Val} | _]) -> {ok,Val};
+find_field(F, [_ | Fs]) -> find_field(F, Fs);
+find_field(_, []) -> error.
+
+%% record_update(Record, RecordName, [RecDefField], [Update], State) ->
+%% {Expr,State'}
+%% Build an expression to update fields in a record returning a new
+%% record. Try to be smart and optimise this. This expansion must be
+%% passed through expr again.
+
+record_update(R, Name, Fs, Us0, St) ->
+ Anno = element(2, R),
+ {Pre,Us} = record_exprs(Us0, St),
+ %% We need a new variable for the record expression
+ %% to guarantee that it is only evaluated once.
+ Var = {var, Anno, new_var_name()},
+ Update = record_match(Var, Name, Anno, Fs, Us, St),
+ {record_update,Anno, Pre ++ [{match,Anno,Var,R},Update]}.
+
+%% record_match(Record, RecordName, Anno, [RecDefField], [Update], State)
+%% Build a 'case' expression to modify record fields.
+
+record_match(R, Name, Anno, Fs, Us, St) ->
+ {Ps,News} = record_upd_fs(Fs, Us, St),
+ {'case',ln(Anno),R,
+ [{clause,ln(Anno),[{tuple,Anno,[{atom,Anno,Name} | Ps]}],[],
+ [{tuple,Anno,[{atom,Anno,Name} | News]}]},
+ {clause,Anno,[{var,Anno,'_'}],[],
+ [call_error(Anno, {tuple,Anno,[{atom,Anno,badrecord},{atom,Anno,Name}]})]}
+ ]}.
+
+record_upd_fs([{record_field,Anno,{atom,_AnnoA,F},_Val} | Fs], Us, St) ->
+ P = {var, Anno, new_var_name()},
+ {Ps,News} = record_upd_fs(Fs, Us, St),
+ case find_field(F, Us) of
+ {ok,New} -> {[P | Ps],[New | News]};
+ error -> {[P | Ps],[P | News]}
+ end;
+record_upd_fs([], _, _) -> {[],[]}.
+
+call_error(Anno, R) ->
+ {call,Anno,{remote,Anno,{atom,Anno,erlang},{atom,Anno,error}},[R]}.
+
+%% Break out expressions from an record update list and bind to new
+%% variables. The idea is that we will evaluate all update expressions
+%% before starting to update the record.
+
+record_exprs(Us, St) ->
+ record_exprs(Us, St, [], []).
+
+record_exprs([{record_field,Anno,{atom,_AnnoA,_F}=Name,Val}=Field0 | Us], St, Pre, Fs) ->
+ case is_simple_val(Val) of
+ true ->
+ record_exprs(Us, St, Pre, [Field0 | Fs]);
+ false ->
+ Var = {var, Anno, new_var_name()},
+ Bind = {match,ln(Anno),Var,Val},
+ Field = {record_field,ln(Anno),Name,Var},
+ record_exprs(Us, St, [Bind | Pre], [Field | Fs])
+ end;
+record_exprs([], _St, Pre, Fs) ->
+ {lists:reverse(Pre),Fs}.
+
+is_simple_val({var,_,_}) -> true;
+is_simple_val(Val) ->
+ try
+ erl_parse:normalise(Val),
+ true
+ catch error:_ ->
+ false
+ end.
+
+%% pattern_fields([RecDefField], [Match]) -> [Pattern].
+%% Build a list of match patterns for the record tuple elements.
+%% This expansion must be passed through pattern again. N.B. We are
+%% scanning the record definition field list!
+
+pattern_fields(Fs, Ms) ->
+ Wildcard = record_wildcard_init(Ms),
+ lists:map(fun ({record_field,Anno,{atom,_,F},_}) ->
+ case find_field(F, Ms) of
+ {ok,Match} -> Match;
+ error when Wildcard =:= none -> {var,Anno,'_'};
+ error -> Wildcard
+ end
+ end, Fs).
+
+%% index_expr(Anno, FieldExpr, Name, Fields) -> IndexExpr.
+%% Return an expression which evaluates to the index of a
+%% field. Currently only handle the case where the field is an
+%% atom. This expansion must be passed through expr again.
+
+index_expr(Anno, {atom,_,F}, _Name, Fs) ->
+ {integer,Anno,index_expr(F, Fs, 2)}.
+
+index_expr(F, [{record_field,_,{atom,_,F},_} | _], I) -> I;
+index_expr(F, [_ | Fs], I) -> index_expr(F, Fs, I+1).
+
+
+%% get_record_field(Anno, RecExpr, FieldExpr, Name, St) -> {Expr,St'}.
+%% Return an expression which verifies that the type of record
+%% is correct and then returns the value of the field.
+%% This expansion must be passed through expr again.
+
+get_record_field_body(Anno, R, {atom,_,F}, Name, St) ->
+ Var = {var, Anno, new_var_name()},
+ Fs = record_fields(Name, Anno, St),
+ I = index_expr(F, Fs, 2),
+ P = record_pattern(2, I, Var, length(Fs)+1, Anno, [{atom,Anno,Name}]),
+ E = {'case',Anno,R,
+ [{clause,Anno,[{tuple,Anno,P}],[],[Var]},
+ {clause,Anno,[{var,Anno,'_'}],[],
+ [{call,Anno,{remote,Anno,
+ {atom,Anno,erlang},
+ {atom,Anno,error}},
+ [{tuple,Anno,[{atom,Anno,badrecord},{atom,Anno,Name}]}]}]}]},
+ expr(E, false, St).
+
+get_record_field_guard(Anno, R, {atom,_,F}, Name, St) ->
+ Fs = record_fields(Name, Anno, St),
+ I = index_expr(F, Fs, 2),
+ ExpR = expr(R, false, St),
+ %% Just to make comparison simple:
+ %% A0 = erl_anno:new(0),
+ %% ExpRp = erl_parse:map_anno(fun(_A) -> A0 end, ExpR),
+ %% RA = {{Name,ExpRp},Anno,ExpR,length(Fs)+1},
+ %% St2 = St1#exprec{strict_ra = [RA | St1#exprec.strict_ra]},
+ {safe_bif,ln(Anno),erlang,element,[{value,ln(Anno),I},ExpR]}.
+
+record_pattern(I, I, Var, Sz, Anno, Acc) ->
+ record_pattern(I+1, I, Var, Sz, Anno, [Var | Acc]);
+record_pattern(Cur, I, Var, Sz, Anno, Acc) when Cur =< Sz ->
+ record_pattern(Cur+1, I, Var, Sz, Anno, [{var,Anno,'_'} | Acc]);
+record_pattern(_, _, _, _, _, Acc) -> lists:reverse(Acc).
+
%% The debugger converts both strings "abc" and lists [67, 68, 69]
%% into {value, Line, [67, 68, 69]}, making it impossible to later
%% distingish one or the other inside binaries when evaluating. To
@@ -572,24 +915,23 @@ bin_expand_strings(Es) ->
%% These expressions are processed "in parallel" for purposes of variable
%% definition etc.
-expr_list([E0|Es]) ->
- E1 = expr(E0, false),
- [E1|expr_list(Es)];
-expr_list([]) -> [].
-
-icr_clauses([C0|Cs], Lc) ->
- C1 = clause(C0, Lc),
- [C1|icr_clauses(Cs, Lc)];
-icr_clauses([], _) -> [].
+expr_list([E0|Es], St) ->
+ E1 = expr(E0, false, St),
+ [E1|expr_list(Es, St)];
+expr_list([], _St) -> [].
-fun_clauses([{clause,A,H,G,B}|Cs]) ->
- [{clause,ln(A),head(H),guard(G),exprs(B, true)}|fun_clauses(Cs)];
-fun_clauses([]) -> [].
+icr_clauses([C0|Cs], Lc, St) ->
+ C1 = clause(C0, Lc, St),
+ [C1|icr_clauses(Cs, Lc, St)];
+icr_clauses([], _, _St) -> [].
+fun_clauses([{clause,A,H,G,B}|Cs], St) ->
+ [{clause,ln(A),head(H, St),guard(G, St),exprs(B, true, St)}|fun_clauses(Cs, St)];
+fun_clauses([], _St) -> [].
-new_map(Fs0, Anno, F) ->
+new_map(Fs0, Anno, St, F) ->
Line = ln(Anno),
- Fs1 = map_fields(Fs0, F),
+ Fs1 = map_fields(Fs0, St, F),
Fs2 = [{L,K,V} || {map_field_assoc,L,K,V} <- Fs1],
try
{value,Line,map_literal(Fs2, #{})}
@@ -604,14 +946,14 @@ map_literal([_|_], _) ->
throw(not_literal);
map_literal([], M) -> M.
-map_fields(Fs) ->
- map_fields(Fs, fun (E) -> expr(E, false) end).
+map_fields(Fs, St) ->
+ map_fields(Fs, St, fun (E) -> expr(E, false, St) end).
-map_fields([{map_field_assoc,A,N,V}|Fs], F) ->
- [{map_field_assoc,ln(A),F(N),F(V)}|map_fields(Fs)];
-map_fields([{map_field_exact,A,N,V}|Fs], F) ->
- [{map_field_exact,ln(A),F(N),F(V)}|map_fields(Fs)];
-map_fields([], _) -> [].
+map_fields([{map_field_assoc,A,N,V}|Fs], St, F) ->
+ [{map_field_assoc,ln(A),F(N),F(V)}|map_fields(Fs, St, F)];
+map_fields([{map_field_exact,A,N,V}|Fs], St, F) ->
+ [{map_field_exact,ln(A),F(N),F(V)}|map_fields(Fs, St, F)];
+map_fields([], _St, _) -> [].
%% new_var_name() -> VarName.
diff --git a/lib/debugger/src/dbg_iserver.erl b/lib/debugger/src/dbg_iserver.erl
index 3e959e8e30..a9d157afa9 100644
--- a/lib/debugger/src/dbg_iserver.erl
+++ b/lib/debugger/src/dbg_iserver.erl
@@ -233,6 +233,14 @@ handle_call({load, Mod, Src, Bin}, _From, State) ->
{reply, {module, Mod}, State};
%% Module database
+handle_call({get_module_db, Mod}, _From, State) ->
+ Db = State#state.db,
+ Reply = case ets:lookup(Db, {Mod, refs}) of
+ [] -> not_found;
+ [{{Mod, refs}, [ModDb|_ModDbs]}] ->
+ ModDb
+ end,
+ {reply, Reply, State};
handle_call({get_module_db, Mod, Pid}, _From, State) ->
Db = State#state.db,
Reply = case ets:lookup(Db, {Mod, refs}) of
diff --git a/lib/debugger/src/dbg_wx_code.erl b/lib/debugger/src/dbg_wx_code.erl
index 4f1253e656..5c53576762 100644
--- a/lib/debugger/src/dbg_wx_code.erl
+++ b/lib/debugger/src/dbg_wx_code.erl
@@ -115,6 +115,10 @@ code_area(Parent) ->
?stc:connect(Ed, stc_doubleclick),
?stc:setReadOnly(Ed, true),
+ %% STC steals keyboard shortcuts on linux for some reason
+ ?stc:cmdKeyClearAll(Ed),
+ ?stc:cmdKeyAssign(Ed, ?wxSTC_KEY_DOWN, ?wxSTC_KEYMOD_NORM, ?wxSTC_CMD_LINEDOWN),
+ ?stc:cmdKeyAssign(Ed, ?wxSTC_KEY_UP, ?wxSTC_KEYMOD_NORM, ?wxSTC_CMD_LINEUP),
Ed.
load_code(Ed, Code) ->
diff --git a/lib/debugger/src/dbg_wx_mon.erl b/lib/debugger/src/dbg_wx_mon.erl
index 08b20d3f69..e94acceb66 100644
--- a/lib/debugger/src/dbg_wx_mon.erl
+++ b/lib/debugger/src/dbg_wx_mon.erl
@@ -551,7 +551,7 @@ menus() ->
{'Save Settings...', 2},
separator,
{'Exit', 0}]},
- {'Edit', [{'Refresh', no},
+ {'Edit', [{'Refresh', 0},
{'Kill All', no}]},
{'Module', [{'Interpret...', 0},
{'Delete All Modules', no},
diff --git a/lib/debugger/src/dbg_wx_trace.erl b/lib/debugger/src/dbg_wx_trace.erl
index 210987d3e6..d1334705c6 100644
--- a/lib/debugger/src/dbg_wx_trace.erl
+++ b/lib/debugger/src/dbg_wx_trace.erl
@@ -312,7 +312,7 @@ gui_cmd('Where', State) ->
{_Status, Mod, Line} = State#state.status,
Win = gui_show_module(State#state.win, Mod, Line,
State#state.cm, State#state.pid, break),
- gui_update_bindings(State#state.win, State#state.meta),
+ gui_update_bindings(State#state.win, Mod, State#state.meta),
gui_enable_updown(State#state.stack_trace, Stack),
dbg_wx_trace_win:display(State#state.win,State#state.status),
State#state{win=Win, cm=Mod, stack=Stack};
@@ -330,10 +330,7 @@ gui_cmd('Messages', State) ->
lists:foldl(
fun(Msg, N) ->
Str1 = io_lib:format(" ~w:", [N]),
- dbg_wx_trace_win:eval_output(State#state.win,Str1, bold),
- Str2 = pretty(Msg, State),
- Str3 = io_lib:format(" ~ts~n",[Str2]),
- dbg_wx_trace_win:eval_output(State#state.win,Str3, normal),
+ dbg_wx_trace_win:eval_output(State#state.win,Str1, Msg, normal),
N+1
end,
1,
@@ -363,7 +360,7 @@ gui_cmd('Up', State) ->
{New, {undefined,-1}, _Bs} -> % call from non-interpreted code
Stack = {New, Max},
Win = dbg_wx_trace_win:show_no_code(State#state.win),
- dbg_wx_trace_win:update_bindings(State#state.win,[]),
+ dbg_wx_trace_win:update_bindings(State#state.win,undefined,[]),
gui_enable_updown(State#state.stack_trace, Stack),
dbg_wx_trace_win:display(State#state.win,{New,null,null}),
State#state{win=Win, cm=null, stack=Stack};
@@ -373,7 +370,7 @@ gui_cmd('Up', State) ->
Win = gui_show_module(State#state.win, Mod, Line,
State#state.cm, State#state.pid,
where),
- dbg_wx_trace_win:update_bindings(State#state.win,Bs),
+ dbg_wx_trace_win:update_bindings(State#state.win,Mod,Bs),
gui_enable_updown(State#state.stack_trace, Stack),
dbg_wx_trace_win:display(State#state.win,{New,Mod,Line}),
State#state{win=Win, cm=Mod, stack=Stack};
@@ -387,7 +384,7 @@ gui_cmd('Down', State) ->
{New, {undefined,-1}, _Bs} -> % call from non-interpreted code
Stack = {New, Max},
Win = dbg_wx_trace_win:show_no_code(State#state.win),
- dbg_wx_trace_win:update_bindings(State#state.win, []),
+ dbg_wx_trace_win:update_bindings(State#state.win,undefined,[]),
gui_enable_updown(State#state.stack_trace, Stack),
dbg_wx_trace_win:display(State#state.win, {New,null,null}),
State#state{win=Win, cm=null, stack=Stack};
@@ -397,7 +394,7 @@ gui_cmd('Down', State) ->
Win = gui_show_module(State#state.win, Mod, Line,
State#state.cm, State#state.pid,
where),
- dbg_wx_trace_win:update_bindings(State#state.win, Bs),
+ dbg_wx_trace_win:update_bindings(State#state.win, Mod, Bs),
gui_enable_updown(State#state.stack_trace, Stack),
dbg_wx_trace_win:display(State#state.win, {New,Mod,Line}),
State#state{win=Win, cm=Mod, stack=Stack};
@@ -511,7 +508,7 @@ gui_cmd({user_command, Cmd}, State) ->
int:meta(State#state.meta, eval, Arg);
true ->
Str = "Commands not allowed",
- dbg_wx_trace_win:eval_output(State#state.win, [$<,Str,10], normal)
+ dbg_wx_trace_win:eval_output(State#state.win, [$<,Str,10], bold)
end,
State;
@@ -633,7 +630,7 @@ meta_cmd({exit_at, {Mod,Line}, Reason, Cur}, State) ->
gui_enable_functions(exit),
gui_enable_updown(State#state.stack_trace, Stack),
gui_enable_btrace(State#state.trace, State#state.stack_trace),
- gui_update_bindings(State#state.win, State#state.meta),
+ gui_update_bindings(State#state.win, Mod, State#state.meta),
dbg_wx_trace_win:display(State#state.win, {exit, {Mod,Line}, Reason}),
State#state{win=Win, cm=Mod,status={exit,{Mod,Line},Reason},
stack=Stack};
@@ -645,7 +642,7 @@ meta_cmd({break_at, Mod, Line, Cur}, State) ->
gui_enable_functions(break),
gui_enable_updown(State#state.stack_trace, Stack),
gui_enable_btrace(State#state.trace, State#state.stack_trace),
- gui_update_bindings(State#state.win, State#state.meta),
+ gui_update_bindings(State#state.win, Mod, State#state.meta),
dbg_wx_trace_win:display(State#state.win, {break, Mod, Line}),
State#state{win=Win, cm=Mod, status={break,Mod,Line}, stack=Stack};
meta_cmd({func_at, Mod, Line, Cur}, State) ->
@@ -668,7 +665,7 @@ meta_cmd({wait_at, Mod, Line, Cur}, State) ->
gui_enable_functions(wait_break),
gui_enable_updown(State#state.stack_trace, Stack),
gui_enable_btrace(State#state.trace, State#state.stack_trace),
- gui_update_bindings(State#state.win, State#state.meta),
+ gui_update_bindings(State#state.win, Mod, State#state.meta),
dbg_wx_trace_win:display(State#state.win, {wait, Mod, Line}),
State#state{win=Win, cm=Mod, status={wait_break,Mod,Line},
stack=Stack};
@@ -677,14 +674,14 @@ meta_cmd({wait_after_at, Mod, Line, Sp}, State) ->
meta_cmd(running, State) ->
Win = dbg_wx_trace_win:unmark_line(State#state.win),
gui_enable_functions(running),
- dbg_wx_trace_win:update_bindings(State#state.win, []),
+ dbg_wx_trace_win:update_bindings(State#state.win, undefined, []),
dbg_wx_trace_win:display(State#state.win, {running, State#state.cm}),
State#state{win=Win, status={running,null,null}};
meta_cmd(idle, State) ->
Win = dbg_wx_trace_win:show_no_code(State#state.win),
gui_enable_functions(idle),
- dbg_wx_trace_win:update_bindings(State#state.win, []),
+ dbg_wx_trace_win:update_bindings(State#state.win, undefined, []),
dbg_wx_trace_win:display(State#state.win, idle),
State#state{win=Win, status={idle,null,null}, cm=undefined};
@@ -713,17 +710,9 @@ meta_cmd({trace_output, StrFun}, State) ->
%% Reply on a user command
meta_cmd({eval_rsp, Res}, State) ->
- Str = pretty(Res, State),
- dbg_wx_trace_win:eval_output(State#state.win, [$<,Str,10], normal),
+ dbg_wx_trace_win:eval_output(State#state.win, [$<], Res, normal),
State.
-pretty(Term, State) ->
- Strings = case State#state.strings of
- [str_on] -> true;
- [] -> false
- end,
- io_lib_pretty:print(Term,[{encoding,unicode},{strings,Strings}]).
-
%%====================================================================
%% GUI auxiliary functions
%%====================================================================
@@ -841,9 +830,9 @@ gui_load_module(Win, Mod, _Pid) ->
dbg_wx_trace_win:show_no_code(Win)
end.
-gui_update_bindings(Win,Meta) ->
+gui_update_bindings(Win,Mod,Meta) ->
Bs = int:meta(Meta, bindings, nostack),
- dbg_wx_trace_win:update_bindings(Win,Bs).
+ dbg_wx_trace_win:update_bindings(Win,Mod,Bs).
gui_enable_functions(Status) ->
Enable = enable(Status),
diff --git a/lib/debugger/src/dbg_wx_trace_win.erl b/lib/debugger/src/dbg_wx_trace_win.erl
index f5e5fbc5bf..755f22d922 100644
--- a/lib/debugger/src/dbg_wx_trace_win.erl
+++ b/lib/debugger/src/dbg_wx_trace_win.erl
@@ -23,7 +23,7 @@
%% External exports
-export([init/0, stop/1]).
--export([create_win/4,
+-export([create_win/4,
get_window/1,
configure/2,
enable/2, is_enabled/1, select/2,
@@ -31,11 +31,11 @@
clear_breaks/1, clear_breaks/2,
display/2, % Help messages
is_shown/2, % Code area
- show_code/3, show_no_code/1, remove_code/2,
+ show_code/3, show_no_code/1, remove_code/2,
mark_line/3, unmark_line/1,
select_line/2, selected_line/1,
- eval_output/3, % Evaluator area
- update_bindings/2, % Bindings area
+ eval_output/3, eval_output/4, eval_output/5, % Evaluator area
+ update_bindings/3, % Bindings area
update_strings/1,
trace_output/2, % Trace area
handle_event/2
@@ -205,7 +205,7 @@ create_win(Parent, Title, Windows, Menus) ->
put(window, Win),
put(strings, [str_on]),
Wi
- end,
+ end,
try wx:batch(Do)
catch E:R ->
@@ -558,29 +558,83 @@ selected_line(#winInfo{editor={_,Ed}}) ->
%% Str = string()
%% Face = normal | bold
%%--------------------------------------------------------------------
-eval_output(#winInfo{eval=#sub{out=Log}}, Text, _Face) ->
+eval_output(#winInfo{eval=#sub{out=Log}}, Text, bold) ->
+ Style = wxTextCtrl:getDefaultStyle(Log),
+ Font = wxTextAttr:getFont(Style),
+ wxFont:setWeight(Font, ?wxFONTWEIGHT_BOLD),
+ wxTextAttr:setFont(Style, Font),
+ wxTextCtrl:setDefaultStyle(Log, Style),
+ wxTextCtrl:appendText(Log, dbg_wx_win:to_string(Text)),
+ wxFont:setWeight(Font, ?wxFONTWEIGHT_NORMAL),
+ wxTextAttr:setFont(Style, Font),
+ wxTextCtrl:setDefaultStyle(Log, Style),
+ ok;
+eval_output(#winInfo{eval=#sub{out=Log}}, Text, _Face) ->
wxTextCtrl:appendText(Log, dbg_wx_win:to_string(Text)),
ok.
-
+
+%%--------------------------------------------------------------------
+%% eval_output(winInfo{}, Prefix, Term, [Mod,] Face)
+%% Prefix = string()
+%% Term = term to be formatted
+%% Mod = module() | undefined for record formatting
+%% Face = normal | bold
+%%--------------------------------------------------------------------
+eval_output(Wi, Prefix, Term, Face) ->
+ {Mod,_Bs} = get(bindings),
+ eval_output(Wi, Prefix, Term, Mod, Face).
+
+eval_output(#winInfo{eval=#sub{out=Log}}=Wi, Prefix, Term, Mod, Face) ->
+ {CW, _, _, _ } = wxTextCtrl:getTextExtent(Log,"w"),
+ {W, _} = wxTextCtrl:getClientSize(Log),
+ LineLength = max(40, W div CW),
+ Column = string:length(Prefix),
+ ValStr = format_term(Term, Mod, LineLength-Column, Column, -1, -1),
+ eval_output(Wi, Prefix, bold),
+ eval_output(Wi, [ValStr, "\n"], Face),
+ ok.
+
%%--------------------------------------------------------------------
%% update_bindings(Bs)
%% Bs = [{Var,Val}]
%%--------------------------------------------------------------------
-update_bindings(#winInfo{bind=#sub{out=BA}}, Bs) ->
+update_bindings(#winInfo{bind=#sub{out=BA}}, Mod, Bs) ->
wxListCtrl:deleteAllItems(BA),
wx:foldl(fun({Var,Val},Row) ->
- wxListCtrl:insertItem(BA, Row, ""),
+ wxListCtrl:insertItem(BA, Row, ""),
wxListCtrl:setItem(BA, Row, 0, dbg_wx_win:to_string(Var)),
- Format = case get(strings) of
- [] -> "~0ltP";
- [str_on] -> "~0tP"
- end,
- wxListCtrl:setItem(BA, Row, 1, dbg_wx_win:to_string(Format,[Val, 20])),
+ Str = format_term_line(Val, Mod),
+ wxListCtrl:setItem(BA, Row, 1, Str),
Row+1
end, 0, Bs),
- put(bindings,Bs),
+ put(bindings,{Mod,Bs}),
ok.
+format_term_line(Val, Mod) ->
+ format_term(Val, Mod, 0, 1, 20, 300).
+
+format_term(Val, Mod, LineLenght, Column, Depth, Limit) ->
+ RecFun = fun(Tag,NoFields) -> record_fields(Tag, NoFields, Mod) end,
+ UseStrings = case get(strings) of
+ [] -> false;
+ [str_on] -> true
+ end,
+ Opts = [{line_length,LineLenght}, {depth, Depth}, {chars_limit, Limit}, {column, Column},
+ {strings, UseStrings}, {encoding, unicode}, {record_print_fun, RecFun}],
+ io_lib_pretty:print(Val, Opts).
+
+record_fields(Tag, NoFields, Mod) ->
+ case dbg_iserver:call({get_module_db, Mod}) of
+ not_found -> no;
+ ModDb ->
+ case dbg_idb:lookup(ModDb, {record, Mod, Tag, NoFields}) of
+ {ok, Value} ->
+ Value;
+ not_found ->
+ no
+ end
+ end.
+
update_strings(Strings) ->
_ = put(strings, Strings),
ok.
@@ -856,26 +910,23 @@ handle_event(#wx{id=?EVAL_ENTRY, event=#wxCommand{type=command_text_enter}},
eval_output(Wi, "\n", normal),
ignore;
Cmd ->
- eval_output(Wi, [$>, Cmd, 10], normal),
+ eval_output(Wi, [$>, Cmd, 10], bold),
wxTextCtrl:setValue(TC,""),
{user_command, Cmd}
end;
%% Bindings area
handle_event(#wx{event=#wxList{type=command_list_item_selected, itemIndex=Row}},Wi) ->
- Bs = get(bindings),
+ {Mod,Bs} = get(bindings),
{Var,Val} = lists:nth(Row+1, Bs),
- Str = case get(strings) of
- [] -> io_lib:format("< ~s = ~ltp~n", [Var, Val]);
- [str_on] -> io_lib:format("< ~s = ~tp~n", [Var, Val])
- end,
- eval_output(Wi, Str, bold),
+ Header = io_lib:format("< ~s = ", [Var]),
+ eval_output(Wi, Header, Val, Mod, normal),
ignore;
-handle_event(#wx{event=#wxList{type=command_list_item_activated, itemIndex=Row}},_Wi) ->
- Bs = get(bindings),
+handle_event(#wx{event=#wxList{type=command_list_item_activated, itemIndex=Row}},_Wi) ->
+ {_Mod,Bs} = get(bindings),
Binding = lists:nth(Row+1, Bs),
{edit, Binding};
-
+
handle_event(_GSEvent, _WinInfo) ->
%%io:format("~p: unhandled ~p~n",[?MODULE, _GSEvent]),
ignore.
@@ -926,8 +977,9 @@ is_button(Name) ->
button_area(Parent) ->
Sz = wxBoxSizer:new(?wxHORIZONTAL),
- wx:foreach(fun({Name, Button}) ->
- B=wxButton:new(Parent, Button,
+ wx:foreach(fun({Name0, Button}) ->
+ Name = [$&|atom_to_list(Name0)],
+ B=wxButton:new(Parent, Button,
[{label,dbg_wx_win:to_string(Name)}]),
Id = wxWindow:getId(B),
_ = wxSizer:add(Sz,B, []),
@@ -939,7 +991,7 @@ button_area(Parent) ->
search_area(Parent) ->
HSz = wxBoxSizer:new(?wxHORIZONTAL),
- _ = wxSizer:add(HSz, wxStaticText:new(Parent, ?wxID_ANY, "Find:"),
+ _ = wxSizer:add(HSz, wxStaticText:new(Parent, ?wxID_ANY, "Find: "),
[{flag,?wxALIGN_CENTER_VERTICAL}]),
TC1 = wxTextCtrl:new(Parent, ?SEARCH_ENTRY, [{style, ?wxTE_PROCESS_ENTER}]),
_ = wxSizer:add(HSz, TC1, [{proportion,3}, {flag, ?wxEXPAND}]),
@@ -951,7 +1003,7 @@ search_area(Parent) ->
Cbtn = wxCheckBox:new(Parent, ?wxID_ANY, "Match Case"),
_ = wxSizer:add(HSz,Cbtn,[{flag,?wxALIGN_CENTER_VERTICAL}]),
_ = wxSizer:add(HSz, 15,15, [{proportion,1}, {flag, ?wxEXPAND}]),
- _ = wxSizer:add(HSz, wxStaticText:new(Parent, ?wxID_ANY, "Goto Line:"),
+ _ = wxSizer:add(HSz, wxStaticText:new(Parent, ?wxID_ANY, "Goto Line: "),
[{flag,?wxALIGN_CENTER_VERTICAL}]),
TC2 = wxTextCtrl:new(Parent, ?GOTO_ENTRY, [{style, ?wxTE_PROCESS_ENTER}]),
_ = wxSizer:add(HSz, TC2, [{proportion,0}, {flag, ?wxEXPAND}]),
@@ -970,13 +1022,19 @@ eval_area(Parent) ->
VSz = wxBoxSizer:new(?wxVERTICAL),
HSz = wxBoxSizer:new(?wxHORIZONTAL),
- _ = wxSizer:add(HSz, wxStaticText:new(Parent, ?wxID_ANY, "Evaluator:"),
+ _ = wxSizer:add(HSz, wxStaticText:new(Parent, ?wxID_ANY, "Evaluator: "),
[{flag,?wxALIGN_CENTER_VERTICAL}]),
TC = wxTextCtrl:new(Parent, ?EVAL_ENTRY, [{style, ?wxTE_PROCESS_ENTER}]),
_ = wxSizer:add(HSz, TC, [{proportion,1}, {flag, ?wxEXPAND}]),
_ = wxSizer:add(VSz, HSz, [{flag, ?wxEXPAND}]),
- TL = wxTextCtrl:new(Parent, ?EVAL_LOG, [{style, ?wxTE_DONTWRAP bor
- ?wxTE_MULTILINE bor ?wxTE_READONLY}]),
+ TL = wxTextCtrl:new(Parent, ?EVAL_LOG, [{style,
+ ?wxTE_DONTWRAP
+ bor ?wxTE_MULTILINE
+ bor ?wxTE_READONLY
+ bor ?wxTE_RICH2
+ }]),
+ FixedFont = wxFont:new(10, ?wxFONTFAMILY_TELETYPE, ?wxNORMAL, ?wxNORMAL,[]),
+ wxWindow:setFont(TL, FixedFont),
_ = wxSizer:add(VSz, TL, [{proportion,5}, {flag, ?wxEXPAND}]),
wxTextCtrl:connect(TC, command_text_enter),
diff --git a/lib/debugger/src/dbg_wx_win.erl b/lib/debugger/src/dbg_wx_win.erl
index 25b76d1739..4d1b76091d 100644
--- a/lib/debugger/src/dbg_wx_win.erl
+++ b/lib/debugger/src/dbg_wx_win.erl
@@ -319,8 +319,8 @@ menu_name(Atom, N) when is_atom(Atom) ->
menu_name("Help", _) -> %% Mac needs this to be exactly this
"&Help";
menu_name(Str, Pos) when is_integer(Pos) ->
- {S1,S2} = lists:split(Pos,Str),
- S1 ++ [$&|S2];
+ {S1,[Key|_]=S2} = lists:split(Pos,Str),
+ S1 ++ [$&|S2] ++ "\tCtrl+" ++ string:uppercase([Key]);
menu_name(Str,_) ->
Str.
diff --git a/lib/debugger/src/debugger.app.src b/lib/debugger/src/debugger.app.src
index c8a8b0fd43..3f2a523411 100644
--- a/lib/debugger/src/debugger.app.src
+++ b/lib/debugger/src/debugger.app.src
@@ -48,5 +48,5 @@
]},
{registered, [dbg_iserver, dbg_wx_mon, dbg_wx_winman]},
{applications, [kernel, stdlib]},
- {runtime_dependencies, ["wx-1.2","stdlib-3.4","kernel-5.3","erts-9.0",
- "compiler-5.0"]}]}.
+ {runtime_dependencies, ["wx-2.0","stdlib-3.15","kernel-8.0","erts-12.0",
+ "compiler-8.0"]}]}.
diff --git a/lib/debugger/test/record_SUITE.erl b/lib/debugger/test/record_SUITE.erl
index 0edb3786be..a123fe2b9a 100644
--- a/lib/debugger/test/record_SUITE.erl
+++ b/lib/debugger/test/record_SUITE.erl
@@ -30,6 +30,8 @@
init_per_suite/1,end_per_suite/1,
errors/1,record_test/1,eval_once/1]).
+-export([debug/0]).
+
suite() ->
[{ct_hooks,[ts_install_cth]},
{timetrap,{minutes,1}}].
@@ -228,8 +230,36 @@ record_test(Config) when is_list(Config) ->
[x,[],{a,b}] = [X || X <- MyList,
begin not is_record(X, foo) or
is_reference(X) end],
+
+ {_R, 2} = check_bindings(#foo{}, 4),
+
+ [a,b,c,d] = record_info(fields, foo),
+ 5 = record_info(size, foo),
+ Foo2 = id(#foo{a=v1, b=true, c=false, d=v4}),
+ 2 = #foo.a,
+ 5 = #foo.d,
+ v1 = Foo2#foo.a,
+ v4 = Foo2#foo.d,
+
+ ?FalseGuard(Foo2#foo.a == baz),
+ ?FalseGuard(Foo2#foo.c),
+ ?FalseGuard(Foo2#foo.a),
+
+ ?TrueGuard(Foo2#foo.b),
+ ?TrueGuard(Foo2#foo.d == v4),
+
+ ?FalseGuard(element(#foo.d, Foo2) == baz),
+ ?FalseGuard(element(#foo.d, Foo2)),
+ ?FalseGuard(element(#foo.c, Foo2)),
+
+ ?TrueGuard(element(#foo.a, Foo2) == v1),
+ ?TrueGuard(element(#foo.b, Foo2)),
ok.
+check_bindings(R0, Int) ->
+ R = R0#foo{a=(X=Int div 2)},
+ {R, X}.
+
eval_once(Config) when is_list(Config) ->
once(fun(GetRec) ->
true = erlang:is_record(GetRec(), foo)
@@ -263,4 +293,16 @@ once(Test, Record) ->
end,
Result.
-id(I) -> I.
+id(I) ->
+ I.
+
+debug() ->
+ %% Used for interactive debugger to see that step and next behaves
+ %% decent
+ _A00 = #foo{},
+ A0 = #foo{a=d1, c=d3},
+ A1 = A0#foo{a=1},
+ A2 = A1#foo{a=A1#foo.a+1, b=1, d=id(1)},
+ A2#foo{a=1,
+ b=2,
+ c=3}.
diff --git a/lib/dialyzer/src/erl_types.erl b/lib/dialyzer/src/erl_types.erl
index db3ca22559..92f45f5e5a 100644
--- a/lib/dialyzer/src/erl_types.erl
+++ b/lib/dialyzer/src/erl_types.erl
@@ -96,7 +96,7 @@
t_integer/0,
t_integer/1,
t_non_neg_integer/0,
- t_pos_integer/0,
+ t_pos_integer/0, t_neg_integer/0,
t_integers/1,
t_iodata/0,
t_iolist/0,
@@ -1713,12 +1713,12 @@ t_map(Pairs0, DefK0, DefV0) ->
true -> {?none, ?none};
false -> {DefK1, DefV0}
end,
- {Pairs1, DefK, DefV}
+ {Pairs1, DefK3, DefV}
= case is_singleton_type(DefK2) of
true -> {mapdict_insert({DefK2, ?opt, DefV1}, Pairs0), ?none, ?none};
false -> {Pairs0, DefK2, DefV1}
end,
- Pairs = normalise_map_optionals(Pairs1, DefK, DefV),
+ {Pairs, DefK} = normalise_map_optionals(Pairs1, DefK3, DefV),
%% Validate invariants of the map representation.
%% Since we needed to iterate over the arguments in order to normalise anyway,
%% we might as well save us some future pain and do this even without
@@ -1732,20 +1732,66 @@ t_map(Pairs0, DefK0, DefV0) ->
false -> ?map(Pairs, DefK, DefV)
end.
-normalise_map_optionals([], _, _) -> [];
-normalise_map_optionals([E={K,?opt,?none}|T], DefK, DefV) ->
+normalise_map_optionals(Pairs, DefK, DefV) ->
+ case normalise_map_optionals(Pairs, DefK, DefV, [], defk_unchanged) of
+ {Pairs1, DefK1, defk_changed} ->
+ normalise_map_optionals(Pairs1, DefK1, DefV);
+ {Pairs1, DefK1, defk_unchanged} ->
+ {Pairs1, DefK1}
+ end.
+
+normalise_map_optionals([], DefK, _, Es, F) -> {lists:reverse(Es), DefK, F};
+normalise_map_optionals([E={K,?opt,?none}|T], DefK, DefV, Es, F) ->
Diff = t_subtract(DefK, K),
case t_is_subtype(K, DefK) andalso DefK =:= Diff of
- true -> [E|normalise_map_optionals(T, DefK, DefV)];
- false -> normalise_map_optionals(T, Diff, DefV)
+ true -> normalise_map_optionals(T, DefK, DefV, [E|Es], F);
+ false -> normalise_map_optionals(T, Diff, DefV, Es, F)
end;
-normalise_map_optionals([E={K,?opt,V}|T], DefK, DefV) ->
- case t_is_equal(V, DefV) andalso t_is_subtype(K, DefK) of
- true -> normalise_map_optionals(T, DefK, DefV);
- false -> [E|normalise_map_optionals(T, DefK, DefV)]
+normalise_map_optionals([E={K,?opt,V}|T], DefK, DefV, Es, F) ->
+ HowToHandleE =
+ case t_is_equal(V, DefV) of
+ true ->
+ case t_is_subtype(K, DefK) of
+ true -> skip;
+ false ->
+ case needs_to_be_merged(K, DefK) of
+ true -> add_to_default_key;
+ false -> keep
+ end
+ end;
+ false -> keep
+ end,
+ case HowToHandleE of
+ skip ->
+ normalise_map_optionals(T, DefK, DefV, Es, F);
+ keep ->
+ normalise_map_optionals(T, DefK, DefV, [E|Es], F);
+ add_to_default_key ->
+ normalise_map_optionals(T, t_sup(K, DefK), DefV, Es, defk_changed)
end;
-normalise_map_optionals([E|T], DefK, DefV) ->
- [E|normalise_map_optionals(T, DefK, DefV)].
+normalise_map_optionals([E|T], DefK, DefV, Es, F) ->
+ normalise_map_optionals(T, DefK, DefV, [E|Es], F).
+
+%% Return `true' if the first argument (a singleton) cannot be
+%% separated from the second argument (the default key) as that would
+%% represent equal map types by unequal terms. An example:
+%% `#{0 => t(), pos_integer() => t()}' is to be represented by
+%% `#{non_neg_integer() => t()}'.
+needs_to_be_merged(?int_set(Set), DefK) ->
+ [I] = set_to_list(Set),
+ Iplus = t_integer(I + 1),
+ Iminus = t_integer(I - 1),
+ InfPlus = t_inf(Iplus, DefK),
+ InfMinus = t_inf(Iminus, DefK),
+ not (t_is_none(InfPlus) andalso t_is_none(InfMinus));
+needs_to_be_merged(?atom(_Set), DefK) ->
+ InfAtom = t_inf(t_atom(), DefK),
+ not t_is_none(InfAtom);
+needs_to_be_merged(?nil, DefK) ->
+ InfNonEmpty = t_inf(t_nonempty_list(), DefK),
+ t_is_cons(InfNonEmpty);
+needs_to_be_merged(_, _) ->
+ false.
validate_map_elements([{K1,_,_}|Rest=[{K2,_,_}|_]]) ->
case is_singleton_type(K1) andalso K1 < K2 of
@@ -2948,10 +2994,10 @@ t_inf(?nil, ?nonempty_list(_, _), _Opaques) ->
?none;
t_inf(?nonempty_list(_, _), ?nil, _Opaques) ->
?none;
-t_inf(?nil, ?list(_Contents, _Termination, _), _Opaques) ->
- ?nil;
-t_inf(?list(_Contents, _Termination, _), ?nil, _Opaques) ->
- ?nil;
+t_inf(?nil, ?list(_Contents, Termination, _), Opaques) ->
+ t_inf(?nil, t_unopaque(Termination), Opaques);
+t_inf(?list(_Contents, Termination, _), ?nil, Opaques) ->
+ t_inf(?nil, t_unopaque(Termination), Opaques);
t_inf(?list(Contents1, Termination1, Size1),
?list(Contents2, Termination2, Size2), Opaques) ->
case t_inf(Termination1, Termination2, Opaques) of
@@ -5584,7 +5630,7 @@ is_singleton_type(?nil) -> true;
is_singleton_type(?atom(?any)) -> false;
is_singleton_type(?atom(Set)) ->
ordsets:size(Set) =:= 1;
-is_singleton_type(?int_range(V, V)) -> true;
+is_singleton_type(?int_range(V, V)) -> true; % cannot happen
is_singleton_type(?int_set(Set)) ->
ordsets:size(Set) =:= 1;
is_singleton_type(_) ->
diff --git a/lib/dialyzer/test/erl_types_SUITE.erl b/lib/dialyzer/test/erl_types_SUITE.erl
index 7d7c144b69..bc735d3a60 100644
--- a/lib/dialyzer/test/erl_types_SUITE.erl
+++ b/lib/dialyzer/test/erl_types_SUITE.erl
@@ -15,7 +15,7 @@
-module(erl_types_SUITE).
-export([all/0,
- consistency_and_to_string/1]).
+ consistency_and_to_string/1, map_multiple_representations/1]).
%% Simplify calls into erl_types and avoid importing the entire module.
-define(M, erl_types).
@@ -23,7 +23,7 @@
-include_lib("common_test/include/ct.hrl").
all() ->
- [consistency_and_to_string].
+ [consistency_and_to_string, map_multiple_representations].
consistency_and_to_string(_Config) ->
%% Check consistency of types
@@ -195,3 +195,119 @@ consistency_and_to_string(_Config) ->
"boolean()" = ?M:t_to_string(Union8),
"{'false',_} | {'true',_}" = ?M:t_to_string(Union10),
"{'true',integer()}" = ?M:t_to_string(?M:t_inf(Union10, ?M:t_tuple([?M:t_atom(true), ?M:t_integer()]))).
+
+%% OTP-17537.
+map_multiple_representations(_Config) ->
+ DefV = erl_types:t_atom(),
+ fun() ->
+ P2 = {erl_types:t_integer(0), optional, DefV},
+ Ps = [P2],
+ DefK = erl_types:t_pos_integer(),
+ T = erl_types:t_map(Ps, DefK, DefV),
+ "#{non_neg_integer()=>atom()}" = erl_types:t_to_string(T)
+ end(),
+ fun() ->
+ P1 = {erl_types:t_integer(-1), optional, DefV},
+ P2 = {erl_types:t_integer(0), optional, DefV},
+ Ps = [P1, P2],
+ DefK = erl_types:t_pos_integer(),
+ T = erl_types:t_map(Ps, DefK, DefV),
+ "#{integer()=>atom()}" = erl_types:t_to_string(T)
+ end(),
+ fun() ->
+ P1 = {erl_types:t_integer(0), optional, DefV}, % integer()
+ P2 = {erl_types:t_integer(1), optional, DefV}, % extra
+ Ps = [P1, P2],
+ DefK = erl_types:t_neg_integer(),
+ T = erl_types:t_map(Ps, DefK, DefV),
+ "#{integer()=>atom()}" = erl_types:t_to_string(T)
+ end(),
+ fun() ->
+ P1 = {erl_types:t_nil(), optional, DefV},
+ Ps = [P1],
+ DefK = erl_types:t_nonempty_list(),
+ T = erl_types:t_map(Ps, DefK, DefV),
+ "#{[any()]=>atom()}" = erl_types:t_to_string(T)
+ end(),
+ fun() ->
+ P1 = {erl_types:t_nil(), optional, DefV},
+ Ps = [P1],
+ DefK = erl_types:t_nonempty_string(),
+ T = erl_types:t_map(Ps, DefK, DefV),
+ "#{string()=>atom()}" = erl_types:t_to_string(T)
+ end(),
+ fun() ->
+ P1 = {erl_types:t_nil(), optional, DefV},
+ Ps = [P1],
+ DefK = erl_types:t_sup(erl_types:t_nonempty_string(),
+ erl_types:t_nil()),
+ T = erl_types:t_map(Ps, DefK, DefV),
+ "#{string()=>atom()}" = erl_types:t_to_string(T)
+ end(),
+ fun() ->
+ P1 = {erl_types:t_nil(), optional, DefV},
+ Ps = [P1],
+ DefK = erl_types:t_sup(erl_types:t_nonempty_string(),
+ erl_types:t_atom()),
+ T = erl_types:t_map(Ps, DefK, DefV),
+ "#{atom() | string()=>atom()}" = erl_types:t_to_string(T)
+ end(),
+ fun() ->
+ P1 = {erl_types:t_integer(0), optional, DefV},
+ Ps = [P1],
+ DefK = erl_types:t_sup(erl_types:t_pos_integer(),
+ erl_types:t_atom()),
+ T = erl_types:t_map(Ps, DefK, DefV),
+ "#{atom() | non_neg_integer()=>atom()}" = erl_types:t_to_string(T)
+ end(),
+ fun() ->
+ P1 = {erl_types:t_integer(8), optional, DefV},
+ Ps = [P1],
+ DefK = erl_types:t_from_range(9, 12),
+ T = erl_types:t_map(Ps, DefK, DefV),
+ "#{8 | 9 | 10 | 11 | 12=>atom()}" = erl_types:t_to_string(T)
+
+ end(),
+ fun() ->
+ P1 = {erl_types:t_integer(13), optional, DefV},
+ Ps = [P1],
+ DefK = erl_types:t_from_range(9, 12),
+ T = erl_types:t_map(Ps, DefK, DefV),
+ "#{9 | 10 | 11 | 12 | 13=>atom()}" = erl_types:t_to_string(T)
+
+ end(),
+ fun() ->
+ P1 = {erl_types:t_atom(a), optional, DefV},
+ Ps = [P1],
+ DefK = erl_types:t_sup([erl_types:t_atom(a01),
+ erl_types:t_atom(a02),
+ erl_types:t_atom(a03),
+ erl_types:t_atom(a04),
+ erl_types:t_atom(a05),
+ erl_types:t_atom(a06),
+ erl_types:t_atom(a07),
+ erl_types:t_atom(a08),
+ erl_types:t_atom(a09),
+ erl_types:t_atom(a10),
+ erl_types:t_atom(a11),
+ erl_types:t_atom(a12),
+ erl_types:t_atom(a13)]),
+ T = erl_types:t_map(Ps, DefK, DefV),
+ "#{atom()=>atom()}" = erl_types:t_to_string(T)
+ end(),
+ fun() ->
+ P1 = {erl_types:t_atom(a), optional, DefV},
+ Ps = [P1],
+ DefK = erl_types:t_sup([erl_types:t_atom(b),
+ erl_types:t_atom(c)]),
+ T = erl_types:t_map(Ps, DefK, DefV),
+ "#{'a' | 'b' | 'c'=>atom()}" = erl_types:t_to_string(T)
+ end(),
+ fun() ->
+ P1 = {erl_types:t_atom(a), optional, DefV},
+ Ps = [P1],
+ DefK = erl_types:t_atom(b),
+ T = erl_types:t_map(Ps, DefK, DefV),
+ "#{'a'=>atom(), 'b'=>atom()}" = erl_types:t_to_string(T)
+ end(),
+ ok.
diff --git a/lib/erl_docgen/src/docgen_xml_to_chunk.erl b/lib/erl_docgen/src/docgen_xml_to_chunk.erl
index 634013922e..2d34350618 100644
--- a/lib/erl_docgen/src/docgen_xml_to_chunk.erl
+++ b/lib/erl_docgen/src/docgen_xml_to_chunk.erl
@@ -639,17 +639,22 @@ transform_datatype(Dom,_Acc) ->
transform_see({See,[{marker,Marker}],Content}) ->
AbsMarker =
- case string:lexemes(Marker,"#") of
- [Link] -> [get(application),":",get(module),"#",Link];
- [AppMod, Link] ->
- case string:lexemes(AppMod,":") of
- [Mod] -> [get(application),":",Mod,"#",Link];
- [App, Mod] -> [App,":",Mod,"#",Link]
- end
+ case string:split(Marker, "#") of
+ [AppFile] -> marker_defaults(AppFile);
+ [AppFile, Anchor] -> [marker_defaults(AppFile), "#", Anchor]
end,
+
{a, [{href,iolist_to_binary(AbsMarker)},
{rel,<<"https://erlang.org/doc/link/",(atom_to_binary(See))/binary>>}], Content}.
+marker_defaults("") ->
+ [get(application), ":", get(module)];
+marker_defaults(AppFile) ->
+ case string:split(AppFile, ":") of
+ [File] -> [get(application), ":", File];
+ [App, File] -> [App, ":", File]
+ end.
+
to_chunk(Dom, Source, Module, AST) ->
[{module,MAttr,Mcontent}] = Dom,
diff --git a/lib/kernel/doc/src/file.xml b/lib/kernel/doc/src/file.xml
index 42798530bd..aa1201d381 100644
--- a/lib/kernel/doc/src/file.xml
+++ b/lib/kernel/doc/src/file.xml
@@ -988,6 +988,13 @@ f.txt: {person, "kalle", 25}.
An <c><anno>IoDevice</anno></c> returned from this call can be used
as an argument to the I/O functions (see
<seeerl marker="stdlib:io"><c>io(3)</c></seeerl>).</p>
+ <warning>
+ <p>While this function can be used to open any file, we recommend
+ against using it for NFS-mounted files, FIFOs, devices, or
+ similar since they can cause IO threads to hang forever.</p>
+ <p>If your application needs to interact with these kinds of files we
+ recommend breaking out those parts to a port program instead.</p>
+ </warning>
<note>
<p>In previous versions of <c>file</c>, modes were specified
as one of the atoms <c>read</c>, <c>write</c>, or
diff --git a/lib/kernel/src/code.erl b/lib/kernel/src/code.erl
index 5a2491f340..a894b954ef 100644
--- a/lib/kernel/src/code.erl
+++ b/lib/kernel/src/code.erl
@@ -877,7 +877,7 @@ get_doc_chunk(Filename, Mod) when is_atom(Mod) ->
Error ->
Error
end;
- {error,beam_lib,{file_error,_Filename,enoent}} ->
+ {error,beam_lib,{file_error,_Filename,_Err}} ->
get_doc_chunk(Filename, atom_to_list(Mod));
{ok, {Mod, [{"Docs",Bin}]}} ->
{ok,binary_to_term(Bin)}
diff --git a/lib/kernel/src/erl_erts_errors.erl b/lib/kernel/src/erl_erts_errors.erl
index 0b2b89ceac..8b0768ac80 100644
--- a/lib/kernel/src/erl_erts_errors.erl
+++ b/lib/kernel/src/erl_erts_errors.erl
@@ -264,9 +264,25 @@ format_erlang_error(binary_to_list, [Bin,Start,Stop], _) ->
end;
format_erlang_error(binary_to_term, [Bin], _) ->
[must_be_binary(Bin, bad_ext_term)];
-format_erlang_error(binary_to_term, [Bin,Options], _) ->
+format_erlang_error(binary_to_term, [Bin,Options], Cause) ->
Arg1 = must_be_binary(Bin),
- [Arg1,maybe_option_list_error(Options, Arg1)];
+ Arg2 = case Cause of
+ badopt ->
+ must_be_list(Options, bad_option);
+ _ ->
+ []
+ end,
+ case {Arg1,Arg2} of
+ {[],[]} ->
+ case lists:member(safe, Options) of
+ true ->
+ [bad_or_unsafe_ext_term];
+ false ->
+ [bad_ext_term]
+ end;
+ {_,_} ->
+ [Arg1,Arg2]
+ end;
format_erlang_error(bitstring_to_list, [_], _) ->
[not_bitstring];
format_erlang_error(bump_reductions, [Int], _) ->
@@ -1290,6 +1306,8 @@ expand_error(bad_encode_option) ->
<<"not one of the atoms: latin1, utf8, or unicode">>;
expand_error(bad_ext_term) ->
<<"invalid external representation of a term">>;
+expand_error(bad_or_unsafe_ext_term) ->
+ <<"invalid or unsafe external representation of a term">>;
expand_error(bad_isdst) ->
<<"not 'true', 'false', or 'undefined'">>;
expand_error(bad_localtime) ->
diff --git a/lib/kernel/src/gen_tcp_socket.erl b/lib/kernel/src/gen_tcp_socket.erl
index 0bb4ff36d8..339dadad3f 100644
--- a/lib/kernel/src/gen_tcp_socket.erl
+++ b/lib/kernel/src/gen_tcp_socket.erl
@@ -50,7 +50,7 @@
-include("inet_int.hrl").
--define(DBG(T), erlang:display({{self(), ?MODULE, ?LINE, ?FUNCTION_NAME}, T})).
+%% -define(DBG(T), erlang:display({{self(), ?MODULE, ?LINE, ?FUNCTION_NAME}, T})).
%% -------------------------------------------------------------------------
@@ -1068,6 +1068,7 @@ server_opts() ->
-compile({inline, [meta/1]}).
meta(D) -> maps:with(maps:keys(server_write_opts()), D).
+
%%% ========================================================================
%%% State Machine
%%%
@@ -1195,7 +1196,7 @@ init({prepare, D, Owner}) ->
owner_mon = OwnerMon},
{ok, accept, {P, D#{type => undefined, buffer => <<>>}}};
init(Arg) ->
- error_logger:error_report([{badarg, {?MODULE, init, [Arg]}}]),
+ error_report([{badarg, {?MODULE, init, [Arg]}}]),
error(badarg, [Arg]).
@@ -1647,17 +1648,15 @@ handle_event(
%% Handle select done - try recv again
handle_event(
info, ?socket_select(Socket, SelectRef),
- #recv{info = ?select_info(SelectRef)},
+ #recv{info = ?select_info(SelectRef)} = _State,
{#params{socket = Socket} = P, D}) ->
- %%
%% ?DBG([info, {socket, Socket}, {ref, SelectRef}]),
handle_recv(P, D, []);
%%
handle_event(
info, ?socket_abort(Socket, SelectRef, Reason),
- #recv{info = ?select_info(SelectRef)},
+ #recv{info = ?select_info(SelectRef)} = _State,
{#params{socket = Socket} = P, D}) ->
- %%
%% ?DBG({abort, Reason}),
handle_connected(P, cleanup_recv_reply(P, D, [], Reason));
%%
@@ -1717,9 +1716,9 @@ handle_shutdown2(Socket, NextState, How) ->
handle_unexpected(Type, Content, State, {P, _D}) ->
- error_logger:warning_report(
- [{module, ?MODULE}, {socket, P#params.socket},
- {unknown_event, {Type, Content}}, {state, State}]),
+ warning_report([{socket, P#params.socket},
+ {unknown_event, {Type, Content}},
+ {state, State}]),
case Type of
{call, From} ->
{keep_state_and_data,
@@ -1734,9 +1733,9 @@ handle_closed(Type, Content, State, {P, _D}) ->
{keep_state_and_data,
[{reply, From, {error, closed}}]};
_ ->
- error_logger:warning_report(
- [{module, ?MODULE}, {socket, P#params.socket},
- {unknown_event, {Type, Content}}, {state, State}]),
+ warning_report([{socket, P#params.socket},
+ {unknown_event, {Type, Content}},
+ {state, State}]),
keep_state_and_data
end.
@@ -1952,14 +1951,14 @@ handle_buffered(P, #{packet_size := PacketSize} = D,
%% What do we do here?
%% Keep the buffer and hope that it will go better with more data?
%% Or discard it and continue as if nothing happened?
- error_logger:warning_msg("Failed decoding message"
- "~n Socket: ~p"
- "~n Socket server: ~p"
- "~n Packet type: ~p"
- "~n byte_size(Data): ~p"
- "~n Reason: ~p",
- [P#params.socket, self(),
- Type, byte_size(Data), Reason]),
+ warning_msg("Failed decoding message"
+ "~n Socket: ~p"
+ "~n Socket server: ~p"
+ "~n Packet type: ~p"
+ "~n byte_size(Data): ~p"
+ "~n Reason: ~p",
+ [P#params.socket, self(),
+ Type, byte_size(Data), Reason]),
D
end.
@@ -2531,6 +2530,7 @@ state_setopts_server(P, D, State, Opts, Tag, Value) ->
end.
state_setopts_active(P, D, State, Opts, Active) ->
+ %% ?DBG([{active, Active}]),
if
Active =:= once;
Active =:= true ->
@@ -2790,8 +2790,34 @@ timeout(EndTime) ->
-endif. % -ifdef(undefined).
+
%% -------------------------------------------------------------------------
error_msg(F, A) ->
error_logger:error_msg(F ++ "~n", A).
+warning_msg(F, A) ->
+ error_logger:error_msg(F ++ "~n", A).
+
+error_report(Report) ->
+ error_logger:error_report(Report).
+
+warning_report(Report) ->
+ error_logger:warning_report([{module, ?MODULE}|Report]).
+
+
+
+%% -------------------------------------------------------------------------
+
+%% formated_timestamp() ->
+%% format_timestamp(os:timestamp()).
+
+%% format_timestamp(TS) ->
+%% megaco:format_timestamp(TS).
+
+%% d(F) ->
+%% d(F, []).
+
+%% d(F, A) ->
+%% io:format("*** [~s] ~p ~w " ++ F ++ "~n",
+%% [formated_timestamp(), self(), ?MODULE | A]).
diff --git a/lib/kernel/src/gen_udp_socket.erl b/lib/kernel/src/gen_udp_socket.erl
index 43b11b456b..998ec8e194 100644
--- a/lib/kernel/src/gen_udp_socket.erl
+++ b/lib/kernel/src/gen_udp_socket.erl
@@ -1142,7 +1142,7 @@ init(Arg) ->
error_logger:error_report([{badarg, {?MODULE, init, [Arg]}}]),
error(badarg, [Arg]).
-
+
socket_open(Domain, Proto, #{fd := FD} = ExtraOpts, Extra) ->
Opts =
(maps:merge(Extra, maps:remove(fd, ExtraOpts)))
@@ -1170,6 +1170,8 @@ socket_open(Domain, Proto, #{fd := FD} = ExtraOpts, Extra) ->
ERROR
end;
socket_open(Domain, Proto, ExtraOpts, Extra) ->
+ %% ?DBG([{domain, Domain}, {proto, Proto},
+ %% {extra_opts, ExtraOpts}, {extra, Extra}]),
Opts = maps:merge(Extra, ExtraOpts),
socket:open(Domain, dgram, Proto, Opts).
@@ -1444,7 +1446,18 @@ handle_event({call, From}, {bind, BindAddr} = _BIND, _State, {P, _D}) ->
%% ?DBG(['try bind',
%% {handle_event, call}, {bind_addr, BindAddr}, {state, _State}]),
Result = socket:bind(P#params.socket, BindAddr),
- %% ?DBG([{bind_result, Result}]),
+ %% ?DBG([{bind_result, Result}] ++
+ %% case Result of
+ %% ok ->
+ %% case socket:sockname(P#params.socket) of
+ %% {ok, SockAddr} ->
+ %% [{sockaddr, SockAddr}];
+ %% {error, SAReason} ->
+ %% [{sockaddr_reason, SAReason}]
+ %% end;
+ %% {error, BReason} ->
+ %% [{bind_reason, BReason}]
+ %% end),
{keep_state_and_data, [{reply, From, Result}]};
@@ -1478,7 +1491,7 @@ handle_event(
info, ?socket_select(Socket, SelectRef),
#recv{info = ?select_info(SelectRef)},
{#params{socket = Socket} = P, D}) ->
- %% ?DBG([info, {socket, Socket}, {ref, SelectRef}]),
+ %% ?DBG(['info socket select', {socket, Socket}, {ref, SelectRef}, {p, P}, {d, D}]),
handle_recv(P, D, []);
%%
@@ -1486,7 +1499,7 @@ handle_event(
info, ?socket_abort(Socket, SelectRef, Reason),
#recv{info = ?select_info(SelectRef)},
{#params{socket = Socket} = P, D}) ->
- %% ?DBG({abort, Reason}),
+ %% ?DBG(['socket abort', {reason, Reason}, {p, P}, {d, D}]),
handle_reading(P, cleanup_recv_reply(P, D, [], Reason));
%%
@@ -1622,6 +1635,8 @@ handle_recv(#params{socket = Socket, recv_method = []} = P,
%% ?DBG(['try recvfrom', {socket, Socket}, {length, Length}]),
case socket_recvfrom(Socket, Length) of
{ok, {Source, <<Data/binary>>}} ->
+ %% ?DBG(['recvfrom ok', {source, Source},
+ %% {'data sz', byte_size(Data)}]),
handle_recv_deliver(P, D, ActionsR, {Source, Data});
{select, ?select_info(_) = SelectInfo} ->
%% ?DBG(['recvfrom select', {socket_info, SelectInfo}]),
@@ -1635,16 +1650,18 @@ handle_recv(#params{socket = Socket, recv_method = []} = P,
end;
handle_recv(#params{socket = Socket} = P,
#{recv_length := Length} = D, ActionsR) ->
+ %% ?DBG(['try recvmsg', {socket, Socket}, {length, Length}]),
case socket_recvmsg(Socket, Length) of
{ok, MsgHdr} ->
handle_recv_deliver(P, D, ActionsR, MsgHdr);
{select, ?select_info(_) = SelectInfo} ->
+ %% ?DBG(['recvmsg select', {socket_info, SelectInfo}]),
{next_state,
#recv{info = SelectInfo},
{P, D},
reverse(ActionsR)};
{error, Reason} ->
- %% ?DBG({'recv error wo rest-data', Reason}),
+ %% ?DBG(['recvmsg error', {reason, Reason}]),
handle_recv_error(P, D, ActionsR, Reason)
end.
@@ -1731,10 +1748,9 @@ recv_data_deliver(
#params{owner = Owner} = P,
#{mode := Mode, deliver := Deliver} = D,
ActionsR, Data) ->
- %%
- %% ?DBG([{owner, Owner},
- %% {mode, Mode},
- %% {header, Header}, {deliver, Deliver}, {packet, Packet}]),
+
+ %% ?DBG([{owner, Owner}, {mode, Mode}, {deliver, Deliver}]),
+
{IP, Port, AncData, DeliverData} = deliver_data(Data, Mode),
case D of
#{recv_from := From} ->
@@ -1769,6 +1785,7 @@ mk_recv_reply(IP, Port, AncData, Data) ->
{IP, Port, AncData, Data}.
deliver_recv_msg(Pid, Active, Deliver, Socket, IP, Port, AncData, Data) ->
+ %% ?DBG(['deliver packet', {pid, Pid}]),
Pid ! mk_recv_msg(Active, Deliver, Socket, IP, Port, AncData, Data).
mk_recv_msg(true = _Active, port = _Deliver,
diff --git a/lib/kernel/src/inet_dns.erl b/lib/kernel/src/inet_dns.erl
index 7a9444ba74..efe9ee132d 100644
--- a/lib/kernel/src/inet_dns.erl
+++ b/lib/kernel/src/inet_dns.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. 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.
@@ -118,6 +118,24 @@ lists_member(H, [_|T]) -> lists_member(H, T).
%% Decode a dns buffer.
%%
+%% Match macros that throw(?DECODE_ERROR) for no match
+-define(
+ MATCH_ELSE_DECODE_ERROR(Match, Pattern, Result),
+ case begin Match end of
+ (Pattern) ->
+ begin Result end;
+ _ ->
+ throw(?DECODE_ERROR)
+ end).
+-define(
+ MATCH_ELSE_DECODE_ERROR(Match, Pattern, Guard, Result),
+ case begin Match end of
+ (Pattern) when not not (Guard) ->
+ begin Result end;
+ _ ->
+ throw(?DECODE_ERROR)
+ end).
+
decode(Buffer) when is_binary(Buffer) ->
try do_decode(Buffer) of
DnsRec ->
@@ -136,33 +154,37 @@ do_decode(<<Id:16,
{NsBuf,AnList,AnTC} = decode_rr_section(AnBuf,AnCount,Buffer),
{ArBuf,NsList,NsTC} = decode_rr_section(NsBuf,NsCount,Buffer),
{Rest,ArList,ArTC} = decode_rr_section(ArBuf,ArCount,Buffer),
- case Rest of
- <<>> ->
- HdrTC = decode_boolean(TC),
- DnsHdr =
- #dns_header{id=Id,
- qr=decode_boolean(QR),
- opcode=decode_opcode(Opcode),
- aa=decode_boolean(AA),
- tc=HdrTC,
- rd=decode_boolean(RD),
- ra=decode_boolean(RA),
- pr=decode_boolean(PR),
- rcode=Rcode},
- case QdTC or AnTC or NsTC or ArTC of
- true when not HdrTC ->
- throw(?DECODE_ERROR);
- _ ->
- #dns_rec{header=DnsHdr,
- qdlist=QdList,
- anlist=AnList,
- nslist=NsList,
- arlist=ArList}
- end;
- _ ->
- %% Garbage data after DNS message
- throw(?DECODE_ERROR)
- end;
+ ?MATCH_ELSE_DECODE_ERROR(
+ Rest,
+ <<>>,
+ begin
+ HdrTC = decode_boolean(TC),
+ DnsHdr =
+ #dns_header{id=Id,
+ qr=decode_boolean(QR),
+ opcode=decode_opcode(Opcode),
+ aa=decode_boolean(AA),
+ tc=HdrTC,
+ rd=decode_boolean(RD),
+ ra=decode_boolean(RA),
+ pr=decode_boolean(PR),
+ rcode=Rcode},
+ ?MATCH_ELSE_DECODE_ERROR(
+ %% Header marked as truncated, or no section
+ %% marked as truncated.
+ %% The converse; a section marked as truncated,
+ %% but not the header - is a parse error.
+ %%
+ HdrTC or (not (QdTC or AnTC or NsTC or ArTC)),
+ true,
+ begin
+ #dns_rec{header=DnsHdr,
+ qdlist=QdList,
+ anlist=AnList,
+ nslist=NsList,
+ arlist=ArList}
+ end)
+ end);
do_decode(_) ->
%% DNS message does not even match header
throw(?DECODE_ERROR).
@@ -175,17 +197,16 @@ decode_query_section(<<>>=Rest, N, _Buffer, Qs) ->
decode_query_section(Rest, 0, _Buffer, Qs) ->
{Rest,reverse(Qs),false};
decode_query_section(Bin, N, Buffer, Qs) ->
- case decode_name(Bin, Buffer) of
- {<<Type:16,Class:16,Rest/binary>>,Name} ->
+ ?MATCH_ELSE_DECODE_ERROR(
+ decode_name(Bin, Buffer),
+ {<<Type:16,Class:16,Rest/binary>>,Name},
+ begin
DnsQuery =
#dns_query{domain=Name,
type=decode_type(Type),
class=decode_class(Class)},
- decode_query_section(Rest, N-1, Buffer, [DnsQuery|Qs]);
- _ ->
- %% Broken question
- throw(?DECODE_ERROR)
- end.
+ decode_query_section(Rest, N-1, Buffer, [DnsQuery|Qs])
+ end).
decode_rr_section(Bin, N, Buffer) ->
decode_rr_section(Bin, N, Buffer, []).
@@ -195,38 +216,37 @@ decode_rr_section(<<>>=Rest, N, _Buffer, RRs) ->
decode_rr_section(Rest, 0, _Buffer, RRs) ->
{Rest,reverse(RRs),false};
decode_rr_section(Bin, N, Buffer, RRs) ->
- case decode_name(Bin, Buffer) of
- {<<T:16/unsigned,C:16/unsigned,TTL:4/binary,
+ ?MATCH_ELSE_DECODE_ERROR(
+ decode_name(Bin, Buffer),
+ {<<T:16/unsigned,C:16/unsigned,TTL:4/binary,
Len:16,D:Len/binary,Rest/binary>>,
- Name} ->
- Type = decode_type(T),
- Class = decode_class(C),
- Data = decode_data(D, Class, Type, Buffer),
- RR =
- case Type of
- opt ->
- <<ExtRcode,Version,Z:16>> = TTL,
- #dns_rr_opt{domain=Name,
- type=Type,
- udp_payload_size=C,
- ext_rcode=ExtRcode,
- version=Version,
- z=Z,
- data=Data};
- _ ->
- <<TimeToLive:32/signed>> = TTL,
- #dns_rr{domain=Name,
- type=Type,
- class=Class,
- ttl=if TimeToLive < 0 -> 0;
- true -> TimeToLive end,
- data=Data}
- end,
- decode_rr_section(Rest, N-1, Buffer, [RR|RRs]);
- _ ->
- %% Broken RR
- throw(?DECODE_ERROR)
- end.
+ Name},
+ begin
+ Type = decode_type(T),
+ Class = decode_class(C),
+ Data = decode_data(D, Class, Type, Buffer),
+ RR =
+ case Type of
+ opt ->
+ <<ExtRcode,Version,Z:16>> = TTL,
+ #dns_rr_opt{domain=Name,
+ type=Type,
+ udp_payload_size=C,
+ ext_rcode=ExtRcode,
+ version=Version,
+ z=Z,
+ data=Data};
+ _ ->
+ <<TimeToLive:32/signed>> = TTL,
+ #dns_rr{domain=Name,
+ type=Type,
+ class=Class,
+ ttl=if TimeToLive < 0 -> 0;
+ true -> TimeToLive end,
+ data=Data}
+ end,
+ decode_rr_section(Rest, N-1, Buffer, [RR|RRs])
+ end).
%%
%% Encode a user query
@@ -430,76 +450,100 @@ encode_boolean(B) when is_integer(B) -> B.
decode_boolean(0) -> false;
decode_boolean(I) when is_integer(I) -> true.
+
%%
%% Data field -> term() content representation
%%
-decode_data(<<A,B,C,D>>, in, ?S_A, _) -> {A,B,C,D};
-decode_data(<<A:16,B:16,C:16,D:16,E:16,F:16,G:16,H:16>>, in, ?S_AAAA, _) ->
- {A,B,C,D,E,F,G,H};
-decode_data(Dom, _, ?S_NS, Buffer) -> decode_domain(Dom, Buffer);
-decode_data(Dom, _, ?S_MD, Buffer) -> decode_domain(Dom, Buffer);
-decode_data(Dom, _, ?S_MF, Buffer) -> decode_domain(Dom, Buffer);
-decode_data(Dom, _, ?S_CNAME, Buffer) -> decode_domain(Dom, Buffer);
-decode_data(Data0, _, ?S_SOA, Buffer) ->
- {Data1,MName} = decode_name(Data0, Buffer),
- {Data,RName} = decode_name(Data1, Buffer),
- case Data of
- <<Serial:32,Refresh:32/signed,Retry:32/signed,
- Expiry:32/signed,Minimum:32>> ->
- {MName,RName,Serial,Refresh,Retry,Expiry,Minimum};
- _ ->
- %% Broken SOA RR data
- throw(?DECODE_ERROR)
- end;
-decode_data(Dom, _, ?S_MB, Buffer) -> decode_domain(Dom, Buffer);
-decode_data(Dom, _, ?S_MG, Buffer) -> decode_domain(Dom, Buffer);
-decode_data(Dom, _, ?S_MR, Buffer) -> decode_domain(Dom, Buffer);
-decode_data(Data, _, ?S_NULL, _) -> Data;
-decode_data(<<A,B,C,D,Proto,BitMap/binary>>, in, ?S_WKS, _Buffer) ->
- {{A,B,C,D},Proto,BitMap};
-decode_data(Dom, _, ?S_PTR, Buffer) -> decode_domain(Dom, Buffer);
-decode_data(<<CpuLen,CPU:CpuLen/binary,
- OsLen,OS:OsLen/binary>>, _, ?S_HINFO, _) ->
- {binary_to_list(CPU),binary_to_list(OS)};
-decode_data(Data0, _, ?S_MINFO, Buffer) ->
- {Data1,RM} = decode_name(Data0, Buffer),
- {Data,EM} = decode_name(Data1, Buffer),
- case Data of
- <<>> -> {RM,EM};
- _ ->
- %% Broken MINFO data
- throw(?DECODE_ERROR)
- end;
-decode_data(<<Prio:16,Dom/binary>>, _, ?S_MX, Buffer) ->
- {Prio,decode_domain(Dom, Buffer)};
-decode_data(<<Prio:16,Weight:16,Port:16,Dom/binary>>, _, ?S_SRV, Buffer) ->
- {Prio,Weight,Port,decode_domain(Dom, Buffer)};
-decode_data(<<Order:16,Preference:16,Data0/binary>>, _, ?S_NAPTR, Buffer) ->
- {Data1,Flags} = decode_string(Data0),
- {Data2,Services} = decode_string(Data1),
- {Data,Regexp} = decode_characters(Data2, utf8),
- Replacement = decode_domain(Data, Buffer),
- {Order,Preference,inet_db:tolower(Flags),inet_db:tolower(Services),
- Regexp,Replacement};
-%% ?S_OPT falls through to default
-decode_data(Data, _, ?S_TXT, _) ->
- decode_txt(Data);
-decode_data(Data, _, ?S_SPF, _) ->
- decode_txt(Data);
-decode_data(<<Prio:16,Weight:16,Data0/binary>>, _, ?S_URI, _) ->
- (1 =< byte_size(Data0))
- orelse throw(?DECODE_ERROR),
- Target = binary_to_list(Data0),
- {Prio,Weight,Target};
+%% Class IN RRs
+decode_data(Data, in, ?S_A, _) ->
+ ?MATCH_ELSE_DECODE_ERROR(Data, <<A,B,C,D>>, {A,B,C,D});
+decode_data(Data, in, ?S_AAAA, _) ->
+ ?MATCH_ELSE_DECODE_ERROR(
+ Data,
+ <<A:16,B:16,C:16,D:16,E:16,F:16,G:16,H:16>>,
+ {A,B,C,D,E,F,G,H});
+decode_data(Data, in, ?S_WKS, _) ->
+ ?MATCH_ELSE_DECODE_ERROR(
+ Data,
+ <<A,B,C,D,Proto,BitMap/binary>>,
+ {{A,B,C,D},Proto,BitMap});
+%%
+%% Standard RRs (any class)
+decode_data(Data, _, ?S_SOA, Buffer) ->
+ {Data1,MName} = decode_name(Data, Buffer),
+ {Data2,RName} = decode_name(Data1, Buffer),
+ ?MATCH_ELSE_DECODE_ERROR(
+ Data2,
+ <<Serial:32,Refresh:32/signed,Retry:32/signed,
+ Expiry:32/signed,Minimum:32>>,
+ {MName,RName,Serial,Refresh,Retry,Expiry,Minimum});
+decode_data(Data, _, ?S_NS, Buffer) -> decode_domain(Data, Buffer);
+decode_data(Data, _, ?S_MD, Buffer) -> decode_domain(Data, Buffer);
+decode_data(Data, _, ?S_MF, Buffer) -> decode_domain(Data, Buffer);
+decode_data(Data, _, ?S_CNAME, Buffer) -> decode_domain(Data, Buffer);
+decode_data(Data, _, ?S_MB, Buffer) -> decode_domain(Data, Buffer);
+decode_data(Data, _, ?S_MG, Buffer) -> decode_domain(Data, Buffer);
+decode_data(Data, _, ?S_MR, Buffer) -> decode_domain(Data, Buffer);
+decode_data(Data, _, ?S_PTR, Buffer) -> decode_domain(Data, Buffer);
+decode_data(Data, _, ?S_NULL, _) -> Data;
+decode_data(Data, _, ?S_HINFO, _) ->
+ ?MATCH_ELSE_DECODE_ERROR(
+ Data,
+ <<CpuLen,CPU:CpuLen/binary,OsLen,OS:OsLen/binary>>,
+ {binary_to_list(CPU),binary_to_list(OS)});
+decode_data(Data, _, ?S_MINFO, Buffer) ->
+ {Data1,RM} = decode_name(Data, Buffer),
+ {Data2,EM} = decode_name(Data1, Buffer),
+ ?MATCH_ELSE_DECODE_ERROR(Data2, <<>>, {RM,EM});
+decode_data(Data, _, ?S_MX, Buffer) ->
+ ?MATCH_ELSE_DECODE_ERROR(
+ Data,
+ <<Prio:16,Dom/binary>>,
+ {Prio,decode_domain(Dom, Buffer)});
+decode_data(Data, _, ?S_SRV, Buffer) ->
+ ?MATCH_ELSE_DECODE_ERROR(
+ Data,
+ <<Prio:16,Weight:16,Port:16,Dom/binary>>,
+ {Prio,Weight,Port,decode_domain(Dom, Buffer)});
+decode_data(Data, _, ?S_NAPTR, Buffer) ->
+ ?MATCH_ELSE_DECODE_ERROR(
+ Data,
+ <<Order:16,Preference:16,Data1/binary>>,
+ begin
+ {Data2,Flags} = decode_string(Data1),
+ {Data3,Services} = decode_string(Data2),
+ {Data4,Regexp} = decode_characters(Data3, utf8),
+ Replacement = decode_domain(Data4, Buffer),
+ {Order,Preference,
+ inet_db:tolower(Flags),inet_db:tolower(Services),
+ Regexp,Replacement}
+ end);
+decode_data(Data, _, ?S_OPT, _) -> Data;
+decode_data(Data, _, ?S_TXT, _) -> decode_txt(Data);
+decode_data(Data, _, ?S_SPF, _) -> decode_txt(Data);
decode_data(Data, _, ?S_URI, _) ->
- decode_txt(Data);
-decode_data(<<Flags:8,Data0/binary>>, _, ?S_CAA, _) ->
- {Data1,Tag} = decode_string(Data0),
- L = length(Tag),
- (1 =< L andalso L =< 15)
- orelse throw(?DECODE_ERROR),
- Value = binary_to_list(Data1),
- {Flags,inet_db:tolower(Tag),Value};
+ ?MATCH_ELSE_DECODE_ERROR(
+ Data,
+ <<Prio:16,Weight:16,Data1/binary>>, 1 =< byte_size(Data1),
+ begin
+ Target = binary_to_list(Data1),
+ {Prio,Weight,Target}
+ end);
+decode_data(Data, _, ?S_CAA, _) ->
+ ?MATCH_ELSE_DECODE_ERROR(
+ Data,
+ <<Flags:8,Data1/binary>>,
+ begin
+ {Data2,Tag} = decode_string(Data1),
+ ?MATCH_ELSE_DECODE_ERROR(
+ length(Tag),
+ L, 1 =< L andalso L =< 15,
+ begin
+ Value = binary_to_list(Data2),
+ {Flags,inet_db:tolower(Tag),Value}
+ end)
+ end);
+%%
%% sofar unknown or non standard
decode_data(Data, _, _, _) ->
Data.
@@ -511,27 +555,22 @@ decode_txt(Bin) ->
{Rest,String} = decode_string(Bin),
[String|decode_txt(Rest)].
-decode_string(<<Len,Bin:Len/binary,Rest/binary>>) ->
- {Rest,binary_to_list(Bin)};
-decode_string(_) ->
- %% Broken string
- throw(?DECODE_ERROR).
+decode_string(Data) ->
+ ?MATCH_ELSE_DECODE_ERROR(
+ Data,
+ <<Len,Bin:Len/binary,Rest/binary>>,
+ {Rest,binary_to_list(Bin)}).
-decode_characters(<<Len,Bin:Len/binary,Rest/binary>>, Encoding) ->
- {Rest,unicode:characters_to_list(Bin, Encoding)};
-decode_characters(_, _) ->
- %% Broken encoded string
- throw(?DECODE_ERROR).
+decode_characters(Data, Encoding) ->
+ ?MATCH_ELSE_DECODE_ERROR(
+ Data,
+ <<Len,Bin:Len/binary,Rest/binary>>,
+ {Rest,unicode:characters_to_list(Bin, Encoding)}).
%% One domain name only, there must be nothing after
%%
decode_domain(Bin, Buffer) ->
- case decode_name(Bin, Buffer) of
- {<<>>,Name} -> Name;
- _ ->
- %% Garbage after domain name
- throw(?DECODE_ERROR)
- end.
+ ?MATCH_ELSE_DECODE_ERROR(decode_name(Bin, Buffer), {<<>>,Name}, Name).
%% Domain name -> {RestBin,Name}
%%
@@ -554,15 +593,13 @@ decode_name(<<0:2,Len:6,Label:Len/binary,Rest/binary>>,
Cnt);
decode_name(<<3:2,Ptr:14,Rest/binary>>, Buffer, Labels, Tail, Cnt) ->
%% Indirection - reposition in buffer and recurse
- case Buffer of
- <<_:Ptr/binary,Bin/binary>> ->
- decode_name(Bin, Buffer, Labels,
- if Cnt =/= 0 -> Tail; true -> Rest end,
- Cnt+2); % size of indirection pointer
- _ ->
- %% Indirection pointer outside buffer
- throw(?DECODE_ERROR)
- end;
+ ?MATCH_ELSE_DECODE_ERROR(
+ Buffer,
+ <<_:Ptr/binary,Bin/binary>>,
+ decode_name(
+ Bin, Buffer, Labels,
+ if Cnt =/= 0 -> Tail; true -> Rest end,
+ Cnt+2)); % size of indirection pointer
decode_name(_, _, _, _, _) -> throw(?DECODE_ERROR).
%% Reverse list of labels (binaries) -> domain name (string)
@@ -575,12 +612,13 @@ decode_name_labels([Label], Name) ->
decode_name_labels([Label|Labels], Name) ->
decode_name_labels(Labels, "."++decode_name_label(Label, Name)).
-decode_name_label(<<>>, _Name) ->
- %% Empty label is only allowed for the root domain,
- %% and that is handled above.
- throw(?DECODE_ERROR);
decode_name_label(Label, Name) ->
- decode_name_label(Label, Name, byte_size(Label)).
+ ?MATCH_ELSE_DECODE_ERROR(
+ Label,
+ _, 1 =< byte_size(Label),
+ %% Empty label is only allowed for the root domain,
+ %% and that is handled above.
+ decode_name_label(Label, Name, byte_size(Label))).
%% Decode $. and $\\ to become $\\ escaped characters
%% in the string representation.
@@ -604,40 +642,42 @@ decode_name_label(Label, Name, N) ->
%%
%% Data field -> {binary(),NewCompressionTable}
%%
+%% Class IN RRs
encode_data(Comp, _, ?S_A, in, {A,B,C,D}) -> {<<A,B,C,D>>,Comp};
encode_data(Comp, _, ?S_AAAA, in, {A,B,C,D,E,F,G,H}) ->
{<<A:16,B:16,C:16,D:16,E:16,F:16,G:16,H:16>>,Comp};
-encode_data(Comp, Pos, ?S_NS, in, Domain) -> encode_name(Comp, Pos, Domain);
-encode_data(Comp, Pos, ?S_MD, in, Domain) -> encode_name(Comp, Pos, Domain);
-encode_data(Comp, Pos, ?S_MF, in, Domain) -> encode_name(Comp, Pos, Domain);
-encode_data(Comp, Pos, ?S_CNAME, in, Domain) -> encode_name(Comp, Pos, Domain);
-encode_data(Comp0, Pos, ?S_SOA, in,
- {MName,RName,Serial,Refresh,Retry,Expiry,Minimum}) ->
- {B1,Comp1} = encode_name(Comp0, Pos, MName),
- {B,Comp} = encode_name(B1, Comp1, Pos+byte_size(B1), RName),
- {<<B/binary,Serial:32,Refresh:32/signed,Retry:32/signed,
- Expiry:32/signed,Minimum:32>>,
- Comp};
-encode_data(Comp, Pos, ?S_MB, in, Domain) -> encode_name(Comp, Pos, Domain);
-encode_data(Comp, Pos, ?S_MG, in, Domain) -> encode_name(Comp, Pos, Domain);
-encode_data(Comp, Pos, ?S_MR, in, Domain) -> encode_name(Comp, Pos, Domain);
-encode_data(Comp, _, ?S_NULL, in, Data) ->
- {iolist_to_binary(Data),Comp};
encode_data(Comp, _, ?S_WKS, in, {{A,B,C,D},Proto,BitMap}) ->
BitMapBin = iolist_to_binary(BitMap),
{<<A,B,C,D,Proto,BitMapBin/binary>>,Comp};
-encode_data(Comp, Pos, ?S_PTR, in, Domain) -> encode_name(Comp, Pos, Domain);
-encode_data(Comp, _, ?S_HINFO, in, {CPU,OS}) ->
+%%
+%% Standard RRs (any class)
+encode_data(Comp, Pos, ?S_NS, _, Domain) -> encode_name(Comp, Pos, Domain);
+encode_data(Comp, Pos, ?S_MD, _, Domain) -> encode_name(Comp, Pos, Domain);
+encode_data(Comp, Pos, ?S_MF, _, Domain) -> encode_name(Comp, Pos, Domain);
+encode_data(Comp, Pos, ?S_CNAME, _, Domain) -> encode_name(Comp, Pos, Domain);
+encode_data(Comp, Pos, ?S_SOA, _,
+ {MName,RName,Serial,Refresh,Retry,Expiry,Minimum}) ->
+ {B1,Comp1} = encode_name(Comp, Pos, MName),
+ {B,Comp2} = encode_name(B1, Comp1, Pos+byte_size(B1), RName),
+ {<<B/binary,Serial:32,Refresh:32/signed,Retry:32/signed,
+ Expiry:32/signed,Minimum:32>>,
+ Comp2};
+encode_data(Comp, Pos, ?S_MB, _, Domain) -> encode_name(Comp, Pos, Domain);
+encode_data(Comp, Pos, ?S_MG, _, Domain) -> encode_name(Comp, Pos, Domain);
+encode_data(Comp, Pos, ?S_MR, _, Domain) -> encode_name(Comp, Pos, Domain);
+encode_data(Comp, _, ?S_NULL, _, Data) -> {iolist_to_binary(Data),Comp};
+encode_data(Comp, Pos, ?S_PTR, _, Domain) -> encode_name(Comp, Pos, Domain);
+encode_data(Comp, _, ?S_HINFO, _, {CPU,OS}) ->
Bin = encode_string(iolist_to_binary(CPU)),
{encode_string(Bin, iolist_to_binary(OS)),Comp};
-encode_data(Comp0, Pos, ?S_MINFO, in, {RM,EM}) ->
- {Bin,Comp} = encode_name(Comp0, Pos, RM),
- encode_name(Bin, Comp, Pos+byte_size(Bin), EM);
-encode_data(Comp, Pos, ?S_MX, in, {Pref,Exch}) ->
+encode_data(Comp, Pos, ?S_MINFO, _, {RM,EM}) ->
+ {Bin,Comp1} = encode_name(Comp, Pos, RM),
+ encode_name(Bin, Comp1, Pos+byte_size(Bin), EM);
+encode_data(Comp, Pos, ?S_MX, _, {Pref,Exch}) ->
encode_name(<<Pref:16>>, Comp, Pos+2, Exch);
-encode_data(Comp, Pos, ?S_SRV, in, {Prio,Weight,Port,Target}) ->
+encode_data(Comp, Pos, ?S_SRV, _, {Prio,Weight,Port,Target}) ->
encode_name(<<Prio:16,Weight:16,Port:16>>, Comp, Pos+2+2+2, Target);
-encode_data(Comp, Pos, ?S_NAPTR, in,
+encode_data(Comp, Pos, ?S_NAPTR, _,
{Order,Preference,Flags,Services,Regexp,Replacement}) ->
B0 = <<Order:16,Preference:16>>,
B1 = encode_string(B0, iolist_to_binary(Flags)),
@@ -647,19 +687,21 @@ encode_data(Comp, Pos, ?S_NAPTR, in,
%% Bypass name compression (RFC 2915: section 2)
{B,_} = encode_name(B3, gb_trees:empty(), Pos+byte_size(B3), Replacement),
{B,Comp};
-%% ?S_OPT falls through to default
-encode_data(Comp, _, ?S_TXT, in, Data) -> {encode_txt(Data),Comp};
-encode_data(Comp, _, ?S_SPF, in, Data) -> {encode_txt(Data),Comp};
-encode_data(Comp, _, ?S_URI, in, {Prio,Weight,Target}) ->
+encode_data(Comp, _, ?S_OPT, _, Data) -> {iolist_to_binary(Data),Comp};
+encode_data(Comp, _, ?S_TXT, _, Data) -> {encode_txt(Data),Comp};
+encode_data(Comp, _, ?S_SPF, _, Data) -> {encode_txt(Data),Comp};
+encode_data(Comp, _, ?S_URI, _, {Prio,Weight,Target}) ->
{<<Prio:16,Weight:16,(iolist_to_binary(Target))/binary>>,Comp};
-encode_data(Comp, _, ?S_URI, in, Data) -> {encode_txt(Data),Comp};
-encode_data(Comp, _, ?S_CAA, in, {Flags,Tag,Value}) ->
+encode_data(Comp, _, ?S_CAA, _, {Flags,Tag,Value}) ->
B0 = <<Flags:8>>,
B1 = encode_string(B0, iolist_to_binary(Tag)),
B2 = iolist_to_binary(Value),
{<<B1/binary,B2/binary>>,Comp};
-encode_data(Comp, _, ?S_CAA, in, Data) -> {encode_txt(Data),Comp};
-encode_data(Comp, _Pos, _Type, _Class, Data) -> {iolist_to_binary(Data),Comp}.
+encode_data(Comp, _, ?S_CAA, _, Data) -> {encode_txt(Data),Comp};
+%%
+%% sofar unknown or non standard
+encode_data(Comp, _Pos, _Type, _Class, Data) ->
+ {iolist_to_binary(Data),Comp}.
%% Array of strings
%%
diff --git a/lib/kernel/src/inet_parse.erl b/lib/kernel/src/inet_parse.erl
index e9685c6554..31d759428d 100644
--- a/lib/kernel/src/inet_parse.erl
+++ b/lib/kernel/src/inet_parse.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2017. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. 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.
@@ -45,6 +45,7 @@
-import(lists, [reverse/1]).
-include_lib("kernel/include/file.hrl").
+-include("inet_int.hrl").
%% --------------------------------------------------------------------------
%% Parse services internet style
@@ -759,7 +760,7 @@ dup(N, E, L) when is_integer(N), N >= 1 ->
%% Convert IPv4 address to ascii
%% Convert IPv6 / IPV4 address to ascii (plain format)
-ntoa({A,B,C,D}) when (A band B band C band D band (bnot 16#ff)) =:= 0 ->
+ntoa({A,B,C,D}) when ?ip(A,B,C,D) ->
integer_to_list(A) ++ "." ++ integer_to_list(B) ++ "." ++
integer_to_list(C) ++ "." ++ integer_to_list(D);
%% ANY
@@ -767,14 +768,12 @@ ntoa({0,0,0,0,0,0,0,0}) -> "::";
%% LOOPBACK
ntoa({0,0,0,0,0,0,0,1}) -> "::1";
%% IPV4 ipv6 host address
-ntoa({0,0,0,0,0,0,A,B}) when (A band B band (bnot 16#ffff)) =:= 0 ->
+ntoa({0,0,0,0,0,0,A,B}) when ?ip6(0,0,0,0,0,0,A,B) ->
"::" ++ dig_to_dec(A) ++ "." ++ dig_to_dec(B);
%% IPV4 non ipv6 host address
-ntoa({0,0,0,0,0,16#ffff,A,B}) when (A band B band (bnot 16#ffff)) =:= 0 ->
+ntoa({0,0,0,0,0,16#ffff=X,A,B}) when ?ip6(0,0,0,0,0,X,A,B) ->
"::ffff:" ++ dig_to_dec(A) ++ "." ++ dig_to_dec(B);
-ntoa({A,B,C,D,E,F,G,H})
- when (A band B band C band D band E band F band G band H band
- (bnot 16#ffff)) =:= 0 ->
+ntoa({A,B,C,D,E,F,G,H}) when ?ip6(A,B,C,D,E,F,G,H) ->
if
A =:= 16#fe80, B =/= 0;
A =:= 16#ff02, B =/= 0 ->
diff --git a/lib/kernel/src/socket.erl b/lib/kernel/src/socket.erl
index a5c27339b8..ef2e868e2c 100644
--- a/lib/kernel/src/socket.erl
+++ b/lib/kernel/src/socket.erl
@@ -232,7 +232,7 @@
-type ip_mreq() ::
#{multiaddr := in_addr(),
- address := in_addr()}.
+ interface := in_addr()}.
-type ip_mreq_source() ::
#{multiaddr := in_addr(),
diff --git a/lib/kernel/test/inet_SUITE.erl b/lib/kernel/test/inet_SUITE.erl
index 5c7587340b..838e0971fe 100644
--- a/lib/kernel/test/inet_SUITE.erl
+++ b/lib/kernel/test/inet_SUITE.erl
@@ -47,7 +47,7 @@
lookup_bad_search_option/1,
getif/1,
getif_ifr_name_overflow/1,getservbyname_overflow/1, getifaddrs/1,
- parse_strict_address/1, ipv4_mapped_ipv6_address/1,
+ parse_strict_address/1, ipv4_mapped_ipv6_address/1, ntoa/1,
simple_netns/1, simple_netns_open/1,
add_del_host/1, add_del_host_v6/1,
simple_bind_to_device/1, simple_bind_to_device_open/1
@@ -76,7 +76,8 @@ all() ->
gethostnative_debug_level, gethostnative_soft_restart,
lookup_bad_search_option,
getif, getif_ifr_name_overflow, getservbyname_overflow,
- getifaddrs, parse_strict_address, simple_netns, simple_netns_open,
+ getifaddrs, parse_strict_address, ipv4_mapped_ipv6_address, ntoa,
+ simple_netns, simple_netns_open,
add_del_host, add_del_host_v6,
simple_bind_to_device, simple_bind_to_device_open
].
@@ -825,6 +826,51 @@ ipv4_mapped_ipv6_address(Config) when is_list(Config) ->
IPv4Address = inet:ipv4_mapped_ipv6_address(IPv6Address),
ok.
+
+ntoa(Config) when is_list(Config) ->
+ M8 = 1 bsl 8,
+ M16 = 1 bsl 16,
+ V4Xs = rand_tuple(4, M8),
+ V6Xs = rand_tuple(4, M16),
+ ntoa(
+ [{A, B, C, D} ||
+ A <- [0, element(1, V4Xs), M8-1, -1, 256],
+ B <- [0, element(2, V4Xs), M8-1, -1, 256],
+ C <- [0, element(3, V4Xs), M8-1, -1, 256],
+ D <- [0, element(4, V4Xs), M8-1, -1, 256]], M8-1),
+ ntoa(
+ [{E, F, G, H, G, G, E, F} ||
+ E <- [0, element(1, V6Xs), M16-1, -1, M16],
+ F <- [0, element(2, V6Xs), M16-1, -1, M16],
+ G <- [0, element(3, V6Xs), M16-1, -1, M16],
+ H <- [0, element(4, V6Xs), M16-1, -1, M16]], M16-1).
+
+ntoa([A | As], Max) ->
+ case
+ lists:all(
+ fun (X) when 0 =< X, X =< Max -> true;
+ (_) -> false
+ end, tuple_to_list(A))
+ of
+ true ->
+ S = inet:ntoa(A),
+ {ok, A} = inet:parse_address(S);
+ false ->
+ {error, einval} = inet:ntoa(A)
+ end,
+ ntoa(As, Max);
+ntoa([], _Max) ->
+ ok.
+
+rand_tuple(N, M) ->
+ rand_tuple(N, M, []).
+%%
+rand_tuple(0, _M, Acc) ->
+ list_to_tuple(Acc);
+rand_tuple(N, M, Acc) ->
+ rand_tuple(N - 1, M, [rand:uniform(M) - 1 | Acc]).
+
+
t_gethostnative(Config) when is_list(Config) ->
%% this will result in 26 bytes sent which causes problem in Windows
%% if the port-program has not assured stdin to be read in BINARY mode
diff --git a/lib/megaco/doc/src/megaco_tcp.xml b/lib/megaco/doc/src/megaco_tcp.xml
index 74a16eefab..eee44ef7f2 100644
--- a/lib/megaco/doc/src/megaco_tcp.xml
+++ b/lib/megaco/doc/src/megaco_tcp.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2000</year><year>2020</year>
+ <year>2000</year><year>2021</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -56,7 +56,7 @@
<type>
<v>TransportRef = pid() | regname()</v>
<v>OptionListPerPort = [Option]</v>
- <v>Option = {port, integer()} |{options, list()} |{receive_handle, term()}</v>
+ <v>Option = {port, integer()} | {options, list()} | {receive_handle, term()} | {inet_backend, default | inet | socket}</v>
</type>
<desc>
<p>This function is used for starting new TPKT listening socket
@@ -64,25 +64,43 @@
definitions.</p>
</desc>
</func>
+
<func>
<name since="">connect(TransportRef, OptionList) -> {ok, Handle, ControlPid} | {error, Reason}</name>
<fsummary></fsummary>
<type>
<v>TransportRef = pid() | regname()</v>
<v>OptionList = [Option]</v>
- <v>Option = {host, Ipaddr} | {port, integer()} |{options, list()} |{receive_handle, term()} |{module, atom()}</v>
+ <v>Option = {host, IpAddr} |
+ {port, integer()} |
+ {options, list()} |
+ {receive_handle, term()} |
+ {module, atom()} |
+ {inet_backend, default | inet | socket}</v>
<v>Handle = socket_handle()</v>
<v>ControlPid = pid()</v>
<v>Reason = term()</v>
</type>
<desc>
- <p>This function is used to open a TPKT connection.</p>
- <p>The <c><![CDATA[module]]></c> option makes it possible for the user to provide
- their own callback module. The <c><![CDATA[receive_message/4]]></c> or
- <c><![CDATA[process_received_message/4]]></c> functions of this module is called
- when a new message is received (which one depends on the size of the
- message; small - receive_message, large - process_received_message).
- Default value is <em>megaco</em>.</p>
+ <p>This function is used to open a TPKT connection.</p>
+ <taglist>
+ <tag><c><![CDATA[module]]></c></tag>
+ <item>
+ <p>This option makes it possible for the user to provide
+ their own callback module.
+ The <c><![CDATA[receive_message/4]]></c>
+ or <c><![CDATA[process_received_message/4]]></c> functions of
+ this module is called when a new message is received.
+ Which one is called depends on the size of the message; </p>
+ <taglist>
+ <tag><c><![CDATA[small]]></c></tag>
+ <item><p>receive_message</p></item>
+ <tag><c><![CDATA[large]]></c></tag>
+ <item><p>process_received_message</p></item>
+ </taglist>
+ <p>Default value is <em>megaco</em>. </p>
+ </item>
+ </taglist>
</desc>
</func>
<func>
diff --git a/lib/megaco/doc/src/megaco_udp.xml b/lib/megaco/doc/src/megaco_udp.xml
index 2809bc8ce9..f9dc551f6c 100644
--- a/lib/megaco/doc/src/megaco_udp.xml
+++ b/lib/megaco/doc/src/megaco_udp.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2000</year><year>2020</year>
+ <year>2000</year><year>2021</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -56,20 +56,36 @@
<type>
<v>TransportRef = pid() | regname()</v>
<v>OptionList = [option()]</v>
- <v>option() = {port, integer()} |{options, list()} |{receive_handle, receive_handle()} |{module, atom()}</v>
+ <v>option() = {port, integer()} |
+ {options, list()} |
+ {receive_handle, receive_handle()} |
+ {module, atom()} |
+ {inet_backend, default | inet | socket}</v>
<v>Handle = socket_handle()</v>
<v>receive_handle() = term()</v>
<v>ControlPid = pid()</v>
<v>Reason = term()</v>
</type>
<desc>
- <p>This function is used to open an UDP/IP socket.</p>
- <p>The <c><![CDATA[module]]></c> option makes it possible for the user to provide
- their own callback module. The functions <c><![CDATA[receive_message/4]]></c> or
- <c><![CDATA[process_received_message/4]]></c> of this module is called when a new
- message is received (which one depends on the size of the message;
- small - receive_message, large - process_received_message).
- Default value is <em>megaco</em>.</p>
+ <p>This function is used to open an UDP/IP socket.</p>
+ <taglist>
+ <tag><c><![CDATA[module]]></c></tag>
+ <item>
+ <p>The option makes it possible for the user to provide
+ their own callback module.
+ The functions <c><![CDATA[receive_message/4]]></c> or
+ <c><![CDATA[process_received_message/4]]></c>
+ of this module is called when a new message is received.
+ Which one depends on the size of the message: </p>
+ <taglist>
+ <tag><c><![CDATA[small]]></c></tag>
+ <item><p>receive_message</p></item>
+ <tag><c><![CDATA[large]]></c></tag>
+ <item><p>process_received_message</p></item>
+ </taglist>
+ <p>Default value is <em>megaco</em>.</p>
+ </item>
+ </taglist>
</desc>
</func>
<func>
diff --git a/lib/megaco/src/tcp/megaco_tcp.erl b/lib/megaco/src/tcp/megaco_tcp.erl
index 1735439501..460e679efc 100644
--- a/lib/megaco/src/tcp/megaco_tcp.erl
+++ b/lib/megaco/src/tcp/megaco_tcp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2021. 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.
@@ -66,6 +66,8 @@
reset_stats/0, reset_stats/1
]).
+%% -export([tcp_sockets/0]).
+
%%-----------------------------------------------------------------
%% Internal exports
@@ -177,11 +179,18 @@ connect(SupPid, Parameters) ->
?d1("connect -> options parsed: "
"~n Rec: ~p", [Rec]),
- #megaco_tcp{host = Host,
- port = Port,
- options = Options} = Rec,
+ #megaco_tcp{host = Host,
+ port = Port,
+ options = Options,
+ inet_backend = IB} = Rec,
- IpOpt = [binary, {packet, tpkt}, {active, once} | Options],
+ IpOpt =
+ case IB of
+ default ->
+ [];
+ _ ->
+ [{inet_backend, IB}]
+ end ++ [binary, {packet, tpkt}, {active, once} | Options],
%%------------------------------------------------------
%% Connect the other side
@@ -376,7 +385,7 @@ create_snmp_counters(Socket, [Counter|Counters]) ->
%%-----------------------------------------------------------------
init({SupPid, _}) ->
process_flag(trap_exit, true),
- {ok, #state{supervisor_pid = SupPid}}.
+ {ok, #state{supervisor_pid = SupPid, linkdb = []}}.
%%-----------------------------------------------------------------
%% Func: terminate/1
@@ -409,7 +418,11 @@ start_tcp_listener(P, State) ->
{error, Reason} ->
?d1("start_tcp_listener -> setup failed"
"~n Reason: ~p", [Reason]),
- {reply, {error, {could_not_start_listener, Reason}}, State}
+ DB = State#state.linkdb,
+ DBStatus = [{LPid, {LRec, LSock}, inet:info(LSock)} ||
+ {LPid, {LRec, LSock}} <- DB],
+ Reply = {error, {could_not_start_listener, Reason, DBStatus}},
+ {reply, Reply, State}
end.
@@ -480,10 +493,18 @@ setup(SupPid, Options) ->
%%------------------------------------------------------
%% Setup the listen socket
- IpOpts = [binary, {packet, tpkt}, {active, once},
- {reuseaddr, true} | TcpRec#megaco_tcp.options],
- case catch gen_tcp:listen(TcpRec#megaco_tcp.port, IpOpts) of
- {ok, Listen} ->
+ IpOpts =
+ case TcpRec#megaco_tcp.inet_backend of
+ default ->
+ [];
+ IB ->
+ [{inet_backend, IB}]
+ end ++
+ [binary, {packet, tpkt}, {active, once},
+ {reuseaddr, true} | TcpRec#megaco_tcp.options],
+ Port = TcpRec#megaco_tcp.port,
+ case catch gen_tcp:listen(Port, IpOpts) of
+ {ok, LSock} ->
?d1("setup -> listen ok"
"~n Listen: ~p", [Listen]),
@@ -491,14 +512,13 @@ setup(SupPid, Options) ->
%%-----------------------------------------------
%% Startup the accept process that will wait for
%% connect attempts
- case start_accept(SupPid, TcpRec, Listen) of
+ case start_accept(SupPid, TcpRec, LSock) of
{ok, Pid} ->
-
?d1("setup -> accept process started"
"~n Pid: ~p", [Pid]),
-
?tcp_debug(TcpRec, "tcp listen setup", []),
- {ok, Pid, {TcpRec, Listen}};
+ {ok, Pid, {TcpRec, LSock}};
+
{error, _Reason} = Error ->
?d1("setup -> failed starting accept process"
"~n Error: ~p", [Error]),
@@ -506,16 +526,17 @@ setup(SupPid, Options) ->
[Error]),
Error
end;
+
{error, Reason} ->
?d1("setup -> listen failed"
"~n Reason: ~p", [Reason]),
- Error = {error, {gen_tcp_listen, Reason}},
+ Error = {error, {gen_tcp_listen, Reason, [Port, IpOpts]}},
?tcp_debug(TcpRec, "tcp listen setup failed", [Error]),
Error;
{'EXIT', _Reason} = Exit ->
?d1("setup -> listen exited"
"~n Exit: ~p", [Exit]),
- Error = {error, {gen_tcp_listen, Exit}},
+ Error = {error, {gen_tcp_listen, Exit, [Port, IpOpts]}},
?tcp_debug(TcpRec, "tcp listen setup failed", [Error]),
Error
end;
@@ -642,6 +663,10 @@ parse_options([{Tag, Val} | T], TcpRec, Mand) ->
parse_options(T, TcpRec#megaco_tcp{module = Val}, Mand2);
serialize when (Val =:= true) orelse (Val =:= false) ->
parse_options(T, TcpRec#megaco_tcp{serialize = Val}, Mand2);
+ inet_backend when (Val =:= default) orelse
+ (Val =:= inet) orelse
+ (Val =:= socket) ->
+ parse_options(T, TcpRec#megaco_tcp{inet_backend = Val}, Mand2);
Bad ->
?d1("parse_options -> bad option: "
"~n Tag: ~p", [Tag]),
@@ -691,3 +716,37 @@ warning_msg(F, A) ->
call(Pid, Req) ->
gen_server:call(Pid, Req, infinity).
+
+
+%%-----------------------------------------------------------------
+
+%% formated_timestamp() ->
+%% format_timestamp(os:timestamp()).
+
+%% format_timestamp(TS) ->
+%% megaco:format_timestamp(TS).
+
+%% d(F) ->
+%% d(F, []).
+
+%% d(F, A) ->
+%% io:format("*** [~s] ~p ~w " ++ F ++ "~n",
+%% [formated_timestamp(), self(), ?MODULE | A]).
+
+
+%%-----------------------------------------------------------------
+
+%% tcp_sockets() ->
+%% port_list("tcp_inet") ++ gen_tcp_socket:which_sockets().
+
+
+%% %% Return all ports having the name 'Name'
+%% port_list(Name) ->
+%% lists:filter(
+%% fun(Port) ->
+%% case erlang:port_info(Port, name) of
+%% {name, Name} -> true;
+%% _ -> false
+%% end
+%% end, erlang:ports()).
+
diff --git a/lib/megaco/src/tcp/megaco_tcp.hrl b/lib/megaco/src/tcp/megaco_tcp.hrl
index 0c01f36b55..6d138eb2eb 100644
--- a/lib/megaco/src/tcp/megaco_tcp.hrl
+++ b/lib/megaco/src/tcp/megaco_tcp.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2021. 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.
@@ -34,12 +34,13 @@
proxy_pid,
receive_handle,
module = megaco,
- serialize = false % false: Spawn a new process for each message
+ serialize = false, % false: Spawn a new process for each message
+ inet_backend = default
}).
--define(GC_MSG_LIMIT,1000).
--define(HEAP_SIZE(S),5000 + 2*(S)).
+-define(GC_MSG_LIMIT, 1000).
+-define(HEAP_SIZE(S), 5000 + 2*(S)).
%%----------------------------------------------------------------------
diff --git a/lib/megaco/src/tcp/megaco_tcp_accept.erl b/lib/megaco/src/tcp/megaco_tcp_accept.erl
index 5fcff200aa..da163dcc10 100644
--- a/lib/megaco/src/tcp/megaco_tcp_accept.erl
+++ b/lib/megaco/src/tcp/megaco_tcp_accept.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2021. 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.
@@ -81,8 +81,7 @@ do_accept(Tcp, Sup, Fd) ->
{ok, S} ->
?d1("do_accept -> accepted: "
"~n S: ~p", [S]),
- case megaco_tcp:start_connection(Sup,
- Tcp#megaco_tcp{socket = S}) of
+ case megaco_tcp:start_connection(Sup, Tcp#megaco_tcp{socket = S}) of
{ok, Pid} ->
?d1("do_accept -> connection started"
"~n Pid: ~p", [Pid]),
@@ -122,3 +121,20 @@ tcp_clear(Socket) ->
after 0 ->
ok
end.
+
+
+
+%%-----------------------------------------------------------------
+
+%% formated_timestamp() ->
+%% format_timestamp(os:timestamp()).
+
+%% format_timestamp(TS) ->
+%% megaco:format_timestamp(TS).
+
+%% d(F) ->
+%% d(F, []).
+
+%% d(F, A) ->
+%% io:format("*** [~s] ~p ~w " ++ F ++ "~n",
+%% [formated_timestamp(), self(), ?MODULE | A]).
diff --git a/lib/megaco/src/udp/megaco_udp.erl b/lib/megaco/src/udp/megaco_udp.erl
index 01aaa90f6c..099f4b7455 100644
--- a/lib/megaco/src/udp/megaco_udp.erl
+++ b/lib/megaco/src/udp/megaco_udp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2021. 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.
@@ -114,9 +114,15 @@ open(SupPid, Options) ->
%%------------------------------------------------------
%% Setup the socket
- IpOpts = [binary, {reuseaddr, true}, {active, once} |
- UdpRec#megaco_udp.options],
-
+ IpOpts =
+ case UdpRec#megaco_udp.inet_backend of
+ default ->
+ [];
+ IB ->
+ [{inet_backend, IB}]
+ end ++
+ [binary, {reuseaddr, true}, {active, once} |
+ UdpRec#megaco_udp.options],
case (catch gen_udp:open(UdpRec#megaco_udp.port, IpOpts)) of
{ok, Socket} ->
?udp_debug(UdpRec, "udp open", []),
@@ -258,9 +264,9 @@ close(#send_handle{socket = Socket}) ->
close(Socket);
close(Socket) ->
?udp_debug({socket, Socket}, "udp close", []),
- case erlang:port_info(Socket, connected) of
- {connected, ControlPid} ->
- megaco_udp_server:stop(ControlPid);
+ case inet:info(Socket) of
+ #{owner := ControlPid} = _Info when is_pid(ControlPid) ->
+ (catch megaco_udp_server:stop(ControlPid));
undefined ->
{error, already_closed}
end.
@@ -294,8 +300,12 @@ parse_options([{Tag, Val} | T], UdpRec, Mand) ->
parse_options(T, UdpRec#megaco_udp{receive_handle = Val}, Mand2);
module when is_atom(Val) ->
parse_options(T, UdpRec#megaco_udp{module = Val}, Mand2);
- serialize when (Val =:= true) orelse (Val =:= false) ->
+ serialize when is_boolean(Val) ->
parse_options(T, UdpRec#megaco_udp{serialize = Val}, Mand2);
+ inet_backend when (Val =:= default) orelse
+ (Val =:= inet) orelse
+ (Val =:= socket) ->
+ parse_options(T, UdpRec#megaco_udp{inet_backend = Val}, Mand2);
Bad ->
{error, {bad_option, Bad}}
end;
@@ -321,5 +331,19 @@ incNumOutOctets(SH, NumOctets) ->
incCounter(Key, Inc) ->
ets:update_counter(megaco_udp_stats, Key, Inc).
-% incNumErrors(SH) ->
-% incCounter({SH, medGwyGatewayNumErrors}, 1).
+%% incNumErrors(SH) ->
+%% incCounter({SH, medGwyGatewayNumErrors}, 1).
+
+%%-----------------------------------------------------------------
+
+%% formated_timestamp() ->
+%% format_timestamp(os:timestamp()).
+
+%% format_timestamp(TS) ->
+%% megaco:format_timestamp(TS).
+
+%% d(F) ->
+%% d(F, []).
+
+%% d(F, A) ->
+%% io:format("*** [~s] ~p " ++ F ++ "~n", [formated_timestamp(), self() | A]).
diff --git a/lib/megaco/src/udp/megaco_udp.hrl b/lib/megaco/src/udp/megaco_udp.hrl
index b5422d28c9..2560b4ad96 100644
--- a/lib/megaco/src/udp/megaco_udp.hrl
+++ b/lib/megaco/src/udp/megaco_udp.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2021. 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.
@@ -32,7 +32,8 @@
socket,
receive_handle,
module = megaco,
- serialize = false % false: Spawn a new process for each message
+ serialize = false, % false: Spawn a new process for each message
+ inet_backend = default
}).
diff --git a/lib/megaco/src/udp/megaco_udp_server.erl b/lib/megaco/src/udp/megaco_udp_server.erl
index 1df9a76671..5abb4165ae 100644
--- a/lib/megaco/src/udp/megaco_udp_server.erl
+++ b/lib/megaco/src/udp/megaco_udp_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2021. 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.
@@ -29,9 +29,11 @@
-behaviour(gen_server).
+
%%-----------------------------------------------------------------
%% Include files
%%-----------------------------------------------------------------
+
-include_lib("megaco/src/udp/megaco_udp.hrl").
-include_lib("megaco/src/app/megaco_internal.hrl").
@@ -39,6 +41,7 @@
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
+
-export([
start_link/1,
stop/1,
@@ -46,9 +49,11 @@
upgrade_receive_handle/2
]).
+
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
+
-export([
init/1,
handle_call/3,
@@ -60,6 +65,7 @@
handle_received_message/5
]).
+
%%-----------------------------------------------------------------
%% External interface functions
%%-----------------------------------------------------------------
@@ -71,6 +77,7 @@
start_link(Arg) ->
gen_server:start_link(?MODULE, Arg, []).
+
%%-----------------------------------------------------------------
%% Func: stop/1
%% Description: Stops the process that keeps track of an UDP
@@ -83,6 +90,7 @@ stop(Pid) ->
upgrade_receive_handle(Pid, NewHandle) ->
call(Pid, {upgrade_receive_handle, NewHandle}).
+
%%-----------------------------------------------------------------
%% Internal interface functions
%%-----------------------------------------------------------------
@@ -98,6 +106,7 @@ init(Arg) ->
?udp_debug(Arg, "udp server starting", [self()]),
{ok, Arg}.
+
%%-----------------------------------------------------------------
%% Func: terminate/2
%% Description: Termination function for the generic server
@@ -106,6 +115,7 @@ terminate(Reason, State) ->
?udp_debug(State, "udp server terminating", [self(), Reason]),
ok.
+
%%-----------------------------------------------------------------
%% Func: handle_call/3
%% Description: Handling call messages (really just stop and garbage)
@@ -120,6 +130,7 @@ handle_call(Req, From, UdpRec) ->
"~n~p", [From, Req]),
{reply, {error, {invalid_request, Req}}, UdpRec}.
+
%%-----------------------------------------------------------------
%% Func: handle_cast/2
%% Description: Handling cast messages (really just stop and garbage)
@@ -132,12 +143,13 @@ handle_cast(Msg, UdpRec) ->
"~n~w", [Msg]),
{noreply, UdpRec}.
+
%%-----------------------------------------------------------------
%% Func: handle_info/2
%% Description: Handling non call/cast messages. Incomming messages
%% from the socket and exit codes.
%%-----------------------------------------------------------------
-handle_info({udp, _UdpId, Ip, Port, Msg},
+handle_info({udp, _Socket, Ip, Port, Msg},
#megaco_udp{serialize = false} = UdpRec) ->
#megaco_udp{socket = Socket, module = Mod, receive_handle = RH} = UdpRec,
SH = megaco_udp:create_send_handle(Socket, Ip, Port),
@@ -150,9 +162,9 @@ handle_info({udp, _UdpId, Ip, Port, Msg},
Sz ->
receive_message(Mod, RH, SH, Sz, Msg)
end,
- inet:setopts(Socket, [{active, once}]),
+ activate(Socket),
{noreply, UdpRec};
-handle_info({udp, _UdpId, Ip, Port, Msg},
+handle_info({udp, _Socket, Ip, Port, Msg},
#megaco_udp{serialize = true} = UdpRec) ->
#megaco_udp{socket = Socket, module = Mod, receive_handle = RH} = UdpRec,
SH = megaco_udp:create_send_handle(Socket, Ip, Port),
@@ -160,7 +172,7 @@ handle_info({udp, _UdpId, Ip, Port, Msg},
incNumInMessages(SH),
incNumInOctets(SH, MsgSize),
process_received_message(Mod, RH, SH, Msg),
- inet:setopts(Socket, [{active, once}]),
+ activate(Socket),
{noreply, UdpRec};
handle_info(Info, UdpRec) ->
warning_msg("received unexpected info: "
@@ -203,6 +215,11 @@ do_stop(#megaco_udp{socket = Socket}) ->
gen_udp:close(Socket).
+-compile({inline, [activate/1]}).
+activate(Socket) ->
+ inet:setopts(Socket, [{active, once}]).
+
+
%%-----------------------------------------------------------------
%% Func: incNumInMessages/1, incNumInOctets/2, incNumErrors/1
%% Description: SNMP counter increment functions
@@ -217,8 +234,8 @@ incNumInOctets(SH, NumOctets) ->
incCounter(Key, Inc) ->
ets:update_counter(megaco_udp_stats, Key, Inc).
-% incNumErrors(SH) ->
-% incCounter({SH, medGwyGatewayNumErrors}, 1).
+%% incNumErrors(SH) ->
+%% incCounter({SH, medGwyGatewayNumErrors}, 1).
%% info_msg(F, A) ->
diff --git a/lib/megaco/test/megaco_load_SUITE.erl b/lib/megaco/test/megaco_load_SUITE.erl
index d033e137ec..42e1a122a4 100644
--- a/lib/megaco/test/megaco_load_SUITE.erl
+++ b/lib/megaco/test/megaco_load_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2021. 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.
@@ -62,7 +62,7 @@
-define(MGC_START(Node, Mid, ET, Conf, Verb),
megaco_test_mgc:start(Node, Mid, ET,
- [{megaco_trace, false}] ++ Conf, Verb)).
+ Conf ++ [{megaco_trace, false}], Verb)).
-define(MGC_STOP(Pid), megaco_test_mgc:stop(Pid)).
-define(MGC_USER_INFO(Pid,Tag), megaco_test_mgc:user_info(Pid,Tag)).
-define(MGC_CONN_INFO(Pid,Tag), megaco_test_mgc:conn_info(Pid,Tag)).
@@ -70,8 +70,8 @@
-define(MG_START(Pid, Mid, Enc, Transp, Conf, Verb),
megaco_test_mg:start(Pid, Mid, Enc, Transp,
- [{megaco_trace, false},
- {transport_opts, [{serialize, true}]}] ++ Conf,
+ Conf ++ [{megaco_trace, false},
+ {transport_opts, [{serialize, true}]}],
Verb)).
-define(MG_STOP(Pid), megaco_test_mg:stop(Pid)).
-define(MG_USER_INFO(Pid,Tag), megaco_test_mg:user_info(Pid,Tag)).
@@ -92,15 +92,47 @@ suite() ->
[{ct_hooks, [ts_install_cth]}].
all() ->
+ %% This is a temporary messure to ensure that we can
+ %% test the socket backend without effecting *all*
+ %% applications on *all* machines.
+ %% This flag is set only for *one* host.
+ case ?TEST_INET_BACKENDS() of
+ true ->
+ [
+ {group, inet_backend_default},
+ {group, inet_backend_inet},
+ {group, inet_backend_socket}
+ ];
+ _ ->
+ [
+ {group, inet_backend_default}
+ ]
+ end.
+
+groups() ->
[
- {group, single},
- {group, multi}
+ {inet_backend_default, [], inet_backend_default_cases()},
+ {inet_backend_inet, [], inet_backend_inet_cases()},
+ {inet_backend_socket, [], inet_backend_socket_cases()},
+
+ {all, [], all_cases()},
+ {single, [], single_cases()},
+ {multi, [], multi_cases()}
].
-groups() ->
+inet_backend_default_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_inet_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_socket_cases() ->
+ [{all, [], all_cases()}].
+
+all_cases() ->
[
- {single, [], single_cases()},
- {multi, [], multi_cases()}
+ {group, single},
+ {group, multi}
].
single_cases() ->
@@ -174,10 +206,39 @@ end_per_suite(Config0) when is_list(Config0) ->
%% -----
%%
-init_per_group(_GroupName, Config) ->
+init_per_group(inet_backend_default = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ [{socket_create_opts, []} | Config];
+init_per_group(inet_backend_inet = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ [{socket_create_opts, [{inet_backend, inet}]} | Config]
+ end;
+init_per_group(inet_backend_socket = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ [{socket_create_opts, [{inet_backend, socket}]} | Config]
+ end;
+init_per_group(Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
Config.
-end_per_group(_GroupName, Config) ->
+end_per_group(Group, Config) when (inet_backend_default =:= Group) orelse
+ (inet_backend_init =:= Group) orelse
+ (inet_backend_socket =:= Group) ->
+ ?SLEEP(?SECS(5)),
+ Config;
+end_per_group(_Group, Config) ->
Config.
@@ -397,25 +458,28 @@ try_single_user_load(Name, Config, NumLoaders0) ->
single_user_load(State, Config, NumLoaders) ->
i("starting with ~w loader(s)", [NumLoaders]),
+ SCO = ?config(socket_create_opts, Config),
Res = load_controller(Config,
fun(Env) ->
populate(Env),
- exit( single_user_load(State, NumLoaders) )
+ exit( do_single_user_load(SCO,
+ State, NumLoaders) )
end),
i("done"),
Res.
-single_user_load([MgcNode, MgNode], NumLoaders) ->
+do_single_user_load(SCO,
+ [MgcNode, MgNode], NumLoaders) ->
%% Start the MGC and MGs
i("[MGC] start"),
MgcMid = {deviceName, "ctrl"},
ET = [{text, tcp, [{serialize, true}]}],
DSI = maybe_display_system_info(NumLoaders),
- {ok, Mgc} = ?MGC_START(MgcNode, MgcMid, ET, DSI, ?MGC_VERBOSITY),
+ {ok, Mgc} = ?MGC_START(MgcNode, MgcMid, ET, SCO ++ DSI, ?MGC_VERBOSITY),
i("[MG] start"),
MgMid = {deviceName, "mg"},
- {ok, Mg} = ?MG_START(MgNode, MgMid, text, tcp, DSI, ?MG_VERBOSITY),
+ {ok, Mg} = ?MG_START(MgNode, MgMid, text, tcp, SCO ++ DSI, ?MG_VERBOSITY),
d("MG user info: ~p", [?MG_USER_INFO(Mg, all)]),
@@ -501,17 +565,18 @@ try_multi_user_load(Name, Config, NumUsers, NumLoaders0) ->
multi_user_load(State, Config, NumUsers, NumLoaders) ->
i("starting with ~w loader(s)", [NumLoaders]),
+ SCO = ?config(socket_create_opts, Config),
Res = load_controller(
Config,
fun(Env) ->
populate(Env),
- exit( multi_user_load(State, NumUsers, NumLoaders) )
+ exit( do_multi_user_load(SCO, State, NumUsers, NumLoaders) )
end),
i("done"),
Res.
-multi_user_load([MgcNode | MgNodes], NumUsers, NumLoaders)
+do_multi_user_load(SCO, [MgcNode | MgNodes], NumUsers, NumLoaders)
when (is_integer(NumUsers) andalso (NumUsers > 1) andalso
is_integer(NumLoaders) andalso (NumLoaders >= 1)) ->
%% Start the MGC and MGs
@@ -519,7 +584,7 @@ multi_user_load([MgcNode | MgNodes], NumUsers, NumLoaders)
MgcMid = {deviceName, "ctrl"},
ET = [{text, tcp, [{serialize, false}]}],
DSI = maybe_display_system_info(2 * NumUsers * NumLoaders),
- {ok, Mgc} = ?MGC_START(MgcNode, MgcMid, ET, DSI, ?MGC_VERBOSITY),
+ {ok, Mgc} = ?MGC_START(MgcNode, MgcMid, ET, SCO ++ DSI, ?MGC_VERBOSITY),
megaco_test_mgc:update_user_info(Mgc,reply_timer,1000),
d("MGC user info: ~p", [?MGC_USER_INFO(Mgc, all)]),
@@ -527,7 +592,7 @@ multi_user_load([MgcNode | MgNodes], NumUsers, NumLoaders)
MgUsers = make_mids(MgNodes),
d("start MGs, apply the load and stop MGs"),
- ok = multi_load(MgUsers, DSI, NumLoaders, ?MULTI_USER_LOAD_NUM_REQUESTS),
+ ok = multi_load(MgUsers, SCO ++ DSI, NumLoaders, ?MULTI_USER_LOAD_NUM_REQUESTS),
i("flush the message queue: ~p", [megaco_test_lib:flush()]),
@@ -542,14 +607,14 @@ multi_user_load([MgcNode | MgNodes], NumUsers, NumLoaders)
ok.
-multi_load(MGs, DSI, NumLoaders, NumReqs) ->
+multi_load(MGs, Conf, NumLoaders, NumReqs) ->
d("multi_load -> entry with"
"~n MGs: ~p"
- "~n DSI: ~p"
+ "~n Conf: ~p"
"~n NumLoaders: ~p"
- "~n NumReqs: ~p", [MGs, DSI, NumLoaders, NumReqs]),
+ "~n NumReqs: ~p", [MGs, Conf, NumLoaders, NumReqs]),
- Pids = multi_load_collector_start(MGs, DSI, NumLoaders, NumReqs, []),
+ Pids = multi_load_collector_start(MGs, Conf, NumLoaders, NumReqs, []),
case timer:tc(?MODULE, do_multi_load, [Pids, NumLoaders, NumReqs]) of
{Time, {ok, OKs, []}} ->
Sec = Time / 1000000,
@@ -569,13 +634,13 @@ do_multi_load(Pids, _NumLoaders, _NumReqs) ->
lists:foreach(Fun, Pids),
await_multi_load_collectors(Pids, [], []).
-multi_load_collector_start([], _DSI, _NumLoaders, _NumReqs, Pids) ->
+multi_load_collector_start([], _Conf, _NumLoaders, _NumReqs, Pids) ->
Pids;
-multi_load_collector_start([{Mid, Node}|MGs], DSI, NumLoaders, NumReqs, Pids) ->
+multi_load_collector_start([{Mid, Node}|MGs], Conf, NumLoaders, NumReqs, Pids) ->
Env = get(),
Pid = spawn_link(?MODULE, multi_load_collector,
- [self(), Node, Mid, DSI, NumLoaders, NumReqs, Env]),
- multi_load_collector_start(MGs, DSI, NumLoaders, NumReqs, [{Pid,Mid}|Pids]).
+ [self(), Node, Mid, Conf, NumLoaders, NumReqs, Env]),
+ multi_load_collector_start(MGs, Conf, NumLoaders, NumReqs, [{Pid,Mid}|Pids]).
get_env(Key, Env) ->
case lists:keysearch(Key, 1, Env) of
@@ -585,13 +650,13 @@ get_env(Key, Env) ->
undefined
end.
-multi_load_collector(Parent, Node, Mid, DSI, NumLoaders, NumReqs, Env) ->
+multi_load_collector(Parent, Node, Mid, Conf, NumLoaders, NumReqs, Env) ->
put(verbosity, get_env(verbosity, Env)),
put(tc, get_env(tc, Env)),
put(sname, get_env(sname, Env) ++ "-loader"),
- case ?MG_START(Node, Mid, text, tcp, DSI, ?MG_VERBOSITY) of
+ case ?MG_START(Node, Mid, text, tcp, Conf, ?MG_VERBOSITY) of
{ok, Pid} ->
- d("MG ~p user info: ~n~p", [Mid, ?MG_USER_INFO(Pid,all)]),
+ d("MG ~p user info: ~n~p", [Mid, ?MG_USER_INFO(Pid, all)]),
ServChRes = ?MG_SERV_CHANGE(Pid),
d("service change result: ~p", [ServChRes]),
megaco_test_mg:update_conn_info(Pid,reply_timer,1000),
diff --git a/lib/megaco/test/megaco_mreq_SUITE.erl b/lib/megaco/test/megaco_mreq_SUITE.erl
index b53e99a995..12eb67f749 100644
--- a/lib/megaco/test/megaco_mreq_SUITE.erl
+++ b/lib/megaco/test/megaco_mreq_SUITE.erl
@@ -36,6 +36,7 @@
]).
+-include_lib("common_test/include/ct.hrl").
-include_lib("megaco/include/megaco.hrl").
-include_lib("megaco/include/megaco_message_v1.hrl").
-include("megaco_test_lib.hrl").
@@ -50,8 +51,8 @@
-define(A5555, ["11111111", "11111111", "00000000"]).
-define(A5556, ["11111111", "11111111", "11111111"]).
--define(MGC_START(Pid, Mid, ET, Verb),
- megaco_test_mgc:start(Pid, Mid, ET, Verb)).
+-define(MGC_START(Pid, Mid, ET, Conf, Verb),
+ megaco_test_mgc:start(Pid, Mid, ET, Conf, Verb)).
-define(MGC_STOP(Pid), megaco_test_mgc:stop(Pid)).
-define(MGC_GET_STATS(Pid, No), megaco_test_mgc:get_stats(Pid, No)).
-define(MGC_RESET_STATS(Pid), megaco_test_mgc:reset_stats(Pid)).
@@ -59,8 +60,8 @@
-define(MGC_REQ_PEND(Pid,To), megaco_test_mgc:request_pending(Pid,To)).
-define(MGC_REQ_HAND(Pid), megaco_test_mgc:request_handle(Pid)).
--define(MG_START(Pid, Mid, Enc, Transp, Verb),
- megaco_test_mg:start(Pid, Mid, Enc, Transp, Verb)).
+-define(MG_START(Pid, Mid, Enc, Transp, Conf, Verb),
+ megaco_test_mg:start(Pid, Mid, Enc, Transp, Conf, Verb)).
-define(MG_STOP(Pid), megaco_test_mg:stop(Pid)).
-define(MG_GET_STATS(Pid), megaco_test_mg:get_stats(Pid)).
-define(MG_RESET_STATS(Pid), megaco_test_mg:reset_stats(Pid)).
@@ -80,15 +81,48 @@ suite() ->
[{ct_hooks, [ts_install_cth]}].
all() ->
+ %% This is a temporary messure to ensure that we can
+ %% test the socket backend without effecting *all*
+ %% applications on *all* machines.
+ %% This flag is set only for *one* host.
+ case ?TEST_INET_BACKENDS() of
+ true ->
+ [
+ {group, inet_backend_default},
+ {group, inet_backend_inet},
+ {group, inet_backend_socket}
+ ];
+ _ ->
+ [
+ {group, inet_backend_default}
+ ]
+ end.
+
+groups() ->
+ [
+ {inet_backend_default, [], inet_backend_default_cases()},
+ {inet_backend_inet, [], inet_backend_inet_cases()},
+ {inet_backend_socket, [], inet_backend_socket_cases()},
+
+ {all, [], all_cases()}
+ ].
+
+inet_backend_default_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_inet_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_socket_cases() ->
+ [{all, [], all_cases()}].
+
+all_cases() ->
[
req_and_rep,
req_and_pending,
req_and_cancel
].
-groups() ->
- [].
-
%%
@@ -144,10 +178,34 @@ end_per_suite(Config0) when is_list(Config0) ->
%% -----
%%
-init_per_group(_GroupName, Config) ->
+init_per_group(inet_backend_default = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ [{socket_create_opts, []} | Config];
+init_per_group(inet_backend_inet = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ [{socket_create_opts, [{inet_backend, inet}]} | Config]
+ end;
+init_per_group(inet_backend_socket = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ [{socket_create_opts, [{inet_backend, socket}]} | Config]
+ end;
+init_per_group(Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
Config.
-end_per_group(_GroupName, Config) ->
+end_per_group(_Group, Config) ->
Config.
@@ -200,7 +258,10 @@ req_and_rep(Config) when is_list(Config) ->
ok = ?START_NODES(Nodes),
Nodes
end,
- Case = fun do_req_and_rep/1,
+ Case = fun(X) ->
+ SCO = ?config(socket_create_opts, Config),
+ do_req_and_rep(SCO, X)
+ end,
Post = fun(Nodes) ->
d("stop nodes (in the reverse order):"
"~n ~p", [Nodes]),
@@ -208,19 +269,19 @@ req_and_rep(Config) when is_list(Config) ->
end,
try_tc(req_and_rep, Pre, Case, Post).
-do_req_and_rep([MgcNode, Mg1Node, Mg2Node, Mg3Node, Mg4Node]) ->
+do_req_and_rep(SCO, [MgcNode, Mg1Node, Mg2Node, Mg3Node, Mg4Node]) ->
%% Start the MGC and MGs
i("start the MGC"),
ET = [{text,tcp}, {text,udp}, {binary,tcp}, {binary,udp}],
{ok, Mgc} =
- ?MGC_START(MgcNode, {deviceName, "ctrl"}, ET, ?MGC_VERBOSITY),
+ ?MGC_START(MgcNode, {deviceName, "ctrl"}, ET, SCO, ?MGC_VERBOSITY),
i("start and connect the MGs"),
MgConf0 = [{Mg1Node, "mg1", text, tcp, ?MG_VERBOSITY},
{Mg2Node, "mg2", text, udp, ?MG_VERBOSITY},
{Mg3Node, "mg3", binary, tcp, ?MG_VERBOSITY},
{Mg4Node, "mg4", binary, udp, ?MG_VERBOSITY}],
- MgConf = rar_connect_mg(MgConf0, []),
+ MgConf = rar_connect_mg(SCO, MgConf0, []),
%% Collect the (initial) MGs statistics
Stats1 = rar_get_mg_stats(MgConf, []),
@@ -309,19 +370,19 @@ do_req_and_rep([MgcNode, Mg1Node, Mg2Node, Mg3Node, Mg4Node]) ->
ok.
-rar_connect_mg([], Acc) ->
+rar_connect_mg(_, [], Acc) ->
lists:reverse(Acc);
-rar_connect_mg([{Node, Name, Coding, Trans, Verb}|Mg], Acc) ->
- Pid = rar_connect_mg(Node, Name, Coding, Trans, Verb),
- rar_connect_mg(Mg, [{Name, Pid}|Acc]).
+rar_connect_mg(SCO, [{Node, Name, Coding, Trans, Verb}|Mg], Acc) ->
+ Pid = rar_connect_mg(SCO, Node, Name, Coding, Trans, Verb),
+ rar_connect_mg(SCO, Mg, [{Name, Pid}|Acc]).
-rar_connect_mg(Node, Name, Coding, Trans, Verb) ->
+rar_connect_mg(SCO, Node, Name, Coding, Trans, Verb) ->
Mid = {deviceName, Name},
- {ok, Pid} = ?MG_START(Node, Mid, Coding, Trans, Verb),
+ {ok, Pid} = ?MG_START(Node, Mid, Coding, Trans, SCO, Verb),
%% Ask the MGs to do a service change
Res = ?MG_SERV_CHANGE(Pid),
- d("rar_connect_mg -> (~s) service change result: ~p", [Name,Res]),
+ d("rar_connect_mg -> (~s) service change result: ~p", [Name, Res]),
Pid.
@@ -396,7 +457,10 @@ req_and_pending(Config) when is_list(Config) ->
ok = ?START_NODES(Nodes),
Nodes
end,
- Case = fun do_req_and_pending/1,
+ Case = fun(X) ->
+ SCO = ?config(socket_create_opts, Config),
+ do_req_and_pending(SCO, X)
+ end,
Post = fun(Nodes) ->
d("stop nodes (in the reverse order):"
"~n ~p", [Nodes]),
@@ -404,17 +468,17 @@ req_and_pending(Config) when is_list(Config) ->
end,
try_tc(req_and_pending, Pre, Case, Post).
-do_req_and_pending([MgcNode, MgNode]) ->
+do_req_and_pending(SCO, [MgcNode, MgNode]) ->
%% Start the MGC and MGs
i("try start the MGC"),
ET = [{text,tcp}, {text,udp}, {binary,tcp}, {binary,udp}],
{ok, Mgc} =
- ?MGC_START(MgcNode, {deviceName, "ctrl"}, ET, ?MGC_VERBOSITY),
+ ?MGC_START(MgcNode, {deviceName, "ctrl"}, ET, SCO, ?MGC_VERBOSITY),
i("try start the MG"),
{ok, Mg} =
- ?MG_START(MgNode, {deviceName, "mg"}, text, tcp, ?MG_VERBOSITY),
+ ?MG_START(MgNode, {deviceName, "mg"}, text, tcp, SCO, ?MG_VERBOSITY),
i("connect MG (to MFC)"),
Res1 = ?MG_SERV_CHANGE(Mg),
@@ -462,7 +526,10 @@ req_and_cancel(Config) when is_list(Config) ->
ok = ?START_NODES(Nodes),
Nodes
end,
- Case = fun do_req_and_cancel/1,
+ Case = fun(X) ->
+ SCO = ?config(socket_create_opts, Config),
+ do_req_and_cancel(SCO, X)
+ end,
Post = fun(Nodes) ->
d("stop nodes (in the reverse order):"
"~n ~p", [Nodes]),
@@ -470,16 +537,16 @@ req_and_cancel(Config) when is_list(Config) ->
end,
try_tc(req_and_cancel, Pre, Case, Post).
-do_req_and_cancel([MgcNode, MgNode]) ->
+do_req_and_cancel(SCO, [MgcNode, MgNode]) ->
%% Start the MGC and MGs
i("start the MGC"),
ET = [{text,tcp}, {text,udp}, {binary,tcp}, {binary,udp}],
{ok, Mgc} =
- ?MGC_START(MgcNode, {deviceName, "ctrl"}, ET, ?MGC_VERBOSITY),
+ ?MGC_START(MgcNode, {deviceName, "ctrl"}, ET, SCO, ?MGC_VERBOSITY),
i("start the MG"),
{ok, Mg} =
- ?MG_START(MgNode, {deviceName, "mg"}, text, tcp, ?MG_VERBOSITY),
+ ?MG_START(MgNode, {deviceName, "mg"}, text, tcp, SCO, ?MG_VERBOSITY),
i("connect the MG"),
Res1 = ?MG_SERV_CHANGE(Mg),
diff --git a/lib/megaco/test/megaco_tcp_SUITE.erl b/lib/megaco/test/megaco_tcp_SUITE.erl
index 5792c6b380..88c7934894 100644
--- a/lib/megaco/test/megaco_tcp_SUITE.erl
+++ b/lib/megaco/test/megaco_tcp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2021. 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.
@@ -70,6 +70,11 @@
-define(CH, megaco_test_command_handler).
-define(TEST_VERBOSITY, debug).
+%% We have some strange reuseaddr issue (*some* times we eaddrinuse),
+%% so this is intended to "ensure" we get no conflict.
+-define(SERVER_PORT(C, I),
+ 2944 + proplists:get_value(adjust_server_port, C) + (I-1)).
+
%%----------------------------------------------------------------------
%% Records
@@ -84,18 +89,51 @@ suite() ->
[{ct_hooks, [ts_install_cth]}].
all() ->
+ %% This is a temporary messure to ensure that we can
+ %% test the socket backend without effecting *all*
+ %% applications on *all* machines.
+ %% This flag is set only for *one* host.
+ case ?TEST_INET_BACKENDS() of
+ true ->
+ [
+ {group, inet_backend_default},
+ {group, inet_backend_inet},
+ {group, inet_backend_socket}
+ ];
+ _ ->
+ [
+ {group, inet_backend_default}
+ ]
+ end.
+
+groups() ->
+ [
+ {inet_backend_default, [], inet_backend_default_cases()},
+ {inet_backend_inet, [], inet_backend_inet_cases()},
+ {inet_backend_socket, [], inet_backend_socket_cases()},
+
+ {all, [], all_cases()},
+ {start, [], start_cases()},
+ {sending, [], sending_cases()},
+ {error, [], error_cases()}
+ ].
+
+inet_backend_default_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_inet_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_socket_cases() ->
+ [{all, [], all_cases()}].
+
+all_cases() ->
[
{group, start},
{group, sending},
{group, error}
].
-groups() ->
- [
- {start, [], start_cases()},
- {sending, [], sending_cases()},
- {error, [], error_cases()}
- ].
start_cases() ->
[
@@ -173,10 +211,41 @@ end_per_suite(Config0) when is_list(Config0) ->
%% -----
%%
+init_per_group(inet_backend_default = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ [{adjust_server_port, 0},
+ {socket_create_opts, []} | Config];
+init_per_group(inet_backend_inet = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ [{adjust_server_port, 100},
+ {socket_create_opts, [{inet_backend, inet}]} | Config]
+ end;
+init_per_group(inet_backend_socket = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ [{adjust_server_port, 200},
+ {socket_create_opts, [{inet_backend, socket}]} | Config]
+ end;
init_per_group(Group, Config) ->
?ANNOUNCE_GROUP_INIT(Group),
Config.
+end_per_group(GroupName, Config) when (inet_backend_default =:= GroupName) orelse
+ (inet_backend_init =:= GroupName) orelse
+ (inet_backend_socket =:= GroupName) ->
+ ?SLEEP(?SECS(5)),
+ Config;
end_per_group(_GroupName, Config) ->
Config.
@@ -198,8 +267,9 @@ init_per_testcase(Case, Config) ->
end_per_testcase(Case, Config) ->
p("end_per_testcase -> entry with"
- "~n Config: ~p"
- "~n Nodes: ~p", [Config, erlang:nodes()]),
+ "~n Config: ~p"
+ "~n Nodes: ~p",
+ [Config, erlang:nodes()]),
p("system events during test: "
"~n ~p", [megaco_test_global_sys_monitor:events()]),
@@ -219,7 +289,7 @@ start_normal(Config) when is_list(Config) ->
put(sname, "start_normal"),
p("BEGIN TEST-CASE"),
Options = [{port, 20000}, {receive_handle, apa}],
- {ok, Pid} = start_case(Options, ok),
+ {ok, Pid} = start_case(Config, Options, ok),
megaco_tcp:stop_transport(Pid),
p("done"),
ok.
@@ -233,7 +303,7 @@ start_invalid_opt(Config) when is_list(Config) ->
put(sname, "start_invalid_opt"),
p("BEGIN TEST-CASE"),
Options = [{port, 20000}, {receivehandle, apa}],
- ok = start_case(Options, error),
+ ok = start_case(Config, Options, error),
p("done"),
ok.
@@ -254,20 +324,28 @@ start_and_stop(Config) when is_list(Config) ->
ok = ?START_NODES(Nodes),
Nodes
end,
- Case = fun do_start_and_stop/1,
+ Case = fun(X) -> do_start_and_stop(Config, X) end,
+ %% Case = fun(X) -> do_start_and_stop(Config, X, 10) end,
Post = fun(Nodes) ->
p("stop nodes"),
?STOP_NODES(lists:reverse(Nodes))
end,
try_tc(start_and_stop, Pre, Case, Post).
-do_start_and_stop([ServerNode, ClientNode]) ->
+
+%% do_start_and_stop(_Config, _Nodes, 0) ->
+%% ok;
+%% do_start_and_stop(Config, Nodes, N) ->
+%% do_start_and_stop(Config, Nodes),
+%% do_start_and_stop(Config, Nodes, N-1).
+
+do_start_and_stop(Config, [ServerNode, ClientNode]) ->
%% Create command sequences
p("create command sequences"),
- ServerPort = 2944,
- ServerCmds = start_and_stop_server_commands(ServerPort),
+ ServerPort = ?SERVER_PORT(Config, 1), % 2944,
+ ServerCmds = start_and_stop_server_commands(Config, ServerPort),
{ok, ServerHost} = inet:gethostname(),
- ClientCmds = start_and_stop_client_commands(ServerPort, ServerHost),
+ ClientCmds = start_and_stop_client_commands(Config, ServerPort, ServerHost),
%% Start the test procs used in the test-case, one for each node
p("start command handlers"),
@@ -283,7 +361,7 @@ do_start_and_stop([ServerNode, ClientNode]) ->
ok.
-start_and_stop_server_commands(Port) ->
+start_and_stop_server_commands(Config, Port) ->
Opts = [{port, Port}],
Self = self(),
[
@@ -302,7 +380,7 @@ start_and_stop_server_commands(Port) ->
#{id => 3,
desc => "Listen",
cmd => fun(State) ->
- server_listen(State, Opts)
+ server_listen(Config, State, Opts)
end},
#{id => 4,
@@ -326,7 +404,7 @@ start_and_stop_server_commands(Port) ->
].
-start_and_stop_client_commands(ServerPort, ServerHost) ->
+start_and_stop_client_commands(Config, ServerPort, ServerHost) ->
Opts = [{port, ServerPort}, {host, ServerHost}],
Self = self(),
[
@@ -351,7 +429,7 @@ start_and_stop_client_commands(ServerPort, ServerHost) ->
#{id => 4,
desc => "Connect",
cmd => fun(State) ->
- client_connect(State, Opts)
+ client_connect(Config, State, Opts)
end},
#{id => 5,
@@ -389,20 +467,20 @@ sendreceive(Config) when is_list(Config) ->
ok = ?START_NODES(Nodes),
Nodes
end,
- Case = fun do_sendreceive/1,
+ Case = fun(X) -> do_sendreceive(Config, X) end,
Post = fun(Nodes) ->
p("stop nodes"),
?STOP_NODES(lists:reverse(Nodes))
end,
try_tc(sendreceive, Pre, Case, Post).
-do_sendreceive([ServerNode, ClientNode]) ->
+do_sendreceive(Config, [ServerNode, ClientNode]) ->
%% Create command sequences
p("create command sequences"),
- ServerPort = 2944,
- ServerCmds = sendreceive_server_commands(ServerPort),
+ ServerPort = ?SERVER_PORT(Config, 2), % 2944,
+ ServerCmds = sendreceive_server_commands(Config, ServerPort),
{ok, ServerHost} = inet:gethostname(),
- ClientCmds = sendreceive_client_commands(ServerPort, ServerHost),
+ ClientCmds = sendreceive_client_commands(Config, ServerPort, ServerHost),
%% Start the test procs used in the test-case, one for each node
p("start command handlers"),
@@ -418,7 +496,7 @@ do_sendreceive([ServerNode, ClientNode]) ->
ok.
-sendreceive_server_commands(Port) ->
+sendreceive_server_commands(Config, Port) ->
Opts = [{port, Port}],
Self = self(),
[
@@ -437,7 +515,7 @@ sendreceive_server_commands(Port) ->
#{id => 3,
desc => "Listen",
cmd => fun(State) ->
- server_listen(State, Opts)
+ server_listen(Config, State, Opts)
end},
#{id => 4,
@@ -502,7 +580,7 @@ sendreceive_server_commands(Port) ->
].
-sendreceive_client_commands(ServerPort, ServerHost) ->
+sendreceive_client_commands(Config, ServerPort, ServerHost) ->
Opts = [{port, ServerPort}, {host, ServerHost}],
Self = self(),
[
@@ -527,7 +605,7 @@ sendreceive_client_commands(ServerPort, ServerHost) ->
#{id => 4,
desc => "Connect",
cmd => fun(State) ->
- client_connect(State, Opts)
+ client_connect(Config, State, Opts)
end},
#{id => 5,
@@ -594,20 +672,20 @@ block_unblock(Config) when is_list(Config) ->
ok = ?START_NODES(Nodes),
Nodes
end,
- Case = fun do_block_unblock/1,
+ Case = fun(X) -> do_block_unblock(Config, X) end,
Post = fun(Nodes) ->
p("stop nodes"),
?STOP_NODES(lists:reverse(Nodes))
end,
try_tc(block_unblock, Pre, Case, Post).
-do_block_unblock([ServerNode, ClientNode]) ->
+do_block_unblock(Config, [ServerNode, ClientNode]) ->
%% Create command sequences
p("create command sequences"),
- ServerPort = 2944,
- ServerCmds = block_unblock_server_commands(ServerPort),
+ ServerPort = ?SERVER_PORT(Config, 3), % 2944,
+ ServerCmds = block_unblock_server_commands(Config, ServerPort),
{ok, ServerHost} = inet:gethostname(),
- ClientCmds = block_unblock_client_commands(ServerPort, ServerHost),
+ ClientCmds = block_unblock_client_commands(Config, ServerPort, ServerHost),
%% Start the test procs used in the test-case, one for each node
p("start command handlers"),
@@ -625,8 +703,8 @@ do_block_unblock([ServerNode, ClientNode]) ->
ok.
-block_unblock_server_commands(Port) ->
- Opts = [{port, Port}],
+block_unblock_server_commands(Config, Port) ->
+ Opts = [{port, Port}],
Self = self(),
[
#{id => 1,
@@ -644,7 +722,7 @@ block_unblock_server_commands(Port) ->
#{id => 3,
desc => "Listen",
cmd => fun(State) ->
- server_listen(State, Opts)
+ server_listen(Config, State, Opts)
end},
#{id => 4,
@@ -671,11 +749,11 @@ block_unblock_server_commands(Port) ->
server_await_continue_signal(State, 5000)
end},
- #{id => 9,
- desc => "Await nothing before sending a message (hejsan)",
- cmd => fun(State) ->
- server_await_nothing(State, 1000)
- end},
+ %% #{id => 9,
+ %% desc => "Await nothing before sending a message (hejsan)",
+ %% cmd => fun(State) ->
+ %% server_await_nothing(State, 1000)
+ %% end},
#{id => 10,
desc => "Send message (hejsan)",
@@ -715,7 +793,7 @@ block_unblock_server_commands(Port) ->
].
-block_unblock_client_commands(ServerPort, ServerHost) ->
+block_unblock_client_commands(Config, ServerPort, ServerHost) ->
Opts = [{port, ServerPort}, {host, ServerHost}],
Self = self(),
[
@@ -740,7 +818,7 @@ block_unblock_client_commands(ServerPort, ServerHost) ->
#{id => 4,
desc => "Connect",
cmd => fun(State) ->
- client_connect(State, Opts)
+ client_connect(Config, State, Opts)
end},
#{id => 5,
@@ -788,7 +866,7 @@ block_unblock_client_commands(ServerPort, ServerHost) ->
#{id => 12,
desc => "Await message (hejsan)",
cmd => fun(State) ->
- client_await_message(State, "hejsan", 100)
+ client_await_message(State, "hejsan", 500)
end},
#{id => 13,
@@ -895,33 +973,37 @@ tcp_server(Config) when is_list(Config) ->
%% Test functions
%%======================================================================
-start_case(Options, Expect) ->
+start_case(Config, Options, Expect) ->
p("start transport"),
case (catch megaco_tcp:start_transport()) of
{ok, Pid} ->
p("create listen socket"),
- case (catch megaco_tcp:listen(Pid, Options)) of
+ case (catch ?LISTEN(Config, Pid, Options)) of
ok when Expect =:= ok ->
p("extected listen result [ok]"),
{ok, Pid};
ok ->
- p("unextected listen result [ok] - stop transport"),
+ p("unexpected listen result [ok] - stop transport"),
megaco_tcp:stop_transport(Pid),
?ERROR(unexpected_start_sucesss);
- {error, _Reason} when Expect =:= error ->
- p("extected listen result [error] - stop transport"),
+ {error, Reason} when Expect =:= error ->
+ p("expected listen result [error] - stop transport: "
+ "~n Reason: ~p", [Reason]),
megaco_tcp:stop_transport(Pid),
ok;
{error, Reason} ->
- p("unextected listen result [error] - stop transport"),
+ p("unexpected listen result [error] - stop transport: "
+ "~n Reason: ~p", [Reason]),
megaco_tcp:stop_transport(Pid),
?ERROR({unexpected_start_failure, Reason});
Error ->
- p("unextected listen result"),
+ p("unexpected listen result: "
+ "~n Error: ~p", [Error]),
+ megaco_tcp:stop_transport(Pid),
?ERROR({unexpected_result, Error})
end;
{error, Reason} ->
- p("unextected start_transport result"),
+ p("unexpected start_transport result"),
?ERROR({failed_starting_transport, Reason})
end.
@@ -1019,10 +1101,11 @@ server_start_transport(State) when is_map(State) ->
Error
end.
-server_listen(#{transport_ref := Ref} = State, Options)
+server_listen(Config, #{transport_ref := Ref} = State, Options)
when is_list(Options) ->
+ ?SLEEP(1000),
Opts = [{receive_handle, self()}, {module, ?MODULE} | Options],
- case (catch megaco_tcp:listen(Ref, Opts)) of
+ case (catch ?LISTEN(Config, Ref, Opts)) of
ok ->
{ok, State};
Error ->
@@ -1110,10 +1193,10 @@ client_start_transport(State) when is_map(State) ->
Error
end.
-client_connect(#{transport_ref := Ref} = State, Options)
+client_connect(Config, #{transport_ref := Ref} = State, Options)
when is_list(Options) ->
Opts = [{receive_handle, self()}, {module, ?MODULE} | Options],
- case (catch megaco_tcp:connect(Ref, Opts)) of
+ case (catch ?CONNECT(Config, Ref, Opts)) of
{ok, Handle, ControlPid} ->
{ok, State#{control_pid => ControlPid,
handle => Handle}};
diff --git a/lib/megaco/test/megaco_test_lib.erl b/lib/megaco/test/megaco_test_lib.erl
index 10e7ed90c8..e39e1e3e8a 100644
--- a/lib/megaco/test/megaco_test_lib.erl
+++ b/lib/megaco/test/megaco_test_lib.erl
@@ -60,7 +60,13 @@
start_node/3, start_node/4,
stop_nodes/3,
- stop_node/3
+ stop_node/3,
+
+ is_socket_backend/1,
+ inet_backend_opts/1,
+ explicit_inet_backend/0, test_inet_backends/0,
+ open/3,
+ listen/3, connect/3
]).
-export([init_per_suite/1, end_per_suite/1,
@@ -475,6 +481,17 @@ pprint(F, A) ->
init_per_suite(Config) ->
+ p("megaco environment: "
+ "~n (megaco) app: ~p"
+ "~n (all) init: ~p"
+ "~n (megaco) init: ~p",
+ [application:get_all_env(megaco),
+ init:get_arguments(),
+ case init:get_argument(megaco) of
+ {ok, Args} -> Args;
+ error -> undefined
+ end]),
+
ct:timetrap(minutes(3)),
try analyze_and_print_host_info() of
@@ -2209,3 +2226,76 @@ p(F, A) ->
print(Pre, F, A) ->
io:format("*** [~s] [~s] ~p " ++ F ++ "~n", [?FTS(), Pre, self() | A]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+explicit_inet_backend() ->
+ %% This is intentional!
+ %% This is a kernel flag, which if set disables
+ %% our own special handling of the inet_backend
+ %% in our test suites.
+ case application:get_all_env(kernel) of
+ Env when is_list(Env) ->
+ case lists:keysearch(inet_backend, 1, Env) of
+ {value, {inet_backend, _}} ->
+ true;
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end.
+
+test_inet_backends() ->
+ case init:get_argument(megaco) of
+ {ok, SnmpArgs} when is_list(SnmpArgs) ->
+ test_inet_backends(SnmpArgs, atom_to_list(?FUNCTION_NAME));
+ error ->
+ false
+ end.
+
+test_inet_backends([], _) ->
+ false;
+test_inet_backends([[Key, Val] | _], Key) ->
+ case list_to_atom(string:to_lower(Val)) of
+ Bool when is_boolean(Bool) ->
+ Bool;
+ _ ->
+ false
+ end;
+test_inet_backends([_|Args], Key) ->
+ test_inet_backends(Args, Key).
+
+
+inet_backend_opts(Config) when is_list(Config) ->
+ case lists:keysearch(socket_create_opts, 1, Config) of
+ {value, {socket_create_opts, InetBackendOpts}} ->
+ InetBackendOpts;
+ false ->
+ []
+ end.
+
+is_socket_backend(Config) when is_list(Config) ->
+ case lists:keysearch(socket_create_opts, 1, Config) of
+ {value, {socket_create_opts, [{inet_backend, socket}]}} ->
+ true;
+ _ ->
+ false
+ end.
+
+
+open(Config, Pid, Opts)
+ when is_list(Config) andalso is_pid(Pid) andalso is_list(Opts) ->
+ InetBackendOpts = inet_backend_opts(Config),
+ megaco_udp:open(Pid, InetBackendOpts ++ Opts).
+
+listen(Config, Pid, Opts)
+ when is_list(Config) andalso is_pid(Pid) andalso is_list(Opts) ->
+ InetBackendOpts = inet_backend_opts(Config),
+ megaco_tcp:listen(Pid, InetBackendOpts ++ Opts).
+
+connect(Config, Ref, Opts)
+ when is_list(Config) andalso is_list(Opts) ->
+ InetBackendOpts = inet_backend_opts(Config),
+ megaco_tcp:connect(Ref, InetBackendOpts ++ Opts).
+
diff --git a/lib/megaco/test/megaco_test_lib.hrl b/lib/megaco/test/megaco_test_lib.hrl
index 0777adbcd0..653af70da4 100644
--- a/lib/megaco/test/megaco_test_lib.hrl
+++ b/lib/megaco/test/megaco_test_lib.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2021. 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.
@@ -106,6 +106,16 @@
-define(FTS(TS), megaco:format_timestamp(TS)).
-define(F(F,A), lists:flatten(io_lib:format(F, A))).
+-define(INET_BACKEND_OPTS(C), ?LIB:inet_backend_opts(C)).
+-define(EXPLICIT_INET_BACKEND(), ?LIB:explicit_inet_backend()).
+-define(TEST_INET_BACKENDS(), ?LIB:test_inet_backends()).
+-define(IS_SOCKET_BACKEND(C), ?LIB:is_socket_backend(C)).
+
+-define(OPEN(C, P, O), ?LIB:open(C, P, O)).
+-define(LISTEN(C, P, O), ?LIB:listen(C, P, O)).
+-define(CONNECT(C, R, O), ?LIB:connect(C, R, O)).
+
+
-define(ANNOUNCE_SUITE_INIT(),
io:format(user, "~n*** ~s *** suite ~w init~n~n", [?FTS(), ?MODULE])).
-define(ANNOUNCE_GROUP_INIT(GR),
diff --git a/lib/megaco/test/megaco_test_mg.erl b/lib/megaco/test/megaco_test_mg.erl
index e84adc7de6..7fae24326a 100644
--- a/lib/megaco/test/megaco_test_mg.erl
+++ b/lib/megaco/test/megaco_test_mg.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2021. 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.
@@ -67,7 +67,9 @@
-define(A5555, tid(255*256*256 + 255*256) ).
-define(A5556, tid(255*256*256 + 255*256 + 255) ).
--record(mg, {mid = undefined,
+-record(mg, {parent = undefined,
+ inet_backend = default,
+ mid = undefined,
state = initiated,
req_handler = undefined,
call_mode = async,
@@ -78,7 +80,6 @@
load_counter = 0,
reply_counter = 0,
mload_info = undefined,
- parent = undefined,
dsi_timer,
evs = []}).
@@ -354,11 +355,16 @@ mg(Parent, Verbosity, Config) ->
case (catch init(Config)) of
{error, _} = Error ->
exit(Error);
+
{'EXIT', Reason} ->
exit({init_failed, Reason});
- {ok, Mid, DSITimer} ->
+
+ {ok, IB, Mid, DSITimer} ->
notify_started(Parent),
- MG = #mg{parent = Parent, mid = Mid, dsi_timer = DSITimer},
+ MG = #mg{parent = Parent,
+ inet_backend = IB,
+ mid = Mid,
+ dsi_timer = DSITimer},
i("mg -> started"),
put(verbosity, Verbosity),
case (catch loop(evs(MG, started))) of
@@ -380,12 +386,16 @@ init(Config) ->
"~n Config: ~p", [Config]),
random_init(),
d("init -> random initiated"),
- Mid = get_conf(local_mid, Config),
- d("init -> Mid: ~p", [Mid]),
+
+ IB = get_conf(inet_backend, Config, default),
+ Mid = get_conf(local_mid, Config),
RI = get_conf(receive_info, Config),
- d("init -> RI: ~p", [RI]),
- d("init -> maybe start the display system info timer"),
+ d("init -> "
+ "~n Inet Backend: ~p"
+ "~n Mid: ~p"
+ "~n RI: ~p", [IB, Mid, RI]),
+
DSITimer =
case get_conf(display_system_info, Config, undefined) of
Time when is_integer(Time) ->
@@ -395,6 +405,7 @@ init(Config) ->
undefined
end,
Conf0 = lists:keydelete(display_system_info, 1, Config),
+ Conf1 = lists:keydelete(inet_backend, 1, Conf0),
d("init -> start megaco"),
application:start(megaco),
@@ -411,12 +422,12 @@ init(Config) ->
_ ->
ok
end,
- Conf1 = lists:keydelete(megaco_trace, 1, Conf0),
+ Conf2 = lists:keydelete(megaco_trace, 1, Conf1),
d("init -> start megaco user"),
- Conf2 = lists:keydelete(local_mid, 1, Conf1),
- Conf3 = lists:keydelete(receive_info, 1, Conf2),
- ok = megaco:start_user(Mid, Conf3),
+ Conf3 = lists:keydelete(local_mid, 1, Conf2),
+ Conf4 = lists:keydelete(receive_info, 1, Conf3),
+ ok = megaco:start_user(Mid, Conf4),
d("init -> update user info (user_mod)"),
ok = megaco:update_user_info(Mid, user_mod, ?MODULE),
d("init -> update user info (user_args)"),
@@ -427,8 +438,8 @@ init(Config) ->
d("init -> parse receive info"),
{MgcPort, MgcHost, RH1, TO} = parse_receive_info(RI, RH),
d("init -> start transport (with ~p)", [TO]),
- {ok, _CH} = start_transport(MgcPort, MgcHost, RH1, TO),
- {ok, Mid, DSITimer}.
+ {ok, _CH} = start_transport(IB, MgcPort, MgcHost, RH1, TO),
+ {ok, IB, Mid, DSITimer}.
loop(#mg{parent = Parent, mid = Mid} = S) ->
@@ -936,39 +947,43 @@ parse_receive_info(RI, RH) ->
{TP, TH, RH1, TO}.
-start_transport(MgcPort, MgcHost,
- #megaco_receive_handle{send_mod = megaco_tcp} = RH, TO) ->
- start_tcp(MgcPort, MgcHost, RH, TO);
-start_transport(MgcPort, MgcHost,
- #megaco_receive_handle{send_mod = megaco_udp} = RH, TO) ->
- start_udp(MgcPort, MgcHost, RH, TO);
-start_transport(_, _, #megaco_receive_handle{send_mod = Mod}, _TO) ->
+start_transport(IB,
+ MgcPort, MgcHost,
+ #megaco_receive_handle{send_mod = megaco_tcp} = RH, TO) ->
+ start_tcp(IB, RH, TO, MgcPort, MgcHost);
+start_transport(IB,
+ MgcPort, MgcHost,
+ #megaco_receive_handle{send_mod = megaco_udp} = RH, TO) ->
+ start_udp(IB, RH, TO, MgcPort, MgcHost);
+start_transport(_, _, _, #megaco_receive_handle{send_mod = Mod}, _TO) ->
throw({error, {bad_send_mod, Mod}}).
-start_tcp(MgcPort, MgcHost, RH, TO) ->
+start_tcp(IB, RH, TO, MgcPort, MgcHost) ->
d("start tcp transport: "
+ "~n Inet Backend: ~p"
"~n MGC Port: ~p"
"~n MGC Host: ~p"
"~n Receive handle: ~p"
- "~n Transport options: ~p", [MgcPort, MgcHost, RH, TO]),
+ "~n Transport options: ~p", [IB, MgcPort, MgcHost, RH, TO]),
case megaco_tcp:start_transport() of
{ok, Sup} ->
d("tcp transport started: ~p", [Sup]),
- start_tcp_connect(TO, RH, MgcPort, MgcHost, Sup);
+ start_tcp_connect(IB, TO, RH, MgcPort, MgcHost, Sup);
{error, Reason} ->
throw({error, {megaco_tcp_start_transport, Reason}})
end.
-start_tcp_connect(TO, RH, Port, Host, Sup) ->
+start_tcp_connect(IB, TO, RH, Port, Host, Sup) ->
d("try tcp connecting to: ~p:~p", [Host, Port]),
- Opts = [{host, Host},
+ Opts = [{inet_backend, IB},
+ {host, Host},
{port, Port},
{receive_handle, RH},
{tcp_options, [{nodelay, true}]}] ++ TO,
- try_start_tcp_connect(RH, Sup, Opts, 250, noError).
+ try_start_tcp_connect(RH, Opts, Sup, 250, noError).
-try_start_tcp_connect(RH, Sup, Opts, Timeout, Error0) when (Timeout < 5000) ->
+try_start_tcp_connect(RH, Opts, Sup, Timeout, Error0) when (Timeout < 5000) ->
Sleep = random(Timeout) + 100,
d("try tcp connect (~p,~p)", [Timeout, Sleep]),
case megaco_tcp:connect(Sup, Opts) of
@@ -978,13 +993,13 @@ try_start_tcp_connect(RH, Sup, Opts, Timeout, Error0) when (Timeout < 5000) ->
Error1 when Error0 =:= noError -> % Keep the first error
d("failed connecting [1]: ~p", [Error1]),
sleep(Sleep),
- try_start_tcp_connect(RH, Sup, Opts, Timeout*2, Error1);
+ try_start_tcp_connect(RH, Opts, Sup, Timeout*2, Error1);
Error2 ->
d("failed connecting [2]: ~p", [Error2]),
sleep(Sleep),
- try_start_tcp_connect(RH, Sup, Opts, Timeout*2, Error0)
+ try_start_tcp_connect(RH, Opts, Sup, Timeout*2, Error0)
end;
-try_start_tcp_connect(_RH, Sup, _Opts, _Timeout, Error) ->
+try_start_tcp_connect(_RH, _Opts, Sup, _Timeout, Error) ->
megaco_tcp:stop_transport(Sup),
throw({error, {megaco_tcp_connect, Error}}).
@@ -995,25 +1010,45 @@ megaco_tcp_connect(RH, SendHandle, ControlPid) ->
d("megaco connected: ~p", [CH]),
{ok, CH}.
-start_udp(MgcPort, MgcHost, RH, TO) ->
+start_udp(IB, RH, TO, MgcPort, MgcHost) ->
d("start udp transport (~p)", [MgcPort]),
case megaco_udp:start_transport() of
{ok, Sup} ->
d("udp transport started: ~p", [Sup]),
- Opts = [{port, 0}, {receive_handle, RH}] ++ TO,
- d("udp open", []),
- case megaco_udp:open(Sup, Opts) of
- {ok, Handle, ControlPid} ->
- d("udp opened: ~p, ~p", [Handle, ControlPid]),
- megaco_udp_connect(MgcPort, MgcHost,
- RH, Handle, ControlPid);
- {error, Reason} ->
- throw({error, {megaco_udp_open, Reason}})
- end;
+ start_udp_open(IB, RH, TO, MgcPort, MgcHost, Sup);
+ %% Opts = [{inet_backend, IB}, {port, 0}, {receive_handle, RH}] ++ TO,
+ %% d("udp open", []),
+ %% case megaco_udp:open(Sup, Opts) of
+ %% {ok, Handle, ControlPid} ->
+ %% d("udp opened: ~p, ~p", [Handle, ControlPid]),
+ %% megaco_udp_connect(IB,
+ %% MgcPort, MgcHost,
+ %% RH, Handle, ControlPid);
+ %% {error, Reason} ->
+ %% throw({error, {megaco_udp_open, Reason}})
+ %% end;
{error, Reason} ->
throw({error, {megaco_udp_start_transport, Reason}})
end.
+start_udp_open(IB, RH, TO, MgcPort, MgcHost, Sup) ->
+ Opts = [{inet_backend, IB}, {port, 0}, {receive_handle, RH}] ++ TO,
+ try_start_udp_open(RH, Opts, MgcPort, MgcHost, Sup).
+
+try_start_udp_open(RH, Opts, MgcPort, MgcHost, Sup) ->
+ d("udp open", []),
+ case megaco_udp:open(Sup, Opts) of
+ {ok, Handle, ControlPid} ->
+ d("udp opened: ~p, ~p", [Handle, ControlPid]),
+ megaco_udp_connect(MgcPort, MgcHost,
+ RH, Handle, ControlPid);
+ {error, Reason} ->
+ megaco_udp:stop_transport(Sup),
+ throw({error, {megaco_udp_open, Reason}})
+ end.
+
+
+
megaco_udp_connect(MgcPort, MgcHost, RH, Handle, ControlPid) ->
MgcMid = preliminary_mid,
SendHandle = megaco_udp:create_send_handle(Handle, MgcHost, MgcPort),
diff --git a/lib/megaco/test/megaco_test_mgc.erl b/lib/megaco/test/megaco_test_mgc.erl
index a7d0731b0f..74fd9fc7fc 100644
--- a/lib/megaco/test/megaco_test_mgc.erl
+++ b/lib/megaco/test/megaco_test_mgc.erl
@@ -57,6 +57,8 @@
-include_lib("megaco/include/megaco.hrl").
-include_lib("megaco/include/megaco_message_v1.hrl").
+-define(NO_ERROR, 'no error').
+
-define(A4444, ["11111111", "00000000", "00000000"]).
-define(A4445, ["11111111", "00000000", "11111111"]).
-define(A5555, ["11111111", "11111111", "00000000"]).
@@ -65,18 +67,19 @@
-define(valid_actions,
[ignore, pending, pending_ignore, discard_ack, handle_ack, handle_pending_ack, handle_sloppy_ack]).
--record(mgc, {parent = undefined,
- tcp_sup = undefined,
- udp_sup = undefined,
- req_action = discard_ack,
- req_timeout = 0,
- mid = undefined,
- ack_info = undefined,
- abort_info = undefined,
- req_info = undefined,
- mg = [],
+-record(mgc, {parent = undefined,
+ inet_backend = default,
+ tcp_sup = undefined,
+ udp_sup = undefined,
+ req_action = discard_ack,
+ req_timeout = 0,
+ mid = undefined,
+ ack_info = undefined,
+ abort_info = undefined,
+ req_info = undefined,
+ mg = [],
dsi_timer,
- evs = []}).
+ evs = []}).
-define(EVS_MAX, 10).
@@ -330,13 +333,14 @@ mgc(Parent, Verbosity, Config) ->
case (catch init(Config)) of
{error, Reason} ->
exit(Reason);
- {Mid, TcpSup, UdpSup, DSITimer} ->
+ {IB, Mid, TcpSup, UdpSup, DSITimer} ->
notify_started(Parent),
- S = #mgc{parent = Parent,
- tcp_sup = TcpSup,
- udp_sup = UdpSup,
- mid = Mid,
- dsi_timer = DSITimer},
+ S = #mgc{parent = Parent,
+ tcp_sup = TcpSup,
+ udp_sup = UdpSup,
+ mid = Mid,
+ dsi_timer = DSITimer,
+ inet_backend = IB},
i("mgc -> started"),
display_system_info("at start "),
loop(evs(S, started))
@@ -345,10 +349,15 @@ mgc(Parent, Verbosity, Config) ->
init(Config) ->
d("init -> entry"),
random_init(),
- Mid = get_conf(local_mid, Config),
+
+ IB = get_conf(inet_backend, Config, default),
+ Mid = get_conf(local_mid, Config),
RI = get_conf(receive_info, Config),
- d("init -> maybe start the display system info timer"),
+ d("init -> "
+ "~n Inet Backend: ~p"
+ "~n Mid: ~p"
+ "~n RI: ~p", [IB, Mid, RI]),
DSITimer =
case get_conf(display_system_info, Config, undefined) of
Time when is_integer(Time) ->
@@ -358,6 +367,7 @@ init(Config) ->
undefined
end,
Conf0 = lists:keydelete(display_system_info, 1, Config),
+ Conf1 = lists:keydelete(inet_backend, 1, Conf0),
d("init -> start megaco"),
application:start(megaco),
@@ -373,12 +383,12 @@ init(Config) ->
_ ->
ok
end,
- Conf1 = lists:keydelete(megaco_trace, 1, Conf0),
+ Conf2 = lists:keydelete(megaco_trace, 1, Conf1),
d("init -> start megaco user"),
- Conf2 = lists:keydelete(local_mid, 1, Conf1),
- Conf3 = lists:keydelete(receive_info, 1, Conf2),
- ok = megaco:start_user(Mid, Conf3),
+ Conf3 = lists:keydelete(local_mid, 1, Conf2),
+ Conf4 = lists:keydelete(receive_info, 1, Conf3),
+ ok = megaco:start_user(Mid, Conf4),
d("init -> update user info (user_mod)"),
ok = megaco:update_user_info(Mid, user_mod, ?MODULE),
@@ -392,8 +402,8 @@ init(Config) ->
Transports = parse_receive_info(RI, RH),
d("init -> start transports"),
- {Tcp, Udp} = start_transports(Transports),
- {Mid, Tcp, Udp, DSITimer}.
+ {Tcp, Udp} = start_transports(IB, Transports),
+ {IB, Mid, Tcp, Udp, DSITimer}.
loop(S) ->
d("loop -> await request"),
@@ -722,11 +732,11 @@ parse_receive_info1(RI, RH) ->
%% send/receive port (udp).
%% The second step *may* need to be repeated!
%% --------------------------------------------------------
-start_transports([]) ->
+start_transports(_, []) ->
throw({error, no_transport});
-start_transports(Transports) when is_list(Transports) ->
+start_transports(IB, Transports) when is_list(Transports) ->
{Tcp, Udp} = start_transports1(Transports, undefined, undefined),
- ok = start_transports2(Transports, Tcp, Udp),
+ ok = start_transports2(IB, Transports, Tcp, Udp),
{Tcp, Udp}.
start_transports1([], Tcp, Udp) ->
@@ -760,28 +770,29 @@ start_transports1([{_TO, _Port, RH}|Transports], Tcp, Udp)
start_transports1([_|Transports], Tcp, Udp) ->
start_transports1(Transports, Tcp, Udp).
-start_transports2([], _, _) ->
+start_transports2(_, [], _, _) ->
ok;
-start_transports2([{TO, Port, RH}|Transports], Tcp, Udp)
+start_transports2(IB, [{TO, Port, RH}|Transports], Tcp, Udp)
when RH#megaco_receive_handle.send_mod =:= megaco_tcp ->
- start_tcp(TO, RH, Port, Tcp),
- start_transports2(Transports, Tcp, Udp);
-start_transports2([{TO, Port, RH}|Transports], Tcp, Udp)
+ start_tcp(IB, TO, RH, Port, Tcp),
+ start_transports2(IB, Transports, Tcp, Udp);
+start_transports2(IB, [{TO, Port, RH}|Transports], Tcp, Udp)
when RH#megaco_receive_handle.send_mod =:= megaco_udp ->
- start_udp(TO, RH, Port, Udp),
- start_transports2(Transports, Tcp, Udp).
+ start_udp(IB, TO, RH, Port, Udp),
+ start_transports2(IB, Transports, Tcp, Udp).
-start_tcp(TO, RH, Port, Sup) ->
+start_tcp(IB, TO, RH, Port, Sup) ->
d("start tcp transport"),
- start_tcp(TO, RH, Port, Sup, 250).
+ start_tcp(IB, TO, RH, Port, Sup, 250).
-start_tcp(TO, RH, Port, Sup, Timeout)
+start_tcp(IB, TO, RH, Port, Sup, Timeout)
when is_pid(Sup) andalso is_integer(Timeout) andalso (Timeout > 0) ->
d("tcp listen on ~p", [Port]),
- Opts = [{port, Port},
+ Opts = [{inet_backend, IB},
+ {port, Port},
{receive_handle, RH},
{tcp_options, [{nodelay, true}]}] ++ TO,
- try_start_tcp(Sup, Opts, Timeout, noError).
+ try_start_tcp(Sup, Opts, Timeout, ?NO_ERROR).
try_start_tcp(Sup, Opts, Timeout, Error0) when (Timeout < 5000) ->
Sleep = random(Timeout) + 100,
@@ -790,7 +801,7 @@ try_start_tcp(Sup, Opts, Timeout, Error0) when (Timeout < 5000) ->
ok ->
d("listen socket created", []),
Sup;
- Error1 when Error0 =:= noError -> % Keep the first error
+ Error1 when Error0 =:= ?NO_ERROR -> % Keep the first error
d("failed creating listen socket [1]: ~p", [Error1]),
sleep(Sleep),
try_start_tcp(Sup, Opts, Timeout*2, Error1);
@@ -809,14 +820,16 @@ try_start_tcp(Sup, _Opts, _Timeout, Error) ->
end.
-start_udp(TO, RH, Port, Sup) ->
+start_udp(IB, TO, RH, Port, Sup) ->
d("start udp transport"),
- start_udp(TO, RH, Port, Sup, 250).
+ start_udp(IB, TO, RH, Port, Sup, 250).
-start_udp(TO, RH, Port, Sup, Timeout) ->
+start_udp(IB, TO, RH, Port, Sup, Timeout) ->
d("udp open ~p", [Port]),
- Opts = [{port, Port}, {receive_handle, RH}] ++ TO,
- try_start_udp(Sup, Opts, Timeout, noError).
+ Opts = [{inet_backend, IB},
+ {port, Port},
+ {receive_handle, RH}] ++ TO,
+ try_start_udp(Sup, Opts, Timeout, ?NO_ERROR).
try_start_udp(Sup, Opts, Timeout, Error0) when (Timeout < 5000) ->
d("try open udp socket (~p)", [Timeout]),
@@ -824,7 +837,7 @@ try_start_udp(Sup, Opts, Timeout, Error0) when (Timeout < 5000) ->
{ok, _SendHandle, _ControlPid} ->
d("port opened", []),
Sup;
- Error1 when Error0 =:= noError -> % Keep the first error
+ Error1 when Error0 =:= ?NO_ERROR -> % Keep the first error
d("failed open port [1]: ~p", [Error1]),
sleep(Timeout),
try_start_udp(Sup, Opts, Timeout*2, Error1);
diff --git a/lib/megaco/test/megaco_udp_SUITE.erl b/lib/megaco/test/megaco_udp_SUITE.erl
index e8fea517f6..461b56fad4 100644
--- a/lib/megaco/test/megaco_udp_SUITE.erl
+++ b/lib/megaco/test/megaco_udp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2020 All Rights Reserved.
+%% Copyright Ericsson AB 2000-2021 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.
@@ -81,17 +81,49 @@ suite() ->
[{ct_hooks, [ts_install_cth]}].
all() ->
+ %% This is a temporary messure to ensure that we can
+ %% test the socket backend without effecting *all*
+ %% applications on *all* machines.
+ %% This flag is set only for *one* host.
+ case ?TEST_INET_BACKENDS() of
+ true ->
+ [
+ {group, inet_backend_default},
+ {group, inet_backend_inet},
+ {group, inet_backend_socket}
+ ];
+ _ ->
+ [
+ {group, inet_backend_default}
+ ]
+ end.
+
+groups() ->
[
- {group, start},
- {group, sending},
- {group, error}
+ {inet_backend_default, [], inet_backend_default_cases()},
+ {inet_backend_inet, [], inet_backend_inet_cases()},
+ {inet_backend_socket, [], inet_backend_socket_cases()},
+
+ {all, [], all_cases()},
+ {start, [], start_cases()},
+ {sending, [], sending_cases()},
+ {error, [], error_cases()}
].
-groups() ->
+inet_backend_default_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_inet_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_socket_cases() ->
+ [{all, [], all_cases()}].
+
+all_cases() ->
[
- {start, [], start_cases()},
- {sending, [], sending_cases()},
- {error, [], error_cases()}
+ {group, start},
+ {group, sending},
+ {group, error}
].
start_cases() ->
@@ -167,6 +199,29 @@ end_per_suite(Config0) when is_list(Config0) ->
%% -----
%%
+init_per_group(inet_backend_default = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ [{socket_create_opts, []} | Config];
+init_per_group(inet_backend_inet = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ [{socket_create_opts, [{inet_backend, inet}]} | Config]
+ end;
+init_per_group(inet_backend_socket = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ [{socket_create_opts, [{inet_backend, socket}]} | Config]
+ end;
init_per_group(Group, Config) ->
?ANNOUNCE_GROUP_INIT(Group),
Config.
@@ -203,7 +258,6 @@ end_per_testcase(Case, Config) ->
-
%% =================================================
%%
%% ------------------ start ------------------------
@@ -217,7 +271,7 @@ start_normal(suite) ->
start_normal(Config) when is_list(Config) ->
?ACQUIRE_NODES(1, Config),
Opts = [{port, 0}, {receive_handle, apa}],
- {ok, Pid} = start_case(Opts, ok),
+ {ok, Pid} = start_case(Config, Opts, ok),
megaco_udp:stop_transport(Pid),
ok.
@@ -229,7 +283,7 @@ start_invalid_opt(suite) ->
start_invalid_opt(Config) when is_list(Config) ->
?ACQUIRE_NODES(1, Config),
Opts = [{port, 0}, {receivehandle, apa}],
- start_case(Opts, error).
+ start_case(Config, Opts, error).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -250,22 +304,22 @@ start_and_stop(Config) when is_list(Config) ->
ok = ?START_NODES(Nodes),
Nodes
end,
- Case = fun(X) -> do_start_and_stop(Factor, X) end,
+ Case = fun(X) -> do_start_and_stop(Config, Factor, X) end,
Post = fun(Nodes) ->
p("stop nodes"),
?STOP_NODES(lists:reverse(Nodes))
end,
try_tc(start_and_stop, Pre, Case, Post).
-do_start_and_stop(Factor, [ServerNode, ClientNode]) ->
+do_start_and_stop(Config, Factor, [ServerNode, ClientNode]) ->
%% Create command sequences
TOCalc = fun(BaseTO) -> to_calc(Factor, BaseTO) end,
TO = TOCalc(?SECS(5)),
p("create command sequences"),
ServerPort = 2944,
- ServerCmds = start_and_stop_server_commands(ServerPort),
+ ServerCmds = start_and_stop_server_commands(Config, ServerPort),
{ok, ServerHost} = inet:gethostname(),
- ClientCmds = start_and_stop_client_commands(TO, ServerPort, ServerHost),
+ ClientCmds = start_and_stop_client_commands(Config, TO, ServerPort, ServerHost),
%% Start the test procs used in the test-case, one for each node
p("start command handlers"),
@@ -294,7 +348,7 @@ do_start_and_stop(Factor, [ServerNode, ClientNode]) ->
ok.
-start_and_stop_server_commands(Port) ->
+start_and_stop_server_commands(Config, Port) ->
Opts = [{port, Port}],
Self = self(),
[
@@ -313,7 +367,7 @@ start_and_stop_server_commands(Port) ->
#{id => 3,
desc => "Open",
cmd => fun(State) ->
- server_open(State, Opts)
+ server_open(Config, State, Opts)
end},
#{id => 4,
@@ -342,7 +396,7 @@ start_and_stop_server_commands(Port) ->
].
-start_and_stop_client_commands(TO, ServerPort, _ServerHost) ->
+start_and_stop_client_commands(Config, TO, ServerPort, _ServerHost) ->
Opts = [{port, ServerPort}],
Self = self(),
[
@@ -361,7 +415,7 @@ start_and_stop_client_commands(TO, ServerPort, _ServerHost) ->
#{id => 3,
desc => "Open",
cmd => fun(State) ->
- client_open(State, Opts)
+ client_open(Config, State, Opts)
end},
#{id => 4,
@@ -414,22 +468,22 @@ sendreceive(Config) when is_list(Config) ->
ok = ?START_NODES(Nodes),
Nodes
end,
- Case = fun(X) -> do_sendreceive(Factor, X) end,
+ Case = fun(X) -> do_sendreceive(Config, Factor, X) end,
Post = fun(Nodes) ->
p("stop nodes"),
?STOP_NODES(lists:reverse(Nodes))
end,
try_tc(sendreceive, Pre, Case, Post).
-do_sendreceive(Factor, [ServerNode, ClientNode]) ->
+do_sendreceive(Config, Factor, [ServerNode, ClientNode]) ->
%% Create command sequences
p("create command sequences"),
TOCalc = fun(BaseTO) -> to_calc(Factor, BaseTO) end,
TO = TOCalc(?SECS(5)),
ServerPort = 2944,
- ServerCmds = sendreceive_server_commands(TO, ServerPort),
+ ServerCmds = sendreceive_server_commands(Config, TO, ServerPort),
{ok, ServerHost} = inet:gethostname(),
- ClientCmds = sendreceive_client_commands(TO, ServerPort, ServerHost),
+ ClientCmds = sendreceive_client_commands(Config, TO, ServerPort, ServerHost),
%% Start the test procs used in the test-case, one for each node
p("start command handlers"),
@@ -458,7 +512,7 @@ do_sendreceive(Factor, [ServerNode, ClientNode]) ->
ok.
-sendreceive_server_commands(TO, Port) ->
+sendreceive_server_commands(Config, TO, Port) ->
Opts = [{port, Port}],
Self = self(),
[
@@ -477,7 +531,7 @@ sendreceive_server_commands(TO, Port) ->
#{id => 3,
desc => "Open",
cmd => fun(State) ->
- server_open(State, Opts)
+ server_open(Config, State, Opts)
end},
#{id => 4,
@@ -541,7 +595,7 @@ sendreceive_server_commands(TO, Port) ->
end}
].
-sendreceive_client_commands(TO, ServerPort, ServerHost) ->
+sendreceive_client_commands(Config, TO, ServerPort, ServerHost) ->
OwnPort = ServerPort+1,
Opts = [{port, OwnPort}],
Self = self(),
@@ -561,7 +615,7 @@ sendreceive_client_commands(TO, ServerPort, ServerHost) ->
#{id => 3,
desc => "Open",
cmd => fun(State) ->
- client_open(State, Opts)
+ client_open(Config, State, Opts)
end},
#{id => 4,
@@ -643,23 +697,23 @@ block_unblock(Config) when is_list(Config) ->
ok = ?START_NODES(Nodes),
Nodes
end,
- Case = fun(X) -> do_block_unblock(Factor, X) end,
+ Case = fun(X) -> do_block_unblock(Config, Factor, X) end,
Post = fun(Nodes) ->
p("stop nodes"),
?STOP_NODES(lists:reverse(Nodes))
end,
try_tc(block_unblock, Pre, Case, Post).
-do_block_unblock(Factor, [ServerNode, ClientNode]) ->
+do_block_unblock(Config, Factor, [ServerNode, ClientNode]) ->
%% Create command sequences
p("create command sequences"),
TOCalc = fun(BaseTO) -> to_calc(Factor, BaseTO) end,
TO = TOCalc(?SECS(5)),
ServerPort = 2944,
p("generated command sequences with timeout: ~w msec", [TO]),
- ServerCmds = block_unblock_server_commands(TO, ServerPort),
+ ServerCmds = block_unblock_server_commands(Config, TO, ServerPort),
{ok, ServerHost} = inet:gethostname(),
- ClientCmds = block_unblock_client_commands(TO, ServerPort, ServerHost),
+ ClientCmds = block_unblock_client_commands(Config, TO, ServerPort, ServerHost),
%% Start the test procs used in the test-case, one for each node
p("start command handlers"),
@@ -707,7 +761,7 @@ do_block_unblock(Factor, [ServerNode, ClientNode]) ->
ok.
-block_unblock_server_commands(TO, Port) ->
+block_unblock_server_commands(Config, TO, Port) ->
Opts = [{port, Port}],
Self = self(),
[
@@ -726,7 +780,7 @@ block_unblock_server_commands(TO, Port) ->
#{id => 3,
desc => "Open",
cmd => fun(State) ->
- server_open(State, Opts)
+ server_open(Config, State, Opts)
end},
#{id => 4,
@@ -791,7 +845,7 @@ block_unblock_server_commands(TO, Port) ->
].
-block_unblock_client_commands(TO, ServerPort, ServerHost) ->
+block_unblock_client_commands(Config, TO, ServerPort, ServerHost) ->
OwnPort = ServerPort+1,
Opts = [{port, OwnPort}],
Self = self(),
@@ -811,7 +865,7 @@ block_unblock_client_commands(TO, ServerPort, ServerHost) ->
#{id => 3,
desc => "Open",
cmd => fun(State) ->
- client_open(State, Opts)
+ client_open(Config, State, Opts)
end},
#{id => 4,
@@ -842,7 +896,7 @@ block_unblock_client_commands(TO, ServerPort, ServerHost) ->
desc => "Pre-Block info",
cmd => fun(#{socket := Socket} = State) ->
p("Socket Info: "
- "~n Port Info: ~p", [erlang:port_info(Socket)]),
+ "~n Port Info: ~p", [inet:info(Socket)]),
{ok, State}
end},
@@ -865,7 +919,7 @@ block_unblock_client_commands(TO, ServerPort, ServerHost) ->
p("Socket Info: "
"~n Active: ~p"
"~n Port Info: ~p",
- [Active, erlang:port_info(Socket)]),
+ [Active, inet:info(Socket)]),
{ok, State}
end},
@@ -890,7 +944,7 @@ block_unblock_client_commands(TO, ServerPort, ServerHost) ->
p("Socket Info: "
"~n Active: ~p"
"~n Port Info: ~p",
- [Active, erlang:port_info(Socket)]),
+ [Active, inet:info(Socket)]),
ok
end,
client_await_nothing(State, Fail, TO div 2)
@@ -909,7 +963,7 @@ block_unblock_client_commands(TO, ServerPort, ServerHost) ->
p("Socket Info: "
"~n Active: ~p"
"~n Port Info: ~p",
- [Active, erlang:port_info(Socket)]),
+ [Active, inet:info(Socket)]),
{ok, State}
end},
@@ -932,7 +986,7 @@ block_unblock_client_commands(TO, ServerPort, ServerHost) ->
p("Socket Info: "
"~n Active: ~p"
"~n Port Info: ~p",
- [Active, erlang:port_info(Socket)]),
+ [Active, inet:info(Socket)]),
{ok, State}
end},
@@ -991,10 +1045,10 @@ socket_failure(Config) when is_list(Config) ->
%% Test functions
%%======================================================================
-start_case(Opts, Expect) ->
+start_case(Config, Opts, Expect) ->
case (catch megaco_udp:start_transport()) of
{ok, Pid} ->
- case (catch megaco_udp:open(Pid, Opts)) of
+ case (catch ?OPEN(Config, Pid, Opts)) of
{ok, _Handle, _CtrlPid} when Expect =:= ok ->
{ok, Pid};
{ok, Handle, CtrlPid} ->
@@ -1048,16 +1102,20 @@ server_start_command_handler(Node, Commands) ->
server_start_transport(State) when is_map(State) ->
case (catch megaco_udp:start_transport()) of
{ok, Ref} ->
+ p("Transport started: ~p", [Ref]),
{ok, State#{transport_ref => Ref}};
Error ->
Error
end.
-server_open(#{transport_ref := Ref} = State, Options)
+server_open(Config, #{transport_ref := Ref} = State, Options)
when is_list(Options) ->
Opts = [{receive_handle, self()}, {module, ?MODULE} | Options],
- try megaco_udp:open(Ref, Opts) of
+ try ?OPEN(Config, Ref, Opts) of
{ok, Socket, ControlPid} ->
+ p("opened: "
+ "~n Socket: ~p"
+ "~n ControlPid: ~p", [Socket, ControlPid]),
{ok, State#{handle => {socket, Socket}, % Temporary
control_pid => ControlPid}};
{error, {could_not_open_udp_port, eaddrinuse}} ->
@@ -1167,10 +1225,10 @@ client_start_transport(State) when is_map(State) ->
Error
end.
-client_open(#{transport_ref := Ref} = State, Options)
+client_open(Config, #{transport_ref := Ref} = State, Options)
when is_list(Options) ->
Opts = [{receive_handle, self()}, {module, ?MODULE} | Options],
- try megaco_udp:open(Ref, Opts) of
+ try ?OPEN(Config, Ref, Opts) of
{ok, Socket, ControlPid} ->
{ok, State#{handle => {socket, Socket},
socket => Socket,
diff --git a/lib/mnesia/src/mnesia_index.erl b/lib/mnesia/src/mnesia_index.erl
index 2ca6c55870..964c50aa52 100644
--- a/lib/mnesia/src/mnesia_index.erl
+++ b/lib/mnesia/src/mnesia_index.erl
@@ -139,22 +139,15 @@ del_object_index(#index{pos_list = PosL, setorbag = SorB}, Storage, Tab, K, Obj)
del_object_index2(PosL, SorB, Storage, Tab, K, Obj).
del_object_index2([], _, _Storage, _Tab, _K, _Obj) -> ok;
-del_object_index2([{{Pos, Type}, Ixt} | Tail], SoB, Storage, Tab, K, Obj) ->
+del_object_index2([{{Pos, Type}, Ixt} | Tail], SoB, Storage, Tab, Key, Obj) ->
ValsF = index_vals_f(Storage, Tab, Pos),
- case SoB of
- bag ->
- del_object_bag(Type, ValsF, Tab, K, Obj, Ixt);
- _ -> %% If set remove the tuple in index table
- del_ixes(Type, Ixt, ValsF, Obj, K)
- end,
- del_object_index2(Tail, SoB, Storage, Tab, K, Obj).
-
-del_object_bag(Type, ValsF, Tab, Key, Obj, Ixt) ->
- IxKeys = ValsF(Obj),
Found = [{X, ValsF(X)} || X <- mnesia_lib:db_get(Tab, Key)],
- del_object_bag_(IxKeys, Found, Type, Tab, Key, Obj, Ixt).
+ IxKeys = ValsF(Obj),
+ del_object_index3(IxKeys, Found, Type, Tab, Key, Obj, Ixt),
+ del_object_index2(Tail, SoB, Storage, Tab, Key, Obj).
+
-del_object_bag_([IxK|IxKs], Found, Type, Tab, Key, Obj, Ixt) ->
+del_object_index3([IxK|IxKs], Found, Type, Tab, Key, Obj, Ixt) ->
case [X || {X, Ixes} <- Found, lists:member(IxK, Ixes)] of
[Old] when Old =:= Obj ->
case Type of
@@ -166,8 +159,8 @@ del_object_bag_([IxK|IxKs], Found, Type, Tab, Key, Obj, Ixt) ->
_ ->
ok
end,
- del_object_bag_(IxKs, Found, Type, Tab, Key, Obj, Ixt);
-del_object_bag_([], _, _, _, _, _, _) ->
+ del_object_index3(IxKs, Found, Type, Tab, Key, Obj, Ixt);
+del_object_index3([], _, _, _, _, _, _) ->
ok.
clear_index(Index, Tab, K, Obj) ->
diff --git a/lib/mnesia/test/mnesia_trans_access_test.erl b/lib/mnesia/test/mnesia_trans_access_test.erl
index f488134391..1549bb6a83 100644
--- a/lib/mnesia/test/mnesia_trans_access_test.erl
+++ b/lib/mnesia/test/mnesia_trans_access_test.erl
@@ -32,7 +32,7 @@
basic_nested/1, mix_of_nested_activities/1,
nested_trans_both_ok/1, nested_trans_child_dies/1,
nested_trans_parent_dies/1, nested_trans_both_dies/1,
- index_match_object/1, index_read/1,index_write/1,
+ index_match_object/1, index_read/1,index_write/1, index_delete_object/1,
index_update_set/1, index_update_bag/1,
add_table_index_ram/1, add_table_index_disc/1,
add_table_index_disc_only/1, create_live_table_index_ram/1,
@@ -78,7 +78,7 @@ groups() ->
nested_trans_parent_dies, nested_trans_both_dies]},
{index_tabs, [],
[index_match_object, index_read, {group, index_update},
- index_write]},
+ index_write, index_delete_object]},
{index_update, [],
[index_update_set, index_update_bag]},
{index_lifecycle, [],
@@ -1164,6 +1164,36 @@ index_write(Config)when is_list(Config) ->
?verify_mnesia(Nodes, []).
+index_delete_object(suite) -> [];
+index_delete_object(doc) -> ["See issue: GH-5040"];
+index_delete_object(Config) when is_list(Config) ->
+ Nodes = ?acquire_nodes(1, Config),
+ {atomic, ok} = mnesia:create_table(ram_set,[{index, [ix]}, {attributes, [key, ix, val]},
+ {ram_copies, Nodes}]),
+ {atomic, ok} = mnesia:create_table(do_set, [{index, [ix]}, {attributes, [key, ix, val]},
+ {disc_only_copies, Nodes}]),
+ {atomic, ok} = mnesia:create_table(ram_bag,[{index, [ix]}, {attributes, [key, ix, val]},
+ {ram_copies, Nodes}]),
+ {atomic, ok} = mnesia:create_table(do_bag, [{index, [ix]}, {attributes, [key, ix, val]},
+ {disc_only_copies, Nodes}]),
+ Test = fun(Tab) ->
+ io:format("Testing: ~p~n",[Tab]),
+ Rec = {Tab, 2, 4, data},
+ Rec2 = {Tab, 3, 5, data},
+ ok = mnesia:dirty_write(Rec),
+ ok = mnesia:dirty_write(Rec2),
+ [Rec] = mnesia:dirty_index_read(Tab, 4, ix),
+ ?match(ok, mnesia:dirty_delete_object({Tab, 2, 4, does_not_exist})),
+ [Rec] = mnesia:dirty_read(Tab, 2),
+ [Rec] = mnesia:dirty_index_read(Tab, 4, ix),
+ ?match(ok, mnesia:dirty_delete_object(Rec)),
+ [] = mnesia:dirty_read(Tab, 2),
+ [] = mnesia:dirty_index_read(Tab, 4, ix),
+ [Rec2] = mnesia:dirty_read(Tab, 3),
+ [Rec2] = mnesia:dirty_index_read(Tab, 5, ix)
+ end,
+ [Test(Tab) || Tab <- [ram_set,do_set,ram_bag,do_bag]],
+ ?verify_mnesia(Nodes, []).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Add and drop indecies
diff --git a/lib/runtime_tools/doc/src/dbg.xml b/lib/runtime_tools/doc/src/dbg.xml
index 168e89b7f0..2e1841b5c5 100644
--- a/lib/runtime_tools/doc/src/dbg.xml
+++ b/lib/runtime_tools/doc/src/dbg.xml
@@ -148,7 +148,7 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<name since="">h() -> ok </name>
<fsummary>Give a list of available help items on standard output.</fsummary>
<desc>
- <p>Gives a list of items for brief online help.</p>
+ <p><c>h</c> stands for <em>h</em>elp. Gives a list of items for brief online help. </p>
</desc>
</func>
<func>
@@ -158,8 +158,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<v>Item = atom()</v>
</type>
<desc>
- <p>Gives a brief help text for functions in the dbg module. The
- available items can be listed with <c>dbg:h/0</c></p>
+ <p><c>h</c> stands for <em>h</em>elp. Gives a brief help text for functions in the dbg module. The
+ available items can be listed with <c>dbg:h/0</c>.</p>
</desc>
</func>
<func>
@@ -178,7 +178,7 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<v>RPCError = term()</v>
</type>
<desc>
- <p>Traces <c>Item</c> in accordance to the value specified
+ <p><c>p</c> stands for <em>p</em>rocess. Traces <c>Item</c> in accordance to the value specified
by <c>Flags</c>. The variation of <c>Item</c> is listed below:</p>
<taglist>
<tag><c>pid()</c> or <c>port()</c></tag>
@@ -313,7 +313,7 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<name since="">c(Mod, Fun, Args, Flags)</name>
<fsummary>Evaluate <c>apply(M,F,Args)</c>with <c>Flags</c>trace flags set.</fsummary>
<desc>
- <p>Evaluates the expression <c>apply(Mod, Fun, Args)</c> with the trace
+ <p><c>c</c> stands for <em>c</em>all. Evaluates the expression <c>apply(Mod, Fun, Args)</c> with the trace
flags in <c>Flags</c> set. This is a convenient way to trace processes
from the Erlang shell.</p>
</desc>
@@ -322,7 +322,7 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<name since="">i() -> ok</name>
<fsummary>Display information about all traced processes and ports.</fsummary>
<desc>
- <p>Displays information about all traced processes and ports.</p>
+ <p><c>i</c> stands for <em>i</em>nformation. Displays information about all traced processes and ports.</p>
</desc>
</func>
<func>
@@ -360,7 +360,7 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<v>MatchNum = {matched, node(), integer()} | {matched, node(), 0, RPCError}</v>
</type>
<desc>
- <p>This function enables call trace for one or more
+ <p><c>tp</c> stands for <em>t</em>race <em>p</em>attern. This function enables call trace for one or more
functions. All exported functions matching the <c>{Module, Function, Arity}</c>
argument will be concerned, but the
<c>match_spec()</c> may further narrow down the set of function
@@ -434,7 +434,7 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<name since="">tpl({Module, Function, Arity}, MatchSpec) -> {ok, MatchDesc} | {error, term()}</name>
<fsummary>Set pattern for traced local (as well as global) function calls</fsummary>
<desc>
- <p>This function works as <seemfa marker="#tp/2"><c>tp/2</c></seemfa>, but enables
+ <p><c>tpl</c> stands for <em>t</em>race <em>p</em>attern <em>l</em>ocal. This function works as <seemfa marker="#tp/2"><c>tp/2</c></seemfa>, but enables
tracing for local calls (and local functions) as well as for
global calls (and functions).</p>
</desc>
@@ -453,7 +453,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<v>MatchNum = {matched, node(), 1} | {matched, node(), 0, RPCError}</v>
</type>
<desc>
- <p>This function associates a match specification with trace event
+ <p><c>tpe</c> stands for <em>t</em>race <em>p</em>attern <em>e</em>vent.
+ This function associates a match specification with trace event
<c>send</c> or <c>'receive'</c>. By default all executed <c>send</c>
and <c>'receive'</c> events are traced if enabled for a process.
A match specification can be used to filter traced events
@@ -522,7 +523,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<v>MatchNum = {matched, node(), integer()} | {matched, node(), 0, RPCError}</v>
</type>
<desc>
- <p>This function disables call tracing on the specified
+ <p><c>ctp</c> stands for <em>c</em>lear <em>t</em>race <em>p</em>attern.
+ This function disables call tracing on the specified
functions. The semantics of the parameter is the same
as for the corresponding function specification in
<seemfa marker="#tp/2"><c>tp/2</c></seemfa> or <seemfa marker="#tpl/2"><c>tpl/2</c></seemfa>. Both local and global call trace
@@ -564,7 +566,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<name since="">ctpl({Module, Function, Arity}) -> {ok, MatchDesc} | {error, term()}</name>
<fsummary>Clear call trace pattern for the specified functions</fsummary>
<desc>
- <p>This function works as <seemfa marker="#ctp/1"><c>ctp/1</c></seemfa>, but only disables
+ <p><c>ctpl</c> stands for <em>c</em>lear <em>t</em>race <em>p</em>attern <em>l</em>ocal.
+ This function works as <seemfa marker="#ctp/1"><c>ctp/1</c></seemfa>, but only disables
tracing set up with <seemfa marker="#tpl/2"><c>tpl/2</c></seemfa>
(not with <seemfa marker="#tp/2"><c>tp/2</c></seemfa>).</p>
</desc>
@@ -601,7 +604,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<name since="">ctpg({Module, Function, Arity}) -> {ok, MatchDesc} | {error, term()}</name>
<fsummary>Clear call trace pattern for the specified functions</fsummary>
<desc>
- <p>This function works as <seemfa marker="#ctp/1"><c>ctp/1</c></seemfa>, but only disables
+ <p><c>ctpg</c> stands for <em>c</em>lear <em>t</em>race <em>p</em>attern <em>g</em>lobal.
+ This function works as <seemfa marker="#ctp/1"><c>ctp/1</c></seemfa>, but only disables
tracing set up with <seemfa marker="#tp/2"><c>tp/2</c></seemfa>
(not with <seemfa marker="#tpl/2"><c>tpl/2</c></seemfa>).</p>
</desc>
@@ -615,7 +619,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<v>MatchNum = {matched, node(), 1} | {matched, node(), 0, RPCError}</v>
</type>
<desc>
- <p>This function clears match specifications for the specified
+ <p><c>ctpe</c> stands for <em>c</em>lear <em>t</em>race <em>p</em>attern <em>e</em>vent.
+ This function clears match specifications for the specified
trace event (<c>send</c> or <c>'receive'</c>). It will revert back
to the default behavior of tracing all triggered events.</p>
<p>The return value follow the same style as for
@@ -626,7 +631,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<name since="">ltp() -> ok</name>
<fsummary>List saved and built-in match specifications on the console.</fsummary>
<desc>
- <p>Use this function to recall all match specifications previously
+ <p><c>ltp</c> stands for <em>l</em>ist <em>t</em>race <em>p</em>atterns.
+ Use this function to recall all match specifications previously
used in the session (i. e. previously saved during calls
to <seemfa marker="#tp/2"><c>tp/2</c></seemfa>, and built-in match specifications.
This is very useful, as a complicated
@@ -657,7 +663,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<name since="">dtp() -> ok</name>
<fsummary>Delete all saved match specifications.</fsummary>
<desc>
- <p>Use this function to "forget" all match specifications
+ <p><c>dtp</c> stands for <em>d</em>elete <em>t</em>race <em>p</em>atterns.
+ Use this function to "forget" all match specifications
saved during calls to <seemfa marker="#tp/2"><c>tp/2</c></seemfa>.
This is useful when one wants to restore other match
specifications from a file with <seemfa marker="#rtp/1"><c>rtp/1</c></seemfa>. Use
@@ -671,7 +678,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<v>N = integer()</v>
</type>
<desc>
- <p>Use this function to "forget" a specific match specification
+ <p><c>dtp</c> stands for <em>d</em>elete <em>t</em>race <em>p</em>attern.
+ Use this function to "forget" a specific match specification
saved during calls to <seemfa marker="#tp/2"><c>tp/2</c></seemfa>.</p>
</desc>
</func>
@@ -683,7 +691,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<v>IOError = term()</v>
</type>
<desc>
- <p>This function will save all match specifications saved
+ <p><c>wtp</c> stands for <em>w</em>rite <em>t</em>race <em>p</em>atterns.
+ This function will save all match specifications saved
during the session (during calls to <seemfa marker="#tp/2"><c>tp/2</c></seemfa>)
and built-in match specifications in a text
file with the name designated by <c>Name</c>. The format
@@ -706,7 +715,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<v>Error = term()</v>
</type>
<desc>
- <p>This function reads match specifications from a file
+ <p><c>rtp</c> stands for <em>r</em>ead <em>t</em>race <em>p</em>atterns.
+ This function reads match specifications from a file
(possibly) generated by the <seemfa marker="#wtp/1"><c>wtp/1</c></seemfa>
function. It checks
the syntax of all match specifications and verifies that
@@ -735,7 +745,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<v>Reason = term()</v>
</type>
<desc>
- <p>The <c>dbg</c> server keeps a list of nodes where tracing
+ <p><c>n</c> stands for <em>n</em>ode.
+ The <c>dbg</c> server keeps a list of nodes where tracing
should be performed. Whenever a <seemfa marker="#tp/2"><c>tp/2</c></seemfa> call or a
<seemfa marker="#p/2"><c>p/2</c></seemfa> call is made, it is executed for all nodes in this
list including the local node (except for <seemfa marker="#p/2"><c>p/2</c></seemfa> with a
@@ -773,7 +784,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<v>Nodename = atom()</v>
</type>
<desc>
- <p>Clears a node from the list of traced nodes. Subsequent
+ <p><c>cn</c> stands for <em>c</em>lear <em>n</em>ode.
+ Clears a node from the list of traced nodes. Subsequent
calls to <seemfa marker="#tp/2"><c>tp/2</c></seemfa> and
<seemfa marker="#p/2"><c>p/2</c></seemfa> will not consider that
node, but tracing already activated on the node will continue
@@ -785,7 +797,8 @@ Error: fun containing local erlang function calls ('is_atomm' called in guard)\
<name since="">ln() -> ok</name>
<fsummary>Show the list of traced nodes on the console.</fsummary>
<desc>
- <p>Shows the list of traced nodes on the console.</p>
+ <p><c>ln</c> stands for <em>l</em>ist <em>n</em>odes.
+ Shows the list of traced nodes on the console.</p>
</desc>
</func>
<func>
diff --git a/lib/snmp/doc/src/snmp_app.xml b/lib/snmp/doc/src/snmp_app.xml
index 361781cb61..9f346f0fe2 100644
--- a/lib/snmp/doc/src/snmp_app.xml
+++ b/lib/snmp/doc/src/snmp_app.xml
@@ -294,13 +294,15 @@ in the snmp_config file!
<tag><marker id="agent_ni_opts"></marker>
<c><![CDATA[agent_net_if_options() = [agent_net_if_option()] <optional>]]></c></tag>
<item>
- <p><c>agent_net_if_option() = {bind_to, bind_to()} |
+ <p><c>agent_net_if_option() =
+ {bind_to, bind_to()} |
{sndbuf, sndbuf()} |
{recbuf, recbuf()} |
{no_reuse, no_reuse()} |
{req_limit, req_limit()} |
{filter, agent_net_if_filter_options()} |
- {extra_sock_opts, extra_socket_options()}</c></p>
+ {extra_sock_opts, extra_socket_options()} |
+ {inet_backend, inet | socket}</c></p>
<p>These options are actually specific to the used module.
The ones shown here are applicable to the default
<c>agent_net_if_module()</c>.</p>
@@ -796,12 +798,14 @@ in the snmp_config file!
<tag><marker id="manager_ni_opts"></marker>
<c><![CDATA[manager_net_if_options() = [manager_net_if_option()] <optional>]]></c></tag>
<item>
- <p><c>manager_net_if_option() = {bind_to, bind_to()} |
- {sndbuf, sndbuf()} |
- {recbuf, recbuf()} |
- {no_reuse, no_reuse()} |
+ <p><c>manager_net_if_option() =
+ {bind_to, bind_to()} |
+ {sndbuf, sndbuf()} |
+ {recbuf, recbuf()} |
+ {no_reuse, no_reuse()} |
{filter, manager_net_if_filter_options()} |
- {extra_sock_opts, extra_socket_options()}</c></p>
+ {extra_sock_opts, extra_socket_options()} |
+ {inet_backend, inet | socket}</c></p>
<p>These options are actually specific to the used module.
The ones shown here are applicable to the default
<c>manager_net_if_module()</c>.</p>
diff --git a/lib/snmp/doc/src/snmp_config.xml b/lib/snmp/doc/src/snmp_config.xml
index 41646d86c3..7dc8e2f66e 100644
--- a/lib/snmp/doc/src/snmp_config.xml
+++ b/lib/snmp/doc/src/snmp_config.xml
@@ -280,13 +280,15 @@
<tag><marker id="agent_ni_opts"></marker>
<c><![CDATA[agent_net_if_options() = [agent_net_if_option()] <optional>]]></c></tag>
<item>
- <p><c>agent_net_if_option() = {bind_to, bind_to()} |
+ <p><c>agent_net_if_option() =
+ {bind_to, bind_to()} |
{sndbuf, sndbuf()} |
{recbuf, recbuf()} |
{no_reuse, no_reuse()} |
{req_limit, req_limit()} |
{filter, agent_net_if_filter_options()} |
- {extra_sock_opts, extra_socket_options()}</c></p>
+ {extra_sock_opts, extra_socket_options()} |
+ {inet_backend, inet | socket}</c></p>
<p>These options are actually specific to the used module.
The ones shown here are applicable to the default
<c>agent_net_if_module()</c>.</p>
@@ -818,12 +820,14 @@ in so far as it will be converted to the new format if found.
<tag><marker id="manager_ni_opts"></marker>
<c><![CDATA[manager_net_if_options() = [manager_net_if_option()] <optional>]]></c></tag>
<item>
- <p><c>manager_net_if_option() = {bind_to, bind_to()} |
- {sndbuf, sndbuf()} |
- {recbuf, recbuf()} |
+ <p><c>manager_net_if_option() =
+ {bind_to, bind_to()} |
+ {sndbuf, sndbuf()} |
+ {recbuf, recbuf()} |
{no_reuse, no_reuse()} |
{filter, manager_net_if_filter_options()} |
- {extra_sock_opts, extra_socket_options()}</c></p>
+ {extra_sock_opts, extra_socket_options()} |
+ {inet_backend, inet | socket}</c></p>
<p>These options are actually specific to the used module.
The ones shown here are applicable to the default
<c>manager_net_if_module()</c>. </p>
diff --git a/lib/snmp/src/agent/snmpa_net_if.erl b/lib/snmp/src/agent/snmpa_net_if.erl
index b6b115bd75..cdb68afef4 100644
--- a/lib/snmp/src/agent/snmpa_net_if.erl
+++ b/lib/snmp/src/agent/snmpa_net_if.erl
@@ -128,17 +128,19 @@
-record(transport,
{socket,
- kind = all :: all | transport_kind(),
- domain = snmpUDPDomain,
+ mref,
+ kind = all :: all | transport_kind(),
+ domain = snmpUDPDomain,
address :: inet:ip_address(),
port_no :: pos_integer(),
port_info :: port_info(),
%% <EPHEMERAL-FOR-FUTUR-USE>
- ephm = none, %% :: ephemeral(),
- ephm_info = undefined, % Only used if ephm =/= none and once
+ ephm = none, %% :: ephemeral(),
+ ephm_info = undefined, % Only used if ephm =/= none and once
%% </EPHEMERAL-FOR-FUTUR-USE>
- opts = [],
- req_refs = [] % Not used for trap/notification transports
+ inet_backend = [],
+ opts = [],
+ req_refs = [] % Not used for trap/notification transports
}).
-ifndef(default_verbosity).
@@ -274,34 +276,45 @@ do_init(Prio, NoteStore, MasterAgent, Parent, Opts) ->
%% will be taken from the "global" socket options (which serve as
%% default values).
%% Also, note that Ephm are not actually used at this time.
- {Ephm, IpAddr, PortInfo, SocketOpts} = socket_opts(Domain, Address,
- RawSocketOpts, Opts),
+ {Ephm, IpAddr, PortInfo, InetBackend, SocketOpts} =
+ socket_opts(Domain, Address, RawSocketOpts, Opts),
?vtrace("socket opts processed:"
- "~n Ephm: ~p"
- "~n Port Info: ~p"
- "~n Socket Opts: ~p", [Ephm, PortInfo, SocketOpts]),
+ "~n Ephm: ~p"
+ "~n Port Info: ~p"
+ "~n Inet Backend: ~p"
+ "~n Socket Opts: ~p",
+ [Ephm, PortInfo, InetBackend, SocketOpts]),
{Socket, IpPort} = socket_open(Domain, PortInfo,
+ InetBackend,
SocketOpts),
+ SockMRef = inet:monitor(Socket),
?vtrace("socket opened:"
- "~n Socket: ~p"
- "~n Port No: ~p", [Socket, IpPort]),
+ "~n Socket: ~p"
+ "~n Port No: ~p"
+ "~n Info: ~p",
+ [Socket, IpPort, inet:info(Socket)]),
+
%% Should we really do this here?
%% If Kind =:= trap_sender, we only need to receive after
%% we have sent an inform!
active_once(Socket),
+ ?vtrace("socket activated:"
+ "~n Info: ~p", [inet:info(Socket)]),
#transport{
- socket = Socket,
- kind = Kind,
- domain = Domain,
+ socket = Socket,
+ mref = SockMRef,
+ kind = Kind,
+ domain = Domain,
%% We may not have explicitly specified the port ('system'
%% or a range), so it could have been "generated".
%% Also, shall we push this into the transport (handled by the
%% FRAMEWORK MIB)? Would not work for ephemeral sockets.
- address = IpAddr,
- port_no = IpPort,
- port_info = PortInfo,
- ephm = Ephm,
- opts = SocketOpts}
+ address = IpAddr,
+ port_no = IpPort,
+ port_info = PortInfo,
+ ephm = Ephm,
+ inet_backend = InetBackend,
+ opts = SocketOpts}
%% We need to fix this also
end || {Domain, Address, Kind, RawSocketOpts} <- RawTransports]
of
@@ -401,7 +414,7 @@ format_address(Address) ->
iolist_to_binary(snmp_conf:mk_addr_string(Address)).
-socket_open(snmpUDPDomain = Domain, IpPort, Opts) ->
+socket_open(snmpUDPDomain = Domain, IpPort, InetBackend, Opts) ->
?vdebug("socket_open(~p) -> entry with"
"~n Port: ~p"
"~n Opts: ~p", [Domain, IpPort, Opts]),
@@ -413,7 +426,7 @@ socket_open(snmpUDPDomain = Domain, IpPort, Opts) ->
"~n FD: ~p"
"~n Port: ~p"
"~n Opts: ~p", [Domain, FD, IpPort, Opts]),
- gen_udp_open(0, [{fd, FD} | Opts]);
+ gen_udp_open(0, InetBackend ++ [{fd, FD} | Opts]);
error ->
case init:get_argument(snmpa_fd) of
{ok, [[FdStr]]} ->
@@ -423,26 +436,28 @@ socket_open(snmpUDPDomain = Domain, IpPort, Opts) ->
"~n FD: ~p"
"~n Port: ~p"
"~n Opts: ~p", [Domain, FD, IpPort, Opts]),
- gen_udp_open(0, [{fd, FD} | Opts]);
+ gen_udp_open(0, InetBackend ++ [{fd, FD} | Opts]);
error ->
?vdebug("socket_open(~p) -> plain open"
"~n Port: ~p"
"~n Opts: ~p", [Domain, IpPort, Opts]),
- gen_udp_open(IpPort, Opts)
+ gen_udp_open(IpPort, InetBackend ++ Opts)
end
end;
-socket_open(Domain, PortInfo, Opts)
+socket_open(Domain, PortInfo, InetBackend, Opts)
when (Domain =:= transportDomainUdpIpv4) orelse
(Domain =:= transportDomainUdpIpv6) ->
?vdebug("socket_open(~p) -> entry with"
- "~n PortInfo: ~p"
- "~n Opts: ~p", [Domain, PortInfo, Opts]),
- gen_udp_open(PortInfo, Opts);
-socket_open(Domain, PortInfo, Opts) ->
+ "~n PortInfo: ~p"
+ "~n InetBackend: ~p"
+ "~n Opts: ~p", [Domain, PortInfo, InetBackend, Opts]),
+ gen_udp_open(PortInfo, InetBackend ++ Opts);
+socket_open(Domain, PortInfo, InetBackend, Opts) ->
?vinfo("socket_open(~p) -> entry when invalid with"
- "~n PortInfo: ~p"
- "~n Opts: ~p", [Domain, PortInfo, Opts]),
- throw({socket_open, Domain, Opts}).
+ "~n PortInfo: ~p"
+ "~n InetBackend: ~p"
+ "~n Opts: ~p", [Domain, PortInfo, InetBackend, Opts]),
+ throw({socket_open, Domain, InetBackend, Opts}).
%% Make the system choose!
@@ -464,7 +479,8 @@ gen_udp_open(system, Opts) ->
end;
%% This is for "future compat" since we cannot actually config '0'...
gen_udp_open(IpPort, Opts) when (IpPort =:= 0) ->
- ?vtrace("gen_udp_open(0) -> entry"),
+ ?vtrace("gen_udp_open(0) -> entry with"
+ "~n Opts: ~p", [Opts]),
case gen_udp:open(IpPort, Opts) of
{ok, Socket} ->
case inet:port(Socket) of
@@ -480,7 +496,8 @@ gen_udp_open(IpPort, Opts) when (IpPort =:= 0) ->
throw({udp_open, {open, IpPort, Reason}})
end;
gen_udp_open(IpPort, Opts) when is_integer(IpPort) ->
- ?vtrace("gen_udp_open(~w) -> entry", [IpPort]),
+ ?vtrace("gen_udp_open(~w) -> entry with"
+ "~n Opts: ~p", [IpPort, Opts]),
case gen_udp:open(IpPort, Opts) of
{ok, Socket} ->
?vtrace("gen_udp_open(~w) -> created: "
@@ -555,7 +572,7 @@ loop(#state{transports = Transports,
parent = Parent} = S) ->
?vdebug("loop(~p)", [S]),
receive
- {udp, Socket, IpAddr, IpPort, Packet} = Msg when is_port(Socket) ->
+ {udp, Socket, IpAddr, IpPort, Packet} = Msg ->
?vlog("got paket from ~w:~w on ~w", [IpAddr, IpPort, Socket]),
case lists:keyfind(Socket, #transport.socket, Transports) of
#transport{socket = Socket, domain = Domain} = Transport ->
@@ -568,7 +585,8 @@ loop(#state{transports = Transports,
end,
loop(maybe_handle_recv(S, Transport, From, Packet));
false ->
- error_msg("Packet on unknown port: ~p", [Msg]),
+ error_msg("Packet on unknown socket: "
+ "~n ~p", [Msg]),
loop(S)
end;
@@ -750,17 +768,16 @@ loop(#state{transports = Transports,
"~n ~p", [Parent, Reason]),
exit(Reason);
- %% We should not do this.
- %% Future versions of sockets will/may not be linkable (port)
- {'EXIT', Socket, Reason} when is_port(Socket) ->
+ {'DOWN', _SockMRef, socket, Socket, Reason} ->
case lists:keyfind(Socket, #transport.socket, Transports) of
#transport{
- socket = Socket,
- domain = Domain,
- port_info = PortInfo,
- opts = SocketOpts,
- req_refs = ReqRefs} = Transport ->
- try socket_open(Domain, PortInfo, SocketOpts) of
+ socket = Socket,
+ domain = Domain,
+ port_info = PortInfo,
+ inet_backend = InetBackend,
+ opts = SocketOpts,
+ req_refs = ReqRefs} = Transport ->
+ try socket_open(Domain, PortInfo, InetBackend, SocketOpts) of
{NewSocket, PortNo} ->
error_msg(
"Socket ~p exited for reason"
@@ -769,11 +786,13 @@ loop(#state{transports = Transports,
[Socket, Reason, NewSocket, PortNo]),
(length(ReqRefs) < Limit) andalso
active_once(NewSocket),
+ NewSockMRef = inet:monitor(NewSocket),
S#state{
transports =
lists:keyreplace(
Socket, #transport.socket, Transports,
Transport#transport{socket = NewSocket,
+ mref = NewSockMRef,
port_no = PortNo})}
catch
ReopenReason ->
@@ -787,7 +806,7 @@ loop(#state{transports = Transports,
end;
false ->
error_msg(
- "Exit message from port ~p for reason ~p~n",
+ "Exit message from socket ~p for reason ~p~n",
[Socket, Reason]),
loop(S)
end;
@@ -806,7 +825,6 @@ loop(#state{transports = Transports,
loop(S)
end.
-
handle_udp_error(S, #transport{socket = Socket,
kind = Kind}, Error) ->
try inet:sockname(Socket) of
@@ -1702,7 +1720,7 @@ toname(Else) ->
active_once(Sock) ->
?vtrace("activate once", []),
- inet:setopts(Sock, [{active, once}]).
+ ok = inet:setopts(Sock, [{active, once}]).
select_transport(_, []) ->
@@ -1988,7 +2006,7 @@ socket_opts(Domain, {IpAddr, PortInfo}, SocketOpts, DefaultOpts) ->
"~n Domain: ~p"
"~n IpAddr: ~p"
"~n PortInfo: ~p"
- "~n SpocketOpts: ~p"
+ "~n SocketOpts: ~p"
"~n DefaultOpts: ~p",
[Domain, IpAddr, PortInfo, SocketOpts, DefaultOpts]),
Opts =
@@ -2017,12 +2035,12 @@ socket_opts(Domain, {IpAddr, PortInfo}, SocketOpts, DefaultOpts) ->
Sz ->
[{recbuf, Sz}]
end ++
- case get_sndbuf(SocketOpts, DefaultOpts) of
- use_default ->
- [];
- Sz ->
- [{sndbuf, Sz}]
- end
+ case get_sndbuf(SocketOpts, DefaultOpts) of
+ use_default ->
+ [];
+ Sz ->
+ [{sndbuf, Sz}]
+ end
] ++
case get_extra_sock_opts(SocketOpts, DefaultOpts) of
ESO when is_list(ESO) ->
@@ -2032,11 +2050,18 @@ socket_opts(Domain, {IpAddr, PortInfo}, SocketOpts, DefaultOpts) ->
"~n ~p", [BadESO]),
[]
end,
+ InetBackend =
+ case get_inet_backend(SocketOpts, DefaultOpts) of
+ use_default ->
+ [];
+ Backend when (Backend =:= inet) orelse (Backend =:= socket) ->
+ [{inet_backend, Backend}]
+ end,
%% <EPHEMERAL-FOR-FUTUR-USE>
%% Ephm = get_ephemeral(SocketOpts),
%% {Ephm, PortInfo, Opts}.
%% </EPHEMERAL-FOR-FUTUR-USE>
- {none, IpAddr, PortInfo, Opts}.
+ {none, IpAddr, PortInfo, InetBackend, Opts}.
%% ----------------------------------------------------------------
@@ -2093,6 +2118,9 @@ get_no_reuse_address(Opts, DefaultOpts) ->
get_extra_sock_opts(Opts, DefaultOpts) ->
get_socket_opt(extra_sock_opts, Opts, DefaultOpts, []).
+get_inet_backend(Opts, DefaultOpts) ->
+ get_socket_opt(inet_backend, Opts, DefaultOpts, use_default).
+
%% <EPHEMERAL-FOR-FUTUR-USE>
%% This is not realy a socket option, but rather socket 'meta'
%% information. Its still put together with the actual socket
@@ -2157,7 +2185,7 @@ get_info(#state{transports = Transports, reqs = Reqs}) ->
transport_kind => Kind,
port_info => PortInfo,
opts => Opts,
- socket_info => get_port_info(Socket),
+ socket_info => get_socket_info(Socket),
num_reqs => length(Refs)} ||
#transport{socket = Socket,
domain = Domain,
@@ -2178,35 +2206,8 @@ proc_mem(P) when is_pid(P) ->
%% proc_mem(_) ->
%% undefined.
-get_port_info(Id) ->
- PortInfo =
- case (catch erlang:port_info(Id)) of
- PI when is_list(PI) ->
- [{port_info, PI}];
- _ ->
- []
- end,
- PortStatus =
- case (catch prim_inet:getstatus(Id)) of
- {ok, PS} ->
- [{port_status, PS}];
- _ ->
- []
- end,
- PortAct =
- case (catch inet:getopts(Id, [active])) of
- {ok, PA} ->
- [{port_act, PA}];
- _ ->
- []
- end,
- PortStats =
- case (catch inet:getstat(Id)) of
- {ok, Stat} ->
- [{port_stats, Stat}];
- _ ->
- []
- end,
+get_socket_info(Id) when is_port(Id) ->
+ Info = inet:info(Id),
IfList =
case (catch inet:getif(Id)) of
{ok, IFs} ->
@@ -2221,13 +2222,29 @@ get_port_info(Id) ->
_ ->
[]
end,
- [{socket, Id}] ++
- IfList ++
- PortStats ++
- PortInfo ++
- PortStatus ++
- PortAct ++
- BufSz.
+ [{socket, Id}, {info, Info}] ++ IfList ++ BufSz;
+get_socket_info(Id) ->
+ Info = inet:info(Id),
+
+ %% Does not exist for 'socket'
+ IfList = [],
+ %% case (catch inet:getif(Id)) of
+ %% {ok, IFs} ->
+ %% [{interfaces, IFs}];
+ %% _ ->
+ %% []
+ %% end,
+
+ BufSz =
+ case (catch inet:getopts(Id, [recbuf, sndbuf])) of
+ {ok, Sz} ->
+ [{buffer_size, Sz}];
+ _ ->
+ []
+ end,
+
+ [{socket, Id}, {info, Info}] ++ IfList ++ BufSz.
+
%% ---------------------------------------------------------------
diff --git a/lib/snmp/src/manager/snmpm_net_if.erl b/lib/snmp/src/manager/snmpm_net_if.erl
index 1eb5ae216a..5ff8f91a6e 100644
--- a/lib/snmp/src/manager/snmpm_net_if.erl
+++ b/lib/snmp/src/manager/snmpm_net_if.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2021. 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.
@@ -81,7 +81,11 @@
-record(transport,
{socket,
- domain = snmpUDPDomain}).
+ port_info,
+ opts,
+ domain = snmpUDPDomain,
+ inet_backend = []
+ }).
-define(DEFAULT_FILTER_MODULE, snmpm_net_if_filter).
-define(DEFAULT_FILTER_OPTS, [{module, ?DEFAULT_FILTER_MODULE}]).
@@ -285,15 +289,29 @@ do_init(Server, NoteStore) ->
?vdebug("Log: ~w", [Log]),
{ok, DomainAddresses} = snmpm_config:system_info(transports),
- ?vdebug("DomainAddresses: ~w",[DomainAddresses]),
+ ?vdebug("DomainAddresses: ~w", [DomainAddresses]),
CommonSocketOpts = common_socket_opts(Opts),
- BindTo = get_opt(Opts, bind_to, false),
+ BindTo = get_opt(Opts, bind_to, false),
+ InetBackend = case get_opt(Opts, inet_backend, use_default) of
+ use_default -> [];
+ IB -> [{inet_backend, IB}]
+ end,
case
[begin
{IpPort, SocketOpts} =
socket_params(Domain, Address, BindTo, CommonSocketOpts),
- Socket = socket_open(IpPort, SocketOpts),
- #transport{socket = Socket, domain = Domain}
+ %% The 'inet-backend' option has to be first,
+ %% so we might as well add it last.
+ Socket = socket_open(IpPort, InetBackend ++ SocketOpts),
+ ?vtrace("socket created: "
+ "~n Ip Port: ~p"
+ "~n Socket Opts: ~p"
+ "~n Socket: ~p", [IpPort, SocketOpts, Socket]),
+ #transport{socket = Socket,
+ port_info = IpPort,
+ opts = SocketOpts,
+ inet_backend = InetBackend,
+ domain = Domain}
end || {Domain, Address} <- DomainAddresses]
of
[] ->
@@ -318,9 +336,9 @@ do_init(Server, NoteStore) ->
end.
socket_open(IpPort, SocketOpts) ->
- ?vtrace("socket_open -> entry with~n"
- " IpPort: ~p~n"
- " SocketOpts: ~p", [IpPort, SocketOpts]),
+ ?vtrace("socket_open -> entry with"
+ "~n IpPort: ~p"
+ "~n SocketOpts: ~p", [IpPort, SocketOpts]),
case gen_udp:open(IpPort, SocketOpts) of
{error, _} = Error ->
throw(Error);
@@ -354,6 +372,7 @@ socket_params(Domain, {IpAddr, IpPort} = Addr, BindTo, CommonSocketOpts) ->
_ ->
socket_params(SocketOpts, Addr, BindTo)
end.
+
%%
socket_params(SocketOpts, {IpAddr, IpPort}, BindTo) ->
case BindTo of
@@ -1253,9 +1272,9 @@ error_msg(F, A) ->
%%%-------------------------------------------------------------------
-% get_opt(Key, Opts) ->
-% ?vtrace("get option ~w", [Key]),
-% snmp_misc:get_option(Key, Opts).
+%% get_opt(Key, Opts) ->
+%% ?vtrace("get option ~w", [Key]),
+%% snmp_misc:get_option(Key, Opts).
get_opt(Opts, Key, Def) ->
?vtrace("get option ~w with default ~p", [Key, Def]),
@@ -1265,10 +1284,19 @@ get_opt(Opts, Key, Def) ->
%% -------------------------------------------------------------------
get_info(#state{transports = Transports}) ->
- ProcSize = proc_mem(self()),
- [{process_memory, ProcSize}
- | [{port_info, get_port_info(Socket)}
- || #transport{socket = Socket} <- Transports]].
+ ProcSize = proc_mem(self()),
+ Counters = get_counters(),
+ TransportInfo = [#{tdomain => Domain,
+ port_info => PI,
+ opts => Opts,
+ socket_info => get_socket_info(Socket)} ||
+ #transport{socket = Socket,
+ port_info = PI,
+ opts = Opts,
+ domain = Domain} <- Transports],
+ [{counters, Counters},
+ {process_memory, ProcSize},
+ {transport_info, TransportInfo}].
proc_mem(P) when is_pid(P) ->
case (catch erlang:process_info(P, memory)) of
@@ -1279,35 +1307,9 @@ proc_mem(P) when is_pid(P) ->
end.
-get_port_info(Id) ->
- PortInfo =
- case (catch erlang:port_info(Id)) of
- PI when is_list(PI) ->
- [{port_info, PI}];
- _ ->
- []
- end,
- PortStatus =
- case (catch prim_inet:getstatus(Id)) of
- {ok, PS} ->
- [{port_status, PS}];
- _ ->
- []
- end,
- PortAct =
- case (catch inet:getopts(Id, [active])) of
- {ok, PA} ->
- [{port_act, PA}];
- _ ->
- []
- end,
- PortStats =
- case (catch inet:getstat(Id)) of
- {ok, Stat} ->
- [{port_stats, Stat}];
- _ ->
- []
- end,
+get_socket_info(Id) when is_port(Id) ->
+ Info = inet:info(Id),
+
IfList =
case (catch inet:getif(Id)) of
{ok, IFs} ->
@@ -1315,6 +1317,29 @@ get_port_info(Id) ->
_ ->
[]
end,
+
+ BufSz =
+ case (catch inet:getopts(Id, [recbuf, sndbuf, buffer])) of
+ {ok, Sz} ->
+ [{buffer_size, Sz}];
+ _ ->
+ []
+ end,
+
+ [{socket, Id}, {info, Info}] ++ IfList ++ BufSz;
+
+get_socket_info(Id) ->
+ Info = inet:info(Id),
+
+ %% Does not exist for 'socket' ... yet
+ %% IfList =
+ %% case (catch inet:getif(Id)) of
+ %% {ok, IFs} ->
+ %% [{interfaces, IFs}];
+ %% _ ->
+ %% []
+ %% end,
+
BufSz =
case (catch inet:getopts(Id, [recbuf, sndbuf, buffer])) of
{ok, Sz} ->
@@ -1322,13 +1347,9 @@ get_port_info(Id) ->
_ ->
[]
end,
- [{socket, Id}] ++
- IfList ++
- PortStats ++
- PortInfo ++
- PortStatus ++
- PortAct ++
- BufSz.
+
+ [{socket, Id}, {info, Info}] ++ BufSz.
+
%%-----------------------------------------------------------------
@@ -1356,6 +1377,20 @@ counters() ->
inc(Name) -> inc(Name, 1).
inc(Name, N) -> snmpm_config:incr_stats_counter(Name, N).
+get_counters() ->
+ Counters = counters(),
+ get_counters(Counters, []).
+
+get_counters([], Acc) ->
+ lists:reverse(Acc);
+get_counters([Counter|Counters], Acc) ->
+ case snmpm_config:get_stats_counter(Counter) of
+ {ok, CounterVal} ->
+ get_counters(Counters, [{Counter, CounterVal}|Acc]);
+ _ ->
+ get_counters(Counters, Acc)
+ end.
+
%% ----------------------------------------------------------------
diff --git a/lib/snmp/src/misc/snmp_misc.erl b/lib/snmp/src/misc/snmp_misc.erl
index 39254503ac..63abb1ac90 100644
--- a/lib/snmp/src/misc/snmp_misc.erl
+++ b/lib/snmp/src/misc/snmp_misc.erl
@@ -455,7 +455,7 @@ bits_to_int([],_Kibbles,Res) -> Res;
bits_to_int([Kibble|Ks],Kibbles,Res) ->
case snmp_misc:assq(Kibble,Kibbles) of
{value,V} ->
- bits_to_int(Ks,Kibbles,Res + round(math:pow(2,V)));
+ bits_to_int(Ks, Kibbles, Res + round(math:pow(2,V)));
_ ->
error
end.
diff --git a/lib/snmp/test/snmp_agent_SUITE.erl b/lib/snmp/test/snmp_agent_SUITE.erl
index fc4de668ab..6564c48d70 100644
--- a/lib/snmp/test/snmp_agent_SUITE.erl
+++ b/lib/snmp/test/snmp_agent_SUITE.erl
@@ -26,12 +26,12 @@
init_per_group/2, end_per_group/2,
init_per_testcase/2, end_per_testcase/2,
- %% all_tcs - misc
+ %% major_tcs - misc
app_info/1,
info_test/1,
create_local_db_dir/1,
- %% all_tcs - test_v1
+ %% major_tcs - test_v1
simple/1,
db_notify_client/1,
v1_processing/1,
@@ -51,7 +51,7 @@
opaque/1,
change_target_addr_config/1,
- %% all_tcs - test_v1 - multiple_reqs
+ %% major_tcs - test_v1 - multiple_reqs
mul_get/1,
mul_get_err/1,
mul_next/1,
@@ -59,7 +59,7 @@
mul_set/1,
mul_set_err/1,
- %% all_tcs - test_v1 - reported_bugs
+ %% major_tcs - test_v1 - reported_bugs
otp_1128/1,
otp_1129/1,
otp_1131/1,
@@ -75,7 +75,7 @@
otp_3187/1,
otp_3725/1,
- %% all_tcs - test_v1 - standard_mibs
+ %% major_tcs - test_v1 - standard_mibs
snmp_standard_mib/1,
snmp_community_mib/1,
snmp_framework_mib/1,
@@ -83,7 +83,7 @@
snmp_notification_mib/1,
snmp_view_based_acm_mib/1,
- %% all_tcs - test_v2
+ %% major_tcs - test_v2
simple_2/1,
v2_processing/1,
big_2/1,
@@ -104,7 +104,7 @@
opaque_2/1,
v2_caps/1,
- %% all_tcs - test_v2 - multiple_reqs_2
+ %% major_tcs - test_v2 - multiple_reqs_2
mul_get_2/1,
mul_get_err_2/1,
mul_next_2/1,
@@ -112,10 +112,10 @@
mul_set_2/1,
mul_set_err_2/1,
- %% all_tcs - test_v2 - v2_inform
+ %% major_tcs - test_v2 - v2_inform
v2_inform_i/1,
- %% all_tcs - test_v2 - reported_bugs_2
+ %% major_tcs - test_v2 - reported_bugs_2
otp_1128_2/1,
otp_1129_2/1,
otp_1131_2/1,
@@ -130,7 +130,7 @@
otp_2979_2/1,
otp_3187_2/1,
- %% all_tcs - test_v2 - standard_mibs_2
+ %% major_tcs - test_v2 - standard_mibs_2
snmpv2_mib_2/1,
snmp_community_mib_2/1,
snmp_framework_mib_2/1,
@@ -138,10 +138,10 @@
snmp_notification_mib_2/1,
snmp_view_based_acm_mib_2/1,
- %% all_tcs - test_v1_v2
+ %% major_tcs - test_v1_v2
simple_bi/1,
- %% all_tcs - test_v3
+ %% major_tcs - test_v3
simple_3/1,
v3_processing/1,
big_3/1,
@@ -162,7 +162,7 @@
opaque_3/1,
v2_caps_3/1,
- %% all_tcs - test_v3 - multiple_reqs_3
+ %% major_tcs - test_v3 - multiple_reqs_3
mul_get_3/1,
mul_get_err_3/1,
mul_next_3/1,
@@ -170,10 +170,10 @@
mul_set_3/1,
mul_set_err_3/1,
- %% all_tcs - test_v3 - v3_inform
+ %% major_tcs - test_v3 - v3_inform
v3_inform_i/1,
- %% all_tcs - test_v3 - reported_bugs_3
+ %% major_tcs - test_v3 - reported_bugs_3
otp_1128_3/1,
otp_1129_3/1,
otp_1131_3/1,
@@ -189,7 +189,7 @@
otp_3187_3/1,
otp_3542/1,
- %% all_tcs - test_v3 - standard_mibs_3
+ %% major_tcs - test_v3 - standard_mibs_3
snmpv2_mib_3/1,
snmp_framework_mib_3/1,
snmp_mpd_mib_3/1,
@@ -198,17 +198,17 @@
snmp_view_based_acm_mib_3/1,
snmp_user_based_sm_mib_3/1,
- %% all_tcs - test_v3 - v3_security
+ %% major_tcs - test_v3 - v3_security
v3_crypto_basic/1,
v3_md5_auth/1,
v3_sha_auth/1,
v3_des_priv/1,
- %% all_tcs - test_multi_threaded, test_multi_threaded_ext
+ %% major_tcs - test_multi_threaded, test_multi_threaded_ext
multi_threaded/1,
mt_trap/1,
- %% all_tcs - mib_storage - mib_storage_ets
+ %% major_tcs - mib_storage - mib_storage_ets
mse_simple/1,
mse_v1_processing/1,
mse_big/1,
@@ -230,7 +230,7 @@
mse_me_of/1,
mse_mib_of/1,
- %% all_tcs - mib_storage - mib_storage_dets
+ %% major_tcs - mib_storage - mib_storage_dets
msd_simple/1,
msd_v1_processing/1,
msd_big/1,
@@ -252,7 +252,7 @@
msd_me_of/1,
msd_mib_of/1,
- %% all_tcs - mib_storage - mib_storage_mnesia
+ %% major_tcs - mib_storage - mib_storage_mnesia
msm_simple/1,
msm_v1_processing/1,
msm_big/1,
@@ -274,28 +274,28 @@
msm_me_of/1,
msm_mib_of/1,
- %% all_tcs - mib_storage - mse_size_check
+ %% major_tcs - mib_storage - mse_size_check
mse_size_check/1,
- %% all_tcs - mib_storage - msd_size_check
+ %% major_tcs - mib_storage - msd_size_check
msd_size_check/1,
- %% all_tcs - mib_storage - msm_size_check
+ %% major_tcs - mib_storage - msm_size_check
msm_size_check/1,
- %% all_tcs - mib_storage - varm_mib_storage_dets
+ %% major_tcs - mib_storage - varm_mib_storage_dets
msd_varm_mib_start/1,
- %% all_tcs - mib_storage - varm_mib_storage_mnesia
+ %% major_tcs - mib_storage - varm_mib_storage_mnesia
msm_varm_mib_start/1,
- %% all_tcs - tickets1 - otp4394
+ %% major_tcs - tickets1 - otp4394
otp_4394/1,
- %% all_tcs - tickets1 - otp7157
+ %% major_tcs - tickets1 - otp7157
otp_7157/1,
- %% all_tcs - tickets1 - otp16092
+ %% major_tcs - tickets1 - otp16092
otp_16092_simple_start_and_stop1/1,
otp_16092_simple_start_and_stop2/1,
otp_16092_simple_start_and_stop3/1,
@@ -526,14 +526,31 @@ suite() ->
[{ct_hooks, [ts_install_cth]}].
all() ->
- %% Reqs = [mnesia, distribution, {local_slave_nodes, 2}, {time, 360}],
- Conf1 = [{group, all_tcs}],
- Conf2 = [{group, tickets2}],
- Conf1 ++ Conf2.
+ %% This is a temporary messure to ensure that we can
+ %% test the socket backend without effecting *all*
+ %% applications on *all* machines.
+ %% This flag is set only for *one* host.
+ case ?TEST_INET_BACKENDS() of
+ true ->
+ [
+ {group, inet_backend_default},
+ {group, inet_backend_inet},
+ {group, inet_backend_socket}
+ ];
+ _ ->
+ [
+ {group, inet_backend_default}
+ ]
+ end.
groups() ->
[
- {all_tcs, [], all_cases()},
+ {inet_backend_default, [], inet_backend_default_cases()},
+ {inet_backend_inet, [], inet_backend_inet_cases()},
+ {inet_backend_socket, [], inet_backend_socket_cases()},
+
+ {all, [], all_cases()},
+ {major_tcs, [], major_cases()},
{mib_storage, [], mib_storage_cases()},
{mib_storage_ets, [], mib_storage_ets_cases()},
{mib_storage_dets, [], mib_storage_dets_cases()},
@@ -568,17 +585,32 @@ groups() ->
{reported_bugs_2, [], reported_bugs2_cases()},
{reported_bugs_3, [], reported_bugs3_cases()},
{tickets1, [], tickets1_cases()},
- {tickets2, [], tickets2_cases()},
{otp4394, [], [otp_4394]},
{otp7157, [], [otp_7157]},
{otp16092, [], otp16092_cases()},
+
+ %% These all belong to group 'tickets2'
+ {tickets2, [], tickets2_cases()},
{otp16649, [], otp16649_cases()},
{otp16649_ipv4, [], otp16649_gen_cases()},
{otp16649_ipv6, [], otp16649_gen_cases()}
].
-all_cases() ->
+inet_backend_default_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_inet_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_socket_cases() ->
+ [{all, [], all_cases()}].
+
+
+%% The agent and the nodes of the agent and manager
+%% is started at group init and then lives until
+%% group end!
+major_cases() ->
[
{group, misc},
{group, test_v1},
@@ -594,6 +626,53 @@ all_cases() ->
{group, mib_storage},
{group, tickets1}
].
+
+all_cases() ->
+ [
+ %% The agent and the nodes of the agent and manager
+ %% is started at group init and then lives until
+ %% group end!
+ {group, major_tcs},
+
+ %% The test cases in the 'tickets2' group
+ %% require control of start and stop of agents and inodes!
+ {group, tickets2}
+ ].
+
+
+tickets1_cases() ->
+ [
+ {group, otp4394},
+ {group, otp7157},
+ {group, otp16092}
+ ].
+
+
+tickets2_cases() ->
+ [
+ otp8395,
+ otp9884,
+ {group, otp16649}
+ ].
+
+otp16649_cases() ->
+ [
+ {group, otp16649_ipv4},
+ {group, otp16649_ipv6}
+ ].
+
+otp16649_gen_cases() ->
+ [
+ otp16649_1,
+ otp16649_2,
+ otp16649_3,
+ otp16649_4,
+ otp16649_5,
+ otp16649_6,
+ otp16649_7
+ ].
+
+
%%
%% -----
@@ -603,7 +682,12 @@ init_per_suite(Config0) when is_list(Config0) ->
?IPRINT("init_per_suite -> entry with"
"~n Config: ~p"
- "~n Nodes: ~p", [Config0, erlang:nodes()]),
+ "~n Nodes: ~p"
+ "~n explicit inet backend: ~p"
+ "~n test inet backends: ~p",
+ [Config0, erlang:nodes(),
+ ?EXPLICIT_INET_BACKEND(),
+ ?TEST_INET_BACKENDS()]),
case ?LIB:init_per_suite(Config0) of
{skip, _} = SKIP ->
@@ -660,125 +744,133 @@ end_per_suite(Config0) when is_list(Config0) ->
%% -----
%%
-init_per_group(all_tcs = GroupName, Config) ->
+init_per_group(GroupName, Config0) ->
+ ?IPRINT("init_per_group -> entry with"
+ "~n GroupName: ~p"
+ "~n Config: ~p"
+ "~n when"
+ "~n Nodes: ~p",
+ [GroupName, Config0, nodes()]),
+
+ Config1 = init_per_group2(GroupName, Config0),
+
+ ?IPRINT("init_per_group -> done when"
+ "~n GroupName: ~p"
+ "~n Config: ~p"
+ "~n Nodes: ~p",
+ [GroupName, Config1, nodes()]),
+
+ Config1.
+
+
+init_per_group2(inet_backend_default = _GroupName, Config) ->
+ snmp_test_lib:init_group_top_dir(default, [{socket_create_opts, []} | Config]);
+init_per_group2(inet_backend_inet = _GroupName, Config) ->
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ snmp_test_lib:init_group_top_dir(inet, [{socket_create_opts, [{inet_backend, inet}]} | Config])
+ end;
+init_per_group2(inet_backend_socket = _GroupName, Config) ->
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ snmp_test_lib:init_group_top_dir(socket, [{socket_create_opts, [{inet_backend, socket}]} | Config])
+ end;
+init_per_group2(major_tcs = GroupName, Config) ->
init_all(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(otp7157 = GroupName, Config) ->
+init_per_group2(otp7157 = GroupName, Config) ->
otp_7157_init(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(otp4394 = GroupName, Config) ->
+init_per_group2(otp4394 = GroupName, Config) ->
otp_4394_init(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(v2_inform = GroupName, Config) ->
+init_per_group2(v2_inform = GroupName, Config) ->
init_v2_inform(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(v3_inform = GroupName, Config) ->
+init_per_group2(v3_inform = GroupName, Config) ->
init_v3_inform(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(multiple_reqs = GroupName, Config) ->
+init_per_group2(multiple_reqs = GroupName, Config) ->
init_mul(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(multiple_reqs_2 = GroupName, Config) ->
+init_per_group2(multiple_reqs_2 = GroupName, Config) ->
init_mul(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(multiple_reqs_3 = GroupName, Config) ->
+init_per_group2(multiple_reqs_3 = GroupName, Config) ->
init_mul(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(test_multi_threaded = GroupName, Config) ->
+init_per_group2(test_multi_threaded = GroupName, Config) ->
init_mt(snmp_test_lib:init_group_top_dir(GroupName, Config), true);
-init_per_group(test_multi_threaded_ext = GroupName, Config) ->
+init_per_group2(test_multi_threaded_ext = GroupName, Config) ->
init_mt(snmp_test_lib:init_group_top_dir(GroupName, Config), extended);
-init_per_group(test_v3 = GroupName, Config) ->
+init_per_group2(test_v3 = GroupName, Config) ->
case snmp_test_lib:crypto_start() of
ok ->
init_v3(snmp_test_lib:init_group_top_dir(GroupName, Config));
_ ->
{skip, "Crypto did not start"}
end;
-init_per_group(test_v1_v2 = GroupName, Config) ->
+init_per_group2(test_v1_v2 = GroupName, Config) ->
init_v1_v2(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(test_v2 = GroupName, Config) ->
+init_per_group2(test_v2 = GroupName, Config) ->
init_v2(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(test_v1 = GroupName, Config) ->
+init_per_group2(test_v1 = GroupName, Config) ->
init_v1(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(test_v1_ipv6 = GroupName, Config) ->
+init_per_group2(test_v1_ipv6 = GroupName, Config) ->
init_per_group_ipv6(GroupName, Config, fun init_v1/1);
-init_per_group(test_v2_ipv6 = GroupName, Config) ->
+init_per_group2(test_v2_ipv6 = GroupName, Config) ->
init_per_group_ipv6(GroupName, Config, fun init_v2/1);
-init_per_group(test_v1_v2_ipv6 = GroupName, Config) ->
+init_per_group2(test_v1_v2_ipv6 = GroupName, Config) ->
init_per_group_ipv6(GroupName, Config, fun init_v1_v2/1);
-init_per_group(test_v3_ipv6 = GroupName, Config) ->
+init_per_group2(test_v3_ipv6 = GroupName, Config) ->
init_per_group_ipv6(GroupName, Config, fun init_v3/1);
-init_per_group(misc = GroupName, Config) ->
+init_per_group2(misc = GroupName, Config) ->
init_misc(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(mib_storage_varm_mnesia = GroupName, Config) ->
+init_per_group2(mib_storage_varm_mnesia = GroupName, Config) ->
init_varm_mib_storage_mnesia(snmp_test_lib:init_group_top_dir(GroupName,
Config));
-init_per_group(mib_storage_varm_dets = GroupName, Config) ->
- ?DBG("init_per_group(mib_storage_varm_dets) -> entry with"
- "~n Config: ~p", [Config]),
+init_per_group2(mib_storage_varm_dets = GroupName, Config) ->
init_varm_mib_storage_dets(
snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(mib_storage_size_check_mnesia = GroupName, Config) ->
+init_per_group2(mib_storage_size_check_mnesia = GroupName, Config) ->
case snmp_test_lib:crypto_start() of
ok ->
init_size_check_msm(snmp_test_lib:init_group_top_dir(GroupName, Config));
_ ->
{skip, "Crypto did not start"}
end;
-init_per_group(mib_storage_size_check_dets = GroupName, Config) ->
+init_per_group2(mib_storage_size_check_dets = GroupName, Config) ->
case snmp_test_lib:crypto_start() of
ok ->
init_size_check_msm(snmp_test_lib:init_group_top_dir(GroupName, Config));
_ ->
{skip, "Crypto did not start"}
end;
-init_per_group(mib_storage_size_check_ets = GroupName, Config) ->
- case snmp_test_lib:crypto_start() of
- ok ->
- init_size_check_msm(snmp_test_lib:init_group_top_dir(GroupName, Config));
- _ ->
- {skip, "Crypto did not start"}
- end;
-init_per_group(mib_storage_mnesia = GroupName, Config) ->
+init_per_group2(mib_storage_size_check_ets = GroupName, Config) ->
+ case snmp_test_lib:crypto_start() of
+ ok ->
+ init_size_check_msm(snmp_test_lib:init_group_top_dir(GroupName, Config));
+ _ ->
+ {skip, "Crypto did not start"}
+ end;
+init_per_group2(mib_storage_mnesia = GroupName, Config) ->
init_mib_storage_mnesia(snmp_test_lib:init_group_top_dir(GroupName,
Config));
-init_per_group(mib_storage_dets = GroupName, Config) ->
+init_per_group2(mib_storage_dets = GroupName, Config) ->
init_mib_storage_dets(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(mib_storage_ets = GroupName, Config) ->
+init_per_group2(mib_storage_ets = GroupName, Config) ->
init_mib_storage_ets(snmp_test_lib:init_group_top_dir(GroupName, Config));
-init_per_group(otp16649_ipv4 = GroupName, Config) ->
+init_per_group2(otp16649_ipv4 = GroupName, Config) ->
Config2 = [{ip, ?LOCALHOST(inet)},
{ipfamily, inet},
{tdomain, transportDomainUdpIpv4} |
lists:keydelete(ip, 1, Config)],
snmp_test_lib:init_group_top_dir(GroupName, Config2);
-init_per_group(otp16649_ipv6 = GroupName, Config) ->
+init_per_group2(otp16649_ipv6 = GroupName, Config) ->
init_per_group_ipv6(GroupName,
[{tdomain, transportDomainUdpIpv6} | Config],
fun(C) -> C end);
- %% SupportsIPv6 =
- %% case ?HAS_SUPPORT_IPV6() of
- %% true ->
- %% case os:type() of
- %% {unix, netbsd} ->
- %% {false, "Host *may* not *properly* support IPV6"};
- %% {unix, darwin} ->
- %% case os:version() of
- %% V > {9, 8, 0} ->
- %% true;
- %% _ ->
- %% {false, "Host *may* not *properly* support IPV6"};
- %% end;
- %% _ ->
- %% true
- %% end;
- %% false ->
- %% {false, "Host does not support IPv6"}
- %% end,
- %% case SupportsIPv6 of
- %% true ->
- %% Config2 = [{ip, ?LOCALHOST(inet6)},
- %% {ipfamily, inet6},
- %% {tdomain, transportDomainUdpIpv6} |
- %% lists:keydelete(ip, 1, Config)],
- %% snmp_test_lib:init_group_top_dir(GroupName, Config2);
- %% {false, SkipReason} ->
- %% {skip, SkipReason}
- %% end;
-init_per_group(GroupName, Config) ->
+init_per_group2(GroupName, Config) ->
snmp_test_lib:init_group_top_dir(GroupName, Config).
init_per_group_ipv6(GroupName, Config, Init) ->
@@ -820,61 +912,78 @@ init_per_group_ipv6(GroupName, Config, Init) ->
end
end.
-end_per_group(all_tcs, Config) ->
+
+end_per_group(GroupName, Config) ->
+ ?IPRINT("end_per_group -> entry with"
+ "~n GroupName: ~p"
+ "~n Config: ~p"
+ "~n when"
+ "~n Nodes: ~p",
+ [GroupName, Config, nodes()]),
+
+ Config1 = end_per_group2(GroupName, Config),
+
+ ?IPRINT("end_per_group -> done when"
+ "~n Nodes: ~p",
+ [nodes()]),
+
+ Config1.
+
+end_per_group2(major_tcs, Config) ->
finish_all(Config);
-end_per_group(otp7157, Config) ->
+end_per_group2(otp7157, Config) ->
otp_7157_finish(Config);
-end_per_group(otp4394, Config) ->
+end_per_group2(otp4394, Config) ->
otp_4394_finish(Config);
-end_per_group(v2_inform, Config) ->
+end_per_group2(v2_inform, Config) ->
finish_v2_inform(Config);
-end_per_group(v3_inform, Config) ->
+end_per_group2(v3_inform, Config) ->
finish_v3_inform(Config);
-end_per_group(multiple_reqs, Config) ->
+end_per_group2(multiple_reqs, Config) ->
finish_mul(Config);
-end_per_group(multiple_reqs_2, Config) ->
+end_per_group2(multiple_reqs_2, Config) ->
finish_mul(Config);
-end_per_group(multiple_reqs_3, Config) ->
+end_per_group2(multiple_reqs_3, Config) ->
finish_mul(Config);
-end_per_group(test_multi_threaded, Config) ->
+end_per_group2(test_multi_threaded, Config) ->
finish_mt(Config);
-end_per_group(test_multi_threaded_ext, Config) ->
+end_per_group2(test_multi_threaded_ext, Config) ->
finish_mt(Config);
-end_per_group(test_v3_ipv6, Config) ->
+end_per_group2(test_v3_ipv6, Config) ->
finish_v3(Config);
-end_per_group(test_v1_v2_ipv6, Config) ->
+end_per_group2(test_v1_v2_ipv6, Config) ->
finish_v1_v2(Config);
-end_per_group(test_v2_ipv6, Config) ->
+end_per_group2(test_v2_ipv6, Config) ->
finish_v2(Config);
-end_per_group(test_v1_ipv6, Config) ->
+end_per_group2(test_v1_ipv6, Config) ->
finish_v1(Config);
-end_per_group(test_v3, Config) ->
+end_per_group2(test_v3, Config) ->
finish_v3(Config);
-end_per_group(test_v1_v2, Config) ->
+end_per_group2(test_v1_v2, Config) ->
finish_v1_v2(Config);
-end_per_group(test_v2, Config) ->
+end_per_group2(test_v2, Config) ->
finish_v2(Config);
-end_per_group(test_v1, Config) ->
+end_per_group2(test_v1, Config) ->
finish_v1(Config);
-end_per_group(misc, Config) ->
+end_per_group2(misc, Config) ->
finish_misc(Config);
-end_per_group(mib_storage_varm_mnesia, Config) ->
+end_per_group2(mib_storage_varm_mnesia, Config) ->
finish_varm_mib_storage_mnesia(Config);
-end_per_group(mib_storage_varm_dets, Config) ->
+end_per_group2(mib_storage_varm_dets, Config) ->
finish_varm_mib_storage_dets(Config);
-end_per_group(mib_storage_size_check_mnesia, Config) ->
+end_per_group2(mib_storage_size_check_mnesia, Config) ->
finish_size_check_msm(Config);
-end_per_group(mib_storage_size_check_dets, Config) ->
+end_per_group2(mib_storage_size_check_dets, Config) ->
finish_size_check_msd(Config);
-end_per_group(mib_storage_size_check_ets, Config) ->
+end_per_group2(mib_storage_size_check_ets, Config) ->
finish_size_check_mse(Config);
-end_per_group(mib_storage_mnesia, Config) ->
+end_per_group2(mib_storage_mnesia, Config) ->
finish_mib_storage_mnesia(Config);
-end_per_group(mib_storage_dets, Config) ->
+end_per_group2(mib_storage_dets, Config) ->
finish_mib_storage_dets(Config);
-end_per_group(mib_storage_ets, Config) ->
+end_per_group2(mib_storage_ets, Config) ->
finish_mib_storage_ets(Config);
-end_per_group(_GroupName, Config) ->
+end_per_group2(_GroupName, Config) ->
Config.
@@ -7025,14 +7134,6 @@ otp_3725_test(MaNode) ->
%% Slogan: Target mib tag list check invalid
%%-----------------------------------------------------------------
-tickets1_cases() ->
- [
- {group, otp4394},
- {group, otp7157},
- {group, otp16092}
- ].
-
-
otp_4394_init(Config) when is_list(Config) ->
?DBG("otp_4394_init -> entry with"
"~n Config: ~p", [Config]),
@@ -7398,31 +7499,6 @@ otp16092_try_start_and_stop_agent(Node, Opts, Expected) ->
%% These cases are started in the new way
%%-----------------------------------------------------------------
-tickets2_cases() ->
- [
- otp8395,
- otp9884,
- {group, otp16649}
- ].
-
-otp16649_cases() ->
- [
- {group, otp16649_ipv4},
- {group, otp16649_ipv6}
- ].
-
-otp16649_gen_cases() ->
- [
- otp16649_1,
- otp16649_2,
- otp16649_3,
- otp16649_4,
- otp16649_5,
- otp16649_6,
- otp16649_7
- ].
-
-
otp8395({init, Config}) when is_list(Config) ->
?DBG("otp8395(init) -> entry with"
"~n Config: ~p", [Config]),
@@ -7430,9 +7506,9 @@ otp8395({init, Config}) when is_list(Config) ->
%% --
%% Start nodes
%%
-
- {ok, AgentNode} = start_node(agent),
- {ok, ManagerNode} = start_node(manager),
+ FName = ?FUNCTION_NAME,
+ {ok, AgentNode} = start_node(mk_node_name(FName, agent)),
+ {ok, ManagerNode} = start_node(mk_node_name(FName, manager)),
%% --
%% Mnesia init
@@ -7580,7 +7656,7 @@ otp8395(Config) when is_list(Config) ->
otp9884({init, Config}) when is_list(Config) ->
?DBG("otp9884(init) -> entry with"
"~n Config: ~p", [Config]),
- init_v1_agent([{ipfamily, inet} | Config]);
+ init_v1_agent([{fname, otp9884}, {ipfamily, inet} | Config]);
otp9884({fin, Config}) when is_list(Config) ->
?DBG("otp9884(fin) -> entry with"
@@ -8024,8 +8100,12 @@ otp16649_init(N, AgentPreTransports, Config) ->
"~n Config2: ~p", [Config3]),
[{agent_raw_transports, AgentPreTransports} | Config3].
+mk_node_name(FName, Post) when is_atom(FName) andalso is_atom(Post) ->
+ list_to_atom(?F("~w_~w", [FName, Post])).
+
otp16649_mk_name(N, Post) when is_integer(N) andalso is_atom(Post) ->
- list_to_atom(?F("otp16649_~w_~w", [N, Post])).
+ mk_node_name(otp16649, list_to_atom(?F("~w_~w", [N, Post]))).
+%% list_to_atom(?F("otp16649_~w_~w", [N, Post])).
otp16649_fin(N, Config) when is_integer(N) ->
@@ -8241,13 +8321,15 @@ start_agent(Config) ->
start_agent(Config, Opts) ->
%% Directories
- ConfDir = ?config(agent_conf_dir, Config),
- DbDir = ?config(agent_db_dir, Config),
- LogDir = ?config(agent_log_dir, Config),
+ ConfDir = ?config(agent_conf_dir, Config),
+ DbDir = ?config(agent_db_dir, Config),
+ LogDir = ?config(agent_log_dir, Config),
+ InetBackend = ?config(socket_create_opts, Config),
Vsns = [v1],
- AgentConfig = process_agent_options(ConfDir, DbDir, LogDir, Vsns, Opts),
+ AgentConfig = process_agent_options(ConfDir, DbDir, LogDir, Vsns,
+ InetBackend, Opts),
%% Nodes
AgentNode = ?config(agent_node, Config),
@@ -8259,7 +8341,15 @@ start_agent(Config, Opts) ->
[{agent_sup, AgentTopSup} | Config].
-process_agent_options(ConfDir, DbDir, LogDir, Vsns, Opts) ->
+process_agent_options(ConfDir, DbDir, LogDir, Vsns, InetBackend, Opts) ->
+ ?IPRINT("process_agent_options ->"
+ "~n ConfDir: ~p"
+ "~n DbDir: ~p"
+ "~n LogDir: ~p"
+ "~n Vsns: ~p"
+ "~n InetBackend: ~p"
+ "~n Opts: ~p",
+ [ConfDir, DbDir, LogDir, Vsns, InetBackend, Opts]),
Defaults =
[{agent_type, master},
{agent_verbosity, trace},
@@ -8283,9 +8373,9 @@ process_agent_options(ConfDir, DbDir, LogDir, Vsns, Opts) ->
{note_store, [{timeout,30000}, {verbosity,log}]},
{net_if, [{module, snmpa_net_if},
{verbosity, trace},
- {options, [{bind_to, false},
- {no_reuse, false},
- {req_limit, infinity}]}]},
+ {options, InetBackend ++ [{bind_to, false},
+ {no_reuse, false},
+ {req_limit, infinity}]}]},
{audit_trail_log, [{type, read_write},
{dir, LogDir},
{size, {10240,20}},
@@ -8699,11 +8789,12 @@ init_v1_agent(Config) ->
%% Start nodes
%%
- {ok, AgentNode} = start_node(agent),
+ FName = ?config(fname, Config),
+ {ok, AgentNode} = start_node(mk_node_name(FName, agent)),
%% We don't use a manager in this test but the (common) config
%% function takes an argument that is derived from this
- {ok, ManagerNode} = start_node(manager),
+ {ok, ManagerNode} = start_node(mk_node_name(FName, manager)),
%% --
%% Mnesia init
@@ -8758,7 +8849,11 @@ init_v1_agent(Config) ->
{agent_node, AgentNode},
{agent_host, AgentHost},
{agent_ip, AgentIP},
- {agent_backup_dirs, AgentBkpDirs}|Config]),
+ {agent_backup_dirs, AgentBkpDirs},
+
+ %% We need this here since without it
+ %% fin_v1_agent will not be able to stop!
+ {manager_node, ManagerNode}|Config]),
%% --
%% Create watchdog
@@ -8786,7 +8881,7 @@ fin_v1_agent(Config) ->
%% -
%% Stop the agent node
- %%
+ %%
stop_node(AgentNode),
diff --git a/lib/snmp/test/snmp_agent_test_lib.erl b/lib/snmp/test/snmp_agent_test_lib.erl
index c99c0359f2..236015cfe0 100644
--- a/lib/snmp/test/snmp_agent_test_lib.erl
+++ b/lib/snmp/test/snmp_agent_test_lib.erl
@@ -123,7 +123,8 @@
init_all(Config) when is_list(Config) ->
?IPRINT("init_all -> entry with"
- "~n Config: ~p", [Config]),
+ "~n Config: ~p"
+ "~n Nodes: ~p", [Config, nodes()]),
%% --
%% Start nodes
@@ -140,12 +141,12 @@ init_all(Config) when is_list(Config) ->
%% Create necessary files ( and dirs )
%%
- ?IPRINT("init_all -> create suite top dir"),
- SuiteTopDir = ?config(snmp_suite_top_dir, Config),
- ?DBG("init_all -> SuiteTopDir ~p", [SuiteTopDir]),
+ ?IPRINT("init_all -> lookup group top dir"),
+ GroupTopDir = ?config(snmp_group_top_dir, Config),
+ ?DBG("init_all -> GroupTopDir ~p", [GroupTopDir]),
?IPRINT("init_all -> create agent dir"),
- AgentDir = join(SuiteTopDir, "agent/"),
+ AgentDir = join(GroupTopDir, "agent/"),
?line ok = file:make_dir(AgentDir),
?DBG("init_all -> AgentDir ~p", [AgentDir]),
@@ -165,12 +166,12 @@ init_all(Config) when is_list(Config) ->
?DBG("init_all -> AgentConfDir ~p", [AgentConfDir]),
?IPRINT("init_all -> create manager dir"),
- MgrDir = join(SuiteTopDir, "mgr/"),
+ MgrDir = join(GroupTopDir, "mgr/"),
?line ok = file:make_dir(MgrDir),
?DBG("init_all -> MgrDir ~p", [MgrDir]),
?IPRINT("init_all -> create sub-agent dir"),
- SaDir = join(SuiteTopDir, "sa/"),
+ SaDir = join(GroupTopDir, "sa/"),
?line ok = file:make_dir(SaDir),
?DBG("init_all -> SaDir ~p", [SaDir]),
@@ -213,7 +214,8 @@ init_all(Config) when is_list(Config) ->
?IPRINT("init_all -> get localhost"),
Ip = ?LOCALHOST(),
- ?IPRINT("init_all -> done"),
+ ?IPRINT("init_all -> done when"
+ "~n Nodes: ~p", [nodes()]),
[{snmp_sa, SaNode},
{snmp_mgr, MgrNode},
{snmp_master, node()},
@@ -232,7 +234,8 @@ init_all(Config) when is_list(Config) ->
finish_all(Config) when is_list(Config) ->
?IPRINT("finish_all -> entry with"
- "~n Config: ~p", [Config]),
+ "~n Config: ~p"
+ "~n Nodes: ~p", [Config, nodes()]),
SaNode = ?config(snmp_sa, Config),
MgrNode = ?config(snmp_mgr, Config),
@@ -246,7 +249,11 @@ finish_all(Config) when is_list(Config) ->
?IPRINT("finish_all -> stop mnesia application"),
application:stop(mnesia),
- ?IPRINT("finish_all -> stop"),
+ ?IPRINT("finish_all -> unload mnesia application"),
+ application:unload(mnesia),
+
+ ?IPRINT("finish_all -> stop when"
+ "~n Nodes: ~p", [nodes()]),
ok.
@@ -266,9 +273,18 @@ init_case(Config) when is_list(Config) ->
SaHost = ?HOSTNAME(SaNode),
MgrHost = ?HOSTNAME(MgrNode),
MasterHost = ?HOSTNAME(MasterNode),
- {ok, MasterIP} = snmp_misc:ip(MasterHost, IpFamily),
- {ok, MIP} = snmp_misc:ip(MgrHost, IpFamily),
- {ok, SIP} = snmp_misc:ip(SaHost, IpFamily),
+ {ok, MasterIP} = ?LIB:which_host_ip(MasterHost, IpFamily),
+ {ok, MIP} = ?LIB:which_host_ip(MgrHost, IpFamily),
+ {ok, SIP} = ?LIB:which_host_ip(SaHost, IpFamily),
+
+ ?IPRINT("init_case -> "
+ "~n SaHost: ~p"
+ "~n MgrHost: ~p"
+ "~n MasterHost: ~p"
+ "~n MasterIP: ~p"
+ "~n MIP: ~p"
+ "~n SIP: ~p",
+ [SaHost, MgrHost, MasterHost, MasterIP, MIP, SIP]),
put(mgr_node, MgrNode),
put(sa_node, SaNode),
@@ -296,6 +312,7 @@ init_case(Config) when is_list(Config) ->
"~n SaNode: ~p"
"~n MgrNode: ~p"
"~n MibDir: ~p", [MasterNode, SaNode, MgrNode, MibDir]),
+
{SaNode, MgrNode, MibDir}.
@@ -646,10 +663,11 @@ start_agent(Config, Vsns, Opts) ->
"~n Vsns: ~p"
"~n Opts: ~p", [node(), Config, Vsns, Opts]),
- ?line AgentLogDir = ?config(agent_log_dir, Config),
- ?line AgentConfDir = ?config(agent_conf_dir, Config),
- ?line AgentDbDir = ?config(agent_db_dir, Config),
- ?line SaNode = ?config(snmp_sa, Config),
+ ?line AgentLogDir = ?config(agent_log_dir, Config),
+ ?line AgentConfDir = ?config(agent_conf_dir, Config),
+ ?line AgentDbDir = ?config(agent_db_dir, Config),
+ ?line SaNode = ?config(snmp_sa, Config),
+ ?line InetBackend = ?config(socket_create_opts, Config),
Env = app_agent_env_init(
[{versions, Vsns},
@@ -668,7 +686,8 @@ start_agent(Config, Vsns, Opts) ->
{mib_server, [{verbosity, log}]},
{symbolic_store, [{verbosity, log}]},
{note_store, [{verbosity, log}]},
- {net_if, [{verbosity, trace}]}],
+ {net_if, [{verbosity, trace},
+ {options, InetBackend}]}],
Opts),
diff --git a/lib/snmp/test/snmp_manager_SUITE.erl b/lib/snmp/test/snmp_manager_SUITE.erl
index 1f0dd506b5..15c02942ba 100644
--- a/lib/snmp/test/snmp_manager_SUITE.erl
+++ b/lib/snmp/test/snmp_manager_SUITE.erl
@@ -143,8 +143,61 @@
suite() ->
[{ct_hooks, [ts_install_cth]}].
-
all() ->
+ %% This is a temporary messure to ensure that we can
+ %% test the socket backend without effecting *all*
+ %% applications on *all* machines.
+ %% This flag is set only for *one* host.
+ case ?TEST_INET_BACKENDS() of
+ true ->
+ [
+ {group, inet_backend_default},
+ {group, inet_backend_inet},
+ {group, inet_backend_socket}
+ ];
+ _ ->
+ [
+ {group, inet_backend_default}
+ ]
+ end.
+
+groups() ->
+ [
+ {inet_backend_default, [], inet_backend_default_cases()},
+ {inet_backend_inet, [], inet_backend_inet_cases()},
+ {inet_backend_socket, [], inet_backend_socket_cases()},
+
+ {all, [], all_cases()},
+ {start_and_stop_tests, [], start_and_stop_tests_cases()},
+ {misc_tests, [], misc_tests_cases()},
+ {user_tests, [], user_tests_cases()},
+ {agent_tests, [], agent_tests_cases()},
+ {request_tests, [], request_tests_cases()},
+ {request_tests_mt, [], request_tests_mt_cases()},
+ {get_tests, [], get_tests_cases()},
+ {get_next_tests, [], get_next_tests_cases()},
+ {set_tests, [], set_tests_cases()},
+ {bulk_tests, [], bulk_tests_cases()},
+ {event_tests, [], event_tests_cases()},
+ {event_tests_mt, [], event_tests_mt_cases()},
+ {tickets, [], tickets_cases()},
+ {otp8015, [], otp8015_cases()},
+ {otp8395, [], otp8395_cases()},
+ {ipv6, [], ipv6_tests()},
+ {ipv6_mt, [], ipv6_tests()}
+
+ ].
+
+inet_backend_default_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_inet_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_socket_cases() ->
+ [{all, [], all_cases()}].
+
+all_cases() ->
[
{group, start_and_stop_tests},
{group, misc_tests},
@@ -160,130 +213,73 @@ all() ->
{group, ipv6_mt}
].
-groups() ->
+start_and_stop_tests_cases() ->
+ [
+ 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_cases() ->
+ [
+ info,
+ usm_priv_aes
+ ].
+
+user_tests_cases() ->
+ [
+ register_user1
+ ].
+
+agent_tests_cases() ->
+ [
+ register_agent_old,
+ register_agent2,
+ register_agent3
+ ].
+
+request_tests_cases() ->
[
- {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,
- usm_priv_aes
- ]
- },
- {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}
- ]
- },
- {request_tests_mt, [],
- [
- {group, get_tests},
- {group, get_next_tests},
- {group, set_tests},
- {group, bulk_tests}
- ]
- },
- {get_tests, [],
- [
- simple_sync_get3,
- simple_async_get3
- ]
- },
- {get_next_tests, [],
- [
- simple_sync_get_next3,
- simple_async_get_next3_cbp_def,
- simple_async_get_next3_cbp_temp,
- simple_async_get_next3_cbp_perm
- ]
- },
- {set_tests, [],
- [
- simple_sync_set3,
- simple_async_set3_cbp_def,
- simple_async_set3_cbp_temp,
- simple_async_set3_cbp_perm
- ]
- },
- {bulk_tests, [],
- [
- simple_sync_get_bulk3,
- simple_async_get_bulk3_cbp_def,
- simple_async_get_bulk3_cbp_temp,
- simple_async_get_bulk3_cbp_perm
- ]
- },
- {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()}
+ {group, get_tests},
+ {group, get_next_tests},
+ {group, set_tests},
+ {group, bulk_tests}
+ ].
+request_tests_mt_cases() -> request_tests_cases().
+
+get_tests_cases() ->
+ [
+ simple_sync_get3,
+ simple_async_get3
+ ].
+
+get_next_tests_cases() ->
+ [
+ simple_sync_get_next3,
+ simple_async_get_next3_cbp_def,
+ simple_async_get_next3_cbp_temp,
+ simple_async_get_next3_cbp_perm
+ ].
+
+set_tests_cases() ->
+ [
+ simple_sync_set3,
+ simple_async_set3_cbp_def,
+ simple_async_set3_cbp_temp,
+ simple_async_set3_cbp_perm
+ ].
+
+bulk_tests_cases() ->
+ [
+ simple_sync_get_bulk3,
+ simple_async_get_bulk3_cbp_def,
+ simple_async_get_bulk3_cbp_temp,
+ simple_async_get_bulk3_cbp_perm
].
ipv6_tests() ->
@@ -301,7 +297,37 @@ ipv6_tests() ->
inform_swarm_cbp_perm
].
+event_tests_cases() ->
+ [
+ trap1,
+ trap2,
+ inform1,
+ inform2,
+ inform3,
+ inform4,
+ inform_swarm_cbp_def,
+ inform_swarm_cbp_temp,
+ inform_swarm_cbp_perm,
+ report
+ ].
+
+event_tests_mt_cases() -> event_tests_cases().
+
+tickets_cases() ->
+ [
+ {group, otp8015},
+ {group, otp8395}
+ ].
+
+otp8015_cases() ->
+ [
+ otp8015_1
+ ].
+otp8395_cases() ->
+ [
+ otp8395_1
+ ].
%%
%% -----
@@ -310,7 +336,13 @@ ipv6_tests() ->
init_per_suite(Config0) when is_list(Config0) ->
?IPRINT("init_per_suite -> entry with"
- "~n Config0: ~p", [Config0]),
+ "~n Config0: ~p"
+ "~n Nodes: ~p"
+ "~n explicit inet backend: ~p"
+ "~n test inet backends: ~p",
+ [Config0, erlang:nodes(),
+ ?EXPLICIT_INET_BACKEND(),
+ ?TEST_INET_BACKENDS()]),
case ?LIB:init_per_suite(Config0) of
{skip, _} = SKIP ->
@@ -363,20 +395,61 @@ end_per_suite(Config0) when is_list(Config0) ->
%% -----
%%
-init_per_group(request_tests_mt = GroupName, Config) ->
+init_per_group(GroupName, Config0) ->
+ ?IPRINT("init_per_group -> entry with"
+ "~n GroupName: ~p"
+ "~n Config: ~p"
+ "~n when"
+ "~n Nodes: ~p",
+ [GroupName, Config0, nodes()]),
+
+ Config1 = init_per_group2(GroupName, Config0),
+
+ ?IPRINT("init_per_group -> done when"
+ "~n GroupName: ~p"
+ "~n Config: ~p"
+ "~n Nodes: ~p",
+ [GroupName, Config1, nodes()]),
+
+ Config1.
+
+
+init_per_group2(inet_backend_default = _GroupName, Config) ->
+ ?LIB:init_group_top_dir(default, [{socket_create_opts, []} | Config]);
+init_per_group2(inet_backend_inet = _GroupName, Config) ->
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ ?LIB:init_group_top_dir(inet, [{socket_create_opts, [{inet_backend, inet}]} | Config])
+ end;
+init_per_group2(inet_backend_socket = _GroupName, Config) ->
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ ?LIB:init_group_top_dir(socket, [{socket_create_opts, [{inet_backend, socket}]} | Config])
+ end;
+init_per_group2(all = GroupName, Config) ->
+ ?LIB:init_group_top_dir(GroupName, Config);
+init_per_group2(request_tests_mt = GroupName, Config) ->
?LIB:init_group_top_dir(
GroupName,
[{manager_net_if_module, snmpm_net_if_mt} | Config]);
-init_per_group(event_tests_mt = GroupName, Config) ->
+init_per_group2(event_tests_mt = GroupName, Config) ->
?LIB:init_group_top_dir(
GroupName,
[{manager_net_if_module, snmpm_net_if_mt} | Config]);
-init_per_group(ipv6_mt = GroupName, Config) ->
+init_per_group2(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_group2(ipv6 = GroupName, Config) ->
init_per_group_ipv6(GroupName, Config);
-init_per_group(GroupName, Config) ->
+init_per_group2(GroupName, Config) ->
?LIB:init_group_top_dir(GroupName, Config).
@@ -728,15 +801,16 @@ simple_start_and_stop1(Config) when is_list(Config) ->
do_simple_start_and_stop1(Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
- Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
- {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("try starting manager"),
ok = snmpm:start_link(Opts),
@@ -768,15 +842,16 @@ do_simple_start_and_stop2([ManagerNode], Config) ->
"~n ~p"
"~n", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
- Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
- {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("try load snmp application"),
@@ -812,13 +887,15 @@ do_simple_start_and_stop3(Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
+ SCO = ?config(socket_create_opts, Config),
ConfDir = ?config(manager_conf_dir, Config),
DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}, {options, [{extra_sock_opts, ['this-should-not-work']}]}]},
+ {net_if, [{verbosity, trace},
+ {options, SCO ++ [{extra_sock_opts, ['this-should-not-work']}]}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -850,15 +927,16 @@ do_simple_start_and_monitor_crash1(Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
- Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
- {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("try starting manager"),
ok = snmpm:start(Opts),
@@ -923,16 +1001,17 @@ do_simple_start_and_monitor_crash2(Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{restart_type, permanent},
- {server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
- {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("try starting manager"),
ok = snmpm:start(Opts),
@@ -1018,15 +1097,16 @@ do_notify_started01(Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
- Opts = [{server, [{verbosity, log}]},
- {net_if, [{verbosity, silence}]},
+ Opts = [{server, [{verbosity, log}]},
+ {net_if, [{verbosity, silence}, {options, SCO}]},
{note_store, [{verbosity, silence}]},
- {config, [{verbosity, log}, {dir, ConfDir}, {db_dir, DbDir}]}],
+ {config, [{verbosity, log}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("request start notification (1)"),
Pid1 = snmpm:notify_started(10000),
@@ -1128,13 +1208,14 @@ do_notify_started02(Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, log}]},
- {net_if, [{verbosity, silence}]},
+ {net_if, [{verbosity, silence}, {options, SCO}]},
{note_store, [{verbosity, silence}]},
{config, [{verbosity, debug}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -1328,17 +1409,18 @@ ns02_ctrl_loop(Opts, N) ->
info(suite) -> [];
info(Config) when is_list(Config) ->
Pre = fun() ->
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
- Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
- {config, [{verbosity, trace},
- {dir, ConfDir},
- {db_dir, DbDir}]}],
+ {config, [{verbosity, trace},
+ {dir, ConfDir},
+ {db_dir, DbDir}]}],
?IPRINT("try starting manager"),
ok = snmpm:start(Opts),
?SLEEP(1000),
@@ -1370,32 +1452,54 @@ do_info(Config) ->
verify_info(Info) when is_list(Info) ->
Keys = [{server, [process_memory, db_memory]},
{config, [process_memory, db_memory]},
- {net_if, [process_memory, port_info]},
+ {net_if, [process_memory, transport_info]},
{note_store, [process_memory, db_memory]},
stats_counters],
- verify_info(Keys, Info);
+ try verify_info(Keys, Info)
+ catch
+ C:E:S ->
+ ?IPRINT("Verification Failed: "
+ "~n Class: ~p"
+ "~n Error: ~p"
+ "~n Stack: ~p", [C, E, S]),
+ {error, {verification_failed, C, E, S}}
+ end;
verify_info(BadInfo) ->
{error, {bad_info, BadInfo}}.
verify_info([], _) ->
+ ?IPRINT("verified"),
ok;
verify_info([Key|Keys], Info) when is_atom(Key) ->
+ ?IPRINT("try verify '~p'", [Key]),
case lists:keymember(Key, 1, Info) of
true ->
verify_info(Keys, Info);
false ->
+ ?IPRINT("Verification of '~p' failed", [Key]),
{error, {missing_info, {Key, Info}}}
end;
verify_info([{Key, SubKeys}|Keys], Info) ->
+ ?IPRINT("try verify '~p' with sub-keys: "
+ "~n ~p", [Key, SubKeys]),
case lists:keysearch(Key, 1, Info) of
{value, {Key, SubInfo}} ->
- case verify_info(SubKeys, SubInfo) of
+ SubInfo2 =
+ if is_list(SubInfo) -> SubInfo;
+ is_map(SubInfo) -> maps:to_list(SubInfo)
+ end,
+ ?IPRINT("try verify sub-key(s) with sub-info: "
+ "~n (Sub-) Keys: ~p"
+ "~n (Sub-) Info: ~p", [SubKeys, SubInfo2]),
+ case verify_info(SubKeys, SubInfo2) of
ok ->
verify_info(Keys, Info);
{error, {missing_info, {SubKey, _}}} ->
+ ?IPRINT("Verification of sub-key '~p' failed", [SubKey]),
{error, {missing_subinfo, {Key, SubKey, Info}}}
end;
false ->
+ ?IPRINT("Verification of key '~p' failed", [Key]),
{error, {missing_info, {Key, Info}}}
end.
@@ -1408,13 +1512,14 @@ verify_info([{Key, SubKeys}|Keys], Info) ->
usm_priv_aes(suite) -> [];
usm_priv_aes(Config) when is_list(Config) ->
Pre = fun() ->
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace},
{dir, ConfDir},
@@ -1505,11 +1610,11 @@ do_usm_priv_aes(Config) ->
?IPRINT("encode scoped pdu"),
Message =
{ message,
- _Version = 'version-3',
+ 'version-3',
{ v3_hdr,
- _MsgID = 1,
+ 1, % MsgID1
MsgMaxSize,
- _MsgFlags = snmp_misc:mk_msg_flags(PduType, 2),
+ snmp_misc:mk_msg_flags(PduType, 2), % MsgFlags1
_MsgSecurityModel = 3, % SEC_USM
MsgSecurityParameters,
0
@@ -1587,13 +1692,14 @@ do_register_user1([ManagerNode], Config) ->
"~n ~p"
"~n", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -1687,13 +1793,14 @@ do_register_agent_old([ManagerNode], Config) ->
"~n ~p"
"~n", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -1820,14 +1927,15 @@ do_register_agent2([ManagerNode], Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
LocalHost = snmp_test_lib:localhost(),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -1965,15 +2073,16 @@ do_register_agent3([ManagerNode], Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
LocalHost = snmp_test_lib:localhost(),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
@@ -4490,13 +4599,14 @@ otp8015_1(doc) -> ["OTP-8015:1 - testing the new api-function."];
otp8015_1(suite) -> [];
otp8015_1(Config) when is_list(Config) ->
Pre = fun() ->
- ConfDir = ?config(manager_conf_dir, Config),
- DbDir = ?config(manager_db_dir, Config),
+ SCO = ?config(socket_create_opts, Config),
+ ConfDir = ?config(manager_conf_dir, Config),
+ DbDir = ?config(manager_db_dir, Config),
write_manager_conf(ConfDir),
Opts = [{server, [{verbosity, trace}]},
- {net_if, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}, {options, SCO}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace},
{dir, ConfDir},
@@ -5349,10 +5459,12 @@ start_manager(Node, Vsns, Conf0, _Opts) ->
"~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),
+ SCO = ?config(socket_create_opts, Conf0),
+
+ AtlDir = ?config(manager_log_dir, Conf0),
+ ConfDir = ?config(manager_conf_dir, 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),
@@ -5367,27 +5479,29 @@ start_manager(Node, Vsns, Conf0, _Opts) ->
NetIfConf =
case get_opt(manager_net_if_module, Conf0, no_module) of
no_module ->
- [{verbosity, NetIfVerbosity}];
+ [{verbosity, NetIfVerbosity},
+ {options, SCO}];
NetIfModule ->
[{module, NetIfModule},
- {verbosity, NetIfVerbosity}]
+ {verbosity, NetIfVerbosity},
+ {options, SCO}]
end,
- Env = [{versions, Vsns},
- {inform_request_behaviour, IRB},
- {audit_trail_log, [{type, read_write},
- {dir, AtlDir},
- {size, {10240, 10}},
- {repair, true},
- {seqno, AtlSeqNo}]},
- {config, [{dir, ConfDir},
- {db_dir, DbDir},
- {verbosity, ConfigVerbosity}]},
- {note_store, [{verbosity, NoteStoreVerbosity}]},
- {server, [{verbosity, ServerVerbosity},
- {cbproxy, CBP},
- {netif_sup, NIS}]},
- {net_if, NetIfConf}],
+ Env = [{versions, Vsns},
+ {inform_request_behaviour, IRB},
+ {audit_trail_log, [{type, read_write},
+ {dir, AtlDir},
+ {size, {10240, 10}},
+ {repair, true},
+ {seqno, AtlSeqNo}]},
+ {config, [{dir, ConfDir},
+ {db_dir, DbDir},
+ {verbosity, ConfigVerbosity}]},
+ {note_store, [{verbosity, NoteStoreVerbosity}]},
+ {server, [{verbosity, ServerVerbosity},
+ {cbproxy, CBP},
+ {netif_sup, NIS}]},
+ {net_if, NetIfConf}],
?line ok = set_mgr_env(Node, Env),
?line ok = try start_snmp(Node) of
diff --git a/lib/snmp/test/snmp_test_global_sys_monitor.erl b/lib/snmp/test/snmp_test_global_sys_monitor.erl
index c3f2e24096..c77b118d18 100644
--- a/lib/snmp/test/snmp_test_global_sys_monitor.erl
+++ b/lib/snmp/test/snmp_test_global_sys_monitor.erl
@@ -240,13 +240,13 @@ call(Req, Timeout1, Timeout2) ->
NamePid when is_pid(NamePid) ->
receive
{?MODULE, Ref, Rep} ->
- Rep
+ exit(Rep)
after Timeout2 ->
- {error, timeout}
+ exit({error, timeout})
end
catch
C:E:_ ->
- {error, {catched, C, E}}
+ exit({error, {catched, C, E}})
end
end,
{Pid, Mon} = spawn_monitor(F),
diff --git a/lib/snmp/test/snmp_test_lib.erl b/lib/snmp/test/snmp_test_lib.erl
index c2c720fdb4..bbf53f8f3e 100644
--- a/lib/snmp/test/snmp_test_lib.erl
+++ b/lib/snmp/test/snmp_test_lib.erl
@@ -51,6 +51,8 @@
-export([f/2, formated_timestamp/0]).
-export([p/2, print1/2, print2/2, print/5]).
-export([eprint/2, wprint/2, nprint/2, iprint/2]).
+-export([explicit_inet_backend/0, test_inet_backends/0]).
+-export([which_host_ip/2]).
-define(SKIP(R), skip(R, ?MODULE, ?LINE)).
@@ -258,6 +260,45 @@ tc_which_name() ->
%% Misc functions
%%
+explicit_inet_backend() ->
+ %% This is intentional!
+ %% This is a kernel flag, which if set disables
+ %% our own special handling of the inet_backend
+ %% in our test suites.
+ case application:get_all_env(kernel) of
+ Env when is_list(Env) ->
+ case lists:keysearch(inet_backend, 1, Env) of
+ {value, {inet_backend, _}} ->
+ true;
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end.
+
+test_inet_backends() ->
+ case init:get_argument(snmp) of
+ {ok, SnmpArgs} when is_list(SnmpArgs) ->
+ test_inet_backends(SnmpArgs, atom_to_list(?FUNCTION_NAME));
+ error ->
+ false
+ end.
+
+test_inet_backends([], _) ->
+ false;
+test_inet_backends([[Key, Val] | _], Key) ->
+ case list_to_atom(string:to_lower(Val)) of
+ Bool when is_boolean(Bool) ->
+ Bool;
+ _ ->
+ false
+ end;
+test_inet_backends([_|Args], Key) ->
+ test_inet_backends(Args, Key).
+
+
+
proxy_call(F, Timeout, Default)
when is_function(F, 0) andalso is_integer(Timeout) andalso (Timeout > 0) ->
{P, M} = erlang:spawn_monitor(fun() -> exit(F()) end),
@@ -282,6 +323,29 @@ hostname(Node) ->
[]
end.
+
+which_host_ip(Hostname, Family) ->
+ case snmp_misc:ip(Hostname, Family) of
+ {ok, {A, _, _, _}} = OK
+ when (A =/= 127) ->
+ OK;
+ {ok, {A, _, _, _, _, _, _, _}} = OK
+ when (A =/= 0) andalso
+ (A =/= 16#fe80) ->
+ OK;
+ {ok, _} ->
+ try localhost(Family) of
+ Addr ->
+ {ok, Addr}
+ catch
+ C:E:S ->
+ {error, {C, E, S}}
+ end;
+ {error, _} = ERROR ->
+ ERROR
+ end.
+
+
localhost() ->
localhost(inet).
@@ -315,6 +379,8 @@ which_addr(_Family, []) ->
fail(no_valid_addr, ?MODULE, ?LINE);
which_addr(Family, [{"lo", _} | IfList]) ->
which_addr(Family, IfList);
+which_addr(Family, [{"tun" ++ _, _} | IfList]) ->
+ which_addr(Family, IfList);
which_addr(Family, [{"docker" ++ _, _} | IfList]) ->
which_addr(Family, IfList);
which_addr(Family, [{"br-" ++ _, _} | IfList]) ->
@@ -624,6 +690,17 @@ old_is_ipv6_host(Hostname) ->
init_per_suite(Config) ->
+ iprint("snmp environment: "
+ "~n (snmp) app: ~p"
+ "~n (all) init: ~p"
+ "~n (snmp) init: ~p",
+ [application:get_all_env(snmp),
+ init:get_arguments(),
+ case init:get_argument(snmp) of
+ {ok, Args} -> Args;
+ error -> undefined
+ end]),
+
ct:timetrap(minutes(2)),
try analyze_and_print_host_info() of
@@ -781,6 +858,7 @@ init_group_top_dir(GroupName, Config) ->
[{snmp_group_top_dir, GroupTopDir} | Config];
_ ->
+ %% This is a "top level" group, that is, there is only the suite
case lists:keysearch(snmp_suite_top_dir, 1, Config) of
{value, {_Key, Dir}} ->
GroupTopDir = filename:join(Dir, GroupName),
diff --git a/lib/snmp/test/snmp_test_lib.hrl b/lib/snmp/test/snmp_test_lib.hrl
index 78d1453c12..a6b1be76ea 100644
--- a/lib/snmp/test/snmp_test_lib.hrl
+++ b/lib/snmp/test/snmp_test_lib.hrl
@@ -41,6 +41,9 @@
-define(OSTYPE(), ?LIB:os_type()).
-define(DISPLAY_SUITE_INFO(), ?LIB:display_suite_info(?MODULE)).
+-define(EXPLICIT_INET_BACKEND(), ?LIB:explicit_inet_backend()).
+-define(TEST_INET_BACKENDS(), ?LIB:test_inet_backends()).
+
%% - Test case macros -
diff --git a/lib/snmp/test/snmp_test_mgr.erl b/lib/snmp/test/snmp_test_mgr.erl
index fe2852c573..7fab69c043 100644
--- a/lib/snmp/test/snmp_test_mgr.erl
+++ b/lib/snmp/test/snmp_test_mgr.erl
@@ -262,7 +262,7 @@ init({Options, CallerPid}) ->
Addr;
{value, Host} when is_list(Host) ->
?IPRINT("init -> Host: ~p", [Host]),
- {ok, Ip} = snmp_misc:ip(Host, IpFamily),
+ {ok, Ip} = ?LIB:which_host_ip(Host, IpFamily),
Ip
end,
?IPRINT("init -> AgIp: ~p", [AgIp]),
diff --git a/lib/ssh/src/ssh.erl b/lib/ssh/src/ssh.erl
index b24df1ecf7..bf354c7ef6 100644
--- a/lib/ssh/src/ssh.erl
+++ b/lib/ssh/src/ssh.erl
@@ -53,6 +53,9 @@
%%% Internal export
-export([is_host/2]).
+-behaviour(ssh_dbg).
+-export([ssh_dbg_trace_points/0, ssh_dbg_flags/1, ssh_dbg_on/1, ssh_dbg_off/1, ssh_dbg_format/2, ssh_dbg_format/3]).
+
%%% "Deprecated" types export:
-export_type([ssh_daemon_ref/0, ssh_connection_ref/0, ssh_channel_id/0]).
-opaque ssh_daemon_ref() :: daemon_ref().
@@ -173,8 +176,7 @@ connect(Host0, Port, UserOptions, NegotiationTimeout) when is_integer(Port),
SocketOpts = [{active,false} | ?GET_OPT(socket_options,Options)],
Host = mangle_connect_address(Host0, Options),
try
- {_, Callback, _} = ?GET_OPT(transport, Options),
- Callback:connect(Host, Port, SocketOpts, ?GET_OPT(connect_timeout,Options))
+ transport_connect(Host, Port, SocketOpts, Options)
of
{ok, Socket} ->
continue_connect(Socket, Options, NegotiationTimeout);
@@ -351,8 +353,7 @@ daemon(Host0, Port0, UserOptions0) when 0 =< Port0, Port0 =< 65535,
{ok,DaemonRef} ->
receive
{request_control, ListenSocket, ReqPid} ->
- {_, Callback, _} = ?GET_OPT(transport, Options1),
- ok = Callback:controlling_process(ListenSocket, ReqPid),
+ ok = controlling_process(ListenSocket, ReqPid, Options1),
ReqPid ! {its_yours,ListenSocket}
end,
{ok,DaemonRef};
@@ -864,6 +865,14 @@ close_listen_socket(ListenSocket, Options) ->
_C:_E -> ok
end.
+controlling_process(ListenSocket, ReqPid, Options) ->
+ {_, Callback, _} = ?GET_OPT(transport, Options),
+ Callback:controlling_process(ListenSocket, ReqPid).
+
+transport_connect(Host, Port, SocketOpts, Options) ->
+ {_, Callback, _} = ?GET_OPT(transport, Options),
+ Callback:connect(Host, Port, SocketOpts, ?GET_OPT(connect_timeout,Options)).
+
%%%----------------------------------------------------------------
is_host(X, Opts) ->
try is_host1(mangle_connect_address(X, Opts))
@@ -912,3 +921,58 @@ mangle_tunnel_address(X) when is_list(X) -> case catch inet:parse_address(X) of
{ok, {0,0,0,0,0,0,0,0}} -> <<"">>;
_ -> list_to_binary(X)
end.
+
+
+%%%################################################################
+%%%#
+%%%# Tracing
+%%%#
+
+ssh_dbg_trace_points() -> [tcp].
+
+ssh_dbg_flags(tcp) -> [c].
+
+ssh_dbg_on(tcp) -> dbg:tpl(?MODULE, controlling_process, 3, x),
+ dbg:tpl(?MODULE, transport_connect, 4, x),
+ dbg:tpl(?MODULE, close_listen_socket, 2, x).
+
+ssh_dbg_off(tcp) ->dbg:ctpl(?MODULE, controlling_process, 3),
+ dbg:ctpl(?MODULE, transport_connect, 4),
+ dbg:ctpl(?MODULE, close_listen_socket, 2).
+
+ssh_dbg_format(tcp, {call, {?MODULE,controlling_process, [ListenSocket, ReqPid, _Opts]}}) ->
+ ["TCP socket transferred to\n",
+ io_lib:format("Sock: ~p~n"
+ "ToPid: ~p~n", [ListenSocket, ReqPid])
+ ];
+ssh_dbg_format(tcp, {return_from, {?MODULE,controlling_process,3}, _Result}) ->
+ skip;
+
+ssh_dbg_format(tcp, {call, {?MODULE,close_listen_socket, [ListenSocket, _Opts]}}) ->
+ ["TCP socket listening closed\n",
+ io_lib:format("Sock: ~p~n", [ListenSocket])
+ ];
+ssh_dbg_format(tcp, {return_from, {?MODULE,close_listen_socket,2}, _Result}) ->
+ skip.
+
+
+ssh_dbg_format(tcp, {call, {?MODULE,transport_connect, [Host,Port,SockOpts,_Opts]}}, Stack) ->
+ {skip, [{transport_connect,Host,Port,SockOpts}|Stack]};
+ssh_dbg_format(tcp, {return_from, {?MODULE,transport_connect,4}, {ok,Sock}},
+ [{transport_connect,Host,Port,SockOpts}|Stack]) ->
+ {["TCP connected to\n",
+ io_lib:format("Host: ~p~n"
+ "Port: ~p~n"
+ "SockOpts: ~p~n"
+ "Socket: ~p~n", [Host,Port,SockOpts,Sock])
+ ],
+ Stack};
+ssh_dbg_format(tcp, {return_from, {?MODULE,transport_connect,4}, Result},
+ [{transport_connect,Host,Port,SockOpts}|Stack]) ->
+ {["TCP connected FAILED to\n",
+ io_lib:format("Host: ~p~n"
+ "Port: ~p~n"
+ "SockOpts: ~p~n"
+ "Result: ~p~n", [Host,Port,SockOpts,Result])
+ ],
+ Stack}.
diff --git a/lib/ssh/src/ssh_acceptor.erl b/lib/ssh/src/ssh_acceptor.erl
index 3ea066f98d..70ebffbea3 100644
--- a/lib/ssh/src/ssh_acceptor.erl
+++ b/lib/ssh/src/ssh_acceptor.erl
@@ -30,10 +30,10 @@
listen/2]).
%% spawn export
--export([acceptor_init/4, acceptor_loop/7]).
+-export([acceptor_init/4, acceptor_loop/6]).
-behaviour(ssh_dbg).
--export([ssh_dbg_trace_points/0, ssh_dbg_flags/1, ssh_dbg_on/1, ssh_dbg_off/1, ssh_dbg_format/2]).
+-export([ssh_dbg_trace_points/0, ssh_dbg_flags/1, ssh_dbg_on/1, ssh_dbg_off/1, ssh_dbg_format/2, ssh_dbg_format/3]).
-define(SLEEP_TIME, 200).
@@ -59,6 +59,14 @@ listen(Port, Options) ->
Other
end.
+accept(ListenSocket, AcceptTimeout, Options) ->
+ {_, Callback, _} = ?GET_OPT(transport, Options),
+ Callback:accept(ListenSocket, AcceptTimeout).
+
+close(Socket, Options) ->
+ {_, Callback, _} = ?GET_OPT(transport, Options),
+ Callback:close(Socket).
+
%%--------------------------------------------------------------------
%%% Internal functions
%%--------------------------------------------------------------------
@@ -66,7 +74,6 @@ acceptor_init(Parent, SystemSup,
#address{address=Address, port=Port, profile=_Profile},
Opts) ->
AcceptTimeout = ?GET_INTERNAL_OPT(timeout, Opts, ?DEFAULT_TIMEOUT),
- {_, Callback, _} = ?GET_OPT(transport, Opts),
case ?GET_INTERNAL_OPT(lsocket, Opts, undefined) of
{LSock, SockOwner} ->
%% A listening socket (or fd option) was provided in the ssh:daemon call
@@ -75,7 +82,7 @@ acceptor_init(Parent, SystemSup,
%% A usable, open LSock
proc_lib:init_ack(Parent, {ok, self()}),
request_ownership(LSock, SockOwner),
- acceptor_loop(Callback, Port, Address, Opts, LSock, AcceptTimeout, SystemSup);
+ acceptor_loop(Port, Address, Opts, LSock, AcceptTimeout, SystemSup);
{error,_Error} ->
%% Not open, a restart
@@ -84,7 +91,7 @@ acceptor_init(Parent, SystemSup,
{ok,NewLSock} ->
proc_lib:init_ack(Parent, {ok, self()}),
Opts1 = ?DELETE_INTERNAL_OPT(lsocket, Opts),
- acceptor_loop(Callback, Port, Address, Opts1, NewLSock, AcceptTimeout, SystemSup);
+ acceptor_loop(Port, Address, Opts1, NewLSock, AcceptTimeout, SystemSup);
{error,Error} ->
proc_lib:init_ack(Parent, {error,Error})
end
@@ -95,7 +102,7 @@ acceptor_init(Parent, SystemSup,
case listen(Port, Opts) of
{ok,LSock} ->
proc_lib:init_ack(Parent, {ok, self()}),
- acceptor_loop(Callback, Port, Address, Opts, LSock, AcceptTimeout, SystemSup);
+ acceptor_loop(Port, Address, Opts, LSock, AcceptTimeout, SystemSup);
{error,Error} ->
proc_lib:init_ack(Parent, {error,Error})
end
@@ -122,13 +129,13 @@ request_ownership(LSock, SockOwner) ->
end.
%%%----------------------------------------------------------------
-acceptor_loop(Callback, Port, Address, Opts, ListenSocket, AcceptTimeout, SystemSup) ->
- case Callback:accept(ListenSocket, AcceptTimeout) of
+acceptor_loop(Port, Address, Opts, ListenSocket, AcceptTimeout, SystemSup) ->
+ case accept(ListenSocket, AcceptTimeout, Opts) of
{ok,Socket} ->
{ok, {FromIP,FromPort}} = inet:peername(Socket), % Just in case of error in next line:
case handle_connection(SystemSup, Address, Port, Opts, Socket) of
{error,Error} ->
- catch Callback:close(Socket),
+ catch close(Socket, Opts),
handle_error(Error, Address, Port, FromIP, FromPort);
_ ->
ok
@@ -136,7 +143,7 @@ acceptor_loop(Callback, Port, Address, Opts, ListenSocket, AcceptTimeout, System
{error,Error} ->
handle_error(Error, Address, Port)
end,
- ?MODULE:acceptor_loop(Callback, Port, Address, Opts, ListenSocket, AcceptTimeout, SystemSup).
+ ?MODULE:acceptor_loop(Port, Address, Opts, ListenSocket, AcceptTimeout, SystemSup).
%%%----------------------------------------------------------------
handle_connection(SystemSup, Address, Port, Options0, Socket) ->
@@ -210,15 +217,60 @@ number_of_connections(SysSupPid) ->
%%%# Tracing
%%%#
-ssh_dbg_trace_points() -> [connections].
+ssh_dbg_trace_points() -> [connections, tcp].
+ssh_dbg_flags(tcp) -> [c];
ssh_dbg_flags(connections) -> [c].
+ssh_dbg_on(tcp) -> dbg:tp(?MODULE, listen, 2, x),
+ dbg:tpl(?MODULE, accept, 3, x),
+ dbg:tpl(?MODULE, close, 2, x);
+
ssh_dbg_on(connections) -> dbg:tp(?MODULE, acceptor_init, 4, x),
- dbg:tpl(?MODULE, handle_connection, 4, x).
+ dbg:tpl(?MODULE, handle_connection, 5, x).
+
+ssh_dbg_off(tcp) -> dbg:ctpg(?MODULE, listen, 2),
+ dbg:ctpl(?MODULE, accept, 3),
+ dbg:ctpl(?MODULE, close, 2);
ssh_dbg_off(connections) -> dbg:ctp(?MODULE, acceptor_init, 4),
- dbg:ctp(?MODULE, handle_connection, 4).
+ dbg:ctp(?MODULE, handle_connection, 5).
+
+ssh_dbg_format(tcp, {call, {?MODULE,listen, [Port,_Opts]}}, Stack) ->
+ {skip, [{port,Port}|Stack]};
+ssh_dbg_format(tcp, {return_from, {?MODULE,listen,2}, {ok,Sock}}, [{port,Port}|Stack]) ->
+ {["TCP listener started\n",
+ io_lib:format("Port: ~p~n"
+ "ListeningSocket: ~p~n", [Port,Sock])
+ ],
+ Stack};
+ssh_dbg_format(tcp, {return_from, {?MODULE,listen,2}, Result}, [{port,Port}|Stack]) ->
+ {["TCP listener start ERROR\n",
+ io_lib:format("Port: ~p~n"
+ "Return: ~p~n", [Port,Result])
+ ],
+ Stack};
+
+ssh_dbg_format(tcp, {call, {?MODULE,accept, [ListenSocket, _AcceptTimeout, _Options]}}, Stack) ->
+ {skip, [{lsock,ListenSocket}|Stack]};
+ssh_dbg_format(tcp, {return_from, {?MODULE,accept,3}, {ok,Sock}}, [{lsock,ListenSocket}|Stack]) ->
+ {["TCP accept\n",
+ io_lib:format("ListenSock: ~p~n"
+ "New Socket: ~p~n", [ListenSocket,Sock])
+ ], Stack};
+ssh_dbg_format(tcp, {return_from, {?MODULE,accept,3}, {error,timeout}}, [{lsock,_ListenSocket}|Stack]) ->
+ {skip, Stack};
+ssh_dbg_format(tcp, {return_from, {?MODULE,accept,3}, Return}, [{lsock,ListenSocket}|Stack]) ->
+ {["TCP accept returned\n",
+ io_lib:format("ListenSock: ~p~n"
+ "Return: ~p~n", [ListenSocket,Return])
+ ], Stack}.
+
+ssh_dbg_format(tcp, {call, {?MODULE,close, [Socket, _Options]}}) ->
+ ["TCP close listen socket\n",
+ io_lib:format("Socket: ~p~n", [Socket])];
+ssh_dbg_format(tcp, {return_from, {?MODULE,close,2}, _Return}) ->
+ skip;
ssh_dbg_format(connections, {call, {?MODULE,acceptor_init, [_Parent, _SysSup, Address, _Opts]}}) ->
[io_lib:format("Starting LISTENER on ~s\n", [ssh_lib:format_address(Address)])
@@ -226,9 +278,9 @@ ssh_dbg_format(connections, {call, {?MODULE,acceptor_init, [_Parent, _SysSup, Ad
ssh_dbg_format(connections, {return_from, {?MODULE,acceptor_init,4}, _Ret}) ->
skip;
-ssh_dbg_format(connections, {call, {?MODULE,handle_connection,[_,_,_,_]}}) ->
+ssh_dbg_format(connections, {call, {?MODULE,handle_connection,[_SystemSup,_Address,_Port,_Options,_Sock]}}) ->
skip;
-ssh_dbg_format(connections, {return_from, {?MODULE,handle_connection,4}, {error,Error}}) ->
+ssh_dbg_format(connections, {return_from, {?MODULE,handle_connection,5}, {error,Error}}) ->
["Starting connection to server failed:\n",
io_lib:format("Error = ~p", [Error])
].
diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl
index e0146385af..0f8d01f2a0 100644
--- a/lib/ssh/src/ssh_connection_handler.erl
+++ b/lib/ssh/src/ssh_connection_handler.erl
@@ -2017,12 +2017,14 @@ update_inet_buffers(Socket) ->
%%%# Tracing
%%%#
-ssh_dbg_trace_points() -> [terminate, disconnect, connections, connection_events, renegotiation].
+ssh_dbg_trace_points() -> [terminate, disconnect, connections, connection_events, renegotiation,
+ tcp].
ssh_dbg_flags(connections) -> [c | ssh_dbg_flags(terminate)];
ssh_dbg_flags(renegotiation) -> [c];
ssh_dbg_flags(connection_events) -> [c];
ssh_dbg_flags(terminate) -> [c];
+ssh_dbg_flags(tcp) -> [c];
ssh_dbg_flags(disconnect) -> [c].
ssh_dbg_on(connections) -> dbg:tp(?MODULE, init, 1, x),
@@ -2034,11 +2036,22 @@ ssh_dbg_on(renegotiation) -> dbg:tpl(?MODULE, init_renegotiate_timers, 3, x),
dbg:tpl(?MODULE, start_rekeying, 2, x),
dbg:tp(?MODULE, renegotiate, 1, x);
ssh_dbg_on(terminate) -> dbg:tp(?MODULE, terminate, 3, x);
+ssh_dbg_on(tcp) -> dbg:tp(?MODULE, handle_event, 4,
+ [{[info, {tcp,'_','_'}, '_', '_'], [], []},
+ {[info, {tcp_error,'_','_'}, '_', '_'], [], []},
+ {[info, {tcp_closed,'_'}, '_', '_'], [], []}
+ ]),
+ dbg:tp(?MODULE, send_bytes, 2, x),
+ dbg:tpl(?MODULE, close_transport, 1, x);
+
ssh_dbg_on(disconnect) -> dbg:tpl(?MODULE, send_disconnect, 7, x).
ssh_dbg_off(disconnect) -> dbg:ctpl(?MODULE, send_disconnect, 7);
ssh_dbg_off(terminate) -> dbg:ctpg(?MODULE, terminate, 3);
+ssh_dbg_off(tcp) -> dbg:ctpg(?MODULE, handle_event, 4), % How to avoid cancelling 'connection_events' ?
+ dbg:ctpl(?MODULE, send_bytes, 2),
+ dbg:ctpg(?MODULE, close_transport, 1);
ssh_dbg_off(renegotiation) -> dbg:ctpl(?MODULE, init_renegotiate_timers, 3),
dbg:ctpl(?MODULE, pause_renegotiate_timers, 3),
dbg:ctpl(?MODULE, check_data_rekeying_dbg, 2),
@@ -2084,6 +2097,43 @@ ssh_dbg_format(connection_events, {return_from, {?MODULE,handle_event,4}, Ret})
io_lib:format("~p~n", [ssh_dbg:reduce_state(Ret, #data{})])
];
+ssh_dbg_format(tcp, {call, {?MODULE,handle_event, [info, {tcp,Sock,TcpData}, State, _Data]}}) ->
+ ["TCP stream data arrived\n",
+ io_lib:format("State: ~p~n"
+ "Socket: ~p~n"
+ "TcpData:~n~s", [State, Sock, ssh_dbg:hex_dump(TcpData, [{max_bytes,48}])])
+ ];
+ssh_dbg_format(tcp, {call, {?MODULE,handle_event, [info, {tcp_error,Sock,Msg}, State, _Data]}}) ->
+ ["TCP stream data ERROR arrived\n",
+ io_lib:format("State: ~p~n"
+ "Socket: ~p~n"
+ "ErrorMsg:~p~n", [State, Sock, Msg])
+ ];
+ssh_dbg_format(tcp, {call, {?MODULE,handle_event, [info, {tcp_closed,Sock}, State, _Data]}}) ->
+ ["TCP stream closed\n",
+ io_lib:format("State: ~p~n"
+ "Socket: ~p~n", [State, Sock])
+ ];
+ssh_dbg_format(tcp, {return_from, {?MODULE,handle_event,4}, _Ret}) ->
+ skip;
+
+ssh_dbg_format(tcp, {call, {?MODULE, send_bytes, ["",_D]}}) ->
+ skip;
+ssh_dbg_format(tcp, {call, {?MODULE, send_bytes, [TcpData, #data{socket=Sock}]}}) ->
+ ["TCP send stream data\n",
+ io_lib:format("Socket: ~p~n"
+ "TcpData:~n~s", [Sock, ssh_dbg:hex_dump(TcpData, [{max_bytes,48}])])
+ ];
+ssh_dbg_format(tcp, {return_from, {?MODULE,send_bytes,2}, _R}) ->
+ skip;
+
+ssh_dbg_format(tcp, {call, {?MODULE, close_transport, [#data{socket=Sock}]}}) ->
+ ["TCP close stream\n",
+ io_lib:format("Socket: ~p~n", [Sock])
+ ];
+ssh_dbg_format(tcp, {return_from, {?MODULE,close_transport,1}, _R}) ->
+ skip;
+
ssh_dbg_format(renegotiation, {call, {?MODULE,init_renegotiate_timers,[OldState,NewState,D]}}) ->
["Renegotiation: start timer (init_renegotiate_timers)\n",
io_lib:format("State: ~p --> ~p~n"
diff --git a/lib/ssh/src/ssh_sftpd.erl b/lib/ssh/src/ssh_sftpd.erl
index 1c53690ed0..2d755e874a 100644
--- a/lib/ssh/src/ssh_sftpd.erl
+++ b/lib/ssh/src/ssh_sftpd.erl
@@ -564,7 +564,10 @@ get_attrs(RelPath, [F | Rest], FileMod, FS0, Vsn, Acc) ->
end,
Attrs = ssh_sftp:info_to_attr(Info),
get_attrs(RelPath, Rest, FileMod, FS1, Vsn, [{Name, Attrs} | Acc]);
- {{error, enoent}, FS1} ->
+ {{error, Msg}, FS1} when
+ Msg == enoent ; % The item has disappeared after reading the list of items to check
+ Msg == eacces -> % You are not allowed to read this
+ %% Skip this F and check the remaining Rest
get_attrs(RelPath, Rest, FileMod, FS1, Vsn, Acc);
{Error, FS1} ->
{Error, FS1}
diff --git a/lib/ssl/doc/src/ssl.xml b/lib/ssl/doc/src/ssl.xml
index 29d2a4670d..bd676c0af5 100644
--- a/lib/ssl/doc/src/ssl.xml
+++ b/lib/ssl/doc/src/ssl.xml
@@ -197,10 +197,6 @@
</datatype>
<datatype>
- <name name="signature_algs"/>
- </datatype>
-
- <datatype>
<name name="sign_algo"/>
</datatype>
@@ -209,6 +205,14 @@
</datatype>
<datatype>
+ <name name="rsassa_pss_scheme"/>
+ </datatype>
+
+ <datatype>
+ <name name="sign_scheme_legacy"/>
+ </datatype>
+
+ <datatype>
<name name="group"/>
</datatype>
@@ -384,8 +388,10 @@
<note><p>Note that TLS-1.3 and TLS-1.2 cipher suites are not overlapping
sets of cipher suites so to support both these versions cipher
- suites from both versions need to be included. If supporting
- TLS-1.3 versions prior to TLS-1.2 can not be supported. </p></note>
+ suites from both versions need to be included. Also if the supplied list does
+ not comply with the configured versions or cryptolib so that the list becomes empty,
+ this option will fallback on its appropriate default value for the configured versions.
+ </p></note>
<p>Non-default cipher suites including anonymous cipher suites (PRE TLS-1.3) are supported for
interop/testing purposes and may be used by adding them to your cipher suite list.
@@ -393,29 +399,140 @@
</p>
</desc>
</datatype>
-
- <datatype>
- <name name="signature_schemes"/>
- <desc>
- <p>
- In addition to the signature_algorithms extension from TLS 1.2,
- <url href="http://www.ietf.org/rfc/rfc8446.txt#section-4.2.3">TLS 1.3
- (RFC 5246 Section 4.2.3)</url>adds the signature_algorithms_cert extension
- which enables having special requirements on the signatures used in the
- certificates that differs from the requirements on digital signatures as a whole.
- If this is not required this extension is not needed.
- </p>
- <p>
- The client will send a signature_algorithms_cert extension (ClientHello),
- if TLS version 1.3 or later is used, and the signature_algs_cert option is
- explicitly specified. By default, only the signature_algs extension is sent.
+
+
+ <datatype>
+ <name name="signature_algs"/>
+ <desc>
+
+ <p>Explicitly list acceptable signature algorithms for certificates and handshake messages
+ in the preferred order. The client will send its list as the client hello <c>signature_algorithm</c> extension
+ introduced in TLS-1.2, see <url href="http://www.ietf.org/rfc/rfc5246.txt">Section 7.4.1.4.1 in RFC 5246</url>.
+ Previously these algorithms where implicitly chosen and partly derived from the cipher suite. </p>
+
+ <p>In TLS-1.2 a somewhat more explicit negotiation is made possible using a list of
+ {<seetype marker="#hash">hash()</seetype>, <seetype marker="#signature_algs">sign_algo()</seetype>} pairs.
</p>
- <p>
- The signature schemes shall be ordered according to the client's preference
- (favorite choice first).
+
+ <p>In TLS-1.3 these algorithm pairs are
+ replaced by so called signature schemes <seetype marker="#sign_scheme">sign_scheme()</seetype>
+ and completely decoupled from the cipher suite.
</p>
+
+ <p>Signature algorithms used for certificates may be overridden by the
+ <seetype marker="#sign_schemes">signature schemes</seetype> (algorithms) supplied by the <c>signature_algs_cert</c> option.</p>
+
+ <p>TLS-1.2 default is</p>
+
+ <p><c>Default_TLS_12_Alg_Pairs =</c></p>
+ <code>[
+%% SHA2
+{sha512, ecdsa},
+{sha512, rsa},
+{sha384, ecdsa},
+{sha384, rsa},
+{sha256, ecdsa},
+{sha256, rsa},
+{sha224, ecdsa},
+{sha224, rsa},
+%% SHA
+{sha, ecdsa},
+{sha, rsa},
+{sha, dsa}
+]
+ </code>
+
+ <p>Support for {md5, rsa} was removed from the the TLS-1.2 default in ssl-8.0 (OTP-22) </p>
+
+
+ <p><c> TLS_13 _Legacy_Schemes =</c></p>
+ <code> [
+ %% Legacy algorithms only applicable to certificate signatures
+rsa_pkcs1_sha512, %% Corresponds to {sha512, rsa}
+rsa_pkcs1_sha384, %% Corresponds to {sha384, rsa}
+rsa_pkcs1_sha256, %% Corresponds to {sha256, rsa}
+ecdsa_sha1, %% Corresponds to {sha, ecdsa}
+rsa_pkcs1_sha1 %% Corresponds to {sha, rsa}
+]
+</code>
+
+ <p><c> Default_TLS_13_Schemes =</c></p>
+ <code> [
+%% ECDSA
+ecdsa_secp521r1_sha512,
+ecdsa_secp384r1_sha384,
+ecdsa_secp256r1_sha256,
+%% RSASSA-PSS
+rsa_pss_pss_sha512,
+rsa_pss_pss_sha384,
+rsa_pss_pss_sha256,
+rsa_pss_rsae_sha512,
+rsa_pss_rsae_sha384,
+rsa_pss_rsae_sha256,
+%% EDDSA
+eddsa_ed25519,
+eddsa_ed448]
+</code>
+
+<p>TLS-1.3 default is</p>
+<code>Default_TLS_13_Schemes ++ Legacy_TLS_13_Schemes </code>
+
+<p>If both TLS-1.3 and TLS-1.2 are supported the default will be</p>
+<code>Default_TLS_13_Schemes ++ Default_TLS_12_Alg_Pairs </code>
+
+<p>so appropriate algorithms can be chosen for the negotiated
+version.
+</p>
+
+<note> <p> TLS-1.2 algorithms will not be negotiated for TLS-1.3, but TLS-1.3 RSASSA-PSS <seetype marker="#rsassa_pss_scheme">rsassa_pss_scheme()</seetype>
+ signature schemes may be negotiated also for TLS-1.2 from @OTP-16590@
+ However if TLS-1.3 is negotiated when both TLS-1.3 and TLS-1.2 is supported using defaults, the corresponding TLS-1.2 algorithms
+ to the TLS-1.3 legacy signature schemes will be considered as the legacy schemes and applied only to certificate signatures.
+ </p>
+ </note>
+
</desc>
- </datatype>
+ </datatype>
+
+ <datatype>
+ <name name="sign_schemes"/>
+
+ <desc>
+ <p>Explicitly list acceptable signature schemes (algorithms),
+ in prefered ordered, for certificates, overrides the
+ algorithms supplied in <seetype
+ marker="#signature_algs"><c>signature_algs</c></seetype> option for
+ certificates.</p>
+
+ <p>
+ In addition to the <c>signature_algorithms</c> extension from TLS
+ 1.2, <url
+ href="http://www.ietf.org/rfc/rfc8446.txt#section-4.2.3">TLS
+ 1.3 (RFC 5246 Section 4.2.3)</url> adds the
+ <c>signature_algorithms_cert</c> extension which enables having
+ special requirements on the signatures used in the
+ certificates that differs from the requirements on digital
+ signatures as a whole. If this is not required this
+ extension is not need.
+ </p>
+
+ <p>
+ The client will send a <c>signature_algorithms_cert</c> extension
+ (in the client hello message), if TLS version 1.2
+ (back-ported to TLS 1.2 in @OTP-16590@) or later is used, and
+ the signature_algs_cert option is explicitly specified. By
+ default, only the <seetype
+ marker="#signature_algs">signature_algs</seetype> extension
+ is sent. </p>
+
+ <note> <p> Note that supported signature schemes for TLS-1.2
+ are <seetype
+ marker="#sign_scheme_legacy">sign_scheme_legacy()</seetype>
+ and <seetype
+ marker="#rsassa_pss_scheme">rsassa_pss_scheme()</seetype>
+ </p></note>
+ </desc>
+ </datatype>
<datatype>
<name name="supported_groups"/>
@@ -973,43 +1090,7 @@ fun(srp, Username :: binary(), UserState :: term()) ->
</p></warning>
</desc>
</datatype>
-
- <datatype>
- <name name="client_signature_algs"/>
- <desc>
- <p>In addition to the algorithms negotiated by the cipher
- suite used for key exchange, payload encryption, message
- authentication and pseudo random calculation, the TLS signature
- algorithm extension <url
- href="http://www.ietf.org/rfc/rfc5246.txt">Section 7.4.1.4.1 in RFC 5246</url> may be
- used, from TLS 1.2, to negotiate which signature algorithm to use during the
- TLS handshake. If no lower TLS versions than 1.2 are supported,
- the client will send a TLS signature algorithm extension
- with the algorithms specified by this option.
- Defaults to</p>
-
- <code>[
-%% SHA2
-{sha512, ecdsa},
-{sha512, rsa},
-{sha384, ecdsa},
-{sha384, rsa},
-{sha256, ecdsa},
-{sha256, rsa},
-{sha224, ecdsa},
-{sha224, rsa},
-%% SHA
-{sha, ecdsa},
-{sha, rsa},
-{sha, dsa},
-]</code>
-<p>
- The algorithms should be in the preferred order.
- Selected signature algorithm can restrict which hash functions
- that may be selected. Default support for {md5, rsa} removed in ssl-8.0
- </p>
- </desc>
- </datatype>
+
<datatype>
<name name="client_session_tickets"/>
@@ -1274,19 +1355,6 @@ fun(srp, Username :: binary(), UserState :: term()) ->
</datatype>
<datatype>
- <name name="server_signature_algs"/>
- <desc><p> The algorithms specified by this option will be the
- ones accepted by the server in a signature algorithm
- negotiation, introduced in TLS-1.2. The algorithms will also
- be offered to the client if a client certificate is
- requested. For more details see the <seetype
- marker="#client_signature_algs">corresponding client
- option</seetype>.
- </p>
- </desc>
- </datatype>
-
- <datatype>
<name name="server_session_tickets"/>
<desc>
<p>Configures the session ticket functionality. Allowed values are <c>disabled</c>,
@@ -1419,19 +1487,20 @@ fun(srp, Username :: binary(), UserState :: term()) ->
<fsummary>Returns a list of cipher suites.</fsummary>
<desc><p>Lists all possible cipher suites corresponding to
<c>Description</c> that are available. The
- <c>exclusive</c> option will exclusively list cipher suites
- introduced in <c>Version</c> whereas the other options
+ <c>exclusive</c> and <c>exclusive_anonymous</c> option will exclusively list cipher suites
+ first supported in <c>Version</c> whereas the other options
are inclusive from the lowest possible version to
<c>Version</c>. The <c>all</c> options includes all suites
- except the anonymous.
+ except the anonymous and no anonymous suites are supported by default.
</p>
<note><p>TLS-1.3 has no overlapping cipher suites with previous
TLS versions, that is the result of
<c>cipher_suites(all, 'tlsv1.3').</c> contains a separate set of
suites that can be used with TLS-1.3 an other set that can be used
- if a lower version is negotiated. No anonymous suites are
- supported by TLS-1.3.</p>
+ if a lower version is negotiated. PRE TLS-1.3 so called <c>PSK</c> and <c>SRP</c> suites
+ need extra configuration to work see <seetype marker="#custom_user_lookup">user lookup function</seetype>.
+ No anonymous suites are supported by TLS-1.3.</p>
<p>Also note that the cipher suites returned
by this function are the cipher suites that the OTP ssl
diff --git a/lib/ssl/doc/src/standards_compliance.xml b/lib/ssl/doc/src/standards_compliance.xml
index 7b12a15261..cc74067ecf 100644
--- a/lib/ssl/doc/src/standards_compliance.xml
+++ b/lib/ssl/doc/src/standards_compliance.xml
@@ -166,7 +166,7 @@
</cell>
<cell align="left" valign="middle"></cell>
<cell align="left" valign="middle"><em>C</em></cell>
- <cell align="left" valign="middle"><em>22</em></cell>
+ <cell align="left" valign="middle"><em>@OTP-16590@</em></cell>
</row>
<row>
<cell align="left" valign="middle"></cell>
@@ -177,8 +177,8 @@
<row>
<cell align="left" valign="middle"></cell>
<cell align="left" valign="middle">RSASSA-PSS signature schemes</cell>
- <cell align="left" valign="middle"><em>PC</em></cell>
- <cell align="left" valign="middle"><em>23</em></cell>
+ <cell align="left" valign="middle"><em>C</em></cell>
+ <cell align="left" valign="middle"><em>@OTP-16590@</em></cell>
</row>
<row>
<cell align="left" valign="middle"></cell>
@@ -190,7 +190,7 @@
<cell align="left" valign="middle"></cell>
<cell align="left" valign="middle">signature_algorithms_cert extension</cell>
<cell align="left" valign="middle"><em>C</em></cell>
- <cell align="left" valign="middle"><em>22</em></cell>
+ <cell align="left" valign="middle"><em>@OTP-16590@</em></cell>
</row>
<row>
@@ -703,7 +703,7 @@
</cell>
<cell align="left" valign="middle"><em>Client</em></cell>
<cell align="left" valign="middle"><em>C</em></cell>
- <cell align="left" valign="middle"><em>23</em></cell>
+ <cell align="left" valign="middle"><em>24</em></cell>
</row>
<row>
<cell align="left" valign="middle"></cell>
@@ -762,12 +762,14 @@
<row>
<cell align="left" valign="middle"></cell>
<cell align="left" valign="middle">ed25519</cell>
+ <cell align="left" valign="middle"><em>C</em></cell>
<cell align="left" valign="middle"><em>24</em></cell>
<cell align="left" valign="middle"></cell>
</row>
<row>
<cell align="left" valign="middle"></cell>
<cell align="left" valign="middle">ed448</cell>
+ <cell align="left" valign="middle"><em>C</em></cell>
<cell align="left" valign="middle"><em>24</em></cell>
<cell align="left" valign="middle"></cell>
</row>
@@ -805,8 +807,8 @@
<row>
<cell align="left" valign="middle"></cell>
<cell align="left" valign="middle"><em>Server</em></cell>
- <cell align="left" valign="middle"><em>PC</em></cell>
- <cell align="left" valign="middle"><em>22</em></cell>
+ <cell align="left" valign="middle"><em>C</em></cell>
+ <cell align="left" valign="middle"><em>24</em></cell>
</row>
<row>
<cell align="left" valign="middle"></cell>
@@ -865,12 +867,14 @@
<row>
<cell align="left" valign="middle"></cell>
<cell align="left" valign="middle">ed25519</cell>
+ <cell align="left" valign="middle"><em>C</em></cell>
<cell align="left" valign="middle"><em>24</em></cell>
<cell align="left" valign="middle"></cell>
</row>
<row>
<cell align="left" valign="middle"></cell>
<cell align="left" valign="middle">ed448</cell>
+ <cell align="left" valign="middle"><em>C</em></cell>
<cell align="left" valign="middle"><em>24</em></cell>
<cell align="left" valign="middle"></cell>
</row>
@@ -1845,19 +1849,21 @@
</url>
</cell>
<cell align="left" valign="middle"><em></em></cell>
- <cell align="left" valign="middle"><em>NC</em></cell>
+ <cell align="left" valign="middle"><em>22</em></cell>
<cell align="left" valign="middle"><em></em></cell>
</row>
<row>
<cell align="left" valign="middle"></cell>
<cell align="left" valign="middle">close_notify</cell>
- <cell align="left" valign="middle"><em>NC</em></cell>
+ <cell align="left" valign="middle"><em>C</em></cell>
+ <cell align="left" valign="middle"><em>22</em></cell>
<cell align="left" valign="middle"></cell>
</row>
<row>
<cell align="left" valign="middle"></cell>
<cell align="left" valign="middle">user_cancelled</cell>
- <cell align="left" valign="middle"><em>NC</em></cell>
+ <cell align="left" valign="middle"><em>C</em></cell>
+ <cell align="left" valign="middle"><em>22</em></cell>
<cell align="left" valign="middle"></cell>
</row>
diff --git a/lib/ssl/src/dtls_connection.erl b/lib/ssl/src/dtls_connection.erl
index 78348826e4..1a4f001273 100644
--- a/lib/ssl/src/dtls_connection.erl
+++ b/lib/ssl/src/dtls_connection.erl
@@ -650,7 +650,7 @@ handle_client_hello(#client_hello{client_version = ClientVersion} = Hello, State
connection_env = CEnv#connection_env{negotiated_version = Version},
handshake_env = HsEnv#handshake_env{
hashsign_algorithm = HashSign,
- client_hello_version = ClientVersion,
+ client_hello_version = ClientVersion,
negotiated_protocol = Protocol},
session = Session}),
{next_state, hello, State, [{next_event, internal, {common_client_hello, Type, ServerHelloExt}}]}
diff --git a/lib/ssl/src/dtls_handshake.erl b/lib/ssl/src/dtls_handshake.erl
index b8f9d7f42b..9999933d90 100644
--- a/lib/ssl/src/dtls_handshake.erl
+++ b/lib/ssl/src/dtls_handshake.erl
@@ -76,11 +76,14 @@ client_hello(_Host, _Port, Cookie, ConnectionStates,
TLSVersion = dtls_v1:corresponding_tls_version(Version),
CipherSuites = ssl_handshake:available_suites(UserSuites, TLSVersion),
- Extensions = ssl_handshake:client_hello_extensions(TLSVersion, CipherSuites,
- SslOpts, ConnectionStates,
- Renegotiation, undefined,
- undefined, OcspNonce),
-
+ Extensions = ssl_handshake:client_hello_extensions(TLSVersion,
+ CipherSuites,
+ SslOpts,
+ ConnectionStates,
+ Renegotiation,
+ undefined,
+ undefined,
+ OcspNonce),
#client_hello{session_id = Id,
client_version = Version,
cipher_suites =
diff --git a/lib/ssl/src/dtls_v1.erl b/lib/ssl/src/dtls_v1.erl
index a4ca4cc3b1..100dba2e4c 100644
--- a/lib/ssl/src/dtls_v1.erl
+++ b/lib/ssl/src/dtls_v1.erl
@@ -21,9 +21,17 @@
-include("ssl_cipher.hrl").
--export([suites/1, all_suites/1, anonymous_suites/1,hmac_hash/3, ecc_curves/1,
- corresponding_tls_version/1, corresponding_dtls_version/1,
- cookie_secret/0, cookie_timeout/0]).
+-export([suites/1,
+ all_suites/1,
+ anonymous_suites/1,
+ exclusive_suites/1,
+ exclusive_anonymous_suites/1,
+ hmac_hash/3,
+ ecc_curves/1,
+ corresponding_tls_version/1,
+ corresponding_dtls_version/1,
+ cookie_secret/0,
+ cookie_timeout/0]).
-define(COOKIE_BASE_TIMEOUT, 30000).
@@ -45,7 +53,20 @@ anonymous_suites(Version) ->
is_acceptable_cipher(ssl_cipher_format:suite_bin_to_map(Cipher))
end,
ssl_cipher:anonymous_suites(corresponding_tls_version(Version))).
-
+
+exclusive_suites(Minor) ->
+ lists:filter(fun(Cipher) ->
+ is_acceptable_cipher(ssl_cipher_format:suite_bin_to_map(Cipher))
+ end,
+ tls_v1:exclusive_suites(corresponding_minor_tls_version(Minor))).
+
+exclusive_anonymous_suites(Minor) ->
+ lists:filter(fun(Cipher) ->
+ is_acceptable_cipher(ssl_cipher_format:suite_bin_to_map(Cipher))
+ end,
+ tls_v1:exclusive_anonymous_suites(corresponding_minor_tls_version(Minor))).
+
+
hmac_hash(MacAlg, MacSecret, Value) ->
tls_v1:hmac_hash(MacAlg, MacSecret, Value).
diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl
index b6a5bf20a4..b05943e53e 100644
--- a/lib/ssl/src/ssl.erl
+++ b/lib/ssl/src/ssl.erl
@@ -190,22 +190,29 @@
-type sign_algo() :: rsa | dsa | ecdsa | eddsa. % exported
+-type sign_schemes() :: [sign_scheme()].
+
-type sign_scheme() :: eddsa_ed25519
| eddsa_ed448
| ecdsa_secp256r1_sha256
| ecdsa_secp384r1_sha384
| ecdsa_secp521r1_sha512
- | rsa_pss_rsae_sha256
+ | rsassa_pss_scheme()
+ | sign_scheme_legacy() . % exported
+
+-type rsassa_pss_scheme() :: rsa_pss_rsae_sha256
| rsa_pss_rsae_sha384
| rsa_pss_rsae_sha512
| rsa_pss_pss_sha256
| rsa_pss_pss_sha384
- | rsa_pss_pss_sha512
- | rsa_pkcs1_sha256
+ | rsa_pss_pss_sha512.
+
+-type sign_scheme_legacy() :: rsa_pkcs1_sha256
| rsa_pkcs1_sha384
| rsa_pkcs1_sha512
| rsa_pkcs1_sha1
- | ecdsa_sha1. % exported
+ | ecdsa_sha1.
+
-type kex_algo() :: rsa |
dhe_rsa | dhe_dss |
@@ -306,7 +313,8 @@
{password, key_password()} |
{ciphers, cipher_suites()} |
{eccs, [named_curve()]} |
- {signature_algs_cert, signature_schemes()} |
+ {signature_algs, signature_algs()} |
+ {signature_algs_cert, sign_schemes()} |
{supported_groups, supported_groups()} |
{secure_renegotiate, secure_renegotiation()} |
{keep_secrets, keep_secrets()} |
@@ -359,8 +367,7 @@
-type hibernate_after() :: timeout().
-type root_fun() :: fun().
-type protocol_versions() :: [protocol_version()].
--type signature_algs() :: [{hash(), sign_algo()}].
--type signature_schemes() :: [sign_scheme()].
+-type signature_algs() :: [{hash(), sign_algo()} | sign_scheme()].
-type supported_groups() :: [group()].
-type custom_user_lookup() :: {Lookupfun :: fun(), UserState :: any()}.
-type padding_check() :: boolean().
@@ -399,7 +406,6 @@
{server_name_indication, sni()} |
{max_fragment_length, max_fragment_length()} |
{customize_hostname_check, customize_hostname_check()} |
- {signature_algs, client_signature_algs()} |
{fallback, fallback()} |
{session_tickets, client_session_tickets()} |
{use_ticket, use_ticket()} |
@@ -425,7 +431,6 @@
-type customize_hostname_check() :: list().
-type sni() :: HostName :: hostname() | disable.
-type max_fragment_length() :: undefined | 512 | 1024 | 2048 | 4096.
--type client_signature_algs() :: signature_algs().
-type fallback() :: boolean().
-type ssl_imp() :: new | old.
%% -type ocsp_stapling() :: boolean().
@@ -450,7 +455,6 @@
{honor_cipher_order, honor_cipher_order()} |
{honor_ecc_order, honor_ecc_order()} |
{client_renegotiation, client_renegotiation()}|
- {signature_algs, server_signature_algs()} |
{session_tickets, server_session_tickets()} |
{anti_replay, anti_replay()} |
{cookie, cookie()} |
@@ -465,7 +469,6 @@
-type dh_file() :: file:filename().
-type server_verify_type() :: verify_type().
-type fail_if_no_peer_cert() :: boolean().
--type server_signature_algs() :: signature_algs().
-type server_reuse_session() :: fun().
-type server_reuse_sessions() :: boolean().
-type sni_hosts() :: [{hostname(), [server_option() | common_option()]}].
@@ -986,7 +989,7 @@ negotiated_protocol(#sslsocket{pid = [Pid|_]}) when is_pid(Pid) ->
%%--------------------------------------------------------------------
-spec cipher_suites(Description, Version) -> ciphers() when
- Description :: default | all | exclusive | anonymous,
+ Description :: default | all | exclusive | anonymous | exclusive_anonymous,
Version :: protocol_version().
%% Description: Returns all default and all supported cipher suites for a
@@ -1483,12 +1486,18 @@ str_to_suite(CipherSuiteName) ->
%%%--------------------------------------------------------------------
supported_suites(exclusive, {3,Minor}) ->
tls_v1:exclusive_suites(Minor);
+supported_suites(exclusive, {254, Minor}) ->
+ dtls_v1:exclusive_suites(Minor);
supported_suites(default, Version) ->
ssl_cipher:suites(Version);
supported_suites(all, Version) ->
ssl_cipher:all_suites(Version);
-supported_suites(anonymous, Version) ->
- ssl_cipher:anonymous_suites(Version).
+supported_suites(anonymous, Version) ->
+ ssl_cipher:anonymous_suites(Version);
+supported_suites(exclusive_anonymous, {3, Minor}) ->
+ tls_v1:exclusive_anonymous_suites(Minor);
+supported_suites(exclusive_anonymous, {254, Minor}) ->
+ dtls_v1:exclusive_anonymous_suites(Minor).
do_listen(Port, #config{transport_info = {Transport, _, _, _,_}} = Config, tls_gen_connection) ->
tls_socket:listen(Transport, Port, Config);
@@ -1782,12 +1791,12 @@ handle_option(session_tickets = Option, Value0, #{versions := Versions} = Option
assert_option_dependency(Option, versions, Versions, ['tlsv1.3']),
Value = validate_option(Option, Value0, Role),
OptionsMap#{Option => Value};
-handle_option(signature_algs = Option, unbound, #{versions := [HighestVersion|_]} = OptionsMap, #{role := Role}) ->
+handle_option(signature_algs = Option, unbound, #{versions := [HighestVersion | _] = Versions} = OptionsMap, #{role := Role}) ->
Value =
handle_hashsigns_option(
default_option_role_sign_algs(
server,
- tls_v1:default_signature_algs(HighestVersion),
+ tls_v1:default_signature_algs(Versions),
Role,
HighestVersion),
tls_version(HighestVersion)),
@@ -2434,7 +2443,7 @@ handle_hashsigns_option(Value, Version) when is_list(Value)
Value
end;
handle_hashsigns_option(_, Version) when Version =:= {3, 3} ->
- handle_hashsigns_option(tls_v1:default_signature_algs(Version), Version);
+ handle_hashsigns_option(tls_v1:default_signature_algs([Version]), Version);
handle_hashsigns_option(_, _Version) ->
undefined.
@@ -2579,9 +2588,8 @@ binary_cipher_suites(Versions, [Map|_] = Ciphers0) when is_map(Map) ->
binary_cipher_suites(Versions, [Tuple|_] = Ciphers0) when is_tuple(Tuple) ->
Ciphers = [ssl_cipher_format:suite_map_to_bin(tuple_to_map(C)) || C <- Ciphers0],
binary_cipher_suites(Versions, Ciphers);
-binary_cipher_suites([Version |_] = Versions, [Cipher0 | _] = Ciphers0) when is_binary(Cipher0) ->
- All = ssl_cipher:all_suites(Version) ++
- ssl_cipher:anonymous_suites(Version),
+binary_cipher_suites(Versions, [Cipher0 | _] = Ciphers0) when is_binary(Cipher0) ->
+ All = all_suites(Versions),
case [Cipher || Cipher <- Ciphers0, lists:member(Cipher, All)] of
[] ->
%% Defaults to all supported suites that does
@@ -2604,6 +2612,16 @@ default_binary_suites(exclusive, {_, Minor}) ->
default_binary_suites(default, Version) ->
ssl_cipher:filter_suites(ssl_cipher:suites(Version)).
+all_suites([{3, 4 = Minor}]) ->
+ tls_v1:exclusive_suites(Minor);
+all_suites([{3, 4} = Version0, Version1 |_]) ->
+ all_suites([Version0]) ++
+ ssl_cipher:all_suites(Version1) ++
+ ssl_cipher:anonymous_suites(Version1);
+all_suites([Version|_]) ->
+ ssl_cipher:all_suites(Version) ++
+ ssl_cipher:anonymous_suites(Version).
+
tuple_to_map({Kex, Cipher, Mac}) ->
#{key_exchange => Kex,
cipher => Cipher,
diff --git a/lib/ssl/src/ssl_certificate.erl b/lib/ssl/src/ssl_certificate.erl
index 6afad3b9c0..cbeb4e4521 100644
--- a/lib/ssl/src/ssl_certificate.erl
+++ b/lib/ssl/src/ssl_certificate.erl
@@ -263,16 +263,21 @@ extensions_list(Extensions) ->
Extensions.
%%--------------------------------------------------------------------
--spec public_key_type(term()) -> rsa | dsa | ec.
+-spec public_key_type(term()) -> rsa | rsa_pss_pss | dsa | ecdsa | eddsa.
%%
%% Description:
%%--------------------------------------------------------------------
+public_key_type(?'id-RSASSA-PSS') ->
+ rsa_pss_pss;
public_key_type(?'rsaEncryption') ->
rsa;
public_key_type(?'id-dsa') ->
dsa;
public_key_type(?'id-ecPublicKey') ->
- ec.
+ ecdsa;
+public_key_type(Oid) ->
+ {_, Sign} = public_key:pkix_sign_types(Oid),
+ Sign.
%%--------------------------------------------------------------------
-spec foldl_db(fun(), db_handle() | {extracted, list()}, list()) ->
@@ -519,21 +524,34 @@ verify_cert_extensions(Cert, UserState, [_|Exts], Context) ->
verify_sign(_, #{version := {_, Minor}}) when Minor < 3 ->
%% This verification is not applicable pre TLS-1.2
true;
-verify_sign(Cert, #{signature_algs := SignAlgs,
+verify_sign(Cert, #{version := {3, 3},
+ signature_algs := SignAlgs,
signature_algs_cert := undefined}) ->
- is_supported_signature_algorithm(Cert, SignAlgs);
-verify_sign(Cert, #{signature_algs_cert := SignAlgs}) ->
- is_supported_signature_algorithm(Cert, SignAlgs).
-
-is_supported_signature_algorithm(#'OTPCertificate'{signatureAlgorithm =
- #'SignatureAlgorithm'{algorithm = ?'id-dsa-with-sha1'}},
- [{_,_}|_] = SignAlgs) ->
+ is_supported_signature_algorithm_1_2(Cert, SignAlgs);
+verify_sign(Cert, #{version := {3, 3},
+ signature_algs_cert := SignAlgs}) ->
+ is_supported_signature_algorithm_1_2(Cert, SignAlgs);
+verify_sign(Cert, #{version := {3, 4},
+ signature_algs := SignAlgs,
+ signature_algs_cert := undefined}) ->
+ is_supported_signature_algorithm_1_3(Cert, SignAlgs);
+verify_sign(Cert, #{version := {3, 4},
+ signature_algs_cert := SignAlgs}) ->
+ is_supported_signature_algorithm_1_3(Cert, SignAlgs).
+
+is_supported_signature_algorithm_1_2(#'OTPCertificate'{signatureAlgorithm =
+ #'SignatureAlgorithm'{algorithm = ?'id-dsa-with-sha1'}},
+ SignAlgs) ->
lists:member({sha, dsa}, SignAlgs);
-is_supported_signature_algorithm(#'OTPCertificate'{signatureAlgorithm = SignAlg}, [{_,_}|_] = SignAlgs) ->
+is_supported_signature_algorithm_1_2(#'OTPCertificate'{signatureAlgorithm =
+ #'SignatureAlgorithm'{algorithm = ?'id-RSASSA-PSS'}} = Cert,
+ SignAlgs) ->
+ is_supported_signature_algorithm_1_3(Cert, SignAlgs);
+is_supported_signature_algorithm_1_2(#'OTPCertificate'{signatureAlgorithm = SignAlg}, SignAlgs) ->
Scheme = ssl_cipher:signature_algorithm_to_scheme(SignAlg),
{Hash, Sign, _ } = ssl_cipher:scheme_to_components(Scheme),
- lists:member({pre_1_3_hash(Hash), pre_1_3_sign(Sign)}, SignAlgs);
-is_supported_signature_algorithm(#'OTPCertificate'{signatureAlgorithm = SignAlg}, SignAlgs) ->
+ lists:member({pre_1_3_hash(Hash), pre_1_3_sign(Sign)}, SignAlgs).
+is_supported_signature_algorithm_1_3(#'OTPCertificate'{signatureAlgorithm = SignAlg}, SignAlgs) ->
Scheme = ssl_cipher:signature_algorithm_to_scheme(SignAlg),
lists:member(Scheme, SignAlgs).
diff --git a/lib/ssl/src/ssl_cipher.erl b/lib/ssl/src/ssl_cipher.erl
index 8e08fb2a4e..35b2da773b 100644
--- a/lib/ssl/src/ssl_cipher.erl
+++ b/lib/ssl/src/ssl_cipher.erl
@@ -44,18 +44,11 @@
aead_encrypt/6,
aead_decrypt/6,
suites/1,
- all_suites/1,
+ all_suites/1,
crypto_support_filters/0,
- anonymous_suites/1,
- psk_suites/1,
- psk_suites_anon/1,
- srp_suites/1,
- srp_suites_anon/1,
- rc4_suites/1,
- des_suites/1,
- rsa_suites/1,
- filter/3,
- filter_suites/1,
+ anonymous_suites/1,
+ filter/3,
+ filter_suites/1,
filter_suites/2,
hash_algorithm/1,
sign_algorithm/1,
@@ -328,15 +321,20 @@ suites({3, Minor}) ->
tls_v1:suites(Minor);
suites({_, Minor}) ->
dtls_v1:suites(Minor).
-
+all_suites({3, 4} = Version) ->
+ suites(Version)
+ ++ tls_v1:psk_suites({3,3})
+ ++ tls_v1:srp_suites({3,3})
+ ++ tls_v1:rsa_suites({3,3})
+ ++ tls_v1:des_suites({3,3})
+ ++ tls_v1:rc4_suites({3,3});
all_suites({3, _} = Version) ->
suites(Version)
- ++ psk_suites(Version)
- ++ srp_suites(Version)
- ++ rsa_suites(Version)
- ++ des_suites(Version)
- ++ rc4_suites(Version);
-
+ ++ tls_v1:psk_suites(Version)
+ ++ tls_v1:srp_suites(Version)
+ ++ tls_v1:rsa_suites(Version)
+ ++ tls_v1:des_suites(Version)
+ ++ tls_v1:rc4_suites(Version);
all_suites(Version) ->
dtls_v1:all_suites(Version).
@@ -347,202 +345,20 @@ all_suites(Version) ->
%% Description: Returns a list of the anonymous cipher suites, only supported
%% if explicitly set by user. Intended only for testing.
%%--------------------------------------------------------------------
-anonymous_suites({3, N} = Version) ->
- srp_suites_anon(Version) ++ anonymous_suites(N);
+anonymous_suites({3, N}) ->
+ anonymous_suites(N);
anonymous_suites({254, _} = Version) ->
dtls_v1:anonymous_suites(Version);
-anonymous_suites(4) ->
- []; %% Raw public key negotiation may be used instead
-anonymous_suites( 3 = N) ->
- psk_suites_anon(N) ++
- [?TLS_DH_anon_WITH_AES_128_GCM_SHA256,
- ?TLS_DH_anon_WITH_AES_256_GCM_SHA384,
- ?TLS_DH_anon_WITH_AES_128_CBC_SHA256,
- ?TLS_DH_anon_WITH_AES_256_CBC_SHA256,
- ?TLS_ECDH_anon_WITH_AES_128_CBC_SHA,
- ?TLS_ECDH_anon_WITH_AES_256_CBC_SHA,
- ?TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA,
- ?TLS_DH_anon_WITH_RC4_128_MD5];
-anonymous_suites(2 = N) ->
- psk_suites_anon(N) ++
- [?TLS_ECDH_anon_WITH_AES_128_CBC_SHA,
- ?TLS_ECDH_anon_WITH_AES_256_CBC_SHA,
- ?TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA,
- ?TLS_DH_anon_WITH_DES_CBC_SHA,
- ?TLS_DH_anon_WITH_RC4_128_MD5];
-anonymous_suites(N) when N == 0;
- N == 1 ->
- psk_suites_anon(N) ++
- [?TLS_DH_anon_WITH_RC4_128_MD5,
- ?TLS_DH_anon_WITH_3DES_EDE_CBC_SHA,
- ?TLS_DH_anon_WITH_DES_CBC_SHA
- ].
-
-%%--------------------------------------------------------------------
--spec psk_suites(ssl_record:ssl_version() | integer()) -> [ssl_cipher_format:cipher_suite()].
-%%
-%% Description: Returns a list of the PSK cipher suites, only supported
-%% if explicitly set by user.
-%%--------------------------------------------------------------------
-psk_suites({3, N}) ->
- psk_suites(N);
-psk_suites(4) ->
- []; %% TODO Add new PSK, PSK_(EC)DHE suites
-psk_suites(3) ->
- [
- ?TLS_RSA_PSK_WITH_AES_256_GCM_SHA384,
- ?TLS_RSA_PSK_WITH_AES_256_CBC_SHA384,
- ?TLS_RSA_PSK_WITH_AES_128_GCM_SHA256,
- ?TLS_RSA_PSK_WITH_AES_128_CBC_SHA256
- ] ++ psk_suites(0);
-psk_suites(_) ->
- [?TLS_RSA_PSK_WITH_AES_256_CBC_SHA,
- ?TLS_RSA_PSK_WITH_AES_128_CBC_SHA,
- ?TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA,
- ?TLS_RSA_PSK_WITH_RC4_128_SHA].
-
-%%--------------------------------------------------------------------
--spec psk_suites_anon(ssl_record:ssl_version() | integer()) -> [ssl_cipher_format:cipher_suite()].
-%%
-%% Description: Returns a list of the anonymous PSK cipher suites, only supported
-%% if explicitly set by user.
-%%--------------------------------------------------------------------
-psk_suites_anon({3, N}) ->
- psk_suites_anon(N);
-psk_suites_anon(3 = N) ->
- [
- ?TLS_DHE_PSK_WITH_AES_256_GCM_SHA384,
- ?TLS_PSK_WITH_AES_256_GCM_SHA384,
- ?TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384,
- ?TLS_DHE_PSK_WITH_AES_256_CBC_SHA384,
- ?TLS_PSK_WITH_AES_256_CBC_SHA384,
- ?TLS_DHE_PSK_WITH_AES_256_CCM,
- ?TLS_PSK_DHE_WITH_AES_256_CCM_8,
- ?TLS_PSK_WITH_AES_256_CCM,
- ?TLS_PSK_WITH_AES_256_CCM_8,
- ?TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256,
- ?TLS_ECDHE_PSK_WITH_AES_128_CCM_SHA256,
- ?TLS_ECDHE_PSK_WITH_AES_128_CCM_8_SHA256,
- ?TLS_DHE_PSK_WITH_AES_128_GCM_SHA256,
- ?TLS_PSK_WITH_AES_128_GCM_SHA256,
- ?TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256,
- ?TLS_ECDHE_PSK_WITH_AES_128_CCM_8_SHA256,
- ?TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,
- ?TLS_DHE_PSK_WITH_AES_128_CBC_SHA256,
- ?TLS_PSK_WITH_AES_128_CBC_SHA256,
- ?TLS_DHE_PSK_WITH_AES_128_CCM,
- ?TLS_PSK_DHE_WITH_AES_128_CCM_8,
- ?TLS_PSK_WITH_AES_128_CCM,
- ?TLS_PSK_WITH_AES_128_CCM_8,
- ?TLS_ECDHE_PSK_WITH_RC4_128_SHA
- ] ++ psk_suites_anon(N-1);
-psk_suites_anon(N) when N > 0 ->
- [?TLS_DHE_PSK_WITH_AES_256_CBC_SHA,
- ?TLS_PSK_WITH_AES_256_CBC_SHA,
- ?TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA,
- ?TLS_DHE_PSK_WITH_AES_128_CBC_SHA,
- ?TLS_PSK_WITH_AES_128_CBC_SHA,
- ?TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA,
- ?TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA,
- ?TLS_PSK_WITH_3DES_EDE_CBC_SHA,
- ?TLS_ECDHE_PSK_WITH_RC4_128_SHA,
- ?TLS_DHE_PSK_WITH_RC4_128_SHA,
- ?TLS_PSK_WITH_RC4_128_SHA];
-psk_suites_anon(0) ->
- [].
-%%--------------------------------------------------------------------
--spec srp_suites(tls_record:tls_version()) -> [ssl_cipher_format:cipher_suite()].
-%%
-%% Description: Returns a list of the SRP cipher suites, only supported
-%% if explicitly set by user.
-%%--------------------------------------------------------------------
-srp_suites(_) ->
- [?TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA,
- ?TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA,
- ?TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA,
- ?TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA,
- ?TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA,
- ?TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA].
-
-%%--------------------------------------------------------------------
--spec srp_suites_anon(tls_record:tls_version()) -> [ssl_cipher_format:cipher_suite()].
-%%
-%% Description: Returns a list of the SRP anonymous cipher suites, only supported
-%% if explicitly set by user.
-%%--------------------------------------------------------------------
-srp_suites_anon(_) ->
- [?TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA,
- ?TLS_SRP_SHA_WITH_AES_128_CBC_SHA,
- ?TLS_SRP_SHA_WITH_AES_256_CBC_SHA].
-%%--------------------------------------------------------------------
--spec rc4_suites(Version::ssl_record:ssl_version() | integer()) ->
- [ssl_cipher_format:cipher_suite()].
-%%
-%% Description: Returns a list of the RSA|(ECDH/RSA)| (ECDH/ECDSA)
-%% with RC4 cipher suites, only supported if explicitly set by user.
-%% Are not considered secure any more. Other RC4 suites already
-%% belonged to the user configured only category.
-%%--------------------------------------------------------------------
-rc4_suites({3, 0}) ->
- rc4_suites(0);
-rc4_suites({3, Minor}) ->
- rc4_suites(Minor) ++ rc4_suites(0);
-rc4_suites(0) ->
- [?TLS_RSA_WITH_RC4_128_SHA,
- ?TLS_RSA_WITH_RC4_128_MD5];
-rc4_suites(N) when N =< 4 ->
- [?TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
- ?TLS_ECDHE_RSA_WITH_RC4_128_SHA,
- ?TLS_ECDH_ECDSA_WITH_RC4_128_SHA,
- ?TLS_ECDH_RSA_WITH_RC4_128_SHA].
+anonymous_suites(1 = N) ->
+ tls_v1:exclusive_anonymous_suites(N);
+anonymous_suites(4 = N) ->
+ tls_v1:exclusive_anonymous_suites(N);
+anonymous_suites(N) when N > 1->
+ tls_v1:exclusive_anonymous_suites(N) ++ anonymous_suites(N-1).
%%--------------------------------------------------------------------
--spec des_suites(Version::ssl_record:ssl_version()) -> [ssl_cipher_format:cipher_suite()].
-%%
-%% Description: Returns a list of the cipher suites
-%% with DES cipher, only supported if explicitly set by user.
-%% Are not considered secure any more.
-%%--------------------------------------------------------------------
-des_suites(_)->
- [?TLS_DHE_RSA_WITH_DES_CBC_SHA,
- ?TLS_RSA_WITH_DES_CBC_SHA,
- ?TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
- ?TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
- ?TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
- ?TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,
- ?TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,
- ?TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
- ].
-
-%%--------------------------------------------------------------------
--spec rsa_suites(Version::ssl_record:ssl_version() | integer()) -> [ssl_cipher_format:cipher_suite()].
-%%
-%% Description: Returns a list of the RSA key exchange
-%% cipher suites, only supported if explicitly set by user.
-%% Are not considered secure any more.
-%%--------------------------------------------------------------------
-rsa_suites({3, 0}) ->
- rsa_suites(0);
-rsa_suites({3, Minor}) ->
- rsa_suites(Minor) ++ rsa_suites(0);
-rsa_suites(0) ->
- [?TLS_RSA_WITH_AES_256_CBC_SHA,
- ?TLS_RSA_WITH_AES_128_CBC_SHA,
- ?TLS_RSA_WITH_3DES_EDE_CBC_SHA
- ];
-rsa_suites(N) when N >= 3 ->
- [
- ?TLS_RSA_WITH_AES_256_GCM_SHA384,
- ?TLS_RSA_WITH_AES_256_CBC_SHA256,
- ?TLS_RSA_WITH_AES_128_GCM_SHA256,
- ?TLS_RSA_WITH_AES_128_CBC_SHA256
- ];
-rsa_suites(_) ->
- [].
-
-%%--------------------------------------------------------------------
--spec filter(undefined | binary(), [ssl_cipher_format:cipher_suite()],
+-spec filter(undefined | binary(), [ssl_cipher_format:cipher_suite()],
ssl_record:ssl_version()) -> [ssl_cipher_format:cipher_suite()].
%%
%% Description: Select the cipher suites that can be used together with the
@@ -555,11 +371,15 @@ filter(DerCert, Ciphers0, Version) ->
SigAlg = OtpCert#'OTPCertificate'.signatureAlgorithm,
PubKeyInfo = OtpCert#'OTPCertificate'.tbsCertificate#'OTPTBSCertificate'.subjectPublicKeyInfo,
PubKeyAlg = PubKeyInfo#'OTPSubjectPublicKeyInfo'.algorithm,
-
- Ciphers = filter_suites_pubkey(
- ssl_certificate:public_key_type(PubKeyAlg#'PublicKeyAlgorithm'.algorithm),
- Ciphers0, Version, OtpCert),
- {_, Sign} = public_key:pkix_sign_types(SigAlg#'SignatureAlgorithm'.algorithm),
+ Type = case ssl_certificate:public_key_type(PubKeyAlg#'PublicKeyAlgorithm'.algorithm) of
+ rsa_pss_pss ->
+ rsa;
+ Other ->
+ Other
+ end,
+ Ciphers = filter_suites_pubkey(Type, Ciphers0, Version, OtpCert),
+ SigAlgo = SigAlg#'SignatureAlgorithm'.algorithm,
+ Sign = ssl_certificate:public_key_type(SigAlgo),
filter_suites_signature(Sign, Ciphers, Version).
%%--------------------------------------------------------------------
@@ -1174,7 +994,7 @@ filter_suites_pubkey(dsa, Ciphers, _, OtpCert) ->
NotECRSAKeyed = (Ciphers -- rsa_keyed_suites(Ciphers)) -- ec_keyed_suites(Ciphers),
filter_keyuse_suites(digitalSignature, KeyUses, NotECRSAKeyed,
dss_dhe_suites(Ciphers));
-filter_suites_pubkey(ec, Ciphers, _, OtpCert) ->
+filter_suites_pubkey(ecdsa, Ciphers, _, OtpCert) ->
Uses = key_uses(OtpCert),
NotRSADSAKeyed = (Ciphers -- rsa_keyed_suites(Ciphers)) -- dss_keyed_suites(Ciphers),
CiphersSuites = filter_keyuse_suites(digitalSignature, Uses, NotRSADSAKeyed,
diff --git a/lib/ssl/src/ssl_handshake.erl b/lib/ssl/src/ssl_handshake.erl
index 32436fdae0..f7dc641fb3 100644
--- a/lib/ssl/src/ssl_handshake.erl
+++ b/lib/ssl/src/ssl_handshake.erl
@@ -371,8 +371,8 @@ certificate_verify(_, _, _, undefined, _, _) ->
certificate_verify(Signature, PublicKeyInfo, Version,
HashSign = {HashAlgo, _}, MasterSecret, {_, Handshake}) ->
- Hash = calc_certificate_verify(Version, HashAlgo, MasterSecret, Handshake),
- case verify_signature(Version, Hash, HashSign, Signature, PublicKeyInfo) of
+ Msg = calc_certificate_verify(Version, HashAlgo, MasterSecret, Handshake),
+ case verify_signature(Version, Msg, HashSign, Signature, PublicKeyInfo) of
true ->
valid;
_ ->
@@ -384,39 +384,32 @@ certificate_verify(Signature, PublicKeyInfo, Version,
%%
%% Description: Checks that a public_key signature is valid.
%%--------------------------------------------------------------------
-verify_signature({3, 4}, Hash, {HashAlgo, SignAlgo}, Signature,
+verify_signature(_, Msg, {HashAlgo, SignAlgo}, Signature,
{_, PubKey, PubKeyParams}) when SignAlgo == rsa_pss_rsae;
SignAlgo == rsa_pss_pss ->
Options = verify_options(SignAlgo, HashAlgo, PubKeyParams),
- public_key:verify(Hash, HashAlgo, Signature, PubKey, Options);
-verify_signature({3, 3}, Hash, {HashAlgo, SignAlgo}, Signature,
- {_, PubKey, PubKeyParams}) when SignAlgo == rsa_pss_rsae;
- SignAlgo == rsa_pss_pss ->
- Options = verify_options(SignAlgo, HashAlgo, PubKeyParams),
- public_key:verify({digest, Hash}, HashAlgo, Signature, PubKey, Options);
-verify_signature({3, Minor}, Hash, {HashAlgo, SignAlgo}, Signature, {?rsaEncryption, PubKey, PubKeyParams})
+ public_key:verify(Msg, HashAlgo, Signature, PubKey, Options);
+verify_signature({3, Minor}, Msg, {HashAlgo, SignAlgo}, Signature, {?rsaEncryption, PubKey, PubKeyParams})
when Minor >= 3 ->
Options = verify_options(SignAlgo, HashAlgo, PubKeyParams),
- public_key:verify({digest, Hash}, HashAlgo, Signature, PubKey, Options);
-verify_signature({3, Minor}, Hash, _HashAlgo, Signature, {?rsaEncryption, PubKey, _PubKeyParams}) when Minor =< 2 ->
+ public_key:verify(Msg, HashAlgo, Signature, PubKey, Options);
+verify_signature({3, Minor}, {digest, Digest}, _HashAlgo, Signature, {?rsaEncryption, PubKey, _PubKeyParams}) when Minor =< 2 ->
case public_key:decrypt_public(Signature, PubKey,
[{rsa_pad, rsa_pkcs1_padding}]) of
- Hash -> true;
+ Digest -> true;
_ -> false
end;
-verify_signature({3, 4}, Hash, {HashAlgo, _SignAlgo}, Signature, {?'id-ecPublicKey', PubKey, PubKeyParams}) ->
- public_key:verify(Hash, HashAlgo, Signature, {PubKey, PubKeyParams});
verify_signature({3, 4}, Msg, {_, eddsa}, Signature, {?'id-Ed25519', PubKey, PubKeyParams}) ->
public_key:verify(Msg, none, Signature, {PubKey, PubKeyParams});
verify_signature({3, 4}, Msg, {_, eddsa}, Signature, {?'id-Ed448', PubKey, PubKeyParams}) ->
public_key:verify(Msg, none, Signature, {PubKey, PubKeyParams});
-verify_signature(_, Hash, {HashAlgo, _SignAlg}, Signature,
+verify_signature(_, Msg, {HashAlgo, _SignAlg}, Signature,
{?'id-ecPublicKey', PublicKey, PublicKeyParams}) ->
- public_key:verify({digest, Hash}, HashAlgo, Signature, {PublicKey, PublicKeyParams});
-verify_signature({3, Minor}, _Hash, {_HashAlgo, anon}, _Signature, _) when Minor =< 3 ->
+ public_key:verify(Msg, HashAlgo, Signature, {PublicKey, PublicKeyParams});
+verify_signature({3, Minor}, _Msg, {_HashAlgo, anon}, _Signature, _) when Minor =< 3 ->
true;
-verify_signature({3, Minor}, Hash, {HashAlgo, dsa}, Signature, {?'id-dsa', PublicKey, PublicKeyParams}) when Minor =< 3->
- public_key:verify({digest, Hash}, HashAlgo, Signature, {PublicKey, PublicKeyParams}).
+verify_signature({3, Minor}, Msg, {HashAlgo, dsa}, Signature, {?'id-dsa', PublicKey, PublicKeyParams}) when Minor =< 3->
+ public_key:verify(Msg, HashAlgo, Signature, {PublicKey, PublicKeyParams}).
%%--------------------------------------------------------------------
-spec master_secret(ssl_record:ssl_version(), #session{} | binary(), ssl_record:connection_states(),
@@ -454,17 +447,18 @@ master_secret(Version, PremasterSecret, ConnectionStates, Role) ->
end.
%%--------------------------------------------------------------------
--spec server_key_exchange_hash(md5sha | md5 | sha | sha224 |sha256 | sha384 | sha512, binary()) -> binary().
+-spec server_key_exchange_hash(md5sha | sha | sha224 |sha256 | sha384 | sha512, binary()) -> binary() | {digest, binary()}.
%%
-%% Description: Calculate server key exchange hash
+%% Description: Calculate the digest of the server key exchange hash if it is complex
%%--------------------------------------------------------------------
server_key_exchange_hash(md5sha, Value) ->
MD5 = crypto:hash(md5, Value),
SHA = crypto:hash(sha, Value),
- <<MD5/binary, SHA/binary>>;
+ {digest, <<MD5/binary, SHA/binary>>};
-server_key_exchange_hash(Hash, Value) ->
- crypto:hash(Hash, Value).
+server_key_exchange_hash(_, Value) ->
+ %% Optimization: Let crypto calculate the hash in sign/verify call
+ Value.
%%--------------------------------------------------------------------
-spec verify_connection(ssl_record:ssl_version(), #finished{}, client | server, integer(), binary(),
@@ -509,10 +503,11 @@ verify_server_key(#server_key_params{params_bin = EncParams,
ssl_record:pending_connection_state(ConnectionStates, read),
#security_parameters{client_random = ClientRandom,
server_random = ServerRandom} = SecParams,
+
Hash = server_key_exchange_hash(HashAlgo,
- <<ClientRandom/binary,
- ServerRandom/binary,
- EncParams/binary>>),
+ <<ClientRandom/binary,
+ ServerRandom/binary,
+ EncParams/binary>>),
verify_signature(Version, Hash, HashSign, Signature, PubKeyInfo).
select_version(RecordCB, ClientVersion, Versions) ->
@@ -567,8 +562,9 @@ encode_handshake(#certificate_request{certificate_types = CertTypes,
certificate_authorities = CertAuths},
{Major, Minor})
when Major == 3, Minor >= 3 ->
- HashSigns= << <<(ssl_cipher:hash_algorithm(Hash)):8, (ssl_cipher:sign_algorithm(Sign)):8>> ||
- {Hash, Sign} <- HashSignAlgos >>,
+
+ HashSigns = << <<(ssl_cipher:signature_scheme(SignatureScheme)):16 >> ||
+ SignatureScheme <- HashSignAlgos >>,
CertTypesLen = byte_size(CertTypes),
HashSignsLen = byte_size(HashSigns),
CertAuthsLen = byte_size(CertAuths),
@@ -863,13 +859,12 @@ decode_handshake(_Version, ?CERTIFICATE_STATUS, <<?BYTE(?CERTIFICATE_STATUS_TYPE
response = ASN1OcspResponse};
decode_handshake(_Version, ?SERVER_KEY_EXCHANGE, Keys) ->
#server_key_exchange{exchange_keys = Keys};
-decode_handshake({Major, Minor}, ?CERTIFICATE_REQUEST,
+decode_handshake({Major, Minor} = Version, ?CERTIFICATE_REQUEST,
<<?BYTE(CertTypesLen), CertTypes:CertTypesLen/binary,
?UINT16(HashSignsLen), HashSigns:HashSignsLen/binary,
?UINT16(CertAuthsLen), CertAuths:CertAuthsLen/binary>>)
when Major >= 3, Minor >= 3 ->
- HashSignAlgos = [{ssl_cipher:hash_algorithm(Hash), ssl_cipher:sign_algorithm(Sign)} ||
- <<?BYTE(Hash), ?BYTE(Sign)>> <= HashSigns],
+ HashSignAlgos = decode_sign_alg(Version, HashSigns),
#certificate_request{certificate_types = CertTypes,
hashsign_algorithms = #hash_sign_algos{hash_sign_algos = HashSignAlgos},
certificate_authorities = CertAuths};
@@ -991,7 +986,12 @@ available_suites(ServerCert, UserSuites, Version, HashSigns, Curve) ->
available_signature_algs(undefined, _) ->
undefined;
available_signature_algs(SupportedHashSigns, Version) when Version >= {3, 3} ->
- #hash_sign_algos{hash_sign_algos = SupportedHashSigns};
+ case contains_scheme(SupportedHashSigns) of
+ true ->
+ #signature_algorithms{signature_scheme_list = SupportedHashSigns};
+ false ->
+ #hash_sign_algos{hash_sign_algos = SupportedHashSigns}
+ end;
available_signature_algs(_, _) ->
undefined.
available_signature_algs(undefined, SupportedHashSigns, _, Version) when
@@ -1004,6 +1004,13 @@ available_signature_algs(#hash_sign_algos{hash_sign_algos = ClientHashSigns}, Su
available_signature_algs(_, _, _, _) ->
undefined.
+contains_scheme([]) ->
+ false;
+contains_scheme([Scheme | _]) when is_atom(Scheme) ->
+ true;
+contains_scheme([_| Rest]) ->
+ contains_scheme(Rest).
+
cipher_suites(Suites, Renegotiation, true) ->
%% TLS_FALLBACK_SCSV should be placed last -RFC7507
cipher_suites(Suites, Renegotiation) ++ [?TLS_FALLBACK_SCSV];
@@ -1174,18 +1181,22 @@ add_common_extensions({3,4},
_CipherSuites,
#{eccs := SupportedECCs,
supported_groups := Groups,
- signature_algs := SignatureSchemes}) ->
+ signature_algs := SignatureSchemes,
+ signature_algs_cert := SignatureCertSchemes}) ->
{EcPointFormats, _} =
client_ecc_extensions(SupportedECCs),
HelloExtensions#{ec_point_formats => EcPointFormats,
elliptic_curves => Groups,
- signature_algs => signature_algs_ext(SignatureSchemes)};
+ signature_algs => signature_algs_ext(SignatureSchemes),
+ signature_algs_cert =>
+ signature_algs_cert(SignatureCertSchemes)};
add_common_extensions(Version,
HelloExtensions,
CipherSuites,
#{eccs := SupportedECCs,
- signature_algs := SupportedHashSigns}) ->
+ signature_algs := SupportedHashSigns,
+ signature_algs_cert := SignatureCertSchemes}) ->
{EcPointFormats, EllipticCurves} =
case advertises_ec_ciphers(
@@ -1198,20 +1209,18 @@ add_common_extensions(Version,
end,
HelloExtensions#{ec_point_formats => EcPointFormats,
elliptic_curves => EllipticCurves,
- signature_algs => available_signature_algs(SupportedHashSigns, Version)}.
-
+ signature_algs => available_signature_algs(SupportedHashSigns, Version),
+ signature_algs_cert =>
+ signature_algs_cert(SignatureCertSchemes)}.
maybe_add_tls13_extensions({3,4},
HelloExtensions0,
- #{signature_algs_cert := SignatureSchemes,
- versions := SupportedVersions},
+ #{versions := SupportedVersions},
KeyShare,
TicketData) ->
HelloExtensions1 =
HelloExtensions0#{client_hello_versions =>
- #client_hello_versions{versions = SupportedVersions},
- signature_algs_cert =>
- signature_algs_cert(SignatureSchemes)},
+ #client_hello_versions{versions = SupportedVersions}},
HelloExtensions = maybe_add_key_share(HelloExtensions1, KeyShare),
maybe_add_pre_shared_key(HelloExtensions, TicketData);
maybe_add_tls13_extensions(_, HelloExtensions, _, _, _) ->
@@ -1505,18 +1514,16 @@ select_hashsign(_, _, KeyExAlgo, _, _Version) when KeyExAlgo == dh_anon;
%% The signature_algorithms extension was introduced with TLS 1.2. Ignore it if we have
%% negotiated a lower version.
select_hashsign({ClientHashSigns, ClientSignatureSchemes},
- Cert, KeyExAlgo, undefined, {Major, Minor} = Version)
- when Major >= 3 andalso Minor >= 3->
+ Cert, KeyExAlgo, undefined, {3, 3} = Version) ->
select_hashsign({ClientHashSigns, ClientSignatureSchemes}, Cert, KeyExAlgo,
- tls_v1:default_signature_algs(Version), Version);
+ tls_v1:default_signature_algs([Version]), Version);
select_hashsign({#hash_sign_algos{hash_sign_algos = ClientHashSigns},
ClientSignatureSchemes0},
- Cert, KeyExAlgo, SupportedHashSigns, {Major, Minor})
- when Major >= 3 andalso Minor >= 3 ->
+ Cert, KeyExAlgo, SupportedHashSigns, {3, 3}) ->
ClientSignatureSchemes = get_signature_scheme(ClientSignatureSchemes0),
{SignAlgo0, Param, PublicKeyAlgo0, _, _} = get_cert_params(Cert),
- SignAlgo = sign_algo(SignAlgo0),
- PublicKeyAlgo = public_key_algo(PublicKeyAlgo0),
+ SignAlgo = sign_algo(SignAlgo0, Param),
+ PublicKeyAlgo = ssl_certificate:public_key_type(PublicKeyAlgo0),
%% RFC 5246 (TLS 1.2)
%% If the client provided a "signature_algorithms" extension, then all
@@ -1536,15 +1543,17 @@ select_hashsign({#hash_sign_algos{hash_sign_algos = ClientHashSigns},
%% signatures appearing in certificates.
case is_supported_sign(SignAlgo, Param, ClientHashSigns, ClientSignatureSchemes) of
true ->
- case lists:filter(fun({_, S} = Algos) when S == PublicKeyAlgo ->
- is_acceptable_hash_sign(Algos, KeyExAlgo, SupportedHashSigns);
- (_) ->
- false
- end, ClientHashSigns) of
- [] ->
- ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_signature_algorithm);
- [HashSign | _] ->
- HashSign
+ case
+ (KeyExAlgo == psk) orelse
+ (KeyExAlgo == dhe_psk) orelse
+ (KeyExAlgo == ecdhe_psk) orelse
+ (KeyExAlgo == srp_anon) orelse
+ (KeyExAlgo == dh_anon) orelse
+ (KeyExAlgo == ecdhe_anon) of
+ true ->
+ ClientHashSigns;
+ false ->
+ do_select_hashsign(ClientHashSigns, PublicKeyAlgo, SupportedHashSigns)
end;
false ->
?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_signature_algorithm)
@@ -1569,30 +1578,19 @@ select_hashsign(#certificate_request{
SupportedHashSigns,
{Major, Minor}) when Major >= 3 andalso Minor >= 3->
{SignAlgo0, Param, PublicKeyAlgo0, _, _} = get_cert_params(Cert),
- SignAlgo = sign_algo(SignAlgo0),
- PublicKeyAlgo = public_key_algo(PublicKeyAlgo0),
-
+ SignAlgo = {_, KeyType} = sign_algo(SignAlgo0, Param),
+ PublicKeyAlgo = ssl_certificate:public_key_type(PublicKeyAlgo0),
+ SignatureSchemes = [Scheme || Scheme <- HashSigns, is_atom(Scheme), (KeyType == rsa_pss_pss) or (KeyType == rsa)],
case is_acceptable_cert_type(PublicKeyAlgo, Types) andalso
- %% certificate_request has no "signature_algorithms_cert"
- %% extension in TLS 1.2.
- is_supported_sign(SignAlgo, Param, HashSigns, undefined) of
+ is_supported_sign(SignAlgo, Param, HashSigns, SignatureSchemes) of
true ->
- case lists:filter(fun({_, S} = Algos) when S == PublicKeyAlgo ->
- is_acceptable_hash_sign(Algos, SupportedHashSigns);
- (_) ->
- false
- end, HashSigns) of
- [] ->
- ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_signature_algorithm);
- [HashSign | _] ->
- HashSign
- end;
+ do_select_hashsign(HashSigns, PublicKeyAlgo, SupportedHashSigns);
false ->
?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_signature_algorithm)
end;
select_hashsign(#certificate_request{certificate_types = Types}, Cert, _, Version) ->
{_, _, PublicKeyAlgo0, _, _} = get_cert_params(Cert),
- PublicKeyAlgo = public_key_algo(PublicKeyAlgo0),
+ PublicKeyAlgo = ssl_certificate:public_key_type(PublicKeyAlgo0),
%% Check cert even for TLS 1.0/1.1
case is_acceptable_cert_type(PublicKeyAlgo, Types) of
@@ -1603,6 +1601,23 @@ select_hashsign(#certificate_request{certificate_types = Types}, Cert, _, Versio
end.
+do_select_hashsign(HashSigns, PublicKeyAlgo, SupportedHashSigns) ->
+ case lists:filter(fun({H, rsa_pss_pss = S}) when S == PublicKeyAlgo ->
+ is_acceptable_hash_sign(list_to_existing_atom(atom_to_list(S) ++ "_" ++ atom_to_list(H)), SupportedHashSigns);
+ ({H, rsa_pss_rsae = S}) when PublicKeyAlgo == rsa ->
+ is_acceptable_hash_sign(list_to_existing_atom(atom_to_list(S) ++ "_" ++ atom_to_list(H)), SupportedHashSigns);
+ ({_, S} = Algos) when S == PublicKeyAlgo ->
+ is_acceptable_hash_sign(Algos, SupportedHashSigns);
+ (_A) ->
+ false
+ end, HashSigns) of
+ [] ->
+ ?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY, no_suitable_signature_algorithm);
+ [HashSign | _] ->
+ HashSign
+ end.
+
+
%% Gets the relevant parameters of a certificate:
%% - signature algorithm
%% - parameters of the signature algorithm
@@ -1723,7 +1738,7 @@ select_own_cert(undefined) ->
undefined.
get_signature_scheme(undefined) ->
- undefined;
+ [];
get_signature_scheme(#signature_algorithms_cert{
signature_scheme_list = ClientSignatureSchemes}) ->
ClientSignatureSchemes.
@@ -1751,10 +1766,9 @@ get_signature_scheme(#signature_algorithms_cert{
%% ECDHE_ECDSA), behave as if the client had sent value {sha1,ecdsa}.
%%--------------------------------------------------------------------
-select_hashsign_algs(HashSign, _, {Major, Minor}) when HashSign =/= undefined andalso
- Major >= 3 andalso Minor >= 3 ->
+select_hashsign_algs(HashSign, _, {3, 3}) when HashSign =/= undefined ->
HashSign;
-select_hashsign_algs(undefined, ?rsaEncryption, {Major, Minor}) when Major >= 3 andalso Minor >= 3 ->
+select_hashsign_algs(undefined, ?rsaEncryption, {3,3}) ->
{sha, rsa};
select_hashsign_algs(undefined,?'id-ecPublicKey', _) ->
{sha, ecdsa};
@@ -1989,8 +2003,9 @@ path_validation_alert({bad_cert, unknown_ca}) ->
path_validation_alert(Reason) ->
?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE, Reason).
-digitally_signed(Version, Hashes, HashAlgo, PrivateKey, SignAlgo) ->
- try do_digitally_signed(Version, Hashes, HashAlgo, PrivateKey, SignAlgo) of
+
+digitally_signed(Version, Msg, HashAlgo, PrivateKey, SignAlgo) ->
+ try do_digitally_signed(Version, Msg, HashAlgo, PrivateKey, SignAlgo) of
Signature ->
Signature
catch
@@ -1998,36 +2013,26 @@ digitally_signed(Version, Hashes, HashAlgo, PrivateKey, SignAlgo) ->
throw(?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE, bad_key(PrivateKey)))
end.
-do_digitally_signed({3, Minor}, Hash, _,
+do_digitally_signed({3, Minor}, Msg, HashAlgo, {#'RSAPrivateKey'{} = Key,
+ #'RSASSA-PSS-params'{}}, SignAlgo) when Minor >= 3 ->
+ Options = signature_options(SignAlgo, HashAlgo),
+ public_key:sign(Msg, HashAlgo, Key, Options);
+do_digitally_signed({3, Minor}, {digest, Digest}, _HashAlgo, #'RSAPrivateKey'{} = Key, rsa) when Minor =< 2 ->
+ public_key:encrypt_private(Digest, Key,
+ [{rsa_pad, rsa_pkcs1_padding}]);
+do_digitally_signed({3, Minor}, {digest, Digest}, _,
#{algorithm := rsa} = Engine, rsa) when Minor =< 2->
- crypto:private_encrypt(rsa, Hash, maps:remove(algorithm, Engine),
+ crypto:private_encrypt(rsa, Digest, maps:remove(algorithm, Engine),
rsa_pkcs1_padding);
-do_digitally_signed({3, Minor}, Hash, HashAlgo, #{algorithm := Alg} = Engine, SignAlgo)
- when Minor > 3 ->
- Options = signature_options(SignAlgo, HashAlgo),
- crypto:sign(Alg, HashAlgo, Hash, maps:remove(algorithm, Engine), Options);
-do_digitally_signed({3, Minor}, Hash, HashAlgo, #{algorithm := Alg} = Engine, SignAlgo)
- when Minor > 3 ->
- Options = signature_options(SignAlgo, HashAlgo),
- crypto:sign(Alg, HashAlgo, Hash, maps:remove(algorithm, Engine), Options);
-do_digitally_signed({3, 3}, Hash, HashAlgo, #{algorithm := Alg} = Engine, SignAlgo) ->
+do_digitally_signed(_, Msg, HashAlgo, #{algorithm := Alg} = Engine, SignAlgo) ->
Options = signature_options(SignAlgo, HashAlgo),
- crypto:sign(Alg, HashAlgo, {digest, Hash}, maps:remove(algorithm, Engine), Options);
-do_digitally_signed({3, 4}, Hash, HashAlgo, {#'RSAPrivateKey'{} = Key,
- #'RSASSA-PSS-params'{}}, SignAlgo) ->
+ crypto:sign(Alg, HashAlgo, Msg, maps:remove(algorithm, Engine), Options);
+do_digitally_signed({3, Minor}, {digest, _} = Msg , HashAlgo, Key, _) when Minor =< 2 ->
+ public_key:sign(Msg, HashAlgo, Key);
+do_digitally_signed(_, Msg, HashAlgo, Key, SignAlgo) ->
Options = signature_options(SignAlgo, HashAlgo),
- public_key:sign(Hash, HashAlgo, Key, Options);
-do_digitally_signed({3, 4}, Hash, HashAlgo, Key, SignAlgo) ->
- Options = signature_options(SignAlgo, HashAlgo),
- public_key:sign(Hash, HashAlgo, Key, Options);
-do_digitally_signed({3, Minor}, Hash, HashAlgo, Key, SignAlgo) when Minor >= 3 ->
- Options = signature_options(HashAlgo, SignAlgo),
- public_key:sign({digest,Hash}, HashAlgo, Key, Options);
-do_digitally_signed({3, Minor}, Hash, _HashAlgo, #'RSAPrivateKey'{} = Key, rsa) when Minor =< 2 ->
- public_key:encrypt_private(Hash, Key,
- [{rsa_pad, rsa_pkcs1_padding}]);
-do_digitally_signed(_Version, Hash, HashAlgo, Key, _SignAlgo) ->
- public_key:sign({digest, Hash}, HashAlgo, Key).
+ public_key:sign(Msg, HashAlgo, Key, Options).
+
signature_options(SignAlgo, HashAlgo) when SignAlgo =:= rsa_pss_rsae orelse
SignAlgo =:= rsa_pss_pss ->
@@ -2401,6 +2406,10 @@ enc_sign(_HashSign, Sign, _Version) ->
SignLen = byte_size(Sign),
<<?UINT16(SignLen), Sign/binary>>.
+enc_hashsign(HashAlgo, SignAlgo) when SignAlgo == rsa_pss_pss;
+ SignAlgo == rsa_pss_rsae ->
+ Sign = ssl_cipher:signature_scheme(list_to_existing_atom(atom_to_list(SignAlgo) ++ "_" ++ atom_to_list(HashAlgo))),
+ <<?UINT16(Sign)>>;
enc_hashsign(HashAlgo, SignAlgo) ->
Hash = ssl_cipher:hash_algorithm(HashAlgo),
Sign = ssl_cipher:sign_algorithm(SignAlgo),
@@ -2421,8 +2430,8 @@ enc_server_key_exchange(Version, Params, {HashAlgo, SignAlgo},
signature = <<>>};
_ ->
Hash =
- server_key_exchange_hash(HashAlgo, <<ClientRandom/binary,
- ServerRandom/binary,
+ server_key_exchange_hash(HashAlgo, <<ClientRandom/binary,
+ ServerRandom/binary,
EncParams/binary>>),
Signature = digitally_signed(Version, Hash, HashAlgo, PrivateKey, SignAlgo),
#server_key_params{params = Params,
@@ -2729,7 +2738,7 @@ decode_extensions(<<?UINT16(?SRP_EXT), ?UINT16(Len), ?BYTE(SRPLen),
decode_extensions(<<?UINT16(?SIGNATURE_ALGORITHMS_EXT), ?UINT16(Len),
ExtData:Len/binary, Rest/binary>>, Version, MessageType, Acc)
- when Version < {3,4} ->
+ when Version < {3,3} ->
SignAlgoListLen = Len - 2,
<<?UINT16(SignAlgoListLen), SignAlgoList/binary>> = ExtData,
HashSignAlgos = [{ssl_cipher:hash_algorithm(Hash), ssl_cipher:sign_algorithm(Sign)} ||
@@ -2738,6 +2747,26 @@ decode_extensions(<<?UINT16(?SIGNATURE_ALGORITHMS_EXT), ?UINT16(Len),
Acc#{signature_algs =>
#hash_sign_algos{hash_sign_algos =
HashSignAlgos}});
+decode_extensions(<<?UINT16(?SIGNATURE_ALGORITHMS_EXT), ?UINT16(Len),
+ ExtData:Len/binary, Rest/binary>>, Version, MessageType, Acc)
+ when Version =:= {3,3} ->
+ SignSchemeListLen = Len - 2,
+ <<?UINT16(SignSchemeListLen), SignSchemeList/binary>> = ExtData,
+ HashSigns = decode_sign_alg(Version, SignSchemeList),
+ decode_extensions(Rest, Version, MessageType,
+ Acc#{signature_algs =>
+ #hash_sign_algos{
+ hash_sign_algos = HashSigns}});
+decode_extensions(<<?UINT16(?SIGNATURE_ALGORITHMS_EXT), ?UINT16(Len),
+ ExtData:Len/binary, Rest/binary>>, Version, MessageType, Acc)
+ when Version =:= {3,4} ->
+ SignSchemeListLen = Len - 2,
+ <<?UINT16(SignSchemeListLen), SignSchemeList/binary>> = ExtData,
+ SignSchemes = decode_sign_alg(Version, SignSchemeList),
+ decode_extensions(Rest, Version, MessageType,
+ Acc#{signature_algs =>
+ #signature_algorithms{
+ signature_scheme_list = SignSchemes}});
decode_extensions(<<?UINT16(?SIGNATURE_ALGORITHMS_EXT), ?UINT16(Len),
ExtData:Len/binary, Rest/binary>>, Version, MessageType, Acc)
@@ -2968,8 +2997,56 @@ decode_extensions(<<?UINT16(_), ?UINT16(Len), _Unknown:Len/binary, Rest/binary>>
decode_extensions(_, _, _, Acc) ->
Acc.
-dec_hashsign(<<?BYTE(HashAlgo), ?BYTE(SignAlgo)>>) ->
- {ssl_cipher:hash_algorithm(HashAlgo), ssl_cipher:sign_algorithm(SignAlgo)}.
+decode_sign_alg({3,3}, SignSchemeList) ->
+ %% Ignore unknown signature algorithms
+ Fun = fun(Elem) ->
+ case ssl_cipher:signature_scheme(Elem) of
+ unassigned ->
+ false;
+ Value when is_atom(Value)->
+ case ssl_cipher:scheme_to_components(Value) of
+ {Hash, rsa_pss_rsae = Sign, _} ->
+ {true, {Hash, Sign}};
+ {Hash, rsa_pss_pss = Sign, _} ->
+ {true,{Hash, Sign}};
+ {sha1, rsa_pkcs1, _} ->
+ {true,{sha, rsa}};
+ {Hash, rsa_pkcs1, _} ->
+ {true,{Hash, rsa}};
+ {sha1, ecdsa, _} ->
+ {true,{sha, ecdsa}};
+ {sha512,ecdsa, _} ->
+ {true,{sha512, ecdsa}};
+ {sha384,ecdsa, _} ->
+ {true,{sha384, ecdsa}};
+ {sha256,ecdsa, _}->
+ {true,{sha256, ecdsa}};
+ _ ->
+ false
+ end;
+ Value ->
+ {true, Value}
+ end
+ end,
+ lists:filtermap(Fun, [SignScheme ||
+ <<?UINT16(SignScheme)>> <= SignSchemeList]);
+decode_sign_alg({3,4}, SignSchemeList) ->
+ %% Ignore unknown signature algorithms
+ Fun = fun(Elem) ->
+ case ssl_cipher:signature_scheme(Elem) of
+ unassigned ->
+ false;
+ Value ->
+ {true, Value}
+ end
+ end,
+ lists:filtermap(Fun, [SignScheme ||
+ <<?UINT16(SignScheme)>> <= SignSchemeList]).
+
+dec_hashsign(Value) ->
+ [HashSign] = decode_sign_alg({3,3}, Value),
+ HashSign.
+
%% Ignore unknown names (only host_name is supported)
dec_sni(<<?BYTE(?SNI_NAMETYPE_HOST_NAME), ?UINT16(Len),
@@ -3162,7 +3239,6 @@ handle_psk_identity(_PSKIdentity, LookupFun)
handle_psk_identity(PSKIdentity, {Fun, UserState}) ->
Fun(psk, PSKIdentity, UserState).
-
filter_hashsigns([], [], _, _, Acc) ->
lists:reverse(Acc);
filter_hashsigns([Suite | Suites], [#{key_exchange := KeyExchange} | Algos], HashSigns, Version,
@@ -3306,18 +3382,6 @@ handle_srp_extension(undefined, Session) ->
handle_srp_extension(#srp{username = Username}, Session) ->
Session#session{srp_username = Username}.
-is_acceptable_hash_sign( _, KeyExAlgo, _) when
- KeyExAlgo == psk;
- KeyExAlgo == dhe_psk;
- KeyExAlgo == ecdhe_psk;
- KeyExAlgo == srp_anon;
- KeyExAlgo == dh_anon;
- KeyExAlgo == ecdhe_anon
- ->
- true;
-is_acceptable_hash_sign(Algos,_, SupportedHashSigns) ->
- is_acceptable_hash_sign(Algos, SupportedHashSigns).
-
is_acceptable_hash_sign(Algos, SupportedHashSigns) ->
lists:member(Algos, SupportedHashSigns).
@@ -3325,7 +3389,7 @@ is_acceptable_cert_type(Sign, Types) ->
lists:member(sign_type(Sign), binary_to_list(Types)).
%% signature_algorithms_cert = undefined
-is_supported_sign(SignAlgo, _, HashSigns, undefined) ->
+is_supported_sign(SignAlgo, _, HashSigns, []) ->
lists:member(SignAlgo, HashSigns);
%% {'SignatureAlgorithm',{1,2,840,113549,1,1,11},'NULL'}
@@ -3371,14 +3435,6 @@ is_supported_sign({Hash, Sign}, _Param, _, SignatureSchemes) ->
end,
lists:foldl(Fun, false, SignatureSchemes).
-%% SupportedPublicKeyAlgorithms PUBLIC-KEY-ALGORITHM-CLASS ::= {
-%% dsa | rsa-encryption | dh | kea | ec-public-key }
-public_key_algo(?rsaEncryption) ->
- rsa;
-public_key_algo(?'id-ecPublicKey') ->
- ecdsa;
-public_key_algo(?'id-dsa') ->
- dsa.
%% SupportedSignatureAlgorithms SIGNATURE-ALGORITHM-CLASS ::= {
%% dsa-with-sha1 | dsaWithSHA1 | md2-with-rsa-encryption |
@@ -3392,7 +3448,11 @@ public_key_algo(?'id-dsa') ->
%% ecdsa-with-sha256 |
%% ecdsa-with-sha384 |
%% ecdsa-with-sha512 }
-sign_algo(Alg) ->
+sign_algo(?'id-RSASSA-PSS', #'RSASSA-PSS-params'{maskGenAlgorithm =
+ #'MaskGenAlgorithm'{algorithm = ?'id-mgf1',
+ parameters = #'HashAlgorithm'{algorithm = HashOid}}}) ->
+ {public_key:pkix_hash_type(HashOid), rsa_pss_pss};
+sign_algo(Alg, _) ->
public_key:pkix_sign_types(Alg).
sign_type(rsa) ->
@@ -3692,6 +3752,7 @@ path_validation(TrustedCert, Path, ServerName, Role, CertDbHandle, CertDbRef, CR
crl_check := CrlCheck,
log_level := Level,
signature_algs := SignAlgos,
+ signature_algs_cert := SignAlgosCert,
depth := Depth},
#{cert_ext := CertExt,
ocsp_responder_certs := OcspResponderCerts,
@@ -3704,7 +3765,7 @@ path_validation(TrustedCert, Path, ServerName, Role, CertDbHandle, CertDbRef, CR
customize_hostname_check =>
CustomizeHostnameCheck,
signature_algs => SignAlgos,
- signature_algs_cert => undefined,
+ signature_algs_cert => SignAlgosCert,
version => Version,
crl_check => CrlCheck,
crl_db => CRLDbHandle,
diff --git a/lib/ssl/src/tls_dtls_connection.erl b/lib/ssl/src/tls_dtls_connection.erl
index 5afeef59f7..0174850758 100644
--- a/lib/ssl/src/tls_dtls_connection.erl
+++ b/lib/ssl/src/tls_dtls_connection.erl
@@ -425,19 +425,29 @@ certify(internal, #certificate_request{},
certify(internal, #certificate_request{} = CertRequest,
#state{static_env = #static_env{role = client,
protocol_cb = Connection},
- handshake_env = HsEnv,
+ handshake_env = #handshake_env{hashsign_algorithm = NegotiatedHashSign} = HsEnv,
connection_env = #connection_env{negotiated_version = Version},
session = #session{own_certificates = [Cert|_]},
ssl_options = #{signature_algs := SupportedHashSigns}} = State) ->
- case ssl_handshake:select_hashsign(CertRequest, Cert,
- SupportedHashSigns, ssl:tls_version(Version)) of
- #alert {} = Alert ->
- ssl_gen_statem:handle_own_alert(Alert, Version, ?FUNCTION_NAME, State);
- NegotiatedHashSign ->
- Connection:next_event(?FUNCTION_NAME, no_record,
- State#state{client_certificate_requested = true,
- handshake_env = HsEnv#handshake_env{cert_hashsign_algorithm = NegotiatedHashSign}})
- end;
+
+ TLSVersion = ssl:tls_version(Version),
+ case NegotiatedHashSign of
+ {Hash, Sign} when TLSVersion == {3,3} andalso Hash =/= undefined andalso
+ Sign =/= undefined ->
+ Connection:next_event(?FUNCTION_NAME, no_record,
+ State#state{client_certificate_requested = true,
+ handshake_env = HsEnv#handshake_env{cert_hashsign_algorithm = NegotiatedHashSign}});
+ _ ->
+ case ssl_handshake:select_hashsign(CertRequest, Cert,
+ SupportedHashSigns, TLSVersion) of
+ #alert {} = Alert ->
+ ssl_gen_statem:handle_own_alert(Alert, Version, ?FUNCTION_NAME, State);
+ SelectedHashSign ->
+ Connection:next_event(?FUNCTION_NAME, no_record,
+ State#state{client_certificate_requested = true,
+ handshake_env = HsEnv#handshake_env{cert_hashsign_algorithm = SelectedHashSign}})
+ end
+ end;
%% PSK and RSA_PSK might bypass the Server-Key-Exchange
certify(internal, #server_hello_done{},
#state{static_env = #static_env{role = client,
@@ -682,10 +692,10 @@ gen_handshake(StateName, Type, Event,
Result ->
Result
catch
- _:_ ->
- ssl_gen_statem:handle_own_alert(?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE,
- malformed_handshake_data),
- Version, StateName, State)
+ _:_ ->
+ ssl_gen_statem:handle_own_alert(?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE,
+ malformed_handshake_data),
+ Version, StateName, State)
end.
%%--------------------------------------------------------------------
@@ -899,7 +909,6 @@ verify_client_cert(#state{static_env = #static_env{role = client},
client_certificate_requested = true,
session = #session{master_secret = MasterSecret,
own_certificates = OwnCerts}} = State, Connection) ->
-
case ssl_handshake:client_certificate_verify(OwnCerts, MasterSecret,
ssl:tls_version(Version), HashSign, PrivateKey, Hist) of
#certificate_verify{} = Verified ->
diff --git a/lib/ssl/src/tls_handshake.erl b/lib/ssl/src/tls_handshake.erl
index d7c899c7cf..05cf1a7339 100644
--- a/lib/ssl/src/tls_handshake.erl
+++ b/lib/ssl/src/tls_handshake.erl
@@ -83,13 +83,14 @@ client_hello(_Host, _Port, ConnectionStates,
#{security_parameters := SecParams} =
ssl_record:pending_connection_state(ConnectionStates, read),
AvailableCipherSuites = ssl_handshake:available_suites(UserSuites, Version),
- Extensions = ssl_handshake:client_hello_extensions(Version,
+ Extensions = ssl_handshake:client_hello_extensions(Version,
AvailableCipherSuites,
- SslOpts, ConnectionStates,
- Renegotiation,
- KeyShare,
- TicketData,
- OcspNonce),
+ SslOpts,
+ ConnectionStates,
+ Renegotiation,
+ KeyShare,
+ TicketData,
+ OcspNonce),
CipherSuites = ssl_handshake:cipher_suites(AvailableCipherSuites, Renegotiation, Fallback),
#client_hello{session_id = Id,
client_version = LegacyVersion,
@@ -247,7 +248,7 @@ hello(#client_hello{client_version = _ClientVersion,
_:_ ->
?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE, malformed_handshake_data)
end;
-
+
hello(#client_hello{client_version = ClientVersion,
cipher_suites = CipherSuites} = Hello,
#{versions := Versions} = SslOpts,
@@ -257,12 +258,11 @@ hello(#client_hello{client_version = ClientVersion,
do_hello(Version, Versions, CipherSuites, Hello, SslOpts, Info, Renegotiation)
catch
error:{case_clause,{asn1, Asn1Reason}} ->
- %% ASN-1 decode of certificate somehow failed
+ %% ASN-1 decode of certificate somehow failed
?ALERT_REC(?FATAL, ?INTERNAL_ERROR, {failed_to_decode_own_certificate, Asn1Reason});
- _:_ ->
- ?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE, malformed_handshake_data)
- end.
-
+ _:_ ->
+ ?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE, malformed_handshake_data)
+ end.
%%--------------------------------------------------------------------
%%% Handshake encodeing
diff --git a/lib/ssl/src/tls_handshake_1_3.erl b/lib/ssl/src/tls_handshake_1_3.erl
index f15e1d90bd..5778413ff3 100644
--- a/lib/ssl/src/tls_handshake_1_3.erl
+++ b/lib/ssl/src/tls_handshake_1_3.erl
@@ -232,9 +232,21 @@ add_signature_algorithms_cert(Extensions, SignAlgsCert) ->
filter_tls13_algs(undefined) -> undefined;
filter_tls13_algs(Algo) ->
- lists:filter(fun is_atom/1, Algo).
-
-
+ lists:foldl(fun(Atom, Acc) when is_atom(Atom) ->
+ [Atom | Acc];
+ ({sha512, rsa}, Acc) ->
+ [rsa_pkcs1_sha512 | Acc];
+ ({sha384, rsa}, Acc) ->
+ [rsa_pkcs1_sha384 | Acc];
+ ({sha256, rsa}, Acc) ->
+ [rsa_pkcs1_sha256 | Acc];
+ ({sha, rsa}, Acc) ->
+ [rsa_pkcs1_sha1 | Acc];
+ ({sha, ecdsa}, Acc) ->
+ [ecdsa_sha1| Acc];
+ (_, Acc) ->
+ Acc
+ end, [], Algo).
%% enum {
%% X509(0),
%% RawPublicKey(2),
diff --git a/lib/ssl/src/tls_v1.erl b/lib/ssl/src/tls_v1.erl
index 14c1311a52..fdceef2977 100644
--- a/lib/ssl/src/tls_v1.erl
+++ b/lib/ssl/src/tls_v1.erl
@@ -37,6 +37,15 @@
setup_keys/8,
suites/1,
exclusive_suites/1,
+ exclusive_anonymous_suites/1,
+ psk_suites/1,
+ psk_exclusive/1,
+ psk_suites_anon/1,
+ srp_suites/1,
+ srp_suites_anon/1,
+ rc4_suites/1,
+ des_suites/1,
+ rsa_suites/1,
prf/5,
ecc_curves/1,
ecc_curves/2,
@@ -44,8 +53,8 @@
enum_to_oid/1,
default_signature_algs/1,
signature_algs/2,
- default_signature_schemes/1,
signature_schemes/2,
+ rsa_schemes/0,
groups/1,
groups/2,
group_to_enum/1,
@@ -196,12 +205,15 @@ finished(Role, Version, PrfAlgo, MasterSecret, Handshake)
certificate_verify(md5sha, _Version, Handshake) ->
MD5 = crypto:hash(md5, Handshake),
SHA = crypto:hash(sha, Handshake),
- <<MD5/binary, SHA/binary>>;
+ {digest, <<MD5/binary, SHA/binary>>};
%% TLS 1.0 -1.1 ---------------------------------------------------
%% TLS 1.2 ---------------------------------------------------
-certificate_verify(HashAlgo, _Version, Handshake) ->
- crypto:hash(HashAlgo, Handshake).
+certificate_verify(_HashAlgo, _Version, Handshake) ->
+ %% crypto:hash(HashAlgo, Handshake).
+ %% Optimization: Let crypto calculate the hash in sign/verify call
+ Handshake.
+
%% TLS 1.2 ---------------------------------------------------
-spec setup_keys(integer(), integer(), binary(), binary(), binary(), integer(),
@@ -494,7 +506,7 @@ mac_hash(Method, Mac_write_secret, Seq_num, Type, {Major, Minor},
-spec suites(1|2|3|4) -> [ssl_cipher_format:cipher_suite()].
suites(Minor) when Minor == 1; Minor == 2 ->
- exclusive_suites(2);
+ exclusive_suites(1);
suites(3) ->
exclusive_suites(3) ++ suites(2);
@@ -504,7 +516,9 @@ suites(4) ->
exclusive_suites(4) ->
[?TLS_AES_256_GCM_SHA384,
?TLS_AES_128_GCM_SHA256,
+
?TLS_CHACHA20_POLY1305_SHA256,
+
?TLS_AES_128_CCM_SHA256,
?TLS_AES_128_CCM_8_SHA256
];
@@ -562,21 +576,245 @@ exclusive_suites(3) ->
%% ?TLS_DH_RSA_WITH_AES_128_GCM_SHA256,
%% ?TLS_DH_DSS_WITH_AES_128_GCM_SHA256
];
-exclusive_suites(Minor) when Minor == 1; Minor == 2 ->
+exclusive_suites(2) ->
+ [];
+exclusive_suites(1) ->
[
?TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
?TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
- ?TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
- ?TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
+
?TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
?TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,
-
+
?TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
?TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
- ?TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
- ?TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
+
?TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,
- ?TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
+ ?TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,
+
+ ?TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
+ ?TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
+ ?TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
+ ?TLS_DHE_DSS_WITH_AES_128_CBC_SHA
+ ].
+
+%%--------------------------------------------------------------------
+-spec exclusive_anonymous_suites(Minor:: integer()) -> [ssl_cipher_format:cipher_suite()].
+%%
+%% Description: Returns a list of the anonymous cipher suites introduced
+%% in Version, only supported if explicitly set by user.
+%%--------------------------------------------------------------------
+exclusive_anonymous_suites(4) ->
+ [];
+exclusive_anonymous_suites(3 = N) ->
+ psk_anon_exclusive(N) ++
+ [?TLS_DH_anon_WITH_AES_128_GCM_SHA256,
+ ?TLS_DH_anon_WITH_AES_256_GCM_SHA384,
+ ?TLS_DH_anon_WITH_AES_128_CBC_SHA256,
+ ?TLS_DH_anon_WITH_AES_256_CBC_SHA256,
+
+ ?TLS_ECDH_anon_WITH_AES_128_CBC_SHA,
+ ?TLS_ECDH_anon_WITH_AES_256_CBC_SHA,
+ ?TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA,
+
+ ?TLS_DH_anon_WITH_RC4_128_MD5];
+exclusive_anonymous_suites(2 = N) ->
+ psk_anon_exclusive(N) ++
+ [?TLS_ECDH_anon_WITH_AES_128_CBC_SHA,
+ ?TLS_ECDH_anon_WITH_AES_256_CBC_SHA,
+ ?TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA,
+
+ ?TLS_DH_anon_WITH_DES_CBC_SHA,
+ ?TLS_DH_anon_WITH_RC4_128_MD5];
+exclusive_anonymous_suites(N = 1) ->
+ psk_anon_exclusive(N) ++
+ [?TLS_DH_anon_WITH_RC4_128_MD5,
+ ?TLS_DH_anon_WITH_3DES_EDE_CBC_SHA,
+ ?TLS_DH_anon_WITH_DES_CBC_SHA
+ ] ++ srp_suites_anon({3,1}).
+
+%%--------------------------------------------------------------------
+-spec psk_suites(ssl_record:ssl_version() | integer()) -> [ssl_cipher_format:cipher_suite()].
+%%
+%% Description: Returns a list of the PSK cipher suites, only supported
+%% if explicitly set by user.
+%%--------------------------------------------------------------------
+psk_suites({3, 3}) ->
+ psk_exclusive(3);
+psk_suites({3, N}) ->
+ psk_exclusive(N).
+
+psk_exclusive(3) ->
+ psk_exclusive(1) -- [?TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA];
+psk_exclusive(1) ->
+ [
+ ?TLS_RSA_PSK_WITH_AES_256_GCM_SHA384,
+ ?TLS_RSA_PSK_WITH_AES_256_CBC_SHA384,
+ ?TLS_RSA_PSK_WITH_AES_128_GCM_SHA256,
+ ?TLS_RSA_PSK_WITH_AES_128_CBC_SHA256,
+ ?TLS_RSA_PSK_WITH_AES_256_CBC_SHA,
+ ?TLS_RSA_PSK_WITH_AES_128_CBC_SHA,
+ ?TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA,
+ ?TLS_RSA_PSK_WITH_RC4_128_SHA];
+psk_exclusive(_) ->
+ [].
+
+%%--------------------------------------------------------------------
+-spec psk_suites_anon(ssl_record:ssl_version() | integer()) -> [ssl_cipher_format:cipher_suite()].
+%%
+%% Description: Returns a list of the anonymous PSK cipher suites, only supported
+%% if explicitly set by user.
+%%--------------------------------------------------------------------
+psk_suites_anon({3, _}) ->
+ psk_anon_exclusive(3) ++ psk_anon_exclusive(1).
+
+psk_anon_exclusive(3) ->
+ [
+ ?TLS_DHE_PSK_WITH_AES_256_GCM_SHA384,
+ ?TLS_PSK_WITH_AES_256_GCM_SHA384,
+ ?TLS_DHE_PSK_WITH_AES_256_CCM,
+ ?TLS_PSK_DHE_WITH_AES_256_CCM_8,
+ ?TLS_PSK_WITH_AES_256_CCM,
+ ?TLS_PSK_WITH_AES_256_CCM_8,
+ ?TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256,
+ ?TLS_ECDHE_PSK_WITH_AES_128_CCM_SHA256,
+ ?TLS_ECDHE_PSK_WITH_AES_128_CCM_8_SHA256,
+ ?TLS_DHE_PSK_WITH_AES_128_GCM_SHA256,
+ ?TLS_PSK_WITH_AES_128_GCM_SHA256,
+ ?TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256,
+ ?TLS_ECDHE_PSK_WITH_AES_128_CCM_8_SHA256,
+ ?TLS_DHE_PSK_WITH_AES_128_CCM,
+ ?TLS_PSK_DHE_WITH_AES_128_CCM_8,
+ ?TLS_PSK_WITH_AES_128_CCM,
+ ?TLS_PSK_WITH_AES_128_CCM_8
+ ];
+psk_anon_exclusive(1) ->
+ [
+ ?TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384,
+ ?TLS_DHE_PSK_WITH_AES_256_CBC_SHA384,
+ ?TLS_PSK_WITH_AES_256_CBC_SHA384,
+ ?TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,
+ ?TLS_DHE_PSK_WITH_AES_128_CBC_SHA256,
+ ?TLS_PSK_WITH_AES_128_CBC_SHA256,
+ ?TLS_ECDHE_PSK_WITH_RC4_128_SHA,
+ ?TLS_DHE_PSK_WITH_AES_256_CBC_SHA,
+ ?TLS_PSK_WITH_AES_256_CBC_SHA,
+ ?TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA,
+ ?TLS_DHE_PSK_WITH_AES_128_CBC_SHA,
+ ?TLS_PSK_WITH_AES_128_CBC_SHA,
+ ?TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA,
+ ?TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA,
+ ?TLS_PSK_WITH_3DES_EDE_CBC_SHA,
+ ?TLS_ECDHE_PSK_WITH_RC4_128_SHA,
+ ?TLS_DHE_PSK_WITH_RC4_128_SHA,
+ ?TLS_PSK_WITH_RC4_128_SHA];
+psk_anon_exclusive(_) ->
+ [].
+%%--------------------------------------------------------------------
+-spec srp_suites(tls_record:tls_version()) -> [ssl_cipher_format:cipher_suite()].
+%%
+%% Description: Returns a list of the SRP cipher suites, only supported
+%% if explicitly set by user.
+%%--------------------------------------------------------------------
+srp_suites({3, 3}) ->
+ srp_exclusive(1) -- [?TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA,
+ ?TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA
+ ];
+srp_suites({3, N}) when N == 1;
+ N == 2 ->
+ srp_exclusive(1).
+
+srp_exclusive(1) ->
+ [?TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA,
+ ?TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA,
+ ?TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA,
+ ?TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA,
+ ?TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA,
+ ?TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA
+ ].
+
+%%--------------------------------------------------------------------
+-spec srp_suites_anon(tls_record:tls_version()) -> [ssl_cipher_format:cipher_suite()].
+%%
+%% Description: Returns a list of the SRP anonymous cipher suites, only supported
+%% if explicitly set by user.
+%%--------------------------------------------------------------------
+srp_suites_anon({3, 3}) ->
+ srp_exclusive_anon(1) -- [?TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA];
+srp_suites_anon({3, N}) when N == 1;
+ N == 2 ->
+ srp_exclusive_anon(1).
+srp_exclusive_anon(1) ->
+ [?TLS_SRP_SHA_WITH_AES_128_CBC_SHA,
+ ?TLS_SRP_SHA_WITH_AES_256_CBC_SHA,
+ ?TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA
+ ].
+
+%%--------------------------------------------------------------------
+-spec rc4_suites(Version::ssl_record:ssl_version() | integer()) ->
+ [ssl_cipher_format:cipher_suite()].
+%%
+%% Description: Returns a list of the RSA|(ECDH/RSA)| (ECDH/ECDSA)
+%% with RC4 cipher suites, only supported if explicitly set by user.
+%% Are not considered secure any more. Other RC4 suites already
+%% belonged to the user configured only category.
+%%--------------------------------------------------------------------
+rc4_suites({3, _}) ->
+ exclusive_rc4(1).
+
+exclusive_rc4(1) ->
+ [?TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
+ ?TLS_ECDHE_RSA_WITH_RC4_128_SHA,
+ ?TLS_ECDH_ECDSA_WITH_RC4_128_SHA,
+ ?TLS_ECDH_RSA_WITH_RC4_128_SHA,
+ ?TLS_RSA_WITH_RC4_128_SHA,
+ ?TLS_RSA_WITH_RC4_128_MD5].
+
+%%--------------------------------------------------------------------
+-spec des_suites(Version::ssl_record:ssl_version()) -> [ssl_cipher_format:cipher_suite()].
+%%
+%% Description: Returns a list of the cipher suites
+%% with DES cipher, only supported if explicitly set by user.
+%% Are not considered secure any more.
+%%--------------------------------------------------------------------
+des_suites({3, _}) ->
+ exclusive_des_suites(1).
+
+exclusive_des_suites(1)->
+ [?TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
+ ?TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
+ ?TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
+ ?TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,
+ ?TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,
+ ?TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,
+ ?TLS_DHE_RSA_WITH_DES_CBC_SHA,
+ ?TLS_RSA_WITH_DES_CBC_SHA].
+
+%%--------------------------------------------------------------------
+-spec rsa_suites(Version::ssl_record:ssl_version() | integer()) -> [ssl_cipher_format:cipher_suite()].
+%%
+%% Description: Returns a list of the RSA key exchange
+%% cipher suites, only supported if explicitly set by user.
+%% Are not considered secure any more.
+%%--------------------------------------------------------------------
+rsa_suites({3, 3}) ->
+ rsa_suites_exclusive(3) -- [?TLS_RSA_WITH_3DES_EDE_CBC_SHA];
+rsa_suites({3, 2}) ->
+ rsa_suites_exclusive(1);
+rsa_suites({3, 1}) ->
+ rsa_suites_exclusive(1).
+
+rsa_suites_exclusive(3) ->
+ [
+ ?TLS_RSA_WITH_AES_256_GCM_SHA384,
+ ?TLS_RSA_WITH_AES_256_CBC_SHA256,
+ ?TLS_RSA_WITH_AES_128_GCM_SHA256,
+ ?TLS_RSA_WITH_AES_128_CBC_SHA256
+ ];
+rsa_suites_exclusive(1) ->
+ [?TLS_RSA_WITH_AES_256_CBC_SHA,
+ ?TLS_RSA_WITH_AES_128_CBC_SHA,
+ ?TLS_RSA_WITH_3DES_EDE_CBC_SHA
].
signature_algs({3, 4}, HashSigns) ->
@@ -585,6 +823,7 @@ signature_algs({3, 3}, HashSigns) ->
CryptoSupports = crypto:supports(),
Hashes = proplists:get_value(hashs, CryptoSupports),
PubKeys = proplists:get_value(public_keys, CryptoSupports),
+ Schemes = rsa_schemes(),
Supported = lists:foldl(fun({Hash, dsa = Sign} = Alg, Acc) ->
case proplists:get_bool(dss, PubKeys)
andalso proplists:get_bool(Hash, Hashes)
@@ -604,15 +843,23 @@ signature_algs({3, 3}, HashSigns) ->
[Alg | Acc];
false ->
Acc
+ end;
+ (Alg, Acc) when is_atom(Alg) ->
+ case lists:member(Alg, Schemes) of
+ true ->
+ [NewAlg] = signature_schemes({3,4}, [Alg]),
+ [NewAlg| Acc];
+ false ->
+ Acc
end
end, [], HashSigns),
lists:reverse(Supported).
-default_signature_algs({3, 4} = Version) ->
- %% TLS 1.3 servers shall be prepared to process TLS 1.2 ClientHellos
- %% containing legacy hash-sign tuples.
- default_signature_schemes(Version) ++ default_signature_algs({3,3});
-default_signature_algs({3, 3} = Version) ->
+default_signature_algs([{3, 4} = Version]) ->
+ default_signature_schemes(Version) ++ legacy_signature_schemes(Version);
+default_signature_algs([{3, 4}, {3,3} | _]) ->
+ default_signature_schemes({3,4}) ++ default_signature_algs([{3,3}]);
+default_signature_algs([{3, 3} = Version |_]) ->
Default = [%% SHA2
{sha512, ecdsa},
{sha512, rsa},
@@ -631,7 +878,7 @@ default_signature_algs(_) ->
undefined.
-signature_schemes(Version, SignatureSchemes) when is_tuple(Version)
+signature_schemes(Version, [_|_] =SignatureSchemes) when is_tuple(Version)
andalso Version >= {3, 3} ->
CryptoSupports = crypto:supports(),
Hashes = proplists:get_value(hashs, CryptoSupports),
@@ -710,22 +957,42 @@ default_signature_schemes(Version) ->
rsa_pss_rsae_sha384,
rsa_pss_rsae_sha256,
eddsa_ed25519,
- eddsa_ed448,
-
- %% These values refer solely to signatures
- %% which appear in certificates (see Section 4.4.2.2) and are not
- %% defined for use in signed TLS handshake messages, although they
- %% MAY appear in "signature_algorithms" and
- %% "signature_algorithms_cert" for backward compatibility with
- %% TLS 1.2.
- rsa_pkcs1_sha512,
- rsa_pkcs1_sha384,
- rsa_pkcs1_sha256,
- ecdsa_sha1,
- rsa_pkcs1_sha1
+ eddsa_ed448
],
signature_schemes(Version, Default).
+legacy_signature_schemes(Version) ->
+ %% These values refer solely to signatures
+ %% which appear in certificates (see Section 4.4.2.2) and are not
+ %% defined for use in signed TLS handshake messages, although they
+ %% MAY appear in "signature_algorithms" and
+ %% "signature_algorithms_cert" for backward compatibility with
+ %% TLS 1.2.
+ LegacySchemes =
+ [rsa_pkcs1_sha512,
+ rsa_pkcs1_sha384,
+ rsa_pkcs1_sha256,
+ ecdsa_sha1,
+ rsa_pkcs1_sha1],
+ signature_schemes(Version, LegacySchemes).
+
+rsa_schemes() ->
+ Supports = crypto:supports(),
+ RSAOpts = proplists:get_value(rsa_opts, Supports),
+
+ case lists:member(rsa_pkcs1_pss_padding, RSAOpts)
+ andalso lists:member(rsa_pss_saltlen, RSAOpts)
+ andalso lists:member(rsa_mgf1_md, RSAOpts) of
+ true ->
+ [rsa_pss_pss_sha512,
+ rsa_pss_pss_sha384,
+ rsa_pss_pss_sha256,
+ rsa_pss_rsae_sha512,
+ rsa_pss_rsae_sha384,
+ rsa_pss_rsae_sha256];
+ false ->
+ []
+ end.
%%--------------------------------------------------------------------
%%% Internal functions
diff --git a/lib/ssl/test/ssl_api_SUITE.erl b/lib/ssl/test/ssl_api_SUITE.erl
index e53bf286da..ec831cfb90 100644
--- a/lib/ssl/test/ssl_api_SUITE.erl
+++ b/lib/ssl/test/ssl_api_SUITE.erl
@@ -1868,14 +1868,12 @@ new_options_in_handshake(Config) when is_list(Config) ->
Version = ssl_test_lib:protocol_version(Config),
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
- [_, Cipher | _] = ssl:filter_cipher_suites(ssl:cipher_suites(all, Version),
- [{key_exchange,
+ Ciphers = [_, Cipher | _] = ssl:filter_cipher_suites(ssl:cipher_suites(all, Version),
+ [{key_exchange,
fun(dhe_rsa) ->
true;
(ecdhe_rsa) ->
true;
- (ecdh_rsa) ->
- true;
(rsa) ->
false;
(_) ->
@@ -1895,7 +1893,7 @@ new_options_in_handshake(Config) when is_list(Config) ->
{host, Hostname},
{from, self()},
{mfa, {?MODULE, connection_info_result, []}},
- {options, [{ciphers, [Cipher]} | ClientOpts]}]),
+ {options, [{ciphers, Ciphers} | ClientOpts]}]),
ct:log("Testcase ~p, Client ~p Server ~p ~n",
[self(), Client, Server]),
diff --git a/lib/ssl/test/ssl_basic_SUITE.erl b/lib/ssl/test/ssl_basic_SUITE.erl
index a82b682526..6ba6c1552c 100644
--- a/lib/ssl/test/ssl_basic_SUITE.erl
+++ b/lib/ssl/test/ssl_basic_SUITE.erl
@@ -289,58 +289,19 @@ cipher_suites() ->
" and prepend|append_cipher_suites/2"}].
cipher_suites(Config) when is_list(Config) ->
- MandatoryCipherSuiteTLS1_0TLS1_1 = #{key_exchange => rsa,
- cipher => '3des_ede_cbc',
- mac => sha,
- prf => default_prf},
- MandatoryCipherSuiteTLS1_0TLS1_2 = #{key_exchange =>rsa,
- cipher => 'aes_128_cbc',
- mac => sha,
- prf => default_prf},
- Version = tls_record:highest_protocol_version([]),
- All = [_|_] = ssl:cipher_suites(all, Version),
- Default = [_|_] = ssl:cipher_suites(default, Version),
- Anonymous = [_|_] = ssl:cipher_suites(anonymous, Version),
- true = length(Default) < length(All),
- Filters = [{key_exchange,
- fun(dhe_rsa) ->
- true;
- (_) ->
- false
- end
- },
- {cipher,
- fun(aes_256_cbc) ->
- true;
- (_) ->
- false
- end
- },
- {mac,
- fun(sha) ->
- true;
- (_) ->
- false
- end
- }
- ],
- Cipher = #{cipher => aes_256_cbc,
- key_exchange => dhe_rsa,
- mac => sha,
- prf => default_prf},
- [Cipher] = ssl:filter_cipher_suites(All, Filters),
- [Cipher | Rest0] = ssl:prepend_cipher_suites([Cipher], Default),
- [Cipher | Rest0] = ssl:prepend_cipher_suites(Filters, Default),
- true = lists:member(Cipher, Default),
- false = lists:member(Cipher, Rest0),
- [Cipher | Rest1] = lists:reverse(ssl:append_cipher_suites([Cipher], Default)),
- [Cipher | Rest1] = lists:reverse(ssl:append_cipher_suites(Filters, Default)),
- true = lists:member(Cipher, Default),
- false = lists:member(Cipher, Rest1),
- [] = lists:dropwhile(fun(X) -> not lists:member(X, Default) end, Anonymous),
- [] = lists:dropwhile(fun(X) -> not lists:member(X, All) end, Anonymous),
- true = lists:member(MandatoryCipherSuiteTLS1_0TLS1_1, All),
- true = lists:member(MandatoryCipherSuiteTLS1_0TLS1_2, All).
+ chipher_suite_checks('tlsv1.3'),
+ chipher_suite_checks('tlsv1.2'),
+ chipher_suite_checks('tlsv1.1'),
+ chipher_suite_checks('tlsv1'),
+ chipher_suite_checks('dtlsv1.2'),
+ chipher_suite_checks('dtlsv1'),
+ anon_chipher_suite_checks('tlsv1.3'),
+ anon_chipher_suite_checks('tlsv1.2'),
+ anon_chipher_suite_checks('tlsv1.1'),
+ anon_chipher_suite_checks('tlsv1'),
+ anon_chipher_suite_checks('dtlsv1.2'),
+ anon_chipher_suite_checks('dtlsv1').
+
%%--------------------------------------------------------------------
cipher_suites_mix() ->
@@ -927,7 +888,76 @@ test_fake_root(Hostname, ServerNode, ClientNode, ServerConf, ClientConf, FakeCer
ssl_test_lib:close(FakeServer1).
+anon_chipher_suite_checks('tlsv1.3' = Version) ->
+ [] = ssl:cipher_suites(anonymous, Version),
+ [] = ssl:cipher_suites(exclusive_anonymous, Version);
+anon_chipher_suite_checks(Version) ->
+ [_|_] = ssl:cipher_suites(anonymous, Version),
+ [_|_] = ssl:cipher_suites(exclusive_anonymous, Version).
-
-
+chipher_suite_checks(Version) ->
+ MandatoryCipherSuiteTLS1_0TLS1_1 = #{key_exchange => rsa,
+ cipher => '3des_ede_cbc',
+ mac => sha,
+ prf => default_prf},
+ MandatoryCipherSuiteTLS1_0TLS1_2 = #{key_exchange =>rsa,
+ cipher => 'aes_128_cbc',
+ mac => sha,
+ prf => default_prf},
+ All = [_|_] = ssl:cipher_suites(all, Version),
+ Default = [_|_] = ssl:cipher_suites(default, Version),
+ Anonymous = ssl:cipher_suites(anonymous, Version),
+ true = length(Default) < length(All),
+ Filters = [{key_exchange,
+ fun(dhe_rsa) ->
+ true;
+ (_) ->
+ false
+ end
+ },
+ {cipher,
+ fun(aes_256_cbc) ->
+ true;
+ (_) ->
+ false
+ end
+ },
+ {mac,
+ fun(sha) ->
+ true;
+ (_) ->
+ false
+ end
+ }
+ ],
+ Cipher = #{cipher => aes_256_cbc,
+ key_exchange => dhe_rsa,
+ mac => sha,
+ prf => default_prf},
+ [Cipher] = ssl:filter_cipher_suites(All, Filters),
+ [Cipher | Rest0] = ssl:prepend_cipher_suites([Cipher], Default),
+ [Cipher | Rest0] = ssl:prepend_cipher_suites(Filters, Default),
+ true = lists:member(Cipher, Default),
+ false = lists:member(Cipher, Rest0),
+ [Cipher | Rest1] = lists:reverse(ssl:append_cipher_suites([Cipher], Default)),
+ [Cipher | Rest1] = lists:reverse(ssl:append_cipher_suites(Filters, Default)),
+ true = lists:member(Cipher, Default),
+ false = lists:member(Cipher, Rest1),
+ [] = lists:dropwhile(fun(X) -> not lists:member(X, Default) end, Anonymous),
+ [] = lists:dropwhile(fun(X) -> not lists:member(X, All) end, Anonymous),
+ case Version of
+ tlsv1 ->
+ true = lists:member(MandatoryCipherSuiteTLS1_0TLS1_1, All);
+ 'tlsv1.1' ->
+ true = lists:member(MandatoryCipherSuiteTLS1_0TLS1_1, All),
+ true = lists:member(MandatoryCipherSuiteTLS1_0TLS1_2, All);
+ 'tlsv1.2' ->
+ ok;
+ 'tlsv1.3' ->
+ ok;
+ 'dtlsv1' ->
+ true = lists:member(MandatoryCipherSuiteTLS1_0TLS1_2, All);
+ 'dtlsv1.2' ->
+ ok
+ end.
diff --git a/lib/ssl/test/ssl_cert_SUITE.erl b/lib/ssl/test/ssl_cert_SUITE.erl
index a824c2ef22..42c44e4855 100644
--- a/lib/ssl/test/ssl_cert_SUITE.erl
+++ b/lib/ssl/test/ssl_cert_SUITE.erl
@@ -141,19 +141,19 @@ all() ->
groups() ->
[
{'tlsv1.3', [], tls_1_3_protocol_groups()},
- {'tlsv1.2', [], tls_1_2_protocol_groups() -- [{group,rsa_pss_pss}]},
+ {'tlsv1.2', [], tls_1_2_protocol_groups()},
{'tlsv1.1', [], ssl_protocol_groups()},
{'tlsv1', [], ssl_protocol_groups()},
- {'dtlsv1.2', [], tls_1_2_protocol_groups() -- [{group,rsa_pss_rsae}, {group,rsa_pss_pss}]},
+ {'dtlsv1.2', [], tls_1_2_protocol_groups()},
{'dtlsv1', [], ssl_protocol_groups()},
{rsa, [], all_version_tests() ++ rsa_tests() ++ pre_tls_1_3_rsa_tests()},
{ecdsa, [], all_version_tests()},
{dsa, [], all_version_tests()},
{rsa_1_3, [], all_version_tests() ++ rsa_tests() ++
tls_1_3_tests() ++ tls_1_3_rsa_tests() ++ [basic_rsa_1024]},
- {rsa_pss_rsae, [], all_version_tests() ++ rsa_tests()},
+ {rsa_pss_rsae, [], all_version_tests() ++ tls_1_2_rsa_tests()},
{rsa_pss_rsae_1_3, [], all_version_tests() ++ rsa_tests() ++ tls_1_3_tests() ++ tls_1_3_rsa_tests()},
- {rsa_pss_pss, [], all_version_tests() ++ rsa_tests()},
+ {rsa_pss_pss, [], all_version_tests()},
{rsa_pss_pss_1_3, [], all_version_tests() ++ rsa_tests() ++ tls_1_3_tests() ++ tls_1_3_rsa_tests()},
{ecdsa_1_3, [], all_version_tests() ++ tls_1_3_tests() ++
[signature_algorithms_bad_curve_secp256r1,
@@ -209,6 +209,12 @@ tls_1_3_rsa_tests() ->
unsupported_sign_algo_cert_client_auth
].
+tls_1_2_rsa_tests() ->
+ [
+ unsupported_sign_algo_client_auth,
+ unsupported_sign_algo_cert_client_auth
+ ].
+
all_version_tests() ->
[
no_auth,
@@ -279,11 +285,58 @@ do_init_per_group(Group, Config0) when Group == rsa;
{server_cert_opts, SOpts} |
lists:delete(server_cert_opts,
lists:delete(client_cert_opts, Config))])];
-
do_init_per_group(Alg, Config) when Alg == rsa_pss_rsae;
- Alg == rsa_pss_pss;
- Alg == rsa_pss_rsae_1_3;
- Alg == rsa_pss_pss_1_3 ->
+ Alg == rsa_pss_pss ->
+ Supports = crypto:supports(),
+ RSAOpts = proplists:get_value(rsa_opts, Supports),
+
+ case lists:member(rsa_pkcs1_pss_padding, RSAOpts)
+ andalso lists:member(rsa_pss_saltlen, RSAOpts)
+ andalso lists:member(rsa_mgf1_md, RSAOpts) of
+ true ->
+ #{client_config := COpts,
+ server_config := SOpts} = ssl_test_lib:make_rsa_pss_pem(rsa_alg(Alg), [], Config, ""),
+ [{cert_key_alg, rsa_alg(Alg)},
+ {extra_client, [{signature_algs, [rsa_pss_pss_sha512,
+ rsa_pss_pss_sha384,
+ rsa_pss_pss_sha256,
+ rsa_pss_rsae_sha512,
+ rsa_pss_rsae_sha384,
+ rsa_pss_rsae_sha256,
+ rsa_pkcs1_sha512,
+ rsa_pkcs1_sha384,
+ rsa_pkcs1_sha256,
+ rsa_pkcs1_sha1,
+ {sha512, rsa},
+ {sha384, rsa},
+ {sha256, rsa},
+ {sha224, rsa}
+ ]}]},
+ {extra_server, [{signature_algs, [rsa_pss_pss_sha512,
+ rsa_pss_pss_sha384,
+ rsa_pss_pss_sha256,
+ rsa_pss_rsae_sha512,
+ rsa_pss_rsae_sha384,
+ rsa_pss_rsae_sha256,
+ {sha512, ecdsa},
+ {sha512, rsa},
+ {sha384, ecdsa},
+ {sha384, rsa},
+ {sha256, ecdsa},
+ {sha256, rsa},
+ {sha224, ecdsa},
+ {sha224, rsa}
+ ]}]} |
+ lists:delete(cert_key_alg,
+ [{client_cert_opts, COpts},
+ {server_cert_opts, SOpts} |
+ lists:delete(server_cert_opts,
+ lists:delete(client_cert_opts, Config))])];
+ false ->
+ {skip, "Missing EC crypto support"}
+ end;
+do_init_per_group(Alg, Config) when Alg == rsa_pss_rsae_1_3;
+ Alg == rsa_pss_pss_1_3 ->
Supports = crypto:supports(),
RSAOpts = proplists:get_value(rsa_opts, Supports),
@@ -468,7 +521,7 @@ missing_root_cert_no_auth(Config) when is_list(Config) ->
missing_root_cert_auth() ->
[{doc,"Must have ROOT certs to be able to verify verify peer"}].
missing_root_cert_auth(Config) when is_list(Config) ->
- ServerOpts = proplists:delete(cacertfile, ssl_test_lib:ssl_options(server_cert_opts, Config)),
+ ServerOpts = proplists:delete(cacertfile, ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config)),
{ClientNode, ServerNode, _} = ssl_test_lib:run_where(Config),
Version = proplists:get_value(version, Config),
Server = ssl_test_lib:start_server_error([{node, ServerNode}, {port, 0},
@@ -478,7 +531,7 @@ missing_root_cert_auth(Config) when is_list(Config) ->
ssl_test_lib:check_result(Server, {error, {options, {cacertfile, ""}}}),
- ClientOpts = proplists:delete(cacertfile, ssl_test_lib:ssl_options(client_cert_opts, Config)),
+ ClientOpts = proplists:delete(cacertfile, ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config)),
Client = ssl_test_lib:start_client_error([{node, ClientNode}, {port, 0},
{from, self()},
{options, [{verify, verify_peer}
@@ -492,7 +545,7 @@ missing_root_cert_auth_user_verify_fun_accept() ->
" with a verify_fun that accepts the unknown CA error"}].
missing_root_cert_auth_user_verify_fun_accept(Config) ->
- ServerOpts = ssl_test_lib:ssl_options(server_cert_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config),
FunAndState = {fun(_,{bad_cert, unknown_ca}, UserState) ->
{valid, UserState};
(_,{bad_cert, _} = Reason, _) ->
@@ -504,8 +557,8 @@ missing_root_cert_auth_user_verify_fun_accept(Config) ->
(_, valid_peer, UserState) ->
{valid, UserState}
end, []},
- ClientOpts = ssl_test_lib:ssl_options([{verify, verify_peer},
- {verify_fun, FunAndState}], Config),
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, [{verify, verify_peer},
+ {verify_fun, FunAndState}], Config),
ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
%%--------------------------------------------------------------------
@@ -513,7 +566,7 @@ missing_root_cert_auth_user_backwardscompatibility_verify_fun_accept() ->
[{doc, "Test old style verify fun"}].
missing_root_cert_auth_user_backwardscompatibility_verify_fun_accept(Config) ->
- ServerOpts = ssl_test_lib:ssl_options(server_cert_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config),
AcceptBadCa = fun({bad_cert,unknown_ca}, Acc) -> Acc;
(Other, Acc) -> [Other | Acc]
end,
@@ -524,9 +577,8 @@ missing_root_cert_auth_user_backwardscompatibility_verify_fun_accept(Config) ->
[_|_] -> false
end
end,
-
- ClientOpts = ssl_test_lib:ssl_options([{verify, verify_peer},
- {verify_fun, VerifyFun}], Config),
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, [{verify, verify_peer},
+ {verify_fun, VerifyFun}], Config),
ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
%%--------------------------------------------------------------------
@@ -535,7 +587,7 @@ missing_root_cert_auth_user_verify_fun_reject() ->
" with a verify_fun that rejects the unknown CA error"}].
missing_root_cert_auth_user_verify_fun_reject(Config) ->
- ServerOpts = ssl_test_lib:ssl_options(server_cert_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config),
FunAndState = {fun(_,{bad_cert, unknown_ca} = Reason, _UserState) ->
{fail, Reason};
(_,{bad_cert, _} = Reason, _) ->
@@ -547,8 +599,8 @@ missing_root_cert_auth_user_verify_fun_reject(Config) ->
(_, valid_peer, UserState) ->
{valid, UserState}
end, []},
- ClientOpts = ssl_test_lib:ssl_options([{verify, verify_peer},
- {verify_fun, FunAndState}], Config),
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, [{verify, verify_peer},
+ {verify_fun, FunAndState}], Config),
ssl_test_lib:basic_alert(ClientOpts, ServerOpts, Config, unknown_ca).
%%--------------------------------------------------------------------
incomplete_chain_auth() ->
@@ -563,12 +615,12 @@ incomplete_chain_auth(Config) when is_list(Config) ->
{client_chain, DefaultCertConf}]),
[ServerRoot| _] = ServerCas = proplists:get_value(cacerts, ServerOpts0),
ClientCas = proplists:get_value(cacerts, ClientOpts0),
- ClientOpts = ssl_test_lib:ssl_options([{verify, verify_peer},
- {cacerts, ServerCas ++ ClientCas} |
- proplists:delete(cacerts, ClientOpts0)], Config),
- ServerOpts = ssl_test_lib:ssl_options([{verify, verify_peer},
- {cacerts, [ServerRoot]} |
- proplists:delete(cacerts, ServerOpts0)], Config),
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, [{verify, verify_peer},
+ {cacerts, ServerCas ++ ClientCas} |
+ proplists:delete(cacerts, ClientOpts0)], Config),
+ ServerOpts = ssl_test_lib:ssl_options(extra_server, [{verify, verify_peer},
+ {cacerts, [ServerRoot]} |
+ proplists:delete(cacerts, ServerOpts0)], Config),
ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
%%--------------------------------------------------------------------
@@ -577,8 +629,8 @@ verify_fun_always_run_client() ->
"valid_peer not only unknown_extension)"}].
verify_fun_always_run_client(Config) when is_list(Config) ->
- ClientOpts = ssl_test_lib:ssl_options(client_cert_opts, Config),
- ServerOpts = ssl_test_lib:ssl_options(server_cert_opts, Config),
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config),
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
Version = proplists:get_value(version, Config),
Server = ssl_test_lib:start_server_error([{node, ServerNode}, {port, 0},
@@ -618,8 +670,8 @@ verify_fun_always_run_server() ->
[{doc,"Verify that user verify_fun is always run (for valid and "
"valid_peer not only unknown_extension)"}].
verify_fun_always_run_server(Config) when is_list(Config) ->
- ClientOpts = ssl_test_lib:ssl_options(client_cert_opts, Config),
- ServerOpts = ssl_test_lib:ssl_options(server_cert_opts, Config),
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config),
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
%% If user verify fun is called correctly we fail the connection.
@@ -681,8 +733,8 @@ critical_extension_auth(Config) when is_list(Config) ->
[{server_chain,
[[],[],[{extensions, Ext}]]},
{client_chain, DefaultCertConf}]),
- ClientOpts = ssl_test_lib:ssl_options(ClientOpts0, Config),
- ServerOpts = ssl_test_lib:ssl_options(ServerOpts0, Config),
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, ClientOpts0, Config),
+ ServerOpts = ssl_test_lib:ssl_options(extra_server, ServerOpts0, Config),
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
Version = proplists:get_value(version, Config),
@@ -713,8 +765,8 @@ critical_extension_client_auth(Config) when is_list(Config) ->
[{client_chain,
[[],[],[{extensions, Ext}]]},
{server_chain, DefaultCertConf}]),
- ClientOpts = ssl_test_lib:ssl_options(ClientOpts0, Config),
- ServerOpts = ssl_test_lib:ssl_options(ServerOpts0, Config),
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, ClientOpts0, Config),
+ ServerOpts = ssl_test_lib:ssl_options(extra_server, ServerOpts0, Config),
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
Version = proplists:get_value(version, Config),
@@ -748,8 +800,8 @@ critical_extension_no_auth(Config) when is_list(Config) ->
[{server_chain,
[[],[], [{extensions, Ext}]]},
{client_chain, DefaultCertConf}]),
- ClientOpts = [{verify, verify_none} | ssl_test_lib:ssl_options(ClientOpts0, Config)],
- ServerOpts = [{verify, verify_none} | ssl_test_lib:ssl_options(ServerOpts0, Config)],
+ ClientOpts = [{verify, verify_none} | ssl_test_lib:ssl_options(extra_client, ClientOpts0, Config)],
+ ServerOpts = [{verify, verify_none} | ssl_test_lib:ssl_options(extra_server, ServerOpts0, Config)],
ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
@@ -769,8 +821,8 @@ extended_key_usage_auth(Config) when is_list(Config) ->
[[],[], [{extensions, Ext}]]},
{client_chain, DefaultCertConf}
]),
- ClientOpts = ssl_test_lib:ssl_options(ClientOpts0, Config),
- ServerOpts = ssl_test_lib:ssl_options(ServerOpts0, Config),
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, ClientOpts0, Config),
+ ServerOpts = ssl_test_lib:ssl_options(extra_server, ServerOpts0, Config),
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
Version = proplists:get_value(version, Config),
@@ -804,8 +856,8 @@ extended_key_usage_client_auth(Config) when is_list(Config) ->
server_config := ServerOpts0} = ssl_test_lib:make_cert_chains_der(proplists:get_value(cert_key_alg, Config),
[{client_chain, [[],[],[{extensions, ClientExt}]]},
{server_chain, [[],[],[{extensions, ServerExt}]]}]),
- ClientOpts = ssl_test_lib:ssl_options(ClientOpts0, Config),
- ServerOpts = ssl_test_lib:ssl_options(ServerOpts0, Config),
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, ClientOpts0, Config),
+ ServerOpts = ssl_test_lib:ssl_options(extra_server, ServerOpts0, Config),
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
Version = proplists:get_value(version, Config),
@@ -842,8 +894,8 @@ cert_expired(Config) when is_list(Config) ->
[]
]},
{client_chain, DefaultCertConf}]),
- ClientOpts = ssl_test_lib:ssl_options(ClientOpts0, Config),
- ServerOpts = ssl_test_lib:ssl_options(ServerOpts0, Config),
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, ClientOpts0, Config),
+ ServerOpts = ssl_test_lib:ssl_options(extra_server, ServerOpts0, Config),
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
Version = proplists:get_value(version, Config),
@@ -869,8 +921,8 @@ no_auth_key_identifier_ext(Config) when is_list(Config) ->
ssl_test_lib:make_cert_chains_der(proplists:get_value(cert_key_alg, Config),
[{client_chain, DefaultCertConf},
{server_chain, DefaultCertConf}]),
- ClientOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(ClientOpts0, Config)],
- ServerOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(ServerOpts0, Config)],
+ ClientOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(extra_client, ClientOpts0, Config)],
+ ServerOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(extra_server, ServerOpts0, Config)],
ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
@@ -889,8 +941,8 @@ no_auth_key_identifier_ext_keyEncipherment(Config) when is_list(Config) ->
[[],[],[{extensions, ClientExt}]]},
{server_chain, DefaultCertConf}
]),
- ClientOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(ClientOpts0, Config)],
- ServerOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(ServerOpts0, Config)],
+ ClientOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(extra_client, ClientOpts0, Config)],
+ ServerOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(extra_server, ServerOpts0, Config)],
ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
@@ -909,10 +961,10 @@ key_auth_ext_sign_only(Config) when is_list(Config) ->
{server_chain, DefaultCertConf}
]),
Version = proplists:get_value(version, Config),
- ClientOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(ClientOpts0, Config)],
+ ClientOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(extra_client, ClientOpts0, Config)],
ServerOpts = [{verify, verify_peer}, {ciphers,
ssl_test_lib:rsa_non_signed_suites(n_version(Version))}
- | ssl_test_lib:ssl_options(ServerOpts0, Config)],
+ | ssl_test_lib:ssl_options(extra_server, ServerOpts0, Config)],
ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
@@ -933,9 +985,9 @@ longer_chain(Config) when is_list(Config) ->
[ServerRoot| _] = ServerCas = proplists:get_value(cacerts, ServerOpts0),
ClientCas = proplists:get_value(cacerts, ClientOpts0),
- ServerOpts = ssl_test_lib:ssl_options([{verify, verify_peer}, {cacerts, [ServerRoot]} |
+ ServerOpts = ssl_test_lib:ssl_options(extra_server, [{verify, verify_peer}, {cacerts, [ServerRoot]} |
proplists:delete(cacerts, ServerOpts0)], Config),
- ClientOpts = ssl_test_lib:ssl_options([{verify, verify_peer},
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, [{verify, verify_peer},
{depth, 5},
{cacerts, ServerCas ++ ClientCas} |
proplists:delete(cacerts, ClientOpts0)], Config),
@@ -972,21 +1024,21 @@ cross_signed_chain(Config)
{[_Peer,CI1New,CI2New,CRNew], CRNew} = chain_and_root(ClientOptsNew),
ServerCas = [CRNew|ServerCas0 -- [CROld]],
- ServerOpts = ssl_test_lib:ssl_options([{verify, verify_peer} |
- lists:keyreplace(cacerts, 1, ServerOpts0, {cacerts, ServerCas})],
+ ServerOpts = ssl_test_lib:ssl_options(extra_server, [{verify, verify_peer} |
+ lists:keyreplace(cacerts, 1, ServerOpts0, {cacerts, ServerCas})],
Config),
- ClientOpts = ssl_test_lib:ssl_options([{verify, verify_peer} |
- lists:keyreplace(cacerts, 1,
- lists:keyreplace(cert, 1, ClientOpts0,
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, [{verify, verify_peer} |
+ lists:keyreplace(cacerts, 1,
+ lists:keyreplace(cert, 1, ClientOpts0,
{cert, [Peer,CI1New,CI2New,CI1,CI2,CRNew,CROld]}),
- {cacerts, ClientCas0})],
+ {cacerts, ClientCas0})],
Config),
ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config),
- ClientOpts2 = ssl_test_lib:ssl_options([{verify, verify_peer} |
- lists:keyreplace(cacerts, 1,
- lists:keyreplace(cert, 1, ClientOpts0,
- {cert, [Peer,CI1,CI1New,CI2,CI2New,CROld,CRNew]}),
- {cacerts, ClientCas0})],
+ ClientOpts2 = ssl_test_lib:ssl_options(extra_client, [{verify, verify_peer} |
+ lists:keyreplace(cacerts, 1,
+ lists:keyreplace(cert, 1, ClientOpts0,
+ {cert, [Peer,CI1,CI1New,CI2,CI2New,CROld,CRNew]}),
+ {cacerts, ClientCas0})],
Config),
ssl_test_lib:basic_test(ClientOpts2, ServerOpts, Config),
ok.
@@ -1083,33 +1135,35 @@ custom_groups(Config) ->
%% of CertificateRequest does not contain the algorithm of the client certificate).
%% ssl client sends an empty certificate.
unsupported_sign_algo_cert_client_auth() ->
- [{doc,"TLS 1.3: Test client authentication with unsupported signature_algorithm_cert"}].
+ [{doc,"TLS 1.3 (backported to TLS-1.2) : Test client authentication with unsupported signature_algorithm_cert"}].
unsupported_sign_algo_cert_client_auth(Config) ->
- ClientOpts0 = ssl_test_lib:ssl_options(client_cert_opts, Config),
+ ClientOpts = ssl_test_lib:ssl_options(client_cert_opts, Config),
ServerOpts0 = ssl_test_lib:ssl_options(server_cert_opts, Config),
- ServerOpts = [{versions, ['tlsv1.2','tlsv1.3']},
- {verify, verify_peer},
+ ServerOpts = [{verify, verify_peer},
{signature_algs, [rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pss_rsae_sha256, rsa_pss_pss_sha256]},
%% Skip rsa_pkcs1_sha256!
{signature_algs_cert, [rsa_pkcs1_sha384, rsa_pkcs1_sha512]},
{fail_if_no_peer_cert, true}|ServerOpts0],
- ClientOpts = [{versions, ['tlsv1.2','tlsv1.3']}|ClientOpts0],
- ssl_test_lib:basic_alert(ClientOpts, ServerOpts, Config, certificate_required).
+ Version = proplists:get_value(version, Config),
+ case Version of
+ 'tlsv1.3' ->
+ ssl_test_lib:basic_alert(ClientOpts, ServerOpts, Config, certificate_required);
+ _ ->
+ ssl_test_lib:basic_alert(ClientOpts, ServerOpts, Config, insufficient_security)
+ end.
%%--------------------------------------------------------------------
unsupported_sign_algo_client_auth() ->
- [{doc,"TLS 1.3: Test client authentication with unsupported signature_algorithm"}].
+ [{doc,"TLS 1.3 (backported to TLS-1.2): Test client authentication with unsupported signature_algorithm"}].
unsupported_sign_algo_client_auth(Config) ->
ClientOpts0 = ssl_test_lib:ssl_options(client_cert_opts, Config),
ServerOpts0 = ssl_test_lib:ssl_options(server_cert_opts, Config),
- ServerOpts = [{versions, ['tlsv1.2','tlsv1.3']},
- {verify, verify_peer},
- %% Skip rsa_pkcs1_sha256!
- {signature_algs, [rsa_pkcs1_sha384, rsa_pkcs1_sha512]},
+ ClientOpts = [{signature_algs, [rsa_pkcs1_sha256, rsa_pss_rsae_sha256]} | ClientOpts0],
+ ServerOpts = [{verify, verify_peer},
+ {signature_algs, [ecdsa_sha1, rsa_pss_pss_sha256]},
{fail_if_no_peer_cert, true}|ServerOpts0],
- ClientOpts = [{versions, ['tlsv1.2','tlsv1.3']}|ClientOpts0],
ssl_test_lib:basic_alert(ClientOpts, ServerOpts, Config, insufficient_security).
%%--------------------------------------------------------------------
hello_retry_client_auth() ->
diff --git a/lib/ssl/test/ssl_cert_tests.erl b/lib/ssl/test/ssl_cert_tests.erl
index d9d535106a..2b71998b11 100644
--- a/lib/ssl/test/ssl_cert_tests.erl
+++ b/lib/ssl/test/ssl_cert_tests.erl
@@ -78,8 +78,8 @@ no_auth() ->
[{doc,"Test connection without authentication"}].
no_auth(Config) ->
- ClientOpts = [{verify, verify_none} | ssl_test_lib:ssl_options(client_cert_opts, Config)],
- ServerOpts = [{verify, verify_none} | ssl_test_lib:ssl_options(server_cert_opts, Config)],
+ ClientOpts = [{verify, verify_none} | ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config)],
+ ServerOpts = [{verify, verify_none} | ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config)],
ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
%%--------------------------------------------------------------------
@@ -87,8 +87,8 @@ auth() ->
[{doc,"Test connection with mutual authentication"}].
auth(Config) ->
- ClientOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(client_cert_opts, Config)],
- ServerOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(server_cert_opts, Config)],
+ ClientOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config)],
+ ServerOpts = [{verify, verify_peer} | ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config)],
ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
@@ -100,8 +100,8 @@ client_auth_empty_cert_accepted() ->
client_auth_empty_cert_accepted(Config) ->
ClientOpts = proplists:delete(keyfile,
proplists:delete(certfile,
- ssl_test_lib:ssl_options(client_cert_opts, Config))),
- ServerOpts0 = ssl_test_lib:ssl_options(server_cert_opts, Config),
+ ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config))),
+ ServerOpts0 = ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config),
ServerOpts = [{verify, verify_peer},
{fail_if_no_peer_cert, false} | ServerOpts0],
ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
@@ -112,8 +112,8 @@ client_auth_empty_cert_rejected() ->
client_auth_empty_cert_rejected(Config) ->
ServerOpts = [{verify, verify_peer}, {fail_if_no_peer_cert, true}
- | ssl_test_lib:ssl_options(server_cert_opts, Config)],
- ClientOpts0 = ssl_test_lib:ssl_options([], Config),
+ | ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config)],
+ ClientOpts0 = ssl_test_lib:ssl_options(extra_client, [], Config),
%% Delete Client Cert and Key
ClientOpts1 = proplists:delete(certfile, ClientOpts0),
ClientOpts = proplists:delete(keyfile, ClientOpts1),
@@ -131,8 +131,8 @@ client_auth_partial_chain() ->
client_auth_partial_chain(Config) when is_list(Config) ->
ServerOpts = [{verify, verify_peer}, {fail_if_no_peer_cert, true}
- | ssl_test_lib:ssl_options(server_cert_opts, Config)],
- ClientOpts0 = ssl_test_lib:ssl_options(client_cert_opts, Config),
+ | ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config)],
+ ClientOpts0 = ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config),
{ok, ClientCAs} = file:read_file(proplists:get_value(cacertfile, ClientOpts0)),
[{_,RootCA,_} | _] = public_key:pem_decode(ClientCAs),
ClientOpts = [{cacerts, [RootCA]} |
@@ -145,8 +145,8 @@ client_auth_allow_partial_chain() ->
client_auth_allow_partial_chain(Config) when is_list(Config) ->
ServerOpts0 = [{verify, verify_peer}, {fail_if_no_peer_cert, true}
- | ssl_test_lib:ssl_options(server_cert_opts, Config)],
- ClientOpts = ssl_test_lib:ssl_options(client_cert_opts, Config),
+ | ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config)],
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config),
{ok, ClientCAs} = file:read_file(proplists:get_value(cacertfile, ClientOpts)),
[{_,_,_}, {_, IntermidiateCA, _} | _] = public_key:pem_decode(ClientCAs),
@@ -171,8 +171,8 @@ client_auth_do_not_allow_partial_chain() ->
client_auth_do_not_allow_partial_chain(Config) when is_list(Config) ->
ServerOpts0 = [{verify, verify_peer}, {fail_if_no_peer_cert, true}
- | ssl_test_lib:ssl_options(server_cert_opts, Config)],
- ClientOpts = ssl_test_lib:ssl_options(client_cert_opts, Config),
+ | ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config)],
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config),
{ok, ServerCAs} = file:read_file(proplists:get_value(cacertfile, ServerOpts0)),
[{_,_,_}, {_, IntermidiateCA, _} | _] = public_key:pem_decode(ServerCAs),
@@ -190,8 +190,8 @@ client_auth_partial_chain_fun_fail() ->
client_auth_partial_chain_fun_fail(Config) when is_list(Config) ->
ServerOpts0 = [{verify, verify_peer}, {fail_if_no_peer_cert, true}
- | ssl_test_lib:ssl_options(server_cert_opts, Config)],
- ClientOpts = ssl_test_lib:ssl_options(client_cert_opts, Config),
+ | ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config)],
+ ClientOpts = ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config),
{ok, ServerCAs} = file:read_file(proplists:get_value(cacertfile, ServerOpts0)),
[{_,_,_}, {_, IntermidiateCA, _} | _] = public_key:pem_decode(ServerCAs),
@@ -209,7 +209,7 @@ client_auth_partial_chain_fun_fail(Config) when is_list(Config) ->
client_auth_sni() ->
[{doc, "Check that sni check works with user verify_fun"}].
client_auth_sni(Config) when is_list(Config) ->
- ServerOpts0 = ssl_test_lib:ssl_options(server_cert_opts, Config),
+ ServerOpts0 = ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config),
FunAndState = {fun(valid_peer, {bad_cert, unknown_ca}, UserState) ->
{valid_peer, UserState};
@@ -223,7 +223,7 @@ client_auth_sni(Config) when is_list(Config) ->
{valid, UserState}
end, []},
- ClientOpts0 = ssl_test_lib:ssl_options(client_cert_opts, Config),
+ ClientOpts0 = ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config),
ClientOpts = [{verify, verify_peer}, {verify_fun, FunAndState
}, {server_name_indication, "localhost"} | ClientOpts0],
@@ -247,16 +247,16 @@ client_auth_seelfsigned_peer(Config) when is_list(Config) ->
key := Key} = public_key:pkix_test_root_cert("OTP test server ROOT", [{key, ssl_test_lib:hardcode_rsa_key(6)},
{extensions, Ext}]),
DerKey = public_key:der_encode('RSAPrivateKey', Key),
- ssl_test_lib:basic_alert(ssl_test_lib:ssl_options([{verify, verify_peer}, {cacerts , [Cert]}], Config),
- ssl_test_lib:ssl_options([{cert, Cert},
- {key, {'RSAPrivateKey', DerKey}}], Config), Config, bad_certificate).
+ ssl_test_lib:basic_alert(ssl_test_lib:ssl_options(extra_client, [{verify, verify_peer}, {cacerts , [Cert]}], Config),
+ ssl_test_lib:ssl_options(extra_server, [{cert, Cert},
+ {key, {'RSAPrivateKey', DerKey}}], Config), Config, bad_certificate).
%%--------------------------------------------------------------------
missing_root_cert_no_auth() ->
[{doc,"Test that the client succeds if the ROOT CA is unknown in verify_none mode"}].
missing_root_cert_no_auth(Config) ->
- ClientOpts = [{verify, verify_none} | ssl_test_lib:ssl_options(client_cert_opts, Config)],
- ServerOpts = [{verify, verify_none} | ssl_test_lib:ssl_options(server_cert_opts, Config)],
+ ClientOpts = [{verify, verify_none} | ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config)],
+ ServerOpts = [{verify, verify_none} | ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config)],
ssl_test_lib:basic_test(ClientOpts, ServerOpts, Config).
@@ -265,8 +265,8 @@ invalid_signature_client() ->
[{doc,"Test server with invalid signature"}].
invalid_signature_client(Config) when is_list(Config) ->
- ClientOpts0 = ssl_test_lib:ssl_options(client_cert_opts, Config),
- ServerOpts0 = ssl_test_lib:ssl_options(server_cert_opts, Config),
+ ClientOpts0 = ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config),
+ ServerOpts0 = ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config),
PrivDir = proplists:get_value(priv_dir, Config),
KeyFile = proplists:get_value(keyfile, ClientOpts0),
@@ -289,8 +289,8 @@ invalid_signature_server() ->
[{doc,"Test client with invalid signature"}].
invalid_signature_server(Config) when is_list(Config) ->
- ClientOpts0 = ssl_test_lib:ssl_options(client_cert_opts, Config),
- ServerOpts0 = ssl_test_lib:ssl_options(server_cert_opts, Config),
+ ClientOpts0 = ssl_test_lib:ssl_options(extra_client, client_cert_opts, Config),
+ ServerOpts0 = ssl_test_lib:ssl_options(extra_server, server_cert_opts, Config),
PrivDir = proplists:get_value(priv_dir, Config),
KeyFile = proplists:get_value(keyfile, ServerOpts0),
diff --git a/lib/ssl/test/ssl_handshake_SUITE.erl b/lib/ssl/test/ssl_handshake_SUITE.erl
index df8f867f24..d5a591db01 100644
--- a/lib/ssl/test/ssl_handshake_SUITE.erl
+++ b/lib/ssl/test/ssl_handshake_SUITE.erl
@@ -193,10 +193,10 @@ ignore_hassign_extension_pre_tls_1_2(Config) ->
CertFile = proplists:get_value(certfile, Opts),
[{_, Cert, _}] = ssl_test_lib:pem_to_der(CertFile),
HashSigns = #hash_sign_algos{hash_sign_algos = [{sha512, rsa}, {sha, dsa}, {sha256, rsa}]},
- {sha512, rsa} = ssl_handshake:select_hashsign({HashSigns, undefined}, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,3}), {3,3}),
+ {sha512, rsa} = ssl_handshake:select_hashsign({HashSigns, undefined}, Cert, ecdhe_rsa, tls_v1:default_signature_algs([{3,3}]), {3,3}),
%%% Ignore
- {md5sha, rsa} = ssl_handshake:select_hashsign({HashSigns, undefined}, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,2}), {3,2}),
- {md5sha, rsa} = ssl_handshake:select_hashsign({HashSigns, undefined}, Cert, ecdhe_rsa, tls_v1:default_signature_algs({3,0}), {3,0}).
+ {md5sha, rsa} = ssl_handshake:select_hashsign({HashSigns, undefined}, Cert, ecdhe_rsa, tls_v1:default_signature_algs([{3,2}]), {3,2}),
+ {md5sha, rsa} = ssl_handshake:select_hashsign({HashSigns, undefined}, Cert, ecdhe_rsa, tls_v1:default_signature_algs([{3,0}]), {3,0}).
encode_decode_srp(_Config) ->
Exts = #{srp => #srp{username = <<"foo">>},
@@ -238,7 +238,7 @@ signature_algorithms(Config) ->
{sha512, rsa} = ssl_handshake:select_hashsign(
{HashSigns0, Schemes0},
Cert, ecdhe_rsa,
- tls_v1:default_signature_algs({3,3}),
+ tls_v1:default_signature_algs([{3,3}]),
{3,3}),
HashSigns1 = #hash_sign_algos{
hash_sign_algos = [{sha, dsa},
@@ -246,7 +246,7 @@ signature_algorithms(Config) ->
{sha256, rsa} = ssl_handshake:select_hashsign(
{HashSigns1, Schemes0},
Cert, ecdhe_rsa,
- tls_v1:default_signature_algs({3,3}),
+ tls_v1:default_signature_algs([{3,3}]),
{3,3}),
Schemes1 = #signature_algorithms_cert{
signature_scheme_list = [rsa_pkcs1_sha1,
@@ -255,13 +255,13 @@ signature_algorithms(Config) ->
#alert{} = ssl_handshake:select_hashsign(
{HashSigns1, Schemes1},
Cert, ecdhe_rsa,
- tls_v1:default_signature_algs({3,3}),
+ tls_v1:default_signature_algs([{3,3}]),
{3,3}),
%% No scheme, hashsign is used
{sha256, rsa} = ssl_handshake:select_hashsign(
{HashSigns1, undefined},
Cert, ecdhe_rsa,
- tls_v1:default_signature_algs({3,3}),
+ tls_v1:default_signature_algs([{3,3}]),
{3,3}),
HashSigns2 = #hash_sign_algos{
hash_sign_algos = [{sha, dsa}]},
@@ -269,7 +269,7 @@ signature_algorithms(Config) ->
#alert{} = ssl_handshake:select_hashsign(
{HashSigns2, Schemes1},
Cert, ecdhe_rsa,
- tls_v1:default_signature_algs({3,3}),
+ tls_v1:default_signature_algs([{3,3}]),
{3,3}).
%%--------------------------------------------------------------------
diff --git a/lib/ssl/test/ssl_session_SUITE.erl b/lib/ssl/test/ssl_session_SUITE.erl
index 57e8944fe2..33a455bf77 100644
--- a/lib/ssl/test/ssl_session_SUITE.erl
+++ b/lib/ssl/test/ssl_session_SUITE.erl
@@ -63,6 +63,7 @@
-define(SLEEP, 500).
-define(EXPIRE, 10).
+-define(CLIENT_CB, ssl_client_session_cache_db).
%%--------------------------------------------------------------------
%% Common Test interface functions -----------------------------------
@@ -453,22 +454,36 @@ no_reuses_session_server_restart_new_cert_file(Config) when is_list(Config) ->
client_max_session_table() ->
- [{doc, "Check that max session table limit handling set max to 1 in init_per_testcase"}].
+ [{doc, "Check that max session table limit is not exceeded, set max to 2 in init_per_testcase"}].
client_max_session_table(Config) when is_list(Config)->
ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
{ClientNode, ServerNode, HostName} = ssl_test_lib:run_where(Config),
- test_max_session_limit(ClientOpts,ServerOpts,ClientNode, ServerNode, HostName).
+ test_max_session_limit(ClientOpts,ServerOpts,ClientNode, ServerNode, HostName),
+ %% Explicit check table size
+ {status, _, _, StatusInfo} = sys:get_status(whereis(ssl_manager)),
+ [_, _,_, _, Prop] = StatusInfo,
+ State = ssl_test_lib:state(Prop),
+ ClientCache = element(2, State),
+ 2 = ?CLIENT_CB:size(ClientCache).
server_max_session_table() ->
- [{doc, "Check that max session table limit handling set max to 1 in init_per_testcase"}].
+ [{doc, "Check that max session table limit exceeded, set max to 2 in init_per_testcase"}].
server_max_session_table(Config) when is_list(Config)->
ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
{ClientNode, ServerNode, HostName} = ssl_test_lib:run_where(Config),
- test_max_session_limit(ClientOpts,ServerOpts,ClientNode, ServerNode, HostName).
+ test_max_session_limit(ClientOpts,ServerOpts,ClientNode, ServerNode, HostName),
+ %% Explicit check table size
+ SupName = sup_name(ServerOpts),
+ Sup = whereis(SupName),
+ %% Will only be one process, that is one server, in our test senario
+ [{_, SessionCachePid, worker,[ssl_server_session_cache]}] = supervisor:which_children(Sup),
+ {SessionCacheCb, SessionCacheDb} = session_cachce_info(SessionCachePid),
+ N = SessionCacheCb:size(SessionCacheDb),
+ true = N == 2.
session_table_stable_size_on_tcp_close() ->
[{doc, "Check that new sessions are cleanup when connection is closed abruptly during first handshake"}].
@@ -702,3 +717,13 @@ test_max_session_limit(ClientOpts, ServerOpts, ClientNode, ServerNode, HostName)
Other ->
ct:fail({{expected, SID2}, {got,Other}})
end.
+
+
+sup_name(Opts) ->
+ case proplists:get_value(protocol, Opts, tls) of
+ tls ->
+ ssl_server_session_cache_sup;
+ dtls ->
+ dtls_server_session_cache_sup
+ end.
+
diff --git a/lib/ssl/test/ssl_session_cache_SUITE.erl b/lib/ssl/test/ssl_session_cache_SUITE.erl
index 8f67908ad7..8b73bac1c6 100644
--- a/lib/ssl/test/ssl_session_cache_SUITE.erl
+++ b/lib/ssl/test/ssl_session_cache_SUITE.erl
@@ -216,7 +216,7 @@ client_unique_session(Config) when is_list(Config) ->
{tcp_options, [{active, false}]},
{options, ServerOpts}]),
Port = ssl_test_lib:inet_port(Server),
- LastClient = clients_start(Server, ClientNode, Hostname, Port, ClientOpts, 20),
+ LastClient = clients_start(Server, ClientNode, Hostname, Port, ClientOpts, 20, []),
receive
{LastClient, {ok, _}} ->
ok
@@ -370,18 +370,17 @@ max_table_size(Config) when is_list(Config) ->
{options, ServerOpts}]),
Port = ssl_test_lib:inet_port(Server),
LastClient = clients_start(Server,
- ClientNode, Hostname, Port, ClientOpts, 20),
+ ClientNode, Hostname, Port, ClientOpts, 20, [{reuse_sessions, save}]),
receive
- {LastClient, {ok, _}} ->
- ok
+ {LastClient, {ok, _}} ->
+ ok
end,
- ct:sleep(1000),
{status, _, _, StatusInfo} = sys:get_status(whereis(ssl_manager)),
[_, _,_, _, Prop] = StatusInfo,
State = ssl_test_lib:state(Prop),
ClientCache = element(2, State),
M = ?CLIENT_CB:size(ClientCache),
- ct:pal("~p",[M]),
+ ct:pal("Cache size ~p",[M]),
ssl_test_lib:close(Server, 500),
ssl_test_lib:close(LastClient),
true = M =< ?MAX_TABLE_SIZE.
@@ -551,22 +550,21 @@ session_cache_process(_Type,Config) when is_list(Config) ->
ssl_test_lib:reuse_session(ClientOpts, ServerOpts, Config).
-clients_start(_Server, ClientNode, Hostname, Port, ClientOpts, 0) ->
- %% Make sure session is registered
- ct:sleep(?SLEEP * 2),
+clients_start(_Server, ClientNode, Hostname, Port, ClientOpts, 0, Opts) ->
ssl_test_lib:start_client([{node, ClientNode},
{port, Port}, {host, Hostname},
{mfa, {?MODULE, connection_info_result, []}},
- {from, self()}, {options, ClientOpts}]);
-clients_start(Server, ClientNode, Hostname, Port, ClientOpts, N) ->
+ %% Make sure session is registered
+ {from, self()}, {options, Opts ++ ClientOpts}]);
+clients_start(Server, ClientNode, Hostname, Port, ClientOpts, N, Opts) ->
spawn_link(ssl_test_lib, start_client,
[[{node, ClientNode},
{port, Port}, {host, Hostname},
{mfa, {ssl_test_lib, no_result, []}},
- {from, self()}, {options, ClientOpts}]]),
+ {from, self()}, {options, Opts ++ ClientOpts}]]),
Server ! listen,
wait_for_server(),
- clients_start(Server, ClientNode, Hostname, Port, ClientOpts, N-1).
+ clients_start(Server, ClientNode, Hostname, Port, ClientOpts, N-1, Opts).
check_timer(Timer) ->
diff --git a/lib/ssl/test/ssl_test_lib.erl b/lib/ssl/test/ssl_test_lib.erl
index 17a04fb374..e4c23c22cf 100644
--- a/lib/ssl/test/ssl_test_lib.erl
+++ b/lib/ssl/test/ssl_test_lib.erl
@@ -35,6 +35,7 @@
end_per_group/2,
ct_log_supported_protocol_versions/1,
ssl_options/2,
+ ssl_options/3,
run_where/1,
run_where/2,
inet_port/1,
@@ -3277,6 +3278,10 @@ ubuntu_legacy_support() ->
true
end.
+ssl_options(Extra, Option, Config) ->
+ ExtraOpts = proplists:get_value(Extra, Config, []),
+ ExtraOpts ++ ssl_options(Option, Config).
+
ssl_options(Option, Config) when is_atom(Option) ->
ProtocolOpts = proplists:get_value(protocol_opts, Config, []),
Opts = proplists:get_value(Option, Config, []),
diff --git a/lib/ssl/test/tls_1_3_version_SUITE.erl b/lib/ssl/test/tls_1_3_version_SUITE.erl
index 03fcb9afe5..6e0334a16f 100644
--- a/lib/ssl/test/tls_1_3_version_SUITE.erl
+++ b/lib/ssl/test/tls_1_3_version_SUITE.erl
@@ -146,7 +146,7 @@ tls13_client_tls12_server(Config) when is_list(Config) ->
tls13_client_with_ext_tls12_server() ->
[{doc,"Test basic connection between TLS 1.2 server and TLS 1.3 client when "
- "client has TLS 1.3 specsific extensions"}].
+ "client has TLS 1.3 specific extensions"}].
tls13_client_with_ext_tls12_server(Config) ->
ClientOpts0 = ssl_test_lib:ssl_options(client_cert_opts, Config),
diff --git a/lib/stdlib/doc/src/c.xml b/lib/stdlib/doc/src/c.xml
index b481596379..bd3045d753 100644
--- a/lib/stdlib/doc/src/c.xml
+++ b/lib/stdlib/doc/src/c.xml
@@ -51,31 +51,80 @@
<func>
<name name="c" arity="1" since=""/>
+ <fsummary>Compile and load a file or module.</fsummary>
+ <desc>
+ <p>Works like <c>c(Module, [])</c>.</p>
+ </desc>
+ </func>
+
+ <func>
<name name="c" arity="2" since=""/>
- <name name="c" arity="3" since="OTP 20.0"/>
<fsummary>Compile and load a file or module.</fsummary>
<desc>
<p>Compiles and then purges and loads the code for a module.
- <c><anno>Module</anno></c> can be either a module name or a source
- file path, with or without <c>.erl</c> extension.
- <c><anno>Options</anno></c> defaults to <c>[]</c>.</p>
- <p>If <c><anno>Module</anno></c> is an atom and is not the path of a
- source file, then the code path is searched to locate the object
- file for the module and extract its original compiler options and
- source path. If the source file is not found in the original
- location, <seemfa
- marker="filelib#find_source/1"><c>filelib:find_source/1</c></seemfa>
- is used to search for it relative to the directory of the object
- file.</p>
+ <c><anno>Module</anno></c> can be either a module name or a source
+ file path, with or without <c>.erl</c> extension.</p>
+
+ <p>If <c><anno>Module</anno></c> is a string, it is assumed to
+ be a source file path, and the compiler will attempt to compile
+ the source file with the options <c><anno>Options</anno></c>.
+ If compilation fails, the old object file (if any) is deleted.</p>
+
+ <p>If <c><anno>Module</anno></c> is an atom, a source file
+ with that exact name or with <c>.erl</c> extension will be
+ looked for. If found, the source file is compiled with the
+ options <c><anno>Options</anno></c>. If compilation fails, the
+ old object file (if any) is deleted.</p>
+
+ <p>If <c><anno>Module</anno></c> is an atom and is not the
+ path of a source file, then the code path is searched to
+ locate the object file for the module and extract its original
+ compiler options and source path. If the source file is not
+ found in the original location, <seemfa
+ marker="filelib#find_source/1"><c>filelib:find_source/1</c></seemfa>
+ is used to search for it relative to the directory of the
+ object file.</p>
+
<p>The source file is compiled with the the original
- options appended to the given <c><anno>Options</anno></c>, the
- output replacing the old object file if and only if compilation
- succeeds. A function <c><anno>Filter</anno></c> can be specified
- for removing elements from from the original compiler options
- before the new options are added.</p>
+ options appended to the given <c><anno>Options</anno></c>, the
+ output replacing the old object file if and only if compilation
+ succeeds.</p>
+
<p>Notice that purging the code means that any processes
- lingering in old code for the module are killed without
- warning. For more information, see <c>code/3</c>.</p>
+ lingering in old code for the module are killed without
+ warning. For more information, see the <seeerl
+ marker="kernel:code">code</seeerl> module.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="c" arity="3" since="OTP 20.0"/>
+ <fsummary>Compile and load a file or module.</fsummary>
+ <desc>
+ <p>Compiles and then purges and loads the code for module
+ <c><anno>Module</anno></c>, which must be an atom.</p>
+
+ <p>The code path is searched to locate the object file for
+ module <c><anno>Module</anno></c> and extract its original
+ compiler options and source path. If the source file is not
+ found in the original location, <seemfa
+ marker="filelib#find_source/1"><c>filelib:find_source/1</c></seemfa>
+ is used to search for it relative to the directory of the
+ object file.</p>
+
+ <p>The source file is compiled with the the original
+ options appended to the given <c><anno>Options</anno></c>, the
+ output replacing the old object file if and only if compilation
+ succeeds. The function <c><anno>Filter</anno></c> specifies
+ which elements to remove from the original compiler options
+ before the new options are added. The <c><anno>Filter</anno></c> fun
+ should return <c>true</c> for options to keep, and <c>false</c> for
+ options to remove.</p>
+
+ <p>Notice that purging the code means that any processes
+ lingering in old code for the module are killed without
+ warning. For more information, see the <seeerl
+ marker="kernel:code">code</seeerl> module.</p>
</desc>
</func>
diff --git a/lib/stdlib/src/epp.erl b/lib/stdlib/src/epp.erl
index 9db34afdad..bf944156fa 100644
--- a/lib/stdlib/src/epp.erl
+++ b/lib/stdlib/src/epp.erl
@@ -593,7 +593,7 @@ server(Pid, Name, Options) ->
init_server(Pid, FileName, Options, St0) ->
SourceName = proplists:get_value(source_name, Options, FileName),
Pdm = proplists:get_value(macros, Options, []),
- Ms0 = predef_macros(FileName),
+ Ms0 = predef_macros(SourceName),
case user_predef(Pdm, Ms0) of
{ok,Ms1} ->
DefEncoding = proplists:get_value(default_encoding, Options,
@@ -1915,4 +1915,3 @@ interpret_file_attr([Form0 | Forms], Delta, Fs) ->
[Form | interpret_file_attr(Forms, Delta, Fs)];
interpret_file_attr([], _Delta, _Fs) ->
[].
-
diff --git a/lib/stdlib/src/shell_docs.erl b/lib/stdlib/src/shell_docs.erl
index 4555723a7c..5aaeedde52 100644
--- a/lib/stdlib/src/shell_docs.erl
+++ b/lib/stdlib/src/shell_docs.erl
@@ -354,7 +354,7 @@ get_doc(Module, Function, Arity) ->
false
end, Docs),
- [{F,A,S,get_local_doc({F,A},Dc,D),M} || {F,A,S,Dc,M} <- FnFunctions].
+ [{F,A,S,get_local_doc(F,Dc,D),M} || {F,A,S,Dc,M} <- FnFunctions].
-spec render(Module, Docs) -> unicode:chardata() when
Module :: module(),
@@ -565,7 +565,10 @@ render_callback(_Module, Callback, Arity, #docs_v1{ docs = Docs } = D, Config) -
get_local_doc(MissingMod, Docs, D) when is_atom(MissingMod) ->
get_local_doc(atom_to_binary(MissingMod), Docs, D);
get_local_doc({F,A}, Docs, D) ->
- get_local_doc(unicode:characters_to_binary(io_lib:format("~tp/~p",[F,A])), Docs, D);
+ get_local_doc(unicode:characters_to_binary(
+ io_lib:format("~tp/~p",[F,A])), Docs, D);
+get_local_doc({_Type,F,A}, Docs, D) ->
+ get_local_doc({F,A}, Docs, D);
get_local_doc(_Missing, #{ <<"en">> := Docs }, D) ->
%% English if it exists
normalize_format(Docs, D);
@@ -598,19 +601,22 @@ render_function(FDocs, #docs_v1{ docs = Docs } = D, Config) ->
Acc#{ Group => [Func|Members] }
end, #{}, lists:sort(FDocs)),
lists:map(
- fun({{_,F,A} = Group,Members}) ->
+ fun({Group,Members}) ->
Signatures = lists:flatmap(fun render_signature/1,lists:reverse(Members)),
case lists:search(fun({_,_,_,Doc,_}) ->
Doc =/= #{}
end, Members) of
{value, {_,_,_,Doc,_Meta}} ->
- render_headers_and_docs(Signatures, get_local_doc({F,A},Doc,D), D, Config);
+ render_headers_and_docs(
+ Signatures, get_local_doc(Group, Doc, D), D, Config);
false ->
case lists:keyfind(Group, 1, Docs) of
false ->
- render_headers_and_docs(Signatures, get_local_doc({F,A},none,D), D, Config);
+ render_headers_and_docs(
+ Signatures, get_local_doc(Group, none, D), D, Config);
{_,_,_,Doc,_} ->
- render_headers_and_docs(Signatures, get_local_doc({F,A},Doc,D), D, Config)
+ render_headers_and_docs(
+ Signatures, get_local_doc(Group, Doc, D), D, Config)
end
end
end, maps:to_list(Grouping)).
@@ -691,8 +697,8 @@ render_typecb_docs([], _C) ->
{error,type_missing};
render_typecb_docs(TypeCBs, #config{} = C) when is_list(TypeCBs) ->
[render_typecb_docs(TypeCB, C) || TypeCB <- TypeCBs];
-render_typecb_docs({{_,F,A},_,_Sig,Docs,_Meta} = TypeCB, #config{docs = D} = C) ->
- render_headers_and_docs(render_signature(TypeCB), get_local_doc({F,A},Docs,D), C).
+render_typecb_docs({F,_,_Sig,Docs,_Meta} = TypeCB, #config{docs = D} = C) ->
+ render_headers_and_docs(render_signature(TypeCB), get_local_doc(F,Docs,D), C).
render_typecb_docs(Docs, D, Config) ->
render_typecb_docs(Docs, init_config(D, Config)).
diff --git a/lib/stdlib/test/epp_SUITE.erl b/lib/stdlib/test/epp_SUITE.erl
index 8ec9b7acb8..ae4ca3cd2c 100644
--- a/lib/stdlib/test/epp_SUITE.erl
+++ b/lib/stdlib/test/epp_SUITE.erl
@@ -18,7 +18,7 @@
%% %CopyrightEnd%
-module(epp_SUITE).
--export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2]).
-export([rec_1/1, include_local/1, predef_mac/1,
@@ -29,7 +29,7 @@
otp_8562/1, otp_8665/1, otp_8911/1, otp_10302/1, otp_10820/1,
otp_11728/1, encoding/1, extends/1, function_macro/1,
test_error/1, test_warning/1, otp_14285/1,
- test_if/1,source_name/1,otp_16978/1,otp_16824/1,scan_file/1]).
+ test_if/1,source_name/1,otp_16978/1,otp_16824/1,scan_file/1,file_macro/1]).
-export([epp_parse_erl_form/2]).
@@ -63,16 +63,16 @@ suite() ->
[{ct_hooks,[ts_install_cth]},
{timetrap,{minutes,1}}].
-all() ->
+all() ->
[rec_1, {group, upcase_mac}, include_local, predef_mac,
{group, variable}, otp_4870, otp_4871, otp_5362, pmod,
not_circular, skip_header, otp_6277, gh_4995, otp_7702, otp_8130,
overload_mac, otp_8388, otp_8470, otp_8562,
otp_8665, otp_8911, otp_10302, otp_10820, otp_11728,
encoding, extends, function_macro, test_error, test_warning,
- otp_14285, test_if, source_name, otp_16978, otp_16824, scan_file].
+ otp_14285, test_if, source_name, otp_16978, otp_16824, scan_file, file_macro].
-groups() ->
+groups() ->
[{upcase_mac, [], [upcase_mac_1, upcase_mac_2]},
{variable, [], [variable_1]}].
@@ -113,6 +113,17 @@ include_local(Config) when is_list(Config) ->
[ FileLine || {attribute,_,file,FileLine} <- List ],
ok.
+file_macro(Config) when is_list(Config) ->
+ DataDir = proplists:get_value(data_dir, Config),
+ File = filename:join(DataDir, "file_macro.erl"),
+ {ok, List} = epp:parse_file(File, [{includes, [DataDir]},
+ {source_name, "Other source"}]),
+ %% Both attribute a and b are defined as ?FILE, they should be the same
+ {attribute,_,a,FileA} = lists:keyfind(a, 3, List),
+ {attribute,_,b,FileB} = lists:keyfind(b, 3, List),
+ "Other source" = FileA = FileB,
+ ok.
+
%%% Here is a little reimplementation of epp:parse_file, which times out
%%% after 4 seconds if the epp server doesn't respond. If we use the
%%% regular epp:parse_file, the test case will time out, and then epp
diff --git a/lib/stdlib/test/epp_SUITE_data/file_macro.erl b/lib/stdlib/test/epp_SUITE_data/file_macro.erl
new file mode 100644
index 0000000000..b30d237363
--- /dev/null
+++ b/lib/stdlib/test/epp_SUITE_data/file_macro.erl
@@ -0,0 +1,9 @@
+-module(file_macro).
+
+-export([]).
+
+-a(?FILE).
+
+-include("file_macro.hrl").
+
+-b(?FILE).
diff --git a/lib/stdlib/test/epp_SUITE_data/file_macro.hrl b/lib/stdlib/test/epp_SUITE_data/file_macro.hrl
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/stdlib/test/epp_SUITE_data/file_macro.hrl
diff --git a/lib/wx/api_gen/wx_gen.erl b/lib/wx/api_gen/wx_gen.erl
index 844d8fbd25..2e7fa48791 100644
--- a/lib/wx/api_gen/wx_gen.erl
+++ b/lib/wx/api_gen/wx_gen.erl
@@ -29,7 +29,7 @@
-import(lists, [foldl/3,foldr/3,reverse/1,keysearch/3,map/2,filter/2,droplast/1]).
-import(proplists, [get_value/2,get_value/3]).
--compile([export_all, no_warn_export_all]).
+-compile([export_all, nowarn_export_all]).
-define(DBGCF(Class, Func, Format, Args),
case {get(current_class), get(current_func)} of
@@ -63,7 +63,7 @@ gen_code() ->
put(class_id, 10), %% Start from 10 using the other as special
Defs1 = init_defs(Defs0),
Tab = ets:new(defs, [bag, named_table]), %% Also used to lookup functions in wx_gen_doc.
- Docs = ets:new(docs, [bag, named_table]), %% Used to lookup docs in wx_gen_doc.
+ _Doc = ets:new(docs, [bag, named_table]), %% Used to lookup docs in wx_gen_doc.
Defs2 = parse_defs(Defs1, Tab, []),
parse_enums([File || {{include, File},_} <- get()]),
Defs = translate_enums(Defs2),
@@ -1061,7 +1061,10 @@ add_compat([]) ->
%% We must fix sort order so that merge works
sort_m({A,{L,In1,Out1},M1}, {A,{L,In2,Out2},M2}) ->
- Mod = fun({class, _} = C) -> C; (Term) -> {base, Term} end,
+ Mod = fun({class, _} = C) -> C;
+ (color) -> {int, int, int, int}; %% Keep sort order
+ (Term) -> {base, Term}
+ end,
if
In1 =:= In2, Out1 =:= Out2 ->
@@ -1255,15 +1258,28 @@ types_differ([_|R1], [{term,_}|R2]) ->
types_differ(R1,R2);
types_differ([{class,C1}|R1], [{class,C2}|R2]) ->
case types_differ(R1,R2) of
- true ->
- true;
- false ->
- {class,C1,C2};
- {class,C1,C2} ->
- {class,C1,C2};
- {class, _,_} ->
- false
+ true -> true;
+ false -> {class,C1,C2};
+ {class,C1,C2} -> {class,C1,C2};
+ {class, _,_} -> false
end;
+types_differ([{class,_}|_R1], [{_,_,_,_}|_R2]) ->
+ %%types_differ(R1,R2); should match on rec name
+ true;
+types_differ( [{_,_,_,_}|R1], [{class,_C1}|R2]) ->
+ types_differ(R1,R2);
+types_differ([color|R1], [{IsInt,_,_}|R2]) ->
+ (IsInt =/= int) orelse types_differ(R1,R2);
+types_differ([color|R1], [{IsInt,_,_,_}|R2]) ->
+ (IsInt =/= int) orelse types_differ(R1,R2);
+types_differ([{IsInt,_,_}|R1], [color|R2]) ->
+ (IsInt =/= int) orelse types_differ(R1,R2);
+types_differ([{IsInt,_,_,_}|R1], [color|R2]) ->
+ (IsInt =/= int) orelse types_differ(R1,R2);
+
+types_differ([color|_], _) -> true;
+types_differ(_, [color|_]) -> true;
+
types_differ([int|_], _) -> true;
types_differ(_, [int|_]) -> true;
types_differ([{class,_}|_], _) -> true;
@@ -1339,6 +1355,8 @@ type_foot_print(voidp) -> int;
%% type_foot_print(Type);
type_foot_print(#type{base={comp,_,R={record,_}}}) ->
R;
+type_foot_print(#type{base={comp,"wxColour",_}}) ->
+ color;
type_foot_print(#type{base={comp,_,Types}}) ->
TFL = map(fun({T,N}) when is_list(N) ->
case T of
diff --git a/lib/wx/api_gen/wx_gen_erl.erl b/lib/wx/api_gen/wx_gen_erl.erl
index 2ea5827843..4ecb11562b 100644
--- a/lib/wx/api_gen/wx_gen_erl.erl
+++ b/lib/wx/api_gen/wx_gen_erl.erl
@@ -672,7 +672,7 @@ guard_test(#param{name=_N,type=#type{base={class,_}}}) ->
guard_test(#param{name=_N,type={merged,_}}) ->
skip;
guard_test(#param{name=N,type=#type{base={comp,"wxColour",_Tup}}}) ->
- "tuple_size(" ++ erl_arg_name(N) ++ ") =:= 3; tuple_size(" ++ erl_arg_name(N) ++ ") =:= 4";
+ "?is_colordata(" ++ erl_arg_name(N) ++ ")";
guard_test(#param{name=N,type=#type{base={comp,_,Tup}}}) ->
Doc = fun({int,V}) -> "is_integer("++erl_arg_name(N)++V ++")";
({int64,V}) -> "is_integer("++erl_arg_name(N)++V ++")";
@@ -1242,6 +1242,7 @@ gen_api_footprint(All) ->
_ ->
case wx_gen:type_foot_print(Type) of
{class, C} -> list_to_atom(C);
+ color -> {int,int,int,int};
T -> T
end
end
diff --git a/lib/wx/api_gen/wx_gen_nif.erl b/lib/wx/api_gen/wx_gen_nif.erl
index e71b155e6d..72a82b26c1 100644
--- a/lib/wx/api_gen/wx_gen_nif.erl
+++ b/lib/wx/api_gen/wx_gen_nif.erl
@@ -1441,6 +1441,7 @@ gen_macros() ->
w("#include <wx/listbook.h>~n"),
w("#include <wx/treebook.h>~n"),
w("#include <wx/taskbar.h>~n"),
+ w("#include <wx/textctrl.h>~n"),
w("#include <wx/popupwin.h>~n"),
w("#include <wx/html/htmlwin.h>~n"),
w("#include <wx/html/htmlcell.h>~n"),
diff --git a/lib/wx/api_gen/wxapi.conf b/lib/wx/api_gen/wxapi.conf
index 05a7a0b7cf..1a5639d5bd 100644
--- a/lib/wx/api_gen/wxapi.conf
+++ b/lib/wx/api_gen/wxapi.conf
@@ -1099,12 +1099,16 @@
{enum, wxTextAttrAlignment, "wxTEXT_ALIGNMENT_"}.
-{class, wxTextAttr, root, [],
+{class, wxTextAttr, root, [],
['wxTextAttr','GetAlignment','GetBackgroundColour',
{'GetFont', [{return, {by_val, true}}]},
+ 'GetFontEncoding','GetFontFaceName','GetFontSize','GetFontStyle','GetFontUnderlined','GetFontWeight',
'GetLeftIndent','GetLeftSubIndent','GetRightIndent','GetTabs','GetTextColour',
'HasBackgroundColour','HasFont','HasTextColour','GetFlags','IsDefault',
- 'SetAlignment','SetBackgroundColour','SetFlags','SetFont','SetLeftIndent',
+ 'SetAlignment','SetBackgroundColour','SetFlags','SetFont',
+ 'SetFontEncoding','SetFontFaceName','SetFontFamily','SetFontSize','SetFontPointSize','SetFontPixelSize',
+ 'SetFontStyle',{'SetFontUnderlined',1},'SetFontWeight',
+ 'SetLeftIndent',
'SetRightIndent','SetTabs','SetTextColour']}.
{class, wxTextCtrl, wxControl, [],
diff --git a/lib/wx/c_src/gen/wxe_func_table.cpp b/lib/wx/c_src/gen/wxe_func_table.cpp
index 23372444a7..66357af2f2 100644
--- a/lib/wx/c_src/gen/wxe_func_table.cpp
+++ b/lib/wx/c_src/gen/wxe_func_table.cpp
@@ -1780,8 +1780,8 @@ extern void wxListItemAttr_SetTextColour(WxeApp *app, wxeMemEnv *memenv, wxeComm
extern void wxListItemAttr_destroy(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxImageList_new_0(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxImageList_new_3(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
-extern void wxImageList_Add_2_1(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxImageList_Add_2_0(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxImageList_Add_2_1(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxImageList_Add_1(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxImageList_Create(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxImageList_Draw(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
@@ -1799,6 +1799,12 @@ extern void wxTextAttr_new_1(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxTextAttr_GetAlignment(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxTextAttr_GetBackgroundColour(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxTextAttr_GetFont(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_GetFontEncoding(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_GetFontFaceName(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_GetFontSize(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_GetFontStyle(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_GetFontUnderlined(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_GetFontWeight(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxTextAttr_GetLeftIndent(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxTextAttr_GetLeftSubIndent(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxTextAttr_GetRightIndent(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
@@ -1813,6 +1819,15 @@ extern void wxTextAttr_SetAlignment(WxeApp *app, wxeMemEnv *memenv, wxeCommand&
extern void wxTextAttr_SetBackgroundColour(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxTextAttr_SetFlags(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxTextAttr_SetFont(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_SetFontEncoding(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_SetFontFaceName(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_SetFontFamily(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_SetFontSize(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_SetFontPointSize(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_SetFontPixelSize(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_SetFontStyle(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_SetFontUnderlined(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxTextAttr_SetFontWeight(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxTextAttr_SetLeftIndent(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxTextAttr_SetRightIndent(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxTextAttr_SetTabs(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
@@ -6248,9 +6263,9 @@ wxe_fns_t wxe_fns[] =
{wxListItemAttr_destroy, "wxListItemAttr", "'Destroy'", 1}, // 1764
{wxImageList_new_0, "wxImageList", "new", 0}, // 1765
{wxImageList_new_3, "wxImageList", "new", 3}, // 1766
- {wxImageList_Add_2_1, "wxImageList", "add", 3}, // 1767
+ {wxImageList_Add_2_0, "wxImageList", "add", 3}, // 1767
{NULL, "", "", 0}, // 1768
- {wxImageList_Add_2_0, "wxImageList", "add", 3}, // 1769
+ {wxImageList_Add_2_1, "wxImageList", "add", 3}, // 1769
{wxImageList_Add_1, "wxImageList", "add", 2}, // 1770
{wxImageList_Create, "wxImageList", "create", 4}, // 1771
{wxImageList_Draw, "wxImageList", "draw", 6}, // 1772
@@ -6271,2775 +6286,2790 @@ wxe_fns_t wxe_fns[] =
{wxTextAttr_GetAlignment, "wxTextAttr", "getAlignment", 1}, // 1787
{wxTextAttr_GetBackgroundColour, "wxTextAttr", "getBackgroundColour", 1}, // 1788
{wxTextAttr_GetFont, "wxTextAttr", "getFont", 1}, // 1789
- {wxTextAttr_GetLeftIndent, "wxTextAttr", "getLeftIndent", 1}, // 1790
- {wxTextAttr_GetLeftSubIndent, "wxTextAttr", "getLeftSubIndent", 1}, // 1791
- {wxTextAttr_GetRightIndent, "wxTextAttr", "getRightIndent", 1}, // 1792
- {wxTextAttr_GetTabs, "wxTextAttr", "getTabs", 1}, // 1793
- {wxTextAttr_GetTextColour, "wxTextAttr", "getTextColour", 1}, // 1794
- {wxTextAttr_HasBackgroundColour, "wxTextAttr", "hasBackgroundColour", 1}, // 1795
- {wxTextAttr_HasFont, "wxTextAttr", "hasFont", 1}, // 1796
- {wxTextAttr_HasTextColour, "wxTextAttr", "hasTextColour", 1}, // 1797
- {wxTextAttr_GetFlags, "wxTextAttr", "getFlags", 1}, // 1798
- {wxTextAttr_IsDefault, "wxTextAttr", "isDefault", 1}, // 1799
- {wxTextAttr_SetAlignment, "wxTextAttr", "setAlignment", 2}, // 1800
- {wxTextAttr_SetBackgroundColour, "wxTextAttr", "setBackgroundColour", 2}, // 1801
- {wxTextAttr_SetFlags, "wxTextAttr", "setFlags", 2}, // 1802
- {wxTextAttr_SetFont, "wxTextAttr", "setFont", 3}, // 1803
- {wxTextAttr_SetLeftIndent, "wxTextAttr", "setLeftIndent", 3}, // 1804
- {wxTextAttr_SetRightIndent, "wxTextAttr", "setRightIndent", 2}, // 1805
- {wxTextAttr_SetTabs, "wxTextAttr", "setTabs", 2}, // 1806
- {wxTextAttr_SetTextColour, "wxTextAttr", "setTextColour", 2}, // 1807
- {wxTextAttr_destroy, "wxTextAttr", "'Destroy'", 1}, // 1808
- {wxTextCtrl_new_0, "wxTextCtrl", "new", 0}, // 1809
- {wxTextCtrl_new_3, "wxTextCtrl", "new", 3}, // 1810
- {NULL, "wxTextCtrl", "destroy", 1}, // 1811 obj destructor wxTextCtrl_destruct
- {wxTextCtrl_AppendText, "wxTextCtrl", "appendText", 2}, // 1812
- {wxTextCtrl_CanCopy, "wxTextCtrl", "canCopy", 1}, // 1813
- {wxTextCtrl_CanCut, "wxTextCtrl", "canCut", 1}, // 1814
- {wxTextCtrl_CanPaste, "wxTextCtrl", "canPaste", 1}, // 1815
- {wxTextCtrl_CanRedo, "wxTextCtrl", "canRedo", 1}, // 1816
- {wxTextCtrl_CanUndo, "wxTextCtrl", "canUndo", 1}, // 1817
- {wxTextCtrl_Clear, "wxTextCtrl", "clear", 1}, // 1818
- {wxTextCtrl_Copy, "wxTextCtrl", "copy", 1}, // 1819
- {wxTextCtrl_Create, "wxTextCtrl", "create", 4}, // 1820
- {wxTextCtrl_Cut, "wxTextCtrl", "cut", 1}, // 1821
- {wxTextCtrl_DiscardEdits, "wxTextCtrl", "discardEdits", 1}, // 1822
- {wxTextCtrl_ChangeValue, "wxTextCtrl", "changeValue", 2}, // 1823
- {wxTextCtrl_EmulateKeyPress, "wxTextCtrl", "emulateKeyPress", 2}, // 1824
- {wxTextCtrl_GetDefaultStyle, "wxTextCtrl", "getDefaultStyle", 1}, // 1825
- {wxTextCtrl_GetInsertionPoint, "wxTextCtrl", "getInsertionPoint", 1}, // 1826
- {wxTextCtrl_GetLastPosition, "wxTextCtrl", "getLastPosition", 1}, // 1827
- {wxTextCtrl_GetLineLength, "wxTextCtrl", "getLineLength", 2}, // 1828
- {wxTextCtrl_GetLineText, "wxTextCtrl", "getLineText", 2}, // 1829
- {wxTextCtrl_GetNumberOfLines, "wxTextCtrl", "getNumberOfLines", 1}, // 1830
- {wxTextCtrl_GetRange, "wxTextCtrl", "getRange", 3}, // 1831
- {wxTextCtrl_GetSelection, "wxTextCtrl", "getSelection", 1}, // 1832
- {wxTextCtrl_GetStringSelection, "wxTextCtrl", "getStringSelection", 1}, // 1833
- {wxTextCtrl_GetStyle, "wxTextCtrl", "getStyle", 3}, // 1834
- {wxTextCtrl_GetValue, "wxTextCtrl", "getValue", 1}, // 1835
- {wxTextCtrl_IsEditable, "wxTextCtrl", "isEditable", 1}, // 1836
- {wxTextCtrl_IsModified, "wxTextCtrl", "isModified", 1}, // 1837
- {wxTextCtrl_IsMultiLine, "wxTextCtrl", "isMultiLine", 1}, // 1838
- {wxTextCtrl_IsSingleLine, "wxTextCtrl", "isSingleLine", 1}, // 1839
- {wxTextCtrl_LoadFile, "wxTextCtrl", "loadFile", 3}, // 1840
- {wxTextCtrl_MarkDirty, "wxTextCtrl", "markDirty", 1}, // 1841
- {wxTextCtrl_Paste, "wxTextCtrl", "paste", 1}, // 1842
- {wxTextCtrl_PositionToXY, "wxTextCtrl", "positionToXY", 2}, // 1843
- {wxTextCtrl_Redo, "wxTextCtrl", "redo", 1}, // 1844
- {wxTextCtrl_Remove, "wxTextCtrl", "remove", 3}, // 1845
- {wxTextCtrl_Replace, "wxTextCtrl", "replace", 4}, // 1846
- {wxTextCtrl_SaveFile, "wxTextCtrl", "saveFile", 2}, // 1847
- {wxTextCtrl_SetDefaultStyle, "wxTextCtrl", "setDefaultStyle", 2}, // 1848
- {wxTextCtrl_SetEditable, "wxTextCtrl", "setEditable", 2}, // 1849
- {wxTextCtrl_SetInsertionPoint, "wxTextCtrl", "setInsertionPoint", 2}, // 1850
- {wxTextCtrl_SetInsertionPointEnd, "wxTextCtrl", "setInsertionPointEnd", 1}, // 1851
- {wxTextCtrl_SetMaxLength, "wxTextCtrl", "setMaxLength", 2}, // 1852
- {wxTextCtrl_SetSelection, "wxTextCtrl", "setSelection", 3}, // 1853
- {wxTextCtrl_SetStyle, "wxTextCtrl", "setStyle", 4}, // 1854
- {wxTextCtrl_SetValue, "wxTextCtrl", "setValue", 2}, // 1855
- {wxTextCtrl_ShowPosition, "wxTextCtrl", "showPosition", 2}, // 1856
- {wxTextCtrl_Undo, "wxTextCtrl", "undo", 1}, // 1857
- {wxTextCtrl_WriteText, "wxTextCtrl", "writeText", 2}, // 1858
- {wxTextCtrl_XYToPosition, "wxTextCtrl", "xYToPosition", 3}, // 1859
- {wxBookCtrlBase_AddPage, "wxBookCtrlBase", "addPage", 4}, // 1860
- {wxBookCtrlBase_InsertPage, "wxBookCtrlBase", "insertPage", 5}, // 1861
- {wxBookCtrlBase_DeletePage, "wxBookCtrlBase", "deletePage", 2}, // 1862
- {wxBookCtrlBase_RemovePage, "wxBookCtrlBase", "removePage", 2}, // 1863
- {wxBookCtrlBase_DeleteAllPages, "wxBookCtrlBase", "deleteAllPages", 1}, // 1864
- {wxBookCtrlBase_GetPage, "wxBookCtrlBase", "getPage", 2}, // 1865
- {wxBookCtrlBase_GetPageCount, "wxBookCtrlBase", "getPageCount", 1}, // 1866
- {wxBookCtrlBase_GetCurrentPage, "wxBookCtrlBase", "getCurrentPage", 1}, // 1867
- {wxBookCtrlBase_AdvanceSelection, "wxBookCtrlBase", "advanceSelection", 2}, // 1868
- {wxBookCtrlBase_SetSelection, "wxBookCtrlBase", "setSelection", 2}, // 1869
- {wxBookCtrlBase_GetSelection, "wxBookCtrlBase", "getSelection", 1}, // 1870
- {wxBookCtrlBase_ChangeSelection, "wxBookCtrlBase", "changeSelection", 2}, // 1871
- {wxBookCtrlBase_HitTest, "wxBookCtrlBase", "hitTest", 2}, // 1872
- {wxBookCtrlBase_GetPageText, "wxBookCtrlBase", "getPageText", 2}, // 1873
- {wxBookCtrlBase_SetPageText, "wxBookCtrlBase", "setPageText", 3}, // 1874
- {wxNotebook_new_0, "wxNotebook", "new", 0}, // 1875
- {wxNotebook_new_3, "wxNotebook", "new", 3}, // 1876
- {NULL, "wxNotebook", "destroy", 1}, // 1877 obj destructor wxNotebook_destruct
- {wxNotebook_AssignImageList, "wxNotebook", "assignImageList", 2}, // 1878
- {wxNotebook_Create, "wxNotebook", "create", 4}, // 1879
- {wxNotebook_GetImageList, "wxNotebook", "getImageList", 1}, // 1880
- {wxNotebook_GetPageImage, "wxNotebook", "getPageImage", 2}, // 1881
- {wxNotebook_GetRowCount, "wxNotebook", "getRowCount", 1}, // 1882
- {wxNotebook_GetThemeBackgroundColour, "wxNotebook", "getThemeBackgroundColour", 1}, // 1883
- {wxNotebook_SetImageList, "wxNotebook", "setImageList", 2}, // 1884
- {wxNotebook_SetPadding, "wxNotebook", "setPadding", 2}, // 1885
- {wxNotebook_SetPageSize, "wxNotebook", "setPageSize", 2}, // 1886
- {wxNotebook_SetPageImage, "wxNotebook", "setPageImage", 3}, // 1887
- {wxChoicebook_new_0, "wxChoicebook", "new", 0}, // 1888
- {wxChoicebook_new_3, "wxChoicebook", "new", 3}, // 1889
- {wxChoicebook_AddPage, "wxChoicebook", "addPage", 4}, // 1890
- {wxChoicebook_AdvanceSelection, "wxChoicebook", "advanceSelection", 2}, // 1891
- {wxChoicebook_AssignImageList, "wxChoicebook", "assignImageList", 2}, // 1892
- {wxChoicebook_Create, "wxChoicebook", "create", 4}, // 1893
- {wxChoicebook_DeleteAllPages, "wxChoicebook", "deleteAllPages", 1}, // 1894
- {wxChoicebook_GetCurrentPage, "wxChoicebook", "getCurrentPage", 1}, // 1895
- {wxChoicebook_GetImageList, "wxChoicebook", "getImageList", 1}, // 1896
- {wxChoicebook_GetPage, "wxChoicebook", "getPage", 2}, // 1897
- {wxChoicebook_GetPageCount, "wxChoicebook", "getPageCount", 1}, // 1898
- {wxChoicebook_GetPageImage, "wxChoicebook", "getPageImage", 2}, // 1899
- {wxChoicebook_GetPageText, "wxChoicebook", "getPageText", 2}, // 1900
- {wxChoicebook_GetSelection, "wxChoicebook", "getSelection", 1}, // 1901
- {wxChoicebook_HitTest, "wxChoicebook", "hitTest", 2}, // 1902
- {wxChoicebook_InsertPage, "wxChoicebook", "insertPage", 5}, // 1903
- {wxChoicebook_SetImageList, "wxChoicebook", "setImageList", 2}, // 1904
- {wxChoicebook_SetPageSize, "wxChoicebook", "setPageSize", 2}, // 1905
- {wxChoicebook_SetPageImage, "wxChoicebook", "setPageImage", 3}, // 1906
- {wxChoicebook_SetPageText, "wxChoicebook", "setPageText", 3}, // 1907
- {wxChoicebook_SetSelection, "wxChoicebook", "setSelection", 2}, // 1908
- {wxChoicebook_ChangeSelection, "wxChoicebook", "changeSelection", 2}, // 1909
- {NULL, "wxChoicebook", "'Destroy'", 1}, // 1910 obj destructor wxChoicebook_destroy
- {wxToolbook_new_0, "wxToolbook", "new", 0}, // 1911
- {wxToolbook_new_3, "wxToolbook", "new", 3}, // 1912
- {wxToolbook_AddPage, "wxToolbook", "addPage", 4}, // 1913
- {wxToolbook_AdvanceSelection, "wxToolbook", "advanceSelection", 2}, // 1914
- {wxToolbook_AssignImageList, "wxToolbook", "assignImageList", 2}, // 1915
- {wxToolbook_Create, "wxToolbook", "create", 4}, // 1916
- {wxToolbook_DeleteAllPages, "wxToolbook", "deleteAllPages", 1}, // 1917
- {wxToolbook_GetCurrentPage, "wxToolbook", "getCurrentPage", 1}, // 1918
- {wxToolbook_GetImageList, "wxToolbook", "getImageList", 1}, // 1919
- {wxToolbook_GetPage, "wxToolbook", "getPage", 2}, // 1920
- {wxToolbook_GetPageCount, "wxToolbook", "getPageCount", 1}, // 1921
- {wxToolbook_GetPageImage, "wxToolbook", "getPageImage", 2}, // 1922
- {wxToolbook_GetPageText, "wxToolbook", "getPageText", 2}, // 1923
- {wxToolbook_GetSelection, "wxToolbook", "getSelection", 1}, // 1924
- {wxToolbook_HitTest, "wxToolbook", "hitTest", 2}, // 1925
- {wxToolbook_InsertPage, "wxToolbook", "insertPage", 5}, // 1926
- {wxToolbook_SetImageList, "wxToolbook", "setImageList", 2}, // 1927
- {wxToolbook_SetPageSize, "wxToolbook", "setPageSize", 2}, // 1928
- {wxToolbook_SetPageImage, "wxToolbook", "setPageImage", 3}, // 1929
- {wxToolbook_SetPageText, "wxToolbook", "setPageText", 3}, // 1930
- {wxToolbook_SetSelection, "wxToolbook", "setSelection", 2}, // 1931
- {wxToolbook_ChangeSelection, "wxToolbook", "changeSelection", 2}, // 1932
- {NULL, "wxToolbook", "'Destroy'", 1}, // 1933 obj destructor wxToolbook_destroy
- {wxListbook_new_0, "wxListbook", "new", 0}, // 1934
- {wxListbook_new_3, "wxListbook", "new", 3}, // 1935
- {wxListbook_AddPage, "wxListbook", "addPage", 4}, // 1936
- {wxListbook_AdvanceSelection, "wxListbook", "advanceSelection", 2}, // 1937
- {wxListbook_AssignImageList, "wxListbook", "assignImageList", 2}, // 1938
- {wxListbook_Create, "wxListbook", "create", 4}, // 1939
- {wxListbook_DeleteAllPages, "wxListbook", "deleteAllPages", 1}, // 1940
- {wxListbook_GetCurrentPage, "wxListbook", "getCurrentPage", 1}, // 1941
- {wxListbook_GetImageList, "wxListbook", "getImageList", 1}, // 1942
- {wxListbook_GetPage, "wxListbook", "getPage", 2}, // 1943
- {wxListbook_GetPageCount, "wxListbook", "getPageCount", 1}, // 1944
- {wxListbook_GetPageImage, "wxListbook", "getPageImage", 2}, // 1945
- {wxListbook_GetPageText, "wxListbook", "getPageText", 2}, // 1946
- {wxListbook_GetSelection, "wxListbook", "getSelection", 1}, // 1947
- {wxListbook_HitTest, "wxListbook", "hitTest", 2}, // 1948
- {wxListbook_InsertPage, "wxListbook", "insertPage", 5}, // 1949
- {wxListbook_SetImageList, "wxListbook", "setImageList", 2}, // 1950
- {wxListbook_SetPageSize, "wxListbook", "setPageSize", 2}, // 1951
- {wxListbook_SetPageImage, "wxListbook", "setPageImage", 3}, // 1952
- {wxListbook_SetPageText, "wxListbook", "setPageText", 3}, // 1953
- {wxListbook_SetSelection, "wxListbook", "setSelection", 2}, // 1954
- {wxListbook_ChangeSelection, "wxListbook", "changeSelection", 2}, // 1955
- {NULL, "wxListbook", "'Destroy'", 1}, // 1956 obj destructor wxListbook_destroy
- {wxTreebook_new_0, "wxTreebook", "new", 0}, // 1957
- {wxTreebook_new_3, "wxTreebook", "new", 3}, // 1958
- {NULL, "wxTreebook", "destroy", 1}, // 1959 obj destructor wxTreebook_destruct
- {wxTreebook_AddPage, "wxTreebook", "addPage", 4}, // 1960
- {wxTreebook_AdvanceSelection, "wxTreebook", "advanceSelection", 2}, // 1961
- {wxTreebook_AssignImageList, "wxTreebook", "assignImageList", 2}, // 1962
- {wxTreebook_Create, "wxTreebook", "create", 4}, // 1963
- {wxTreebook_DeleteAllPages, "wxTreebook", "deleteAllPages", 1}, // 1964
- {wxTreebook_GetCurrentPage, "wxTreebook", "getCurrentPage", 1}, // 1965
- {wxTreebook_GetImageList, "wxTreebook", "getImageList", 1}, // 1966
- {wxTreebook_GetPage, "wxTreebook", "getPage", 2}, // 1967
- {wxTreebook_GetPageCount, "wxTreebook", "getPageCount", 1}, // 1968
- {wxTreebook_GetPageImage, "wxTreebook", "getPageImage", 2}, // 1969
- {wxTreebook_GetPageText, "wxTreebook", "getPageText", 2}, // 1970
- {wxTreebook_GetSelection, "wxTreebook", "getSelection", 1}, // 1971
- {wxTreebook_ExpandNode, "wxTreebook", "expandNode", 3}, // 1972
- {wxTreebook_IsNodeExpanded, "wxTreebook", "isNodeExpanded", 2}, // 1973
- {wxTreebook_HitTest, "wxTreebook", "hitTest", 2}, // 1974
- {wxTreebook_InsertPage, "wxTreebook", "insertPage", 5}, // 1975
- {wxTreebook_InsertSubPage, "wxTreebook", "insertSubPage", 5}, // 1976
- {wxTreebook_SetImageList, "wxTreebook", "setImageList", 2}, // 1977
- {wxTreebook_SetPageSize, "wxTreebook", "setPageSize", 2}, // 1978
- {wxTreebook_SetPageImage, "wxTreebook", "setPageImage", 3}, // 1979
- {wxTreebook_SetPageText, "wxTreebook", "setPageText", 3}, // 1980
- {wxTreebook_SetSelection, "wxTreebook", "setSelection", 2}, // 1981
- {wxTreebook_ChangeSelection, "wxTreebook", "changeSelection", 2}, // 1982
- {wxTreeCtrl_new_0, "wxTreeCtrl", "new", 0}, // 1983
- {wxTreeCtrl_new_2, "wxTreeCtrl", "new", 2}, // 1984
- {NULL, "wxTreeCtrl", "destroy", 1}, // 1985 obj destructor wxTreeCtrl_destruct
- {wxTreeCtrl_AddRoot, "wxTreeCtrl", "addRoot", 3}, // 1986
- {wxTreeCtrl_AppendItem, "wxTreeCtrl", "appendItem", 4}, // 1987
- {wxTreeCtrl_AssignImageList, "wxTreeCtrl", "assignImageList", 2}, // 1988
- {wxTreeCtrl_AssignStateImageList, "wxTreeCtrl", "assignStateImageList", 2}, // 1989
- {wxTreeCtrl_Collapse, "wxTreeCtrl", "collapse", 2}, // 1990
- {wxTreeCtrl_CollapseAndReset, "wxTreeCtrl", "collapseAndReset", 2}, // 1991
- {wxTreeCtrl_Create, "wxTreeCtrl", "create", 3}, // 1992
- {wxTreeCtrl_Delete, "wxTreeCtrl", "delete", 2}, // 1993
- {wxTreeCtrl_DeleteAllItems, "wxTreeCtrl", "deleteAllItems", 1}, // 1994
- {wxTreeCtrl_DeleteChildren, "wxTreeCtrl", "deleteChildren", 2}, // 1995
- {wxTreeCtrl_EditLabel, "wxTreeCtrl", "editLabel", 2}, // 1996
- {wxTreeCtrl_EnsureVisible, "wxTreeCtrl", "ensureVisible", 2}, // 1997
- {wxTreeCtrl_Expand, "wxTreeCtrl", "expand", 2}, // 1998
- {wxTreeCtrl_GetBoundingRect, "wxTreeCtrl", "getBoundingRect", 3}, // 1999
- {wxTreeCtrl_GetChildrenCount, "wxTreeCtrl", "getChildrenCount", 3}, // 2000
- {wxTreeCtrl_GetCount, "wxTreeCtrl", "getCount", 1}, // 2001
- {wxTreeCtrl_GetEditControl, "wxTreeCtrl", "getEditControl", 1}, // 2002
- {wxTreeCtrl_GetFirstChild, "wxTreeCtrl", "getFirstChild", 2}, // 2003
- {wxTreeCtrl_GetNextChild, "wxTreeCtrl", "getNextChild", 3}, // 2004
- {wxTreeCtrl_GetFirstVisibleItem, "wxTreeCtrl", "getFirstVisibleItem", 1}, // 2005
- {wxTreeCtrl_GetImageList, "wxTreeCtrl", "getImageList", 1}, // 2006
- {wxTreeCtrl_GetIndent, "wxTreeCtrl", "getIndent", 1}, // 2007
- {wxTreeCtrl_GetItemBackgroundColour, "wxTreeCtrl", "getItemBackgroundColour", 2}, // 2008
- {wxTreeCtrl_GetItemData, "wxTreeCtrl", "getItemData", 2}, // 2009
- {wxTreeCtrl_GetItemFont, "wxTreeCtrl", "getItemFont", 2}, // 2010
- {wxTreeCtrl_GetItemImage, "wxTreeCtrl", "getItemImage", 3}, // 2011
- {wxTreeCtrl_GetItemText, "wxTreeCtrl", "getItemText", 2}, // 2012
- {wxTreeCtrl_GetItemTextColour, "wxTreeCtrl", "getItemTextColour", 2}, // 2013
- {wxTreeCtrl_GetLastChild, "wxTreeCtrl", "getLastChild", 2}, // 2014
- {wxTreeCtrl_GetNextSibling, "wxTreeCtrl", "getNextSibling", 2}, // 2015
- {wxTreeCtrl_GetNextVisible, "wxTreeCtrl", "getNextVisible", 2}, // 2016
- {wxTreeCtrl_GetItemParent, "wxTreeCtrl", "getItemParent", 2}, // 2017
- {wxTreeCtrl_GetPrevSibling, "wxTreeCtrl", "getPrevSibling", 2}, // 2018
- {wxTreeCtrl_GetPrevVisible, "wxTreeCtrl", "getPrevVisible", 2}, // 2019
- {wxTreeCtrl_GetRootItem, "wxTreeCtrl", "getRootItem", 1}, // 2020
- {wxTreeCtrl_GetSelection, "wxTreeCtrl", "getSelection", 1}, // 2021
- {wxTreeCtrl_GetSelections, "wxTreeCtrl", "getSelections", 1}, // 2022
- {wxTreeCtrl_GetStateImageList, "wxTreeCtrl", "getStateImageList", 1}, // 2023
- {wxTreeCtrl_HitTest, "wxTreeCtrl", "hitTest", 2}, // 2024
- {wxTreeCtrl_InsertItem, "wxTreeCtrl", "insertItem", 5}, // 2025
- {NULL, "", "", 0}, // 2026
- {wxTreeCtrl_IsBold, "wxTreeCtrl", "isBold", 2}, // 2027
- {wxTreeCtrl_IsExpanded, "wxTreeCtrl", "isExpanded", 2}, // 2028
- {wxTreeCtrl_IsSelected, "wxTreeCtrl", "isSelected", 2}, // 2029
- {wxTreeCtrl_IsVisible, "wxTreeCtrl", "isVisible", 2}, // 2030
- {wxTreeCtrl_ItemHasChildren, "wxTreeCtrl", "itemHasChildren", 2}, // 2031
- {wxTreeCtrl_IsTreeItemIdOk, "wxTreeCtrl", "isTreeItemIdOk", 1}, // 2032
- {wxTreeCtrl_PrependItem, "wxTreeCtrl", "prependItem", 4}, // 2033
- {wxTreeCtrl_ScrollTo, "wxTreeCtrl", "scrollTo", 2}, // 2034
- {wxTreeCtrl_SelectItem, "wxTreeCtrl", "selectItem", 3}, // 2035
- {wxTreeCtrl_SetIndent, "wxTreeCtrl", "setIndent", 2}, // 2036
- {wxTreeCtrl_SetImageList, "wxTreeCtrl", "setImageList", 2}, // 2037
- {wxTreeCtrl_SetItemBackgroundColour, "wxTreeCtrl", "setItemBackgroundColour", 3}, // 2038
- {wxTreeCtrl_SetItemBold, "wxTreeCtrl", "setItemBold", 3}, // 2039
- {wxTreeCtrl_SetItemData, "wxTreeCtrl", "setItemData", 3}, // 2040
- {wxTreeCtrl_SetItemDropHighlight, "wxTreeCtrl", "setItemDropHighlight", 3}, // 2041
- {wxTreeCtrl_SetItemFont, "wxTreeCtrl", "setItemFont", 3}, // 2042
- {wxTreeCtrl_SetItemHasChildren, "wxTreeCtrl", "setItemHasChildren", 3}, // 2043
- {wxTreeCtrl_SetItemImage, "wxTreeCtrl", "setItemImage", 4}, // 2044
- {wxTreeCtrl_SetItemText, "wxTreeCtrl", "setItemText", 3}, // 2045
- {wxTreeCtrl_SetItemTextColour, "wxTreeCtrl", "setItemTextColour", 3}, // 2046
- {wxTreeCtrl_SetStateImageList, "wxTreeCtrl", "setStateImageList", 2}, // 2047
- {wxTreeCtrl_SetWindowStyle, "wxTreeCtrl", "setWindowStyle", 2}, // 2048
- {wxTreeCtrl_SortChildren, "wxTreeCtrl", "sortChildren", 2}, // 2049
- {wxTreeCtrl_Toggle, "wxTreeCtrl", "toggle", 2}, // 2050
- {wxTreeCtrl_ToggleItemSelection, "wxTreeCtrl", "toggleItemSelection", 2}, // 2051
- {wxTreeCtrl_Unselect, "wxTreeCtrl", "unselect", 1}, // 2052
- {wxTreeCtrl_UnselectAll, "wxTreeCtrl", "unselectAll", 1}, // 2053
- {wxTreeCtrl_UnselectItem, "wxTreeCtrl", "unselectItem", 2}, // 2054
- {wxScrollBar_new_0, "wxScrollBar", "new", 0}, // 2055
- {wxScrollBar_new_3, "wxScrollBar", "new", 3}, // 2056
- {NULL, "wxScrollBar", "destroy", 1}, // 2057 obj destructor wxScrollBar_destruct
- {wxScrollBar_Create, "wxScrollBar", "create", 4}, // 2058
- {wxScrollBar_GetRange, "wxScrollBar", "getRange", 1}, // 2059
- {wxScrollBar_GetPageSize, "wxScrollBar", "getPageSize", 1}, // 2060
- {wxScrollBar_GetThumbPosition, "wxScrollBar", "getThumbPosition", 1}, // 2061
- {wxScrollBar_GetThumbSize, "wxScrollBar", "getThumbSize", 1}, // 2062
- {wxScrollBar_SetThumbPosition, "wxScrollBar", "setThumbPosition", 2}, // 2063
- {wxScrollBar_SetScrollbar, "wxScrollBar", "setScrollbar", 6}, // 2064
- {wxSpinButton_new_0, "wxSpinButton", "new", 0}, // 2065
- {wxSpinButton_new_2, "wxSpinButton", "new", 2}, // 2066
- {NULL, "wxSpinButton", "destroy", 1}, // 2067 obj destructor wxSpinButton_destruct
- {wxSpinButton_Create, "wxSpinButton", "create", 3}, // 2068
- {wxSpinButton_GetMax, "wxSpinButton", "getMax", 1}, // 2069
- {wxSpinButton_GetMin, "wxSpinButton", "getMin", 1}, // 2070
- {wxSpinButton_GetValue, "wxSpinButton", "getValue", 1}, // 2071
- {wxSpinButton_SetRange, "wxSpinButton", "setRange", 3}, // 2072
- {wxSpinButton_SetValue, "wxSpinButton", "setValue", 2}, // 2073
- {wxSpinCtrl_new_0, "wxSpinCtrl", "new", 0}, // 2074
- {wxSpinCtrl_new_2, "wxSpinCtrl", "new", 2}, // 2075
- {wxSpinCtrl_Create, "wxSpinCtrl", "create", 3}, // 2076
- {wxSpinCtrl_SetValue_1_1, "wxSpinCtrl", "setValue", 2}, // 2077
- {wxSpinCtrl_SetValue_1_0, "wxSpinCtrl", "setValue", 2}, // 2078
- {wxSpinCtrl_GetValue, "wxSpinCtrl", "getValue", 1}, // 2079
- {wxSpinCtrl_SetRange, "wxSpinCtrl", "setRange", 3}, // 2080
- {wxSpinCtrl_SetSelection, "wxSpinCtrl", "setSelection", 3}, // 2081
- {wxSpinCtrl_GetMin, "wxSpinCtrl", "getMin", 1}, // 2082
- {wxSpinCtrl_GetMax, "wxSpinCtrl", "getMax", 1}, // 2083
- {NULL, "wxSpinCtrl", "'Destroy'", 1}, // 2084 obj destructor wxSpinCtrl_destroy
- {wxStaticText_new_0, "wxStaticText", "new", 0}, // 2085
- {wxStaticText_new_4, "wxStaticText", "new", 4}, // 2086
- {wxStaticText_Create, "wxStaticText", "create", 5}, // 2087
- {wxStaticText_GetLabel, "wxStaticText", "getLabel", 1}, // 2088
- {wxStaticText_SetLabel, "wxStaticText", "setLabel", 2}, // 2089
- {wxStaticText_Wrap, "wxStaticText", "wrap", 2}, // 2090
- {NULL, "wxStaticText", "'Destroy'", 1}, // 2091 obj destructor wxStaticText_destroy
- {wxStaticBitmap_new_0, "wxStaticBitmap", "new", 0}, // 2092
- {wxStaticBitmap_new_4, "wxStaticBitmap", "new", 4}, // 2093
- {wxStaticBitmap_Create, "wxStaticBitmap", "create", 5}, // 2094
- {wxStaticBitmap_GetBitmap, "wxStaticBitmap", "getBitmap", 1}, // 2095
- {wxStaticBitmap_SetBitmap, "wxStaticBitmap", "setBitmap", 2}, // 2096
- {NULL, "wxStaticBitmap", "'Destroy'", 1}, // 2097 obj destructor wxStaticBitmap_destroy
- {wxRadioBox_new, "wxRadioBox", "new", 7}, // 2098
- {NULL, "wxRadioBox", "destroy", 1}, // 2099 obj destructor wxRadioBox_destruct
- {wxRadioBox_Create, "wxRadioBox", "create", 8}, // 2100
- {wxRadioBox_Enable_1, "wxRadioBox", "enable", 2}, // 2101
- {wxRadioBox_Enable_2, "wxRadioBox", "enable", 3}, // 2102
- {wxRadioBox_GetSelection, "wxRadioBox", "getSelection", 1}, // 2103
- {wxRadioBox_GetString, "wxRadioBox", "getString", 2}, // 2104
- {wxRadioBox_SetSelection, "wxRadioBox", "setSelection", 2}, // 2105
- {wxRadioBox_Show, "wxRadioBox", "show", 3}, // 2106
- {wxRadioBox_GetColumnCount, "wxRadioBox", "getColumnCount", 1}, // 2107
- {wxRadioBox_GetItemHelpText, "wxRadioBox", "getItemHelpText", 2}, // 2108
- {wxRadioBox_GetItemToolTip, "wxRadioBox", "getItemToolTip", 2}, // 2109
- {wxRadioBox_GetItemFromPoint, "wxRadioBox", "getItemFromPoint", 2}, // 2110
- {wxRadioBox_GetRowCount, "wxRadioBox", "getRowCount", 1}, // 2111
- {wxRadioBox_IsItemEnabled, "wxRadioBox", "isItemEnabled", 2}, // 2112
- {wxRadioBox_IsItemShown, "wxRadioBox", "isItemShown", 2}, // 2113
- {wxRadioBox_SetItemHelpText, "wxRadioBox", "setItemHelpText", 3}, // 2114
- {wxRadioBox_SetItemToolTip, "wxRadioBox", "setItemToolTip", 3}, // 2115
- {wxRadioButton_new_0, "wxRadioButton", "new", 0}, // 2116
- {wxRadioButton_new_4, "wxRadioButton", "new", 4}, // 2117
- {NULL, "wxRadioButton", "destroy", 1}, // 2118 obj destructor wxRadioButton_destruct
- {wxRadioButton_Create, "wxRadioButton", "create", 5}, // 2119
- {wxRadioButton_GetValue, "wxRadioButton", "getValue", 1}, // 2120
- {wxRadioButton_SetValue, "wxRadioButton", "setValue", 2}, // 2121
- {wxSlider_new_0, "wxSlider", "new", 0}, // 2122
- {wxSlider_new_6, "wxSlider", "new", 6}, // 2123
- {NULL, "wxSlider", "destroy", 1}, // 2124 obj destructor wxSlider_destruct
- {wxSlider_Create, "wxSlider", "create", 7}, // 2125
- {wxSlider_GetLineSize, "wxSlider", "getLineSize", 1}, // 2126
- {wxSlider_GetMax, "wxSlider", "getMax", 1}, // 2127
- {wxSlider_GetMin, "wxSlider", "getMin", 1}, // 2128
- {wxSlider_GetPageSize, "wxSlider", "getPageSize", 1}, // 2129
- {wxSlider_GetThumbLength, "wxSlider", "getThumbLength", 1}, // 2130
- {wxSlider_GetValue, "wxSlider", "getValue", 1}, // 2131
- {wxSlider_SetLineSize, "wxSlider", "setLineSize", 2}, // 2132
- {wxSlider_SetPageSize, "wxSlider", "setPageSize", 2}, // 2133
- {wxSlider_SetRange, "wxSlider", "setRange", 3}, // 2134
- {wxSlider_SetThumbLength, "wxSlider", "setThumbLength", 2}, // 2135
- {wxSlider_SetValue, "wxSlider", "setValue", 2}, // 2136
- {wxDialog_new_0, "wxDialog", "new", 0}, // 2137
- {wxDialog_new_4, "wxDialog", "new", 4}, // 2138
- {NULL, "wxDialog", "destroy", 1}, // 2139 obj destructor wxDialog_destruct
- {wxDialog_Create, "wxDialog", "create", 5}, // 2140
- {wxDialog_CreateButtonSizer, "wxDialog", "createButtonSizer", 2}, // 2141
- {wxDialog_CreateStdDialogButtonSizer, "wxDialog", "createStdDialogButtonSizer", 2}, // 2142
- {wxDialog_EndModal, "wxDialog", "endModal", 2}, // 2143
- {wxDialog_GetAffirmativeId, "wxDialog", "getAffirmativeId", 1}, // 2144
- {wxDialog_GetReturnCode, "wxDialog", "getReturnCode", 1}, // 2145
- {wxDialog_IsModal, "wxDialog", "isModal", 1}, // 2146
- {wxDialog_SetAffirmativeId, "wxDialog", "setAffirmativeId", 2}, // 2147
- {wxDialog_SetReturnCode, "wxDialog", "setReturnCode", 2}, // 2148
- {wxDialog_Show, "wxDialog", "show", 2}, // 2149
- {wxDialog_ShowModal, "wxDialog", "showModal", 1}, // 2150
- {wxColourDialog_new_0, "wxColourDialog", "new", 0}, // 2151
- {wxColourDialog_new_2, "wxColourDialog", "new", 2}, // 2152
- {NULL, "wxColourDialog", "destroy", 1}, // 2153 obj destructor wxColourDialog_destruct
- {wxColourDialog_Create, "wxColourDialog", "create", 3}, // 2154
- {wxColourDialog_GetColourData, "wxColourDialog", "getColourData", 1}, // 2155
- {wxColourData_new, "wxColourData", "new", 0}, // 2156
- {NULL, "wxColourData", "destroy", 1}, // 2157 obj destructor wxColourData_destruct
- {wxColourData_GetChooseFull, "wxColourData", "getChooseFull", 1}, // 2158
- {wxColourData_GetColour, "wxColourData", "getColour", 1}, // 2159
- {wxColourData_GetCustomColour, "wxColourData", "getCustomColour", 2}, // 2160
- {wxColourData_SetChooseFull, "wxColourData", "setChooseFull", 2}, // 2161
- {wxColourData_SetColour, "wxColourData", "setColour", 2}, // 2162
- {wxColourData_SetCustomColour, "wxColourData", "setCustomColour", 3}, // 2163
- {wxPalette_new_0, "wxPalette", "new", 0}, // 2164
- {wxPalette_new_1, "wxPalette", "new", 1}, // 2165
- {wxPalette_new_4, "wxPalette", "new", 3}, // 2166
- {NULL, "wxPalette", "destroy", 1}, // 2167 obj destructor wxPalette_destruct
- {wxPalette_Create, "wxPalette", "create", 4}, // 2168
- {wxPalette_GetColoursCount, "wxPalette", "getColoursCount", 1}, // 2169
- {wxPalette_GetPixel, "wxPalette", "getPixel", 4}, // 2170
- {wxPalette_GetRGB, "wxPalette", "getRGB", 2}, // 2171
- {wxPalette_IsOk, "wxPalette", "isOk", 1}, // 2172
- {wxDirDialog_new, "wxDirDialog", "new", 2}, // 2173
- {NULL, "wxDirDialog", "destroy", 1}, // 2174 obj destructor wxDirDialog_destruct
- {wxDirDialog_GetPath, "wxDirDialog", "getPath", 1}, // 2175
- {wxDirDialog_GetMessage, "wxDirDialog", "getMessage", 1}, // 2176
- {wxDirDialog_SetMessage, "wxDirDialog", "setMessage", 2}, // 2177
- {wxDirDialog_SetPath, "wxDirDialog", "setPath", 2}, // 2178
- {wxFileDialog_new, "wxFileDialog", "new", 2}, // 2179
- {NULL, "wxFileDialog", "destroy", 1}, // 2180 obj destructor wxFileDialog_destruct
- {wxFileDialog_GetDirectory, "wxFileDialog", "getDirectory", 1}, // 2181
- {wxFileDialog_GetFilename, "wxFileDialog", "getFilename", 1}, // 2182
- {wxFileDialog_GetFilenames, "wxFileDialog", "getFilenames", 1}, // 2183
- {wxFileDialog_GetFilterIndex, "wxFileDialog", "getFilterIndex", 1}, // 2184
- {wxFileDialog_GetMessage, "wxFileDialog", "getMessage", 1}, // 2185
- {wxFileDialog_GetPath, "wxFileDialog", "getPath", 1}, // 2186
- {wxFileDialog_GetPaths, "wxFileDialog", "getPaths", 1}, // 2187
- {wxFileDialog_GetWildcard, "wxFileDialog", "getWildcard", 1}, // 2188
- {wxFileDialog_SetDirectory, "wxFileDialog", "setDirectory", 2}, // 2189
- {wxFileDialog_SetFilename, "wxFileDialog", "setFilename", 2}, // 2190
- {wxFileDialog_SetFilterIndex, "wxFileDialog", "setFilterIndex", 2}, // 2191
- {wxFileDialog_SetMessage, "wxFileDialog", "setMessage", 2}, // 2192
- {wxFileDialog_SetPath, "wxFileDialog", "setPath", 2}, // 2193
- {wxFileDialog_SetWildcard, "wxFileDialog", "setWildcard", 2}, // 2194
- {wxPickerBase_SetInternalMargin, "wxPickerBase", "setInternalMargin", 2}, // 2195
- {wxPickerBase_GetInternalMargin, "wxPickerBase", "getInternalMargin", 1}, // 2196
- {wxPickerBase_SetTextCtrlProportion, "wxPickerBase", "setTextCtrlProportion", 2}, // 2197
- {wxPickerBase_SetPickerCtrlProportion, "wxPickerBase", "setPickerCtrlProportion", 2}, // 2198
- {wxPickerBase_GetTextCtrlProportion, "wxPickerBase", "getTextCtrlProportion", 1}, // 2199
- {wxPickerBase_GetPickerCtrlProportion, "wxPickerBase", "getPickerCtrlProportion", 1}, // 2200
- {wxPickerBase_HasTextCtrl, "wxPickerBase", "hasTextCtrl", 1}, // 2201
- {wxPickerBase_GetTextCtrl, "wxPickerBase", "getTextCtrl", 1}, // 2202
- {wxPickerBase_IsTextCtrlGrowable, "wxPickerBase", "isTextCtrlGrowable", 1}, // 2203
- {wxPickerBase_SetPickerCtrlGrowable, "wxPickerBase", "setPickerCtrlGrowable", 2}, // 2204
- {wxPickerBase_SetTextCtrlGrowable, "wxPickerBase", "setTextCtrlGrowable", 2}, // 2205
- {wxPickerBase_IsPickerCtrlGrowable, "wxPickerBase", "isPickerCtrlGrowable", 1}, // 2206
- {wxFilePickerCtrl_new_0, "wxFilePickerCtrl", "new", 0}, // 2207
- {wxFilePickerCtrl_new_3, "wxFilePickerCtrl", "new", 3}, // 2208
- {wxFilePickerCtrl_Create, "wxFilePickerCtrl", "create", 4}, // 2209
- {wxFilePickerCtrl_GetPath, "wxFilePickerCtrl", "getPath", 1}, // 2210
- {wxFilePickerCtrl_SetPath, "wxFilePickerCtrl", "setPath", 2}, // 2211
- {NULL, "wxFilePickerCtrl", "'Destroy'", 1}, // 2212 obj destructor wxFilePickerCtrl_destroy
- {wxDirPickerCtrl_new_0, "wxDirPickerCtrl", "new", 0}, // 2213
- {wxDirPickerCtrl_new_3, "wxDirPickerCtrl", "new", 3}, // 2214
- {wxDirPickerCtrl_Create, "wxDirPickerCtrl", "create", 4}, // 2215
- {wxDirPickerCtrl_GetPath, "wxDirPickerCtrl", "getPath", 1}, // 2216
- {wxDirPickerCtrl_SetPath, "wxDirPickerCtrl", "setPath", 2}, // 2217
- {NULL, "wxDirPickerCtrl", "'Destroy'", 1}, // 2218 obj destructor wxDirPickerCtrl_destroy
- {wxColourPickerCtrl_new_0, "wxColourPickerCtrl", "new", 0}, // 2219
- {wxColourPickerCtrl_new_3, "wxColourPickerCtrl", "new", 3}, // 2220
- {wxColourPickerCtrl_Create, "wxColourPickerCtrl", "create", 4}, // 2221
- {wxColourPickerCtrl_GetColour, "wxColourPickerCtrl", "getColour", 1}, // 2222
- {wxColourPickerCtrl_SetColour_1_1, "wxColourPickerCtrl", "setColour", 2}, // 2223
- {wxColourPickerCtrl_SetColour_1_0, "wxColourPickerCtrl", "setColour", 2}, // 2224
- {NULL, "wxColourPickerCtrl", "'Destroy'", 1}, // 2225 obj destructor wxColourPickerCtrl_destroy
- {wxDatePickerCtrl_new_0, "wxDatePickerCtrl", "new", 0}, // 2226
- {wxDatePickerCtrl_new_3, "wxDatePickerCtrl", "new", 3}, // 2227
- {wxDatePickerCtrl_GetRange, "wxDatePickerCtrl", "getRange", 3}, // 2228
- {wxDatePickerCtrl_GetValue, "wxDatePickerCtrl", "getValue", 1}, // 2229
- {wxDatePickerCtrl_SetRange, "wxDatePickerCtrl", "setRange", 3}, // 2230
- {wxDatePickerCtrl_SetValue, "wxDatePickerCtrl", "setValue", 2}, // 2231
- {NULL, "wxDatePickerCtrl", "'Destroy'", 1}, // 2232 obj destructor wxDatePickerCtrl_destroy
- {wxFontPickerCtrl_new_0, "wxFontPickerCtrl", "new", 0}, // 2233
- {wxFontPickerCtrl_new_3, "wxFontPickerCtrl", "new", 3}, // 2234
- {wxFontPickerCtrl_Create, "wxFontPickerCtrl", "create", 4}, // 2235
- {wxFontPickerCtrl_GetSelectedFont, "wxFontPickerCtrl", "getSelectedFont", 1}, // 2236
- {wxFontPickerCtrl_SetSelectedFont, "wxFontPickerCtrl", "setSelectedFont", 2}, // 2237
- {wxFontPickerCtrl_GetMaxPointSize, "wxFontPickerCtrl", "getMaxPointSize", 1}, // 2238
- {wxFontPickerCtrl_SetMaxPointSize, "wxFontPickerCtrl", "setMaxPointSize", 2}, // 2239
- {NULL, "wxFontPickerCtrl", "'Destroy'", 1}, // 2240 obj destructor wxFontPickerCtrl_destroy
- {wxFindReplaceDialog_new_0, "wxFindReplaceDialog", "new", 0}, // 2241
- {wxFindReplaceDialog_new_4, "wxFindReplaceDialog", "new", 4}, // 2242
- {NULL, "wxFindReplaceDialog", "destroy", 1}, // 2243 obj destructor wxFindReplaceDialog_destruct
- {wxFindReplaceDialog_Create, "wxFindReplaceDialog", "create", 5}, // 2244
- {wxFindReplaceDialog_GetData, "wxFindReplaceDialog", "getData", 1}, // 2245
- {wxFindReplaceData_new, "wxFindReplaceData", "new", 1}, // 2246
- {wxFindReplaceData_GetFindString, "wxFindReplaceData", "getFindString", 1}, // 2247
- {wxFindReplaceData_GetReplaceString, "wxFindReplaceData", "getReplaceString", 1}, // 2248
- {wxFindReplaceData_GetFlags, "wxFindReplaceData", "getFlags", 1}, // 2249
- {wxFindReplaceData_SetFlags, "wxFindReplaceData", "setFlags", 2}, // 2250
- {wxFindReplaceData_SetFindString, "wxFindReplaceData", "setFindString", 2}, // 2251
- {wxFindReplaceData_SetReplaceString, "wxFindReplaceData", "setReplaceString", 2}, // 2252
- {NULL, "wxFindReplaceData", "'Destroy'", 1}, // 2253 obj destructor wxFindReplaceData_destroy
- {NULL, "", "", 0}, // 2254
- {wxMultiChoiceDialog_new, "wxMultiChoiceDialog", "new", 5}, // 2255
- {wxMultiChoiceDialog_GetSelections, "wxMultiChoiceDialog", "getSelections", 1}, // 2256
- {wxMultiChoiceDialog_SetSelections, "wxMultiChoiceDialog", "setSelections", 2}, // 2257
- {NULL, "wxMultiChoiceDialog", "'Destroy'", 1}, // 2258 obj destructor wxMultiChoiceDialog_destroy
- {NULL, "", "", 0}, // 2259
- {wxSingleChoiceDialog_new, "wxSingleChoiceDialog", "new", 5}, // 2260
- {wxSingleChoiceDialog_GetSelection, "wxSingleChoiceDialog", "getSelection", 1}, // 2261
- {wxSingleChoiceDialog_GetStringSelection, "wxSingleChoiceDialog", "getStringSelection", 1}, // 2262
- {wxSingleChoiceDialog_SetSelection, "wxSingleChoiceDialog", "setSelection", 2}, // 2263
- {NULL, "wxSingleChoiceDialog", "'Destroy'", 1}, // 2264 obj destructor wxSingleChoiceDialog_destroy
- {wxTextEntryDialog_new_0, "wxTextEntryDialog", "new", 0}, // 2265
- {wxTextEntryDialog_new_3, "wxTextEntryDialog", "new", 3}, // 2266
- {NULL, "wxTextEntryDialog", "destroy", 1}, // 2267 obj destructor wxTextEntryDialog_destruct
- {wxTextEntryDialog_GetValue, "wxTextEntryDialog", "getValue", 1}, // 2268
- {wxTextEntryDialog_SetValue, "wxTextEntryDialog", "setValue", 2}, // 2269
- {wxPasswordEntryDialog_new, "wxPasswordEntryDialog", "new", 3}, // 2270
- {NULL, "wxPasswordEntryDialog", "'Destroy'", 1}, // 2271 obj destructor wxPasswordEntryDialog_destroy
- {wxFontData_new_0, "wxFontData", "new", 0}, // 2272
- {wxFontData_new_1, "wxFontData", "new", 1}, // 2273
- {wxFontData_EnableEffects, "wxFontData", "enableEffects", 2}, // 2274
- {wxFontData_GetAllowSymbols, "wxFontData", "getAllowSymbols", 1}, // 2275
- {wxFontData_GetColour, "wxFontData", "getColour", 1}, // 2276
- {wxFontData_GetChosenFont, "wxFontData", "getChosenFont", 1}, // 2277
- {wxFontData_GetEnableEffects, "wxFontData", "getEnableEffects", 1}, // 2278
- {wxFontData_GetInitialFont, "wxFontData", "getInitialFont", 1}, // 2279
- {wxFontData_GetShowHelp, "wxFontData", "getShowHelp", 1}, // 2280
- {wxFontData_SetAllowSymbols, "wxFontData", "setAllowSymbols", 2}, // 2281
- {wxFontData_SetChosenFont, "wxFontData", "setChosenFont", 2}, // 2282
- {wxFontData_SetColour, "wxFontData", "setColour", 2}, // 2283
- {wxFontData_SetInitialFont, "wxFontData", "setInitialFont", 2}, // 2284
- {wxFontData_SetRange, "wxFontData", "setRange", 3}, // 2285
- {wxFontData_SetShowHelp, "wxFontData", "setShowHelp", 2}, // 2286
- {NULL, "wxFontData", "'Destroy'", 1}, // 2287 obj destructor wxFontData_destroy
- {wxFontDialog_new_0, "wxFontDialog", "new", 0}, // 2288
- {NULL, "", "", 0}, // 2289
- {wxFontDialog_new_2, "wxFontDialog", "new", 2}, // 2290
- {NULL, "", "", 0}, // 2291
- {wxFontDialog_Create, "wxFontDialog", "create", 3}, // 2292
- {wxFontDialog_GetFontData, "wxFontDialog", "getFontData", 1}, // 2293
- {NULL, "", "", 0}, // 2294
- {NULL, "wxFontDialog", "'Destroy'", 1}, // 2295 obj destructor wxFontDialog_destroy
- {wxProgressDialog_new, "wxProgressDialog", "new", 3}, // 2296
- {wxProgressDialog_Resume, "wxProgressDialog", "resume", 1}, // 2297
- {wxProgressDialog_Update, "wxProgressDialog", "update", 3}, // 2298
- {NULL, "wxProgressDialog", "'Destroy'", 1}, // 2299 obj destructor wxProgressDialog_destroy
- {wxMessageDialog_new, "wxMessageDialog", "new", 3}, // 2300
- {NULL, "wxMessageDialog", "'Destroy'", 1}, // 2301 obj destructor wxMessageDialog_destroy
- {wxPageSetupDialog_new, "wxPageSetupDialog", "new", 2}, // 2302
- {NULL, "wxPageSetupDialog", "destroy", 1}, // 2303 obj destructor wxPageSetupDialog_destruct
- {wxPageSetupDialog_GetPageSetupData, "wxPageSetupDialog", "getPageSetupData", 1}, // 2304
- {wxPageSetupDialog_ShowModal, "wxPageSetupDialog", "showModal", 1}, // 2305
- {wxPageSetupDialogData_new_0, "wxPageSetupDialogData", "new", 0}, // 2306
- {NULL, "", "", 0}, // 2307
- {wxPageSetupDialogData_new_1, "wxPageSetupDialogData", "new", 1}, // 2308
- {NULL, "wxPageSetupDialogData", "destroy", 1}, // 2309 obj destructor wxPageSetupDialogData_destruct
- {wxPageSetupDialogData_EnableHelp, "wxPageSetupDialogData", "enableHelp", 2}, // 2310
- {wxPageSetupDialogData_EnableMargins, "wxPageSetupDialogData", "enableMargins", 2}, // 2311
- {wxPageSetupDialogData_EnableOrientation, "wxPageSetupDialogData", "enableOrientation", 2}, // 2312
- {wxPageSetupDialogData_EnablePaper, "wxPageSetupDialogData", "enablePaper", 2}, // 2313
- {wxPageSetupDialogData_EnablePrinter, "wxPageSetupDialogData", "enablePrinter", 2}, // 2314
- {wxPageSetupDialogData_GetDefaultMinMargins, "wxPageSetupDialogData", "getDefaultMinMargins", 1}, // 2315
- {wxPageSetupDialogData_GetEnableMargins, "wxPageSetupDialogData", "getEnableMargins", 1}, // 2316
- {wxPageSetupDialogData_GetEnableOrientation, "wxPageSetupDialogData", "getEnableOrientation", 1}, // 2317
- {wxPageSetupDialogData_GetEnablePaper, "wxPageSetupDialogData", "getEnablePaper", 1}, // 2318
- {wxPageSetupDialogData_GetEnablePrinter, "wxPageSetupDialogData", "getEnablePrinter", 1}, // 2319
- {wxPageSetupDialogData_GetEnableHelp, "wxPageSetupDialogData", "getEnableHelp", 1}, // 2320
- {wxPageSetupDialogData_GetDefaultInfo, "wxPageSetupDialogData", "getDefaultInfo", 1}, // 2321
- {wxPageSetupDialogData_GetMarginTopLeft, "wxPageSetupDialogData", "getMarginTopLeft", 1}, // 2322
- {wxPageSetupDialogData_GetMarginBottomRight, "wxPageSetupDialogData", "getMarginBottomRight", 1}, // 2323
- {wxPageSetupDialogData_GetMinMarginTopLeft, "wxPageSetupDialogData", "getMinMarginTopLeft", 1}, // 2324
- {wxPageSetupDialogData_GetMinMarginBottomRight, "wxPageSetupDialogData", "getMinMarginBottomRight", 1}, // 2325
- {wxPageSetupDialogData_GetPaperId, "wxPageSetupDialogData", "getPaperId", 1}, // 2326
- {wxPageSetupDialogData_GetPaperSize, "wxPageSetupDialogData", "getPaperSize", 1}, // 2327
- {NULL, "", "", 0}, // 2328
- {wxPageSetupDialogData_GetPrintData, "wxPageSetupDialogData", "getPrintData", 1}, // 2329
- {wxPageSetupDialogData_IsOk, "wxPageSetupDialogData", "isOk", 1}, // 2330
- {wxPageSetupDialogData_SetDefaultInfo, "wxPageSetupDialogData", "setDefaultInfo", 2}, // 2331
- {wxPageSetupDialogData_SetDefaultMinMargins, "wxPageSetupDialogData", "setDefaultMinMargins", 2}, // 2332
- {wxPageSetupDialogData_SetMarginTopLeft, "wxPageSetupDialogData", "setMarginTopLeft", 2}, // 2333
- {wxPageSetupDialogData_SetMarginBottomRight, "wxPageSetupDialogData", "setMarginBottomRight", 2}, // 2334
- {wxPageSetupDialogData_SetMinMarginTopLeft, "wxPageSetupDialogData", "setMinMarginTopLeft", 2}, // 2335
- {wxPageSetupDialogData_SetMinMarginBottomRight, "wxPageSetupDialogData", "setMinMarginBottomRight", 2}, // 2336
- {wxPageSetupDialogData_SetPaperId, "wxPageSetupDialogData", "setPaperId", 2}, // 2337
- {wxPageSetupDialogData_SetPaperSize, "wxPageSetupDialogData", "setPaperSize", 2}, // 2338
- {wxPageSetupDialogData_SetPrintData, "wxPageSetupDialogData", "setPrintData", 2}, // 2339
- {wxPrintDialog_new_2_0, "wxPrintDialog", "new", 2}, // 2340
- {wxPrintDialog_new_2_1, "wxPrintDialog", "new", 2}, // 2341
- {NULL, "wxPrintDialog", "destroy", 1}, // 2342 obj destructor wxPrintDialog_destruct
- {wxPrintDialog_GetPrintDialogData, "wxPrintDialog", "getPrintDialogData", 1}, // 2343
- {wxPrintDialog_GetPrintDC, "wxPrintDialog", "getPrintDC", 1}, // 2344
- {wxPrintDialogData_new_0, "wxPrintDialogData", "new", 0}, // 2345
- {wxPrintDialogData_new_1, "wxPrintDialogData", "new", 1}, // 2346
- {NULL, "", "", 0}, // 2347
- {NULL, "wxPrintDialogData", "destroy", 1}, // 2348 obj destructor wxPrintDialogData_destruct
- {wxPrintDialogData_EnableHelp, "wxPrintDialogData", "enableHelp", 2}, // 2349
- {wxPrintDialogData_EnablePageNumbers, "wxPrintDialogData", "enablePageNumbers", 2}, // 2350
- {wxPrintDialogData_EnablePrintToFile, "wxPrintDialogData", "enablePrintToFile", 2}, // 2351
- {wxPrintDialogData_EnableSelection, "wxPrintDialogData", "enableSelection", 2}, // 2352
- {wxPrintDialogData_GetAllPages, "wxPrintDialogData", "getAllPages", 1}, // 2353
- {wxPrintDialogData_GetCollate, "wxPrintDialogData", "getCollate", 1}, // 2354
- {wxPrintDialogData_GetFromPage, "wxPrintDialogData", "getFromPage", 1}, // 2355
- {wxPrintDialogData_GetMaxPage, "wxPrintDialogData", "getMaxPage", 1}, // 2356
- {wxPrintDialogData_GetMinPage, "wxPrintDialogData", "getMinPage", 1}, // 2357
- {wxPrintDialogData_GetNoCopies, "wxPrintDialogData", "getNoCopies", 1}, // 2358
- {wxPrintDialogData_GetPrintData, "wxPrintDialogData", "getPrintData", 1}, // 2359
- {wxPrintDialogData_GetPrintToFile, "wxPrintDialogData", "getPrintToFile", 1}, // 2360
- {wxPrintDialogData_GetSelection, "wxPrintDialogData", "getSelection", 1}, // 2361
- {wxPrintDialogData_GetToPage, "wxPrintDialogData", "getToPage", 1}, // 2362
- {wxPrintDialogData_IsOk, "wxPrintDialogData", "isOk", 1}, // 2363
- {wxPrintDialogData_SetCollate, "wxPrintDialogData", "setCollate", 2}, // 2364
- {wxPrintDialogData_SetFromPage, "wxPrintDialogData", "setFromPage", 2}, // 2365
- {wxPrintDialogData_SetMaxPage, "wxPrintDialogData", "setMaxPage", 2}, // 2366
- {wxPrintDialogData_SetMinPage, "wxPrintDialogData", "setMinPage", 2}, // 2367
- {wxPrintDialogData_SetNoCopies, "wxPrintDialogData", "setNoCopies", 2}, // 2368
- {wxPrintDialogData_SetPrintData, "wxPrintDialogData", "setPrintData", 2}, // 2369
- {wxPrintDialogData_SetPrintToFile, "wxPrintDialogData", "setPrintToFile", 2}, // 2370
- {wxPrintDialogData_SetSelection, "wxPrintDialogData", "setSelection", 2}, // 2371
- {wxPrintDialogData_SetToPage, "wxPrintDialogData", "setToPage", 2}, // 2372
- {wxPrintData_new_0, "wxPrintData", "new", 0}, // 2373
- {wxPrintData_new_1, "wxPrintData", "new", 1}, // 2374
- {NULL, "wxPrintData", "destroy", 1}, // 2375 obj destructor wxPrintData_destruct
- {wxPrintData_GetCollate, "wxPrintData", "getCollate", 1}, // 2376
- {wxPrintData_GetBin, "wxPrintData", "getBin", 1}, // 2377
- {wxPrintData_GetColour, "wxPrintData", "getColour", 1}, // 2378
- {wxPrintData_GetDuplex, "wxPrintData", "getDuplex", 1}, // 2379
- {wxPrintData_GetNoCopies, "wxPrintData", "getNoCopies", 1}, // 2380
- {wxPrintData_GetOrientation, "wxPrintData", "getOrientation", 1}, // 2381
- {wxPrintData_GetPaperId, "wxPrintData", "getPaperId", 1}, // 2382
- {wxPrintData_GetPrinterName, "wxPrintData", "getPrinterName", 1}, // 2383
- {wxPrintData_GetQuality, "wxPrintData", "getQuality", 1}, // 2384
- {wxPrintData_IsOk, "wxPrintData", "isOk", 1}, // 2385
- {wxPrintData_SetBin, "wxPrintData", "setBin", 2}, // 2386
- {wxPrintData_SetCollate, "wxPrintData", "setCollate", 2}, // 2387
- {wxPrintData_SetColour, "wxPrintData", "setColour", 2}, // 2388
- {wxPrintData_SetDuplex, "wxPrintData", "setDuplex", 2}, // 2389
- {wxPrintData_SetNoCopies, "wxPrintData", "setNoCopies", 2}, // 2390
- {wxPrintData_SetOrientation, "wxPrintData", "setOrientation", 2}, // 2391
- {wxPrintData_SetPaperId, "wxPrintData", "setPaperId", 2}, // 2392
- {wxPrintData_SetPrinterName, "wxPrintData", "setPrinterName", 2}, // 2393
- {wxPrintData_SetQuality, "wxPrintData", "setQuality", 2}, // 2394
- {wxPrintPreview_new_2, "wxPrintPreview", "new", 2}, // 2395
- {wxPrintPreview_new_3, "wxPrintPreview", "new", 3}, // 2396
- {NULL, "wxPrintPreview", "destroy", 1}, // 2397 obj destructor wxPrintPreview_destruct
- {wxPrintPreview_GetCanvas, "wxPrintPreview", "getCanvas", 1}, // 2398
- {wxPrintPreview_GetCurrentPage, "wxPrintPreview", "getCurrentPage", 1}, // 2399
- {wxPrintPreview_GetFrame, "wxPrintPreview", "getFrame", 1}, // 2400
- {wxPrintPreview_GetMaxPage, "wxPrintPreview", "getMaxPage", 1}, // 2401
- {wxPrintPreview_GetMinPage, "wxPrintPreview", "getMinPage", 1}, // 2402
- {wxPrintPreview_GetPrintout, "wxPrintPreview", "getPrintout", 1}, // 2403
- {wxPrintPreview_GetPrintoutForPrinting, "wxPrintPreview", "getPrintoutForPrinting", 1}, // 2404
- {wxPrintPreview_IsOk, "wxPrintPreview", "isOk", 1}, // 2405
- {wxPrintPreview_PaintPage, "wxPrintPreview", "paintPage", 3}, // 2406
- {wxPrintPreview_Print, "wxPrintPreview", "print", 2}, // 2407
- {wxPrintPreview_RenderPage, "wxPrintPreview", "renderPage", 2}, // 2408
- {wxPrintPreview_SetCanvas, "wxPrintPreview", "setCanvas", 2}, // 2409
- {wxPrintPreview_SetCurrentPage, "wxPrintPreview", "setCurrentPage", 2}, // 2410
- {wxPrintPreview_SetFrame, "wxPrintPreview", "setFrame", 2}, // 2411
- {wxPrintPreview_SetPrintout, "wxPrintPreview", "setPrintout", 2}, // 2412
- {wxPrintPreview_SetZoom, "wxPrintPreview", "setZoom", 2}, // 2413
- {wxPreviewFrame_new, "wxPreviewFrame", "new", 3}, // 2414
- {NULL, "wxPreviewFrame", "destroy", 1}, // 2415 obj destructor wxPreviewFrame_destruct
- {wxPreviewFrame_CreateControlBar, "wxPreviewFrame", "createControlBar", 1}, // 2416
- {wxPreviewFrame_CreateCanvas, "wxPreviewFrame", "createCanvas", 1}, // 2417
- {wxPreviewFrame_Initialize, "wxPreviewFrame", "initialize", 1}, // 2418
- {wxPreviewFrame_OnCloseWindow, "wxPreviewFrame", "onCloseWindow", 2}, // 2419
- {wxPreviewControlBar_new, "wxPreviewControlBar", "new", 4}, // 2420
- {NULL, "wxPreviewControlBar", "destroy", 1}, // 2421 obj destructor wxPreviewControlBar_destruct
- {wxPreviewControlBar_CreateButtons, "wxPreviewControlBar", "createButtons", 1}, // 2422
- {wxPreviewControlBar_GetPrintPreview, "wxPreviewControlBar", "getPrintPreview", 1}, // 2423
- {wxPreviewControlBar_GetZoomControl, "wxPreviewControlBar", "getZoomControl", 1}, // 2424
- {wxPreviewControlBar_SetZoomControl, "wxPreviewControlBar", "setZoomControl", 2}, // 2425
- {wxPrinter_new, "wxPrinter", "new", 1}, // 2426
- {wxPrinter_CreateAbortWindow, "wxPrinter", "createAbortWindow", 3}, // 2427
- {wxPrinter_GetAbort, "wxPrinter", "getAbort", 1}, // 2428
- {wxPrinter_GetLastError, "wxPrinter", "getLastError", 0}, // 2429
- {wxPrinter_GetPrintDialogData, "wxPrinter", "getPrintDialogData", 1}, // 2430
- {wxPrinter_Print, "wxPrinter", "print", 4}, // 2431
- {wxPrinter_PrintDialog, "wxPrinter", "printDialog", 2}, // 2432
- {wxPrinter_ReportError, "wxPrinter", "reportError", 4}, // 2433
- {wxPrinter_Setup, "wxPrinter", "setup", 2}, // 2434
- {NULL, "wxPrinter", "'Destroy'", 1}, // 2435 obj destructor wxPrinter_destroy
- {wxXmlResource_new_2, "wxXmlResource", "new", 2}, // 2436
- {wxXmlResource_new_1, "wxXmlResource", "new", 1}, // 2437
- {NULL, "wxXmlResource", "destroy", 1}, // 2438 obj destructor wxXmlResource_destruct
- {wxXmlResource_AttachUnknownControl, "wxXmlResource", "attachUnknownControl", 4}, // 2439
- {wxXmlResource_ClearHandlers, "wxXmlResource", "clearHandlers", 1}, // 2440
- {wxXmlResource_CompareVersion, "wxXmlResource", "compareVersion", 5}, // 2441
- {wxXmlResource_Get, "wxXmlResource", "get", 0}, // 2442
- {wxXmlResource_GetFlags, "wxXmlResource", "getFlags", 1}, // 2443
- {wxXmlResource_GetVersion, "wxXmlResource", "getVersion", 1}, // 2444
- {wxXmlResource_GetXRCID, "wxXmlResource", "getXRCID", 2}, // 2445
- {wxXmlResource_InitAllHandlers, "wxXmlResource", "initAllHandlers", 1}, // 2446
- {wxXmlResource_Load, "wxXmlResource", "load", 2}, // 2447
- {wxXmlResource_LoadBitmap, "wxXmlResource", "loadBitmap", 2}, // 2448
- {wxXmlResource_LoadDialog_2, "wxXmlResource", "loadDialog", 3}, // 2449
- {wxXmlResource_LoadDialog_3, "wxXmlResource", "loadDialog", 4}, // 2450
- {wxXmlResource_LoadFrame_2, "wxXmlResource", "loadFrame", 3}, // 2451
- {wxXmlResource_LoadFrame_3, "wxXmlResource", "loadFrame", 4}, // 2452
- {wxXmlResource_LoadIcon, "wxXmlResource", "loadIcon", 2}, // 2453
- {wxXmlResource_LoadMenu, "wxXmlResource", "loadMenu", 2}, // 2454
- {wxXmlResource_LoadMenuBar_2, "wxXmlResource", "loadMenuBar", 3}, // 2455
- {wxXmlResource_LoadMenuBar_1, "wxXmlResource", "loadMenuBar", 2}, // 2456
- {wxXmlResource_LoadPanel_2, "wxXmlResource", "loadPanel", 3}, // 2457
- {wxXmlResource_LoadPanel_3, "wxXmlResource", "loadPanel", 4}, // 2458
- {wxXmlResource_LoadToolBar, "wxXmlResource", "loadToolBar", 3}, // 2459
- {wxXmlResource_Set, "wxXmlResource", "set", 1}, // 2460
- {wxXmlResource_SetFlags, "wxXmlResource", "setFlags", 2}, // 2461
- {wxXmlResource_Unload, "wxXmlResource", "unload", 2}, // 2462
- {NULL, "wxXmlResource", "xrcctrl", 3}, // 2463 TaylorMade erl only wxXmlResource_xrcctrl
- {wxHtmlEasyPrinting_new, "wxHtmlEasyPrinting", "new", 1}, // 2464
- {wxHtmlEasyPrinting_GetPrintData, "wxHtmlEasyPrinting", "getPrintData", 1}, // 2465
- {wxHtmlEasyPrinting_GetPageSetupData, "wxHtmlEasyPrinting", "getPageSetupData", 1}, // 2466
- {wxHtmlEasyPrinting_PreviewFile, "wxHtmlEasyPrinting", "previewFile", 2}, // 2467
- {wxHtmlEasyPrinting_PreviewText, "wxHtmlEasyPrinting", "previewText", 3}, // 2468
- {wxHtmlEasyPrinting_PrintFile, "wxHtmlEasyPrinting", "printFile", 2}, // 2469
- {wxHtmlEasyPrinting_PrintText, "wxHtmlEasyPrinting", "printText", 3}, // 2470
- {wxHtmlEasyPrinting_PageSetup, "wxHtmlEasyPrinting", "pageSetup", 1}, // 2471
- {wxHtmlEasyPrinting_SetFonts, "wxHtmlEasyPrinting", "setFonts", 4}, // 2472
- {wxHtmlEasyPrinting_SetHeader, "wxHtmlEasyPrinting", "setHeader", 3}, // 2473
- {wxHtmlEasyPrinting_SetFooter, "wxHtmlEasyPrinting", "setFooter", 3}, // 2474
- {NULL, "wxHtmlEasyPrinting", "'Destroy'", 1}, // 2475 obj destructor wxHtmlEasyPrinting_destroy
+ {wxTextAttr_GetFontEncoding, "wxTextAttr", "getFontEncoding", 1}, // 1790
+ {wxTextAttr_GetFontFaceName, "wxTextAttr", "getFontFaceName", 1}, // 1791
+ {wxTextAttr_GetFontSize, "wxTextAttr", "getFontSize", 1}, // 1792
+ {wxTextAttr_GetFontStyle, "wxTextAttr", "getFontStyle", 1}, // 1793
+ {wxTextAttr_GetFontUnderlined, "wxTextAttr", "getFontUnderlined", 1}, // 1794
+ {wxTextAttr_GetFontWeight, "wxTextAttr", "getFontWeight", 1}, // 1795
+ {wxTextAttr_GetLeftIndent, "wxTextAttr", "getLeftIndent", 1}, // 1796
+ {wxTextAttr_GetLeftSubIndent, "wxTextAttr", "getLeftSubIndent", 1}, // 1797
+ {wxTextAttr_GetRightIndent, "wxTextAttr", "getRightIndent", 1}, // 1798
+ {wxTextAttr_GetTabs, "wxTextAttr", "getTabs", 1}, // 1799
+ {wxTextAttr_GetTextColour, "wxTextAttr", "getTextColour", 1}, // 1800
+ {wxTextAttr_HasBackgroundColour, "wxTextAttr", "hasBackgroundColour", 1}, // 1801
+ {wxTextAttr_HasFont, "wxTextAttr", "hasFont", 1}, // 1802
+ {wxTextAttr_HasTextColour, "wxTextAttr", "hasTextColour", 1}, // 1803
+ {wxTextAttr_GetFlags, "wxTextAttr", "getFlags", 1}, // 1804
+ {wxTextAttr_IsDefault, "wxTextAttr", "isDefault", 1}, // 1805
+ {wxTextAttr_SetAlignment, "wxTextAttr", "setAlignment", 2}, // 1806
+ {wxTextAttr_SetBackgroundColour, "wxTextAttr", "setBackgroundColour", 2}, // 1807
+ {wxTextAttr_SetFlags, "wxTextAttr", "setFlags", 2}, // 1808
+ {wxTextAttr_SetFont, "wxTextAttr", "setFont", 3}, // 1809
+ {wxTextAttr_SetFontEncoding, "wxTextAttr", "setFontEncoding", 2}, // 1810
+ {wxTextAttr_SetFontFaceName, "wxTextAttr", "setFontFaceName", 2}, // 1811
+ {wxTextAttr_SetFontFamily, "wxTextAttr", "setFontFamily", 2}, // 1812
+ {wxTextAttr_SetFontSize, "wxTextAttr", "setFontSize", 2}, // 1813
+ {wxTextAttr_SetFontPointSize, "wxTextAttr", "setFontPointSize", 2}, // 1814
+ {wxTextAttr_SetFontPixelSize, "wxTextAttr", "setFontPixelSize", 2}, // 1815
+ {wxTextAttr_SetFontStyle, "wxTextAttr", "setFontStyle", 2}, // 1816
+ {wxTextAttr_SetFontUnderlined, "wxTextAttr", "setFontUnderlined", 2}, // 1817
+ {wxTextAttr_SetFontWeight, "wxTextAttr", "setFontWeight", 2}, // 1818
+ {wxTextAttr_SetLeftIndent, "wxTextAttr", "setLeftIndent", 3}, // 1819
+ {wxTextAttr_SetRightIndent, "wxTextAttr", "setRightIndent", 2}, // 1820
+ {wxTextAttr_SetTabs, "wxTextAttr", "setTabs", 2}, // 1821
+ {wxTextAttr_SetTextColour, "wxTextAttr", "setTextColour", 2}, // 1822
+ {wxTextAttr_destroy, "wxTextAttr", "'Destroy'", 1}, // 1823
+ {wxTextCtrl_new_0, "wxTextCtrl", "new", 0}, // 1824
+ {wxTextCtrl_new_3, "wxTextCtrl", "new", 3}, // 1825
+ {NULL, "wxTextCtrl", "destroy", 1}, // 1826 obj destructor wxTextCtrl_destruct
+ {wxTextCtrl_AppendText, "wxTextCtrl", "appendText", 2}, // 1827
+ {wxTextCtrl_CanCopy, "wxTextCtrl", "canCopy", 1}, // 1828
+ {wxTextCtrl_CanCut, "wxTextCtrl", "canCut", 1}, // 1829
+ {wxTextCtrl_CanPaste, "wxTextCtrl", "canPaste", 1}, // 1830
+ {wxTextCtrl_CanRedo, "wxTextCtrl", "canRedo", 1}, // 1831
+ {wxTextCtrl_CanUndo, "wxTextCtrl", "canUndo", 1}, // 1832
+ {wxTextCtrl_Clear, "wxTextCtrl", "clear", 1}, // 1833
+ {wxTextCtrl_Copy, "wxTextCtrl", "copy", 1}, // 1834
+ {wxTextCtrl_Create, "wxTextCtrl", "create", 4}, // 1835
+ {wxTextCtrl_Cut, "wxTextCtrl", "cut", 1}, // 1836
+ {wxTextCtrl_DiscardEdits, "wxTextCtrl", "discardEdits", 1}, // 1837
+ {wxTextCtrl_ChangeValue, "wxTextCtrl", "changeValue", 2}, // 1838
+ {wxTextCtrl_EmulateKeyPress, "wxTextCtrl", "emulateKeyPress", 2}, // 1839
+ {wxTextCtrl_GetDefaultStyle, "wxTextCtrl", "getDefaultStyle", 1}, // 1840
+ {wxTextCtrl_GetInsertionPoint, "wxTextCtrl", "getInsertionPoint", 1}, // 1841
+ {wxTextCtrl_GetLastPosition, "wxTextCtrl", "getLastPosition", 1}, // 1842
+ {wxTextCtrl_GetLineLength, "wxTextCtrl", "getLineLength", 2}, // 1843
+ {wxTextCtrl_GetLineText, "wxTextCtrl", "getLineText", 2}, // 1844
+ {wxTextCtrl_GetNumberOfLines, "wxTextCtrl", "getNumberOfLines", 1}, // 1845
+ {wxTextCtrl_GetRange, "wxTextCtrl", "getRange", 3}, // 1846
+ {wxTextCtrl_GetSelection, "wxTextCtrl", "getSelection", 1}, // 1847
+ {wxTextCtrl_GetStringSelection, "wxTextCtrl", "getStringSelection", 1}, // 1848
+ {wxTextCtrl_GetStyle, "wxTextCtrl", "getStyle", 3}, // 1849
+ {wxTextCtrl_GetValue, "wxTextCtrl", "getValue", 1}, // 1850
+ {wxTextCtrl_IsEditable, "wxTextCtrl", "isEditable", 1}, // 1851
+ {wxTextCtrl_IsModified, "wxTextCtrl", "isModified", 1}, // 1852
+ {wxTextCtrl_IsMultiLine, "wxTextCtrl", "isMultiLine", 1}, // 1853
+ {wxTextCtrl_IsSingleLine, "wxTextCtrl", "isSingleLine", 1}, // 1854
+ {wxTextCtrl_LoadFile, "wxTextCtrl", "loadFile", 3}, // 1855
+ {wxTextCtrl_MarkDirty, "wxTextCtrl", "markDirty", 1}, // 1856
+ {wxTextCtrl_Paste, "wxTextCtrl", "paste", 1}, // 1857
+ {wxTextCtrl_PositionToXY, "wxTextCtrl", "positionToXY", 2}, // 1858
+ {wxTextCtrl_Redo, "wxTextCtrl", "redo", 1}, // 1859
+ {wxTextCtrl_Remove, "wxTextCtrl", "remove", 3}, // 1860
+ {wxTextCtrl_Replace, "wxTextCtrl", "replace", 4}, // 1861
+ {wxTextCtrl_SaveFile, "wxTextCtrl", "saveFile", 2}, // 1862
+ {wxTextCtrl_SetDefaultStyle, "wxTextCtrl", "setDefaultStyle", 2}, // 1863
+ {wxTextCtrl_SetEditable, "wxTextCtrl", "setEditable", 2}, // 1864
+ {wxTextCtrl_SetInsertionPoint, "wxTextCtrl", "setInsertionPoint", 2}, // 1865
+ {wxTextCtrl_SetInsertionPointEnd, "wxTextCtrl", "setInsertionPointEnd", 1}, // 1866
+ {wxTextCtrl_SetMaxLength, "wxTextCtrl", "setMaxLength", 2}, // 1867
+ {wxTextCtrl_SetSelection, "wxTextCtrl", "setSelection", 3}, // 1868
+ {wxTextCtrl_SetStyle, "wxTextCtrl", "setStyle", 4}, // 1869
+ {wxTextCtrl_SetValue, "wxTextCtrl", "setValue", 2}, // 1870
+ {wxTextCtrl_ShowPosition, "wxTextCtrl", "showPosition", 2}, // 1871
+ {wxTextCtrl_Undo, "wxTextCtrl", "undo", 1}, // 1872
+ {wxTextCtrl_WriteText, "wxTextCtrl", "writeText", 2}, // 1873
+ {wxTextCtrl_XYToPosition, "wxTextCtrl", "xYToPosition", 3}, // 1874
+ {wxBookCtrlBase_AddPage, "wxBookCtrlBase", "addPage", 4}, // 1875
+ {wxBookCtrlBase_InsertPage, "wxBookCtrlBase", "insertPage", 5}, // 1876
+ {wxBookCtrlBase_DeletePage, "wxBookCtrlBase", "deletePage", 2}, // 1877
+ {wxBookCtrlBase_RemovePage, "wxBookCtrlBase", "removePage", 2}, // 1878
+ {wxBookCtrlBase_DeleteAllPages, "wxBookCtrlBase", "deleteAllPages", 1}, // 1879
+ {wxBookCtrlBase_GetPage, "wxBookCtrlBase", "getPage", 2}, // 1880
+ {wxBookCtrlBase_GetPageCount, "wxBookCtrlBase", "getPageCount", 1}, // 1881
+ {wxBookCtrlBase_GetCurrentPage, "wxBookCtrlBase", "getCurrentPage", 1}, // 1882
+ {wxBookCtrlBase_AdvanceSelection, "wxBookCtrlBase", "advanceSelection", 2}, // 1883
+ {wxBookCtrlBase_SetSelection, "wxBookCtrlBase", "setSelection", 2}, // 1884
+ {wxBookCtrlBase_GetSelection, "wxBookCtrlBase", "getSelection", 1}, // 1885
+ {wxBookCtrlBase_ChangeSelection, "wxBookCtrlBase", "changeSelection", 2}, // 1886
+ {wxBookCtrlBase_HitTest, "wxBookCtrlBase", "hitTest", 2}, // 1887
+ {wxBookCtrlBase_GetPageText, "wxBookCtrlBase", "getPageText", 2}, // 1888
+ {wxBookCtrlBase_SetPageText, "wxBookCtrlBase", "setPageText", 3}, // 1889
+ {wxNotebook_new_0, "wxNotebook", "new", 0}, // 1890
+ {wxNotebook_new_3, "wxNotebook", "new", 3}, // 1891
+ {NULL, "wxNotebook", "destroy", 1}, // 1892 obj destructor wxNotebook_destruct
+ {wxNotebook_AssignImageList, "wxNotebook", "assignImageList", 2}, // 1893
+ {wxNotebook_Create, "wxNotebook", "create", 4}, // 1894
+ {wxNotebook_GetImageList, "wxNotebook", "getImageList", 1}, // 1895
+ {wxNotebook_GetPageImage, "wxNotebook", "getPageImage", 2}, // 1896
+ {wxNotebook_GetRowCount, "wxNotebook", "getRowCount", 1}, // 1897
+ {wxNotebook_GetThemeBackgroundColour, "wxNotebook", "getThemeBackgroundColour", 1}, // 1898
+ {wxNotebook_SetImageList, "wxNotebook", "setImageList", 2}, // 1899
+ {wxNotebook_SetPadding, "wxNotebook", "setPadding", 2}, // 1900
+ {wxNotebook_SetPageSize, "wxNotebook", "setPageSize", 2}, // 1901
+ {wxNotebook_SetPageImage, "wxNotebook", "setPageImage", 3}, // 1902
+ {wxChoicebook_new_0, "wxChoicebook", "new", 0}, // 1903
+ {wxChoicebook_new_3, "wxChoicebook", "new", 3}, // 1904
+ {wxChoicebook_AddPage, "wxChoicebook", "addPage", 4}, // 1905
+ {wxChoicebook_AdvanceSelection, "wxChoicebook", "advanceSelection", 2}, // 1906
+ {wxChoicebook_AssignImageList, "wxChoicebook", "assignImageList", 2}, // 1907
+ {wxChoicebook_Create, "wxChoicebook", "create", 4}, // 1908
+ {wxChoicebook_DeleteAllPages, "wxChoicebook", "deleteAllPages", 1}, // 1909
+ {wxChoicebook_GetCurrentPage, "wxChoicebook", "getCurrentPage", 1}, // 1910
+ {wxChoicebook_GetImageList, "wxChoicebook", "getImageList", 1}, // 1911
+ {wxChoicebook_GetPage, "wxChoicebook", "getPage", 2}, // 1912
+ {wxChoicebook_GetPageCount, "wxChoicebook", "getPageCount", 1}, // 1913
+ {wxChoicebook_GetPageImage, "wxChoicebook", "getPageImage", 2}, // 1914
+ {wxChoicebook_GetPageText, "wxChoicebook", "getPageText", 2}, // 1915
+ {wxChoicebook_GetSelection, "wxChoicebook", "getSelection", 1}, // 1916
+ {wxChoicebook_HitTest, "wxChoicebook", "hitTest", 2}, // 1917
+ {wxChoicebook_InsertPage, "wxChoicebook", "insertPage", 5}, // 1918
+ {wxChoicebook_SetImageList, "wxChoicebook", "setImageList", 2}, // 1919
+ {wxChoicebook_SetPageSize, "wxChoicebook", "setPageSize", 2}, // 1920
+ {wxChoicebook_SetPageImage, "wxChoicebook", "setPageImage", 3}, // 1921
+ {wxChoicebook_SetPageText, "wxChoicebook", "setPageText", 3}, // 1922
+ {wxChoicebook_SetSelection, "wxChoicebook", "setSelection", 2}, // 1923
+ {wxChoicebook_ChangeSelection, "wxChoicebook", "changeSelection", 2}, // 1924
+ {NULL, "wxChoicebook", "'Destroy'", 1}, // 1925 obj destructor wxChoicebook_destroy
+ {wxToolbook_new_0, "wxToolbook", "new", 0}, // 1926
+ {wxToolbook_new_3, "wxToolbook", "new", 3}, // 1927
+ {wxToolbook_AddPage, "wxToolbook", "addPage", 4}, // 1928
+ {wxToolbook_AdvanceSelection, "wxToolbook", "advanceSelection", 2}, // 1929
+ {wxToolbook_AssignImageList, "wxToolbook", "assignImageList", 2}, // 1930
+ {wxToolbook_Create, "wxToolbook", "create", 4}, // 1931
+ {wxToolbook_DeleteAllPages, "wxToolbook", "deleteAllPages", 1}, // 1932
+ {wxToolbook_GetCurrentPage, "wxToolbook", "getCurrentPage", 1}, // 1933
+ {wxToolbook_GetImageList, "wxToolbook", "getImageList", 1}, // 1934
+ {wxToolbook_GetPage, "wxToolbook", "getPage", 2}, // 1935
+ {wxToolbook_GetPageCount, "wxToolbook", "getPageCount", 1}, // 1936
+ {wxToolbook_GetPageImage, "wxToolbook", "getPageImage", 2}, // 1937
+ {wxToolbook_GetPageText, "wxToolbook", "getPageText", 2}, // 1938
+ {wxToolbook_GetSelection, "wxToolbook", "getSelection", 1}, // 1939
+ {wxToolbook_HitTest, "wxToolbook", "hitTest", 2}, // 1940
+ {wxToolbook_InsertPage, "wxToolbook", "insertPage", 5}, // 1941
+ {wxToolbook_SetImageList, "wxToolbook", "setImageList", 2}, // 1942
+ {wxToolbook_SetPageSize, "wxToolbook", "setPageSize", 2}, // 1943
+ {wxToolbook_SetPageImage, "wxToolbook", "setPageImage", 3}, // 1944
+ {wxToolbook_SetPageText, "wxToolbook", "setPageText", 3}, // 1945
+ {wxToolbook_SetSelection, "wxToolbook", "setSelection", 2}, // 1946
+ {wxToolbook_ChangeSelection, "wxToolbook", "changeSelection", 2}, // 1947
+ {NULL, "wxToolbook", "'Destroy'", 1}, // 1948 obj destructor wxToolbook_destroy
+ {wxListbook_new_0, "wxListbook", "new", 0}, // 1949
+ {wxListbook_new_3, "wxListbook", "new", 3}, // 1950
+ {wxListbook_AddPage, "wxListbook", "addPage", 4}, // 1951
+ {wxListbook_AdvanceSelection, "wxListbook", "advanceSelection", 2}, // 1952
+ {wxListbook_AssignImageList, "wxListbook", "assignImageList", 2}, // 1953
+ {wxListbook_Create, "wxListbook", "create", 4}, // 1954
+ {wxListbook_DeleteAllPages, "wxListbook", "deleteAllPages", 1}, // 1955
+ {wxListbook_GetCurrentPage, "wxListbook", "getCurrentPage", 1}, // 1956
+ {wxListbook_GetImageList, "wxListbook", "getImageList", 1}, // 1957
+ {wxListbook_GetPage, "wxListbook", "getPage", 2}, // 1958
+ {wxListbook_GetPageCount, "wxListbook", "getPageCount", 1}, // 1959
+ {wxListbook_GetPageImage, "wxListbook", "getPageImage", 2}, // 1960
+ {wxListbook_GetPageText, "wxListbook", "getPageText", 2}, // 1961
+ {wxListbook_GetSelection, "wxListbook", "getSelection", 1}, // 1962
+ {wxListbook_HitTest, "wxListbook", "hitTest", 2}, // 1963
+ {wxListbook_InsertPage, "wxListbook", "insertPage", 5}, // 1964
+ {wxListbook_SetImageList, "wxListbook", "setImageList", 2}, // 1965
+ {wxListbook_SetPageSize, "wxListbook", "setPageSize", 2}, // 1966
+ {wxListbook_SetPageImage, "wxListbook", "setPageImage", 3}, // 1967
+ {wxListbook_SetPageText, "wxListbook", "setPageText", 3}, // 1968
+ {wxListbook_SetSelection, "wxListbook", "setSelection", 2}, // 1969
+ {wxListbook_ChangeSelection, "wxListbook", "changeSelection", 2}, // 1970
+ {NULL, "wxListbook", "'Destroy'", 1}, // 1971 obj destructor wxListbook_destroy
+ {wxTreebook_new_0, "wxTreebook", "new", 0}, // 1972
+ {wxTreebook_new_3, "wxTreebook", "new", 3}, // 1973
+ {NULL, "wxTreebook", "destroy", 1}, // 1974 obj destructor wxTreebook_destruct
+ {wxTreebook_AddPage, "wxTreebook", "addPage", 4}, // 1975
+ {wxTreebook_AdvanceSelection, "wxTreebook", "advanceSelection", 2}, // 1976
+ {wxTreebook_AssignImageList, "wxTreebook", "assignImageList", 2}, // 1977
+ {wxTreebook_Create, "wxTreebook", "create", 4}, // 1978
+ {wxTreebook_DeleteAllPages, "wxTreebook", "deleteAllPages", 1}, // 1979
+ {wxTreebook_GetCurrentPage, "wxTreebook", "getCurrentPage", 1}, // 1980
+ {wxTreebook_GetImageList, "wxTreebook", "getImageList", 1}, // 1981
+ {wxTreebook_GetPage, "wxTreebook", "getPage", 2}, // 1982
+ {wxTreebook_GetPageCount, "wxTreebook", "getPageCount", 1}, // 1983
+ {wxTreebook_GetPageImage, "wxTreebook", "getPageImage", 2}, // 1984
+ {wxTreebook_GetPageText, "wxTreebook", "getPageText", 2}, // 1985
+ {wxTreebook_GetSelection, "wxTreebook", "getSelection", 1}, // 1986
+ {wxTreebook_ExpandNode, "wxTreebook", "expandNode", 3}, // 1987
+ {wxTreebook_IsNodeExpanded, "wxTreebook", "isNodeExpanded", 2}, // 1988
+ {wxTreebook_HitTest, "wxTreebook", "hitTest", 2}, // 1989
+ {wxTreebook_InsertPage, "wxTreebook", "insertPage", 5}, // 1990
+ {wxTreebook_InsertSubPage, "wxTreebook", "insertSubPage", 5}, // 1991
+ {wxTreebook_SetImageList, "wxTreebook", "setImageList", 2}, // 1992
+ {wxTreebook_SetPageSize, "wxTreebook", "setPageSize", 2}, // 1993
+ {wxTreebook_SetPageImage, "wxTreebook", "setPageImage", 3}, // 1994
+ {wxTreebook_SetPageText, "wxTreebook", "setPageText", 3}, // 1995
+ {wxTreebook_SetSelection, "wxTreebook", "setSelection", 2}, // 1996
+ {wxTreebook_ChangeSelection, "wxTreebook", "changeSelection", 2}, // 1997
+ {wxTreeCtrl_new_0, "wxTreeCtrl", "new", 0}, // 1998
+ {wxTreeCtrl_new_2, "wxTreeCtrl", "new", 2}, // 1999
+ {NULL, "wxTreeCtrl", "destroy", 1}, // 2000 obj destructor wxTreeCtrl_destruct
+ {wxTreeCtrl_AddRoot, "wxTreeCtrl", "addRoot", 3}, // 2001
+ {wxTreeCtrl_AppendItem, "wxTreeCtrl", "appendItem", 4}, // 2002
+ {wxTreeCtrl_AssignImageList, "wxTreeCtrl", "assignImageList", 2}, // 2003
+ {wxTreeCtrl_AssignStateImageList, "wxTreeCtrl", "assignStateImageList", 2}, // 2004
+ {wxTreeCtrl_Collapse, "wxTreeCtrl", "collapse", 2}, // 2005
+ {wxTreeCtrl_CollapseAndReset, "wxTreeCtrl", "collapseAndReset", 2}, // 2006
+ {wxTreeCtrl_Create, "wxTreeCtrl", "create", 3}, // 2007
+ {wxTreeCtrl_Delete, "wxTreeCtrl", "delete", 2}, // 2008
+ {wxTreeCtrl_DeleteAllItems, "wxTreeCtrl", "deleteAllItems", 1}, // 2009
+ {wxTreeCtrl_DeleteChildren, "wxTreeCtrl", "deleteChildren", 2}, // 2010
+ {wxTreeCtrl_EditLabel, "wxTreeCtrl", "editLabel", 2}, // 2011
+ {wxTreeCtrl_EnsureVisible, "wxTreeCtrl", "ensureVisible", 2}, // 2012
+ {wxTreeCtrl_Expand, "wxTreeCtrl", "expand", 2}, // 2013
+ {wxTreeCtrl_GetBoundingRect, "wxTreeCtrl", "getBoundingRect", 3}, // 2014
+ {wxTreeCtrl_GetChildrenCount, "wxTreeCtrl", "getChildrenCount", 3}, // 2015
+ {wxTreeCtrl_GetCount, "wxTreeCtrl", "getCount", 1}, // 2016
+ {wxTreeCtrl_GetEditControl, "wxTreeCtrl", "getEditControl", 1}, // 2017
+ {wxTreeCtrl_GetFirstChild, "wxTreeCtrl", "getFirstChild", 2}, // 2018
+ {wxTreeCtrl_GetNextChild, "wxTreeCtrl", "getNextChild", 3}, // 2019
+ {wxTreeCtrl_GetFirstVisibleItem, "wxTreeCtrl", "getFirstVisibleItem", 1}, // 2020
+ {wxTreeCtrl_GetImageList, "wxTreeCtrl", "getImageList", 1}, // 2021
+ {wxTreeCtrl_GetIndent, "wxTreeCtrl", "getIndent", 1}, // 2022
+ {wxTreeCtrl_GetItemBackgroundColour, "wxTreeCtrl", "getItemBackgroundColour", 2}, // 2023
+ {wxTreeCtrl_GetItemData, "wxTreeCtrl", "getItemData", 2}, // 2024
+ {wxTreeCtrl_GetItemFont, "wxTreeCtrl", "getItemFont", 2}, // 2025
+ {wxTreeCtrl_GetItemImage, "wxTreeCtrl", "getItemImage", 3}, // 2026
+ {wxTreeCtrl_GetItemText, "wxTreeCtrl", "getItemText", 2}, // 2027
+ {wxTreeCtrl_GetItemTextColour, "wxTreeCtrl", "getItemTextColour", 2}, // 2028
+ {wxTreeCtrl_GetLastChild, "wxTreeCtrl", "getLastChild", 2}, // 2029
+ {wxTreeCtrl_GetNextSibling, "wxTreeCtrl", "getNextSibling", 2}, // 2030
+ {wxTreeCtrl_GetNextVisible, "wxTreeCtrl", "getNextVisible", 2}, // 2031
+ {wxTreeCtrl_GetItemParent, "wxTreeCtrl", "getItemParent", 2}, // 2032
+ {wxTreeCtrl_GetPrevSibling, "wxTreeCtrl", "getPrevSibling", 2}, // 2033
+ {wxTreeCtrl_GetPrevVisible, "wxTreeCtrl", "getPrevVisible", 2}, // 2034
+ {wxTreeCtrl_GetRootItem, "wxTreeCtrl", "getRootItem", 1}, // 2035
+ {wxTreeCtrl_GetSelection, "wxTreeCtrl", "getSelection", 1}, // 2036
+ {wxTreeCtrl_GetSelections, "wxTreeCtrl", "getSelections", 1}, // 2037
+ {wxTreeCtrl_GetStateImageList, "wxTreeCtrl", "getStateImageList", 1}, // 2038
+ {wxTreeCtrl_HitTest, "wxTreeCtrl", "hitTest", 2}, // 2039
+ {wxTreeCtrl_InsertItem, "wxTreeCtrl", "insertItem", 5}, // 2040
+ {NULL, "", "", 0}, // 2041
+ {wxTreeCtrl_IsBold, "wxTreeCtrl", "isBold", 2}, // 2042
+ {wxTreeCtrl_IsExpanded, "wxTreeCtrl", "isExpanded", 2}, // 2043
+ {wxTreeCtrl_IsSelected, "wxTreeCtrl", "isSelected", 2}, // 2044
+ {wxTreeCtrl_IsVisible, "wxTreeCtrl", "isVisible", 2}, // 2045
+ {wxTreeCtrl_ItemHasChildren, "wxTreeCtrl", "itemHasChildren", 2}, // 2046
+ {wxTreeCtrl_IsTreeItemIdOk, "wxTreeCtrl", "isTreeItemIdOk", 1}, // 2047
+ {wxTreeCtrl_PrependItem, "wxTreeCtrl", "prependItem", 4}, // 2048
+ {wxTreeCtrl_ScrollTo, "wxTreeCtrl", "scrollTo", 2}, // 2049
+ {wxTreeCtrl_SelectItem, "wxTreeCtrl", "selectItem", 3}, // 2050
+ {wxTreeCtrl_SetIndent, "wxTreeCtrl", "setIndent", 2}, // 2051
+ {wxTreeCtrl_SetImageList, "wxTreeCtrl", "setImageList", 2}, // 2052
+ {wxTreeCtrl_SetItemBackgroundColour, "wxTreeCtrl", "setItemBackgroundColour", 3}, // 2053
+ {wxTreeCtrl_SetItemBold, "wxTreeCtrl", "setItemBold", 3}, // 2054
+ {wxTreeCtrl_SetItemData, "wxTreeCtrl", "setItemData", 3}, // 2055
+ {wxTreeCtrl_SetItemDropHighlight, "wxTreeCtrl", "setItemDropHighlight", 3}, // 2056
+ {wxTreeCtrl_SetItemFont, "wxTreeCtrl", "setItemFont", 3}, // 2057
+ {wxTreeCtrl_SetItemHasChildren, "wxTreeCtrl", "setItemHasChildren", 3}, // 2058
+ {wxTreeCtrl_SetItemImage, "wxTreeCtrl", "setItemImage", 4}, // 2059
+ {wxTreeCtrl_SetItemText, "wxTreeCtrl", "setItemText", 3}, // 2060
+ {wxTreeCtrl_SetItemTextColour, "wxTreeCtrl", "setItemTextColour", 3}, // 2061
+ {wxTreeCtrl_SetStateImageList, "wxTreeCtrl", "setStateImageList", 2}, // 2062
+ {wxTreeCtrl_SetWindowStyle, "wxTreeCtrl", "setWindowStyle", 2}, // 2063
+ {wxTreeCtrl_SortChildren, "wxTreeCtrl", "sortChildren", 2}, // 2064
+ {wxTreeCtrl_Toggle, "wxTreeCtrl", "toggle", 2}, // 2065
+ {wxTreeCtrl_ToggleItemSelection, "wxTreeCtrl", "toggleItemSelection", 2}, // 2066
+ {wxTreeCtrl_Unselect, "wxTreeCtrl", "unselect", 1}, // 2067
+ {wxTreeCtrl_UnselectAll, "wxTreeCtrl", "unselectAll", 1}, // 2068
+ {wxTreeCtrl_UnselectItem, "wxTreeCtrl", "unselectItem", 2}, // 2069
+ {wxScrollBar_new_0, "wxScrollBar", "new", 0}, // 2070
+ {wxScrollBar_new_3, "wxScrollBar", "new", 3}, // 2071
+ {NULL, "wxScrollBar", "destroy", 1}, // 2072 obj destructor wxScrollBar_destruct
+ {wxScrollBar_Create, "wxScrollBar", "create", 4}, // 2073
+ {wxScrollBar_GetRange, "wxScrollBar", "getRange", 1}, // 2074
+ {wxScrollBar_GetPageSize, "wxScrollBar", "getPageSize", 1}, // 2075
+ {wxScrollBar_GetThumbPosition, "wxScrollBar", "getThumbPosition", 1}, // 2076
+ {wxScrollBar_GetThumbSize, "wxScrollBar", "getThumbSize", 1}, // 2077
+ {wxScrollBar_SetThumbPosition, "wxScrollBar", "setThumbPosition", 2}, // 2078
+ {wxScrollBar_SetScrollbar, "wxScrollBar", "setScrollbar", 6}, // 2079
+ {wxSpinButton_new_0, "wxSpinButton", "new", 0}, // 2080
+ {wxSpinButton_new_2, "wxSpinButton", "new", 2}, // 2081
+ {NULL, "wxSpinButton", "destroy", 1}, // 2082 obj destructor wxSpinButton_destruct
+ {wxSpinButton_Create, "wxSpinButton", "create", 3}, // 2083
+ {wxSpinButton_GetMax, "wxSpinButton", "getMax", 1}, // 2084
+ {wxSpinButton_GetMin, "wxSpinButton", "getMin", 1}, // 2085
+ {wxSpinButton_GetValue, "wxSpinButton", "getValue", 1}, // 2086
+ {wxSpinButton_SetRange, "wxSpinButton", "setRange", 3}, // 2087
+ {wxSpinButton_SetValue, "wxSpinButton", "setValue", 2}, // 2088
+ {wxSpinCtrl_new_0, "wxSpinCtrl", "new", 0}, // 2089
+ {wxSpinCtrl_new_2, "wxSpinCtrl", "new", 2}, // 2090
+ {wxSpinCtrl_Create, "wxSpinCtrl", "create", 3}, // 2091
+ {wxSpinCtrl_SetValue_1_1, "wxSpinCtrl", "setValue", 2}, // 2092
+ {wxSpinCtrl_SetValue_1_0, "wxSpinCtrl", "setValue", 2}, // 2093
+ {wxSpinCtrl_GetValue, "wxSpinCtrl", "getValue", 1}, // 2094
+ {wxSpinCtrl_SetRange, "wxSpinCtrl", "setRange", 3}, // 2095
+ {wxSpinCtrl_SetSelection, "wxSpinCtrl", "setSelection", 3}, // 2096
+ {wxSpinCtrl_GetMin, "wxSpinCtrl", "getMin", 1}, // 2097
+ {wxSpinCtrl_GetMax, "wxSpinCtrl", "getMax", 1}, // 2098
+ {NULL, "wxSpinCtrl", "'Destroy'", 1}, // 2099 obj destructor wxSpinCtrl_destroy
+ {wxStaticText_new_0, "wxStaticText", "new", 0}, // 2100
+ {wxStaticText_new_4, "wxStaticText", "new", 4}, // 2101
+ {wxStaticText_Create, "wxStaticText", "create", 5}, // 2102
+ {wxStaticText_GetLabel, "wxStaticText", "getLabel", 1}, // 2103
+ {wxStaticText_SetLabel, "wxStaticText", "setLabel", 2}, // 2104
+ {wxStaticText_Wrap, "wxStaticText", "wrap", 2}, // 2105
+ {NULL, "wxStaticText", "'Destroy'", 1}, // 2106 obj destructor wxStaticText_destroy
+ {wxStaticBitmap_new_0, "wxStaticBitmap", "new", 0}, // 2107
+ {wxStaticBitmap_new_4, "wxStaticBitmap", "new", 4}, // 2108
+ {wxStaticBitmap_Create, "wxStaticBitmap", "create", 5}, // 2109
+ {wxStaticBitmap_GetBitmap, "wxStaticBitmap", "getBitmap", 1}, // 2110
+ {wxStaticBitmap_SetBitmap, "wxStaticBitmap", "setBitmap", 2}, // 2111
+ {NULL, "wxStaticBitmap", "'Destroy'", 1}, // 2112 obj destructor wxStaticBitmap_destroy
+ {wxRadioBox_new, "wxRadioBox", "new", 7}, // 2113
+ {NULL, "wxRadioBox", "destroy", 1}, // 2114 obj destructor wxRadioBox_destruct
+ {wxRadioBox_Create, "wxRadioBox", "create", 8}, // 2115
+ {wxRadioBox_Enable_1, "wxRadioBox", "enable", 2}, // 2116
+ {wxRadioBox_Enable_2, "wxRadioBox", "enable", 3}, // 2117
+ {wxRadioBox_GetSelection, "wxRadioBox", "getSelection", 1}, // 2118
+ {wxRadioBox_GetString, "wxRadioBox", "getString", 2}, // 2119
+ {wxRadioBox_SetSelection, "wxRadioBox", "setSelection", 2}, // 2120
+ {wxRadioBox_Show, "wxRadioBox", "show", 3}, // 2121
+ {wxRadioBox_GetColumnCount, "wxRadioBox", "getColumnCount", 1}, // 2122
+ {wxRadioBox_GetItemHelpText, "wxRadioBox", "getItemHelpText", 2}, // 2123
+ {wxRadioBox_GetItemToolTip, "wxRadioBox", "getItemToolTip", 2}, // 2124
+ {wxRadioBox_GetItemFromPoint, "wxRadioBox", "getItemFromPoint", 2}, // 2125
+ {wxRadioBox_GetRowCount, "wxRadioBox", "getRowCount", 1}, // 2126
+ {wxRadioBox_IsItemEnabled, "wxRadioBox", "isItemEnabled", 2}, // 2127
+ {wxRadioBox_IsItemShown, "wxRadioBox", "isItemShown", 2}, // 2128
+ {wxRadioBox_SetItemHelpText, "wxRadioBox", "setItemHelpText", 3}, // 2129
+ {wxRadioBox_SetItemToolTip, "wxRadioBox", "setItemToolTip", 3}, // 2130
+ {wxRadioButton_new_0, "wxRadioButton", "new", 0}, // 2131
+ {wxRadioButton_new_4, "wxRadioButton", "new", 4}, // 2132
+ {NULL, "wxRadioButton", "destroy", 1}, // 2133 obj destructor wxRadioButton_destruct
+ {wxRadioButton_Create, "wxRadioButton", "create", 5}, // 2134
+ {wxRadioButton_GetValue, "wxRadioButton", "getValue", 1}, // 2135
+ {wxRadioButton_SetValue, "wxRadioButton", "setValue", 2}, // 2136
+ {wxSlider_new_0, "wxSlider", "new", 0}, // 2137
+ {wxSlider_new_6, "wxSlider", "new", 6}, // 2138
+ {NULL, "wxSlider", "destroy", 1}, // 2139 obj destructor wxSlider_destruct
+ {wxSlider_Create, "wxSlider", "create", 7}, // 2140
+ {wxSlider_GetLineSize, "wxSlider", "getLineSize", 1}, // 2141
+ {wxSlider_GetMax, "wxSlider", "getMax", 1}, // 2142
+ {wxSlider_GetMin, "wxSlider", "getMin", 1}, // 2143
+ {wxSlider_GetPageSize, "wxSlider", "getPageSize", 1}, // 2144
+ {wxSlider_GetThumbLength, "wxSlider", "getThumbLength", 1}, // 2145
+ {wxSlider_GetValue, "wxSlider", "getValue", 1}, // 2146
+ {wxSlider_SetLineSize, "wxSlider", "setLineSize", 2}, // 2147
+ {wxSlider_SetPageSize, "wxSlider", "setPageSize", 2}, // 2148
+ {wxSlider_SetRange, "wxSlider", "setRange", 3}, // 2149
+ {wxSlider_SetThumbLength, "wxSlider", "setThumbLength", 2}, // 2150
+ {wxSlider_SetValue, "wxSlider", "setValue", 2}, // 2151
+ {wxDialog_new_0, "wxDialog", "new", 0}, // 2152
+ {wxDialog_new_4, "wxDialog", "new", 4}, // 2153
+ {NULL, "wxDialog", "destroy", 1}, // 2154 obj destructor wxDialog_destruct
+ {wxDialog_Create, "wxDialog", "create", 5}, // 2155
+ {wxDialog_CreateButtonSizer, "wxDialog", "createButtonSizer", 2}, // 2156
+ {wxDialog_CreateStdDialogButtonSizer, "wxDialog", "createStdDialogButtonSizer", 2}, // 2157
+ {wxDialog_EndModal, "wxDialog", "endModal", 2}, // 2158
+ {wxDialog_GetAffirmativeId, "wxDialog", "getAffirmativeId", 1}, // 2159
+ {wxDialog_GetReturnCode, "wxDialog", "getReturnCode", 1}, // 2160
+ {wxDialog_IsModal, "wxDialog", "isModal", 1}, // 2161
+ {wxDialog_SetAffirmativeId, "wxDialog", "setAffirmativeId", 2}, // 2162
+ {wxDialog_SetReturnCode, "wxDialog", "setReturnCode", 2}, // 2163
+ {wxDialog_Show, "wxDialog", "show", 2}, // 2164
+ {wxDialog_ShowModal, "wxDialog", "showModal", 1}, // 2165
+ {wxColourDialog_new_0, "wxColourDialog", "new", 0}, // 2166
+ {wxColourDialog_new_2, "wxColourDialog", "new", 2}, // 2167
+ {NULL, "wxColourDialog", "destroy", 1}, // 2168 obj destructor wxColourDialog_destruct
+ {wxColourDialog_Create, "wxColourDialog", "create", 3}, // 2169
+ {wxColourDialog_GetColourData, "wxColourDialog", "getColourData", 1}, // 2170
+ {wxColourData_new, "wxColourData", "new", 0}, // 2171
+ {NULL, "wxColourData", "destroy", 1}, // 2172 obj destructor wxColourData_destruct
+ {wxColourData_GetChooseFull, "wxColourData", "getChooseFull", 1}, // 2173
+ {wxColourData_GetColour, "wxColourData", "getColour", 1}, // 2174
+ {wxColourData_GetCustomColour, "wxColourData", "getCustomColour", 2}, // 2175
+ {wxColourData_SetChooseFull, "wxColourData", "setChooseFull", 2}, // 2176
+ {wxColourData_SetColour, "wxColourData", "setColour", 2}, // 2177
+ {wxColourData_SetCustomColour, "wxColourData", "setCustomColour", 3}, // 2178
+ {wxPalette_new_0, "wxPalette", "new", 0}, // 2179
+ {wxPalette_new_1, "wxPalette", "new", 1}, // 2180
+ {wxPalette_new_4, "wxPalette", "new", 3}, // 2181
+ {NULL, "wxPalette", "destroy", 1}, // 2182 obj destructor wxPalette_destruct
+ {wxPalette_Create, "wxPalette", "create", 4}, // 2183
+ {wxPalette_GetColoursCount, "wxPalette", "getColoursCount", 1}, // 2184
+ {wxPalette_GetPixel, "wxPalette", "getPixel", 4}, // 2185
+ {wxPalette_GetRGB, "wxPalette", "getRGB", 2}, // 2186
+ {wxPalette_IsOk, "wxPalette", "isOk", 1}, // 2187
+ {wxDirDialog_new, "wxDirDialog", "new", 2}, // 2188
+ {NULL, "wxDirDialog", "destroy", 1}, // 2189 obj destructor wxDirDialog_destruct
+ {wxDirDialog_GetPath, "wxDirDialog", "getPath", 1}, // 2190
+ {wxDirDialog_GetMessage, "wxDirDialog", "getMessage", 1}, // 2191
+ {wxDirDialog_SetMessage, "wxDirDialog", "setMessage", 2}, // 2192
+ {wxDirDialog_SetPath, "wxDirDialog", "setPath", 2}, // 2193
+ {wxFileDialog_new, "wxFileDialog", "new", 2}, // 2194
+ {NULL, "wxFileDialog", "destroy", 1}, // 2195 obj destructor wxFileDialog_destruct
+ {wxFileDialog_GetDirectory, "wxFileDialog", "getDirectory", 1}, // 2196
+ {wxFileDialog_GetFilename, "wxFileDialog", "getFilename", 1}, // 2197
+ {wxFileDialog_GetFilenames, "wxFileDialog", "getFilenames", 1}, // 2198
+ {wxFileDialog_GetFilterIndex, "wxFileDialog", "getFilterIndex", 1}, // 2199
+ {wxFileDialog_GetMessage, "wxFileDialog", "getMessage", 1}, // 2200
+ {wxFileDialog_GetPath, "wxFileDialog", "getPath", 1}, // 2201
+ {wxFileDialog_GetPaths, "wxFileDialog", "getPaths", 1}, // 2202
+ {wxFileDialog_GetWildcard, "wxFileDialog", "getWildcard", 1}, // 2203
+ {wxFileDialog_SetDirectory, "wxFileDialog", "setDirectory", 2}, // 2204
+ {wxFileDialog_SetFilename, "wxFileDialog", "setFilename", 2}, // 2205
+ {wxFileDialog_SetFilterIndex, "wxFileDialog", "setFilterIndex", 2}, // 2206
+ {wxFileDialog_SetMessage, "wxFileDialog", "setMessage", 2}, // 2207
+ {wxFileDialog_SetPath, "wxFileDialog", "setPath", 2}, // 2208
+ {wxFileDialog_SetWildcard, "wxFileDialog", "setWildcard", 2}, // 2209
+ {wxPickerBase_SetInternalMargin, "wxPickerBase", "setInternalMargin", 2}, // 2210
+ {wxPickerBase_GetInternalMargin, "wxPickerBase", "getInternalMargin", 1}, // 2211
+ {wxPickerBase_SetTextCtrlProportion, "wxPickerBase", "setTextCtrlProportion", 2}, // 2212
+ {wxPickerBase_SetPickerCtrlProportion, "wxPickerBase", "setPickerCtrlProportion", 2}, // 2213
+ {wxPickerBase_GetTextCtrlProportion, "wxPickerBase", "getTextCtrlProportion", 1}, // 2214
+ {wxPickerBase_GetPickerCtrlProportion, "wxPickerBase", "getPickerCtrlProportion", 1}, // 2215
+ {wxPickerBase_HasTextCtrl, "wxPickerBase", "hasTextCtrl", 1}, // 2216
+ {wxPickerBase_GetTextCtrl, "wxPickerBase", "getTextCtrl", 1}, // 2217
+ {wxPickerBase_IsTextCtrlGrowable, "wxPickerBase", "isTextCtrlGrowable", 1}, // 2218
+ {wxPickerBase_SetPickerCtrlGrowable, "wxPickerBase", "setPickerCtrlGrowable", 2}, // 2219
+ {wxPickerBase_SetTextCtrlGrowable, "wxPickerBase", "setTextCtrlGrowable", 2}, // 2220
+ {wxPickerBase_IsPickerCtrlGrowable, "wxPickerBase", "isPickerCtrlGrowable", 1}, // 2221
+ {wxFilePickerCtrl_new_0, "wxFilePickerCtrl", "new", 0}, // 2222
+ {wxFilePickerCtrl_new_3, "wxFilePickerCtrl", "new", 3}, // 2223
+ {wxFilePickerCtrl_Create, "wxFilePickerCtrl", "create", 4}, // 2224
+ {wxFilePickerCtrl_GetPath, "wxFilePickerCtrl", "getPath", 1}, // 2225
+ {wxFilePickerCtrl_SetPath, "wxFilePickerCtrl", "setPath", 2}, // 2226
+ {NULL, "wxFilePickerCtrl", "'Destroy'", 1}, // 2227 obj destructor wxFilePickerCtrl_destroy
+ {wxDirPickerCtrl_new_0, "wxDirPickerCtrl", "new", 0}, // 2228
+ {wxDirPickerCtrl_new_3, "wxDirPickerCtrl", "new", 3}, // 2229
+ {wxDirPickerCtrl_Create, "wxDirPickerCtrl", "create", 4}, // 2230
+ {wxDirPickerCtrl_GetPath, "wxDirPickerCtrl", "getPath", 1}, // 2231
+ {wxDirPickerCtrl_SetPath, "wxDirPickerCtrl", "setPath", 2}, // 2232
+ {NULL, "wxDirPickerCtrl", "'Destroy'", 1}, // 2233 obj destructor wxDirPickerCtrl_destroy
+ {wxColourPickerCtrl_new_0, "wxColourPickerCtrl", "new", 0}, // 2234
+ {wxColourPickerCtrl_new_3, "wxColourPickerCtrl", "new", 3}, // 2235
+ {wxColourPickerCtrl_Create, "wxColourPickerCtrl", "create", 4}, // 2236
+ {wxColourPickerCtrl_GetColour, "wxColourPickerCtrl", "getColour", 1}, // 2237
+ {wxColourPickerCtrl_SetColour_1_1, "wxColourPickerCtrl", "setColour", 2}, // 2238
+ {wxColourPickerCtrl_SetColour_1_0, "wxColourPickerCtrl", "setColour", 2}, // 2239
+ {NULL, "wxColourPickerCtrl", "'Destroy'", 1}, // 2240 obj destructor wxColourPickerCtrl_destroy
+ {wxDatePickerCtrl_new_0, "wxDatePickerCtrl", "new", 0}, // 2241
+ {wxDatePickerCtrl_new_3, "wxDatePickerCtrl", "new", 3}, // 2242
+ {wxDatePickerCtrl_GetRange, "wxDatePickerCtrl", "getRange", 3}, // 2243
+ {wxDatePickerCtrl_GetValue, "wxDatePickerCtrl", "getValue", 1}, // 2244
+ {wxDatePickerCtrl_SetRange, "wxDatePickerCtrl", "setRange", 3}, // 2245
+ {wxDatePickerCtrl_SetValue, "wxDatePickerCtrl", "setValue", 2}, // 2246
+ {NULL, "wxDatePickerCtrl", "'Destroy'", 1}, // 2247 obj destructor wxDatePickerCtrl_destroy
+ {wxFontPickerCtrl_new_0, "wxFontPickerCtrl", "new", 0}, // 2248
+ {wxFontPickerCtrl_new_3, "wxFontPickerCtrl", "new", 3}, // 2249
+ {wxFontPickerCtrl_Create, "wxFontPickerCtrl", "create", 4}, // 2250
+ {wxFontPickerCtrl_GetSelectedFont, "wxFontPickerCtrl", "getSelectedFont", 1}, // 2251
+ {wxFontPickerCtrl_SetSelectedFont, "wxFontPickerCtrl", "setSelectedFont", 2}, // 2252
+ {wxFontPickerCtrl_GetMaxPointSize, "wxFontPickerCtrl", "getMaxPointSize", 1}, // 2253
+ {wxFontPickerCtrl_SetMaxPointSize, "wxFontPickerCtrl", "setMaxPointSize", 2}, // 2254
+ {NULL, "wxFontPickerCtrl", "'Destroy'", 1}, // 2255 obj destructor wxFontPickerCtrl_destroy
+ {wxFindReplaceDialog_new_0, "wxFindReplaceDialog", "new", 0}, // 2256
+ {wxFindReplaceDialog_new_4, "wxFindReplaceDialog", "new", 4}, // 2257
+ {NULL, "wxFindReplaceDialog", "destroy", 1}, // 2258 obj destructor wxFindReplaceDialog_destruct
+ {wxFindReplaceDialog_Create, "wxFindReplaceDialog", "create", 5}, // 2259
+ {wxFindReplaceDialog_GetData, "wxFindReplaceDialog", "getData", 1}, // 2260
+ {wxFindReplaceData_new, "wxFindReplaceData", "new", 1}, // 2261
+ {wxFindReplaceData_GetFindString, "wxFindReplaceData", "getFindString", 1}, // 2262
+ {wxFindReplaceData_GetReplaceString, "wxFindReplaceData", "getReplaceString", 1}, // 2263
+ {wxFindReplaceData_GetFlags, "wxFindReplaceData", "getFlags", 1}, // 2264
+ {wxFindReplaceData_SetFlags, "wxFindReplaceData", "setFlags", 2}, // 2265
+ {wxFindReplaceData_SetFindString, "wxFindReplaceData", "setFindString", 2}, // 2266
+ {wxFindReplaceData_SetReplaceString, "wxFindReplaceData", "setReplaceString", 2}, // 2267
+ {NULL, "wxFindReplaceData", "'Destroy'", 1}, // 2268 obj destructor wxFindReplaceData_destroy
+ {NULL, "", "", 0}, // 2269
+ {wxMultiChoiceDialog_new, "wxMultiChoiceDialog", "new", 5}, // 2270
+ {wxMultiChoiceDialog_GetSelections, "wxMultiChoiceDialog", "getSelections", 1}, // 2271
+ {wxMultiChoiceDialog_SetSelections, "wxMultiChoiceDialog", "setSelections", 2}, // 2272
+ {NULL, "wxMultiChoiceDialog", "'Destroy'", 1}, // 2273 obj destructor wxMultiChoiceDialog_destroy
+ {NULL, "", "", 0}, // 2274
+ {wxSingleChoiceDialog_new, "wxSingleChoiceDialog", "new", 5}, // 2275
+ {wxSingleChoiceDialog_GetSelection, "wxSingleChoiceDialog", "getSelection", 1}, // 2276
+ {wxSingleChoiceDialog_GetStringSelection, "wxSingleChoiceDialog", "getStringSelection", 1}, // 2277
+ {wxSingleChoiceDialog_SetSelection, "wxSingleChoiceDialog", "setSelection", 2}, // 2278
+ {NULL, "wxSingleChoiceDialog", "'Destroy'", 1}, // 2279 obj destructor wxSingleChoiceDialog_destroy
+ {wxTextEntryDialog_new_0, "wxTextEntryDialog", "new", 0}, // 2280
+ {wxTextEntryDialog_new_3, "wxTextEntryDialog", "new", 3}, // 2281
+ {NULL, "wxTextEntryDialog", "destroy", 1}, // 2282 obj destructor wxTextEntryDialog_destruct
+ {wxTextEntryDialog_GetValue, "wxTextEntryDialog", "getValue", 1}, // 2283
+ {wxTextEntryDialog_SetValue, "wxTextEntryDialog", "setValue", 2}, // 2284
+ {wxPasswordEntryDialog_new, "wxPasswordEntryDialog", "new", 3}, // 2285
+ {NULL, "wxPasswordEntryDialog", "'Destroy'", 1}, // 2286 obj destructor wxPasswordEntryDialog_destroy
+ {wxFontData_new_0, "wxFontData", "new", 0}, // 2287
+ {wxFontData_new_1, "wxFontData", "new", 1}, // 2288
+ {wxFontData_EnableEffects, "wxFontData", "enableEffects", 2}, // 2289
+ {wxFontData_GetAllowSymbols, "wxFontData", "getAllowSymbols", 1}, // 2290
+ {wxFontData_GetColour, "wxFontData", "getColour", 1}, // 2291
+ {wxFontData_GetChosenFont, "wxFontData", "getChosenFont", 1}, // 2292
+ {wxFontData_GetEnableEffects, "wxFontData", "getEnableEffects", 1}, // 2293
+ {wxFontData_GetInitialFont, "wxFontData", "getInitialFont", 1}, // 2294
+ {wxFontData_GetShowHelp, "wxFontData", "getShowHelp", 1}, // 2295
+ {wxFontData_SetAllowSymbols, "wxFontData", "setAllowSymbols", 2}, // 2296
+ {wxFontData_SetChosenFont, "wxFontData", "setChosenFont", 2}, // 2297
+ {wxFontData_SetColour, "wxFontData", "setColour", 2}, // 2298
+ {wxFontData_SetInitialFont, "wxFontData", "setInitialFont", 2}, // 2299
+ {wxFontData_SetRange, "wxFontData", "setRange", 3}, // 2300
+ {wxFontData_SetShowHelp, "wxFontData", "setShowHelp", 2}, // 2301
+ {NULL, "wxFontData", "'Destroy'", 1}, // 2302 obj destructor wxFontData_destroy
+ {wxFontDialog_new_0, "wxFontDialog", "new", 0}, // 2303
+ {NULL, "", "", 0}, // 2304
+ {wxFontDialog_new_2, "wxFontDialog", "new", 2}, // 2305
+ {NULL, "", "", 0}, // 2306
+ {wxFontDialog_Create, "wxFontDialog", "create", 3}, // 2307
+ {wxFontDialog_GetFontData, "wxFontDialog", "getFontData", 1}, // 2308
+ {NULL, "", "", 0}, // 2309
+ {NULL, "wxFontDialog", "'Destroy'", 1}, // 2310 obj destructor wxFontDialog_destroy
+ {wxProgressDialog_new, "wxProgressDialog", "new", 3}, // 2311
+ {wxProgressDialog_Resume, "wxProgressDialog", "resume", 1}, // 2312
+ {wxProgressDialog_Update, "wxProgressDialog", "update", 3}, // 2313
+ {NULL, "wxProgressDialog", "'Destroy'", 1}, // 2314 obj destructor wxProgressDialog_destroy
+ {wxMessageDialog_new, "wxMessageDialog", "new", 3}, // 2315
+ {NULL, "wxMessageDialog", "'Destroy'", 1}, // 2316 obj destructor wxMessageDialog_destroy
+ {wxPageSetupDialog_new, "wxPageSetupDialog", "new", 2}, // 2317
+ {NULL, "wxPageSetupDialog", "destroy", 1}, // 2318 obj destructor wxPageSetupDialog_destruct
+ {wxPageSetupDialog_GetPageSetupData, "wxPageSetupDialog", "getPageSetupData", 1}, // 2319
+ {wxPageSetupDialog_ShowModal, "wxPageSetupDialog", "showModal", 1}, // 2320
+ {wxPageSetupDialogData_new_0, "wxPageSetupDialogData", "new", 0}, // 2321
+ {NULL, "", "", 0}, // 2322
+ {wxPageSetupDialogData_new_1, "wxPageSetupDialogData", "new", 1}, // 2323
+ {NULL, "wxPageSetupDialogData", "destroy", 1}, // 2324 obj destructor wxPageSetupDialogData_destruct
+ {wxPageSetupDialogData_EnableHelp, "wxPageSetupDialogData", "enableHelp", 2}, // 2325
+ {wxPageSetupDialogData_EnableMargins, "wxPageSetupDialogData", "enableMargins", 2}, // 2326
+ {wxPageSetupDialogData_EnableOrientation, "wxPageSetupDialogData", "enableOrientation", 2}, // 2327
+ {wxPageSetupDialogData_EnablePaper, "wxPageSetupDialogData", "enablePaper", 2}, // 2328
+ {wxPageSetupDialogData_EnablePrinter, "wxPageSetupDialogData", "enablePrinter", 2}, // 2329
+ {wxPageSetupDialogData_GetDefaultMinMargins, "wxPageSetupDialogData", "getDefaultMinMargins", 1}, // 2330
+ {wxPageSetupDialogData_GetEnableMargins, "wxPageSetupDialogData", "getEnableMargins", 1}, // 2331
+ {wxPageSetupDialogData_GetEnableOrientation, "wxPageSetupDialogData", "getEnableOrientation", 1}, // 2332
+ {wxPageSetupDialogData_GetEnablePaper, "wxPageSetupDialogData", "getEnablePaper", 1}, // 2333
+ {wxPageSetupDialogData_GetEnablePrinter, "wxPageSetupDialogData", "getEnablePrinter", 1}, // 2334
+ {wxPageSetupDialogData_GetEnableHelp, "wxPageSetupDialogData", "getEnableHelp", 1}, // 2335
+ {wxPageSetupDialogData_GetDefaultInfo, "wxPageSetupDialogData", "getDefaultInfo", 1}, // 2336
+ {wxPageSetupDialogData_GetMarginTopLeft, "wxPageSetupDialogData", "getMarginTopLeft", 1}, // 2337
+ {wxPageSetupDialogData_GetMarginBottomRight, "wxPageSetupDialogData", "getMarginBottomRight", 1}, // 2338
+ {wxPageSetupDialogData_GetMinMarginTopLeft, "wxPageSetupDialogData", "getMinMarginTopLeft", 1}, // 2339
+ {wxPageSetupDialogData_GetMinMarginBottomRight, "wxPageSetupDialogData", "getMinMarginBottomRight", 1}, // 2340
+ {wxPageSetupDialogData_GetPaperId, "wxPageSetupDialogData", "getPaperId", 1}, // 2341
+ {wxPageSetupDialogData_GetPaperSize, "wxPageSetupDialogData", "getPaperSize", 1}, // 2342
+ {NULL, "", "", 0}, // 2343
+ {wxPageSetupDialogData_GetPrintData, "wxPageSetupDialogData", "getPrintData", 1}, // 2344
+ {wxPageSetupDialogData_IsOk, "wxPageSetupDialogData", "isOk", 1}, // 2345
+ {wxPageSetupDialogData_SetDefaultInfo, "wxPageSetupDialogData", "setDefaultInfo", 2}, // 2346
+ {wxPageSetupDialogData_SetDefaultMinMargins, "wxPageSetupDialogData", "setDefaultMinMargins", 2}, // 2347
+ {wxPageSetupDialogData_SetMarginTopLeft, "wxPageSetupDialogData", "setMarginTopLeft", 2}, // 2348
+ {wxPageSetupDialogData_SetMarginBottomRight, "wxPageSetupDialogData", "setMarginBottomRight", 2}, // 2349
+ {wxPageSetupDialogData_SetMinMarginTopLeft, "wxPageSetupDialogData", "setMinMarginTopLeft", 2}, // 2350
+ {wxPageSetupDialogData_SetMinMarginBottomRight, "wxPageSetupDialogData", "setMinMarginBottomRight", 2}, // 2351
+ {wxPageSetupDialogData_SetPaperId, "wxPageSetupDialogData", "setPaperId", 2}, // 2352
+ {wxPageSetupDialogData_SetPaperSize, "wxPageSetupDialogData", "setPaperSize", 2}, // 2353
+ {wxPageSetupDialogData_SetPrintData, "wxPageSetupDialogData", "setPrintData", 2}, // 2354
+ {wxPrintDialog_new_2_0, "wxPrintDialog", "new", 2}, // 2355
+ {wxPrintDialog_new_2_1, "wxPrintDialog", "new", 2}, // 2356
+ {NULL, "wxPrintDialog", "destroy", 1}, // 2357 obj destructor wxPrintDialog_destruct
+ {wxPrintDialog_GetPrintDialogData, "wxPrintDialog", "getPrintDialogData", 1}, // 2358
+ {wxPrintDialog_GetPrintDC, "wxPrintDialog", "getPrintDC", 1}, // 2359
+ {wxPrintDialogData_new_0, "wxPrintDialogData", "new", 0}, // 2360
+ {wxPrintDialogData_new_1, "wxPrintDialogData", "new", 1}, // 2361
+ {NULL, "", "", 0}, // 2362
+ {NULL, "wxPrintDialogData", "destroy", 1}, // 2363 obj destructor wxPrintDialogData_destruct
+ {wxPrintDialogData_EnableHelp, "wxPrintDialogData", "enableHelp", 2}, // 2364
+ {wxPrintDialogData_EnablePageNumbers, "wxPrintDialogData", "enablePageNumbers", 2}, // 2365
+ {wxPrintDialogData_EnablePrintToFile, "wxPrintDialogData", "enablePrintToFile", 2}, // 2366
+ {wxPrintDialogData_EnableSelection, "wxPrintDialogData", "enableSelection", 2}, // 2367
+ {wxPrintDialogData_GetAllPages, "wxPrintDialogData", "getAllPages", 1}, // 2368
+ {wxPrintDialogData_GetCollate, "wxPrintDialogData", "getCollate", 1}, // 2369
+ {wxPrintDialogData_GetFromPage, "wxPrintDialogData", "getFromPage", 1}, // 2370
+ {wxPrintDialogData_GetMaxPage, "wxPrintDialogData", "getMaxPage", 1}, // 2371
+ {wxPrintDialogData_GetMinPage, "wxPrintDialogData", "getMinPage", 1}, // 2372
+ {wxPrintDialogData_GetNoCopies, "wxPrintDialogData", "getNoCopies", 1}, // 2373
+ {wxPrintDialogData_GetPrintData, "wxPrintDialogData", "getPrintData", 1}, // 2374
+ {wxPrintDialogData_GetPrintToFile, "wxPrintDialogData", "getPrintToFile", 1}, // 2375
+ {wxPrintDialogData_GetSelection, "wxPrintDialogData", "getSelection", 1}, // 2376
+ {wxPrintDialogData_GetToPage, "wxPrintDialogData", "getToPage", 1}, // 2377
+ {wxPrintDialogData_IsOk, "wxPrintDialogData", "isOk", 1}, // 2378
+ {wxPrintDialogData_SetCollate, "wxPrintDialogData", "setCollate", 2}, // 2379
+ {wxPrintDialogData_SetFromPage, "wxPrintDialogData", "setFromPage", 2}, // 2380
+ {wxPrintDialogData_SetMaxPage, "wxPrintDialogData", "setMaxPage", 2}, // 2381
+ {wxPrintDialogData_SetMinPage, "wxPrintDialogData", "setMinPage", 2}, // 2382
+ {wxPrintDialogData_SetNoCopies, "wxPrintDialogData", "setNoCopies", 2}, // 2383
+ {wxPrintDialogData_SetPrintData, "wxPrintDialogData", "setPrintData", 2}, // 2384
+ {wxPrintDialogData_SetPrintToFile, "wxPrintDialogData", "setPrintToFile", 2}, // 2385
+ {wxPrintDialogData_SetSelection, "wxPrintDialogData", "setSelection", 2}, // 2386
+ {wxPrintDialogData_SetToPage, "wxPrintDialogData", "setToPage", 2}, // 2387
+ {wxPrintData_new_0, "wxPrintData", "new", 0}, // 2388
+ {wxPrintData_new_1, "wxPrintData", "new", 1}, // 2389
+ {NULL, "wxPrintData", "destroy", 1}, // 2390 obj destructor wxPrintData_destruct
+ {wxPrintData_GetCollate, "wxPrintData", "getCollate", 1}, // 2391
+ {wxPrintData_GetBin, "wxPrintData", "getBin", 1}, // 2392
+ {wxPrintData_GetColour, "wxPrintData", "getColour", 1}, // 2393
+ {wxPrintData_GetDuplex, "wxPrintData", "getDuplex", 1}, // 2394
+ {wxPrintData_GetNoCopies, "wxPrintData", "getNoCopies", 1}, // 2395
+ {wxPrintData_GetOrientation, "wxPrintData", "getOrientation", 1}, // 2396
+ {wxPrintData_GetPaperId, "wxPrintData", "getPaperId", 1}, // 2397
+ {wxPrintData_GetPrinterName, "wxPrintData", "getPrinterName", 1}, // 2398
+ {wxPrintData_GetQuality, "wxPrintData", "getQuality", 1}, // 2399
+ {wxPrintData_IsOk, "wxPrintData", "isOk", 1}, // 2400
+ {wxPrintData_SetBin, "wxPrintData", "setBin", 2}, // 2401
+ {wxPrintData_SetCollate, "wxPrintData", "setCollate", 2}, // 2402
+ {wxPrintData_SetColour, "wxPrintData", "setColour", 2}, // 2403
+ {wxPrintData_SetDuplex, "wxPrintData", "setDuplex", 2}, // 2404
+ {wxPrintData_SetNoCopies, "wxPrintData", "setNoCopies", 2}, // 2405
+ {wxPrintData_SetOrientation, "wxPrintData", "setOrientation", 2}, // 2406
+ {wxPrintData_SetPaperId, "wxPrintData", "setPaperId", 2}, // 2407
+ {wxPrintData_SetPrinterName, "wxPrintData", "setPrinterName", 2}, // 2408
+ {wxPrintData_SetQuality, "wxPrintData", "setQuality", 2}, // 2409
+ {wxPrintPreview_new_2, "wxPrintPreview", "new", 2}, // 2410
+ {wxPrintPreview_new_3, "wxPrintPreview", "new", 3}, // 2411
+ {NULL, "wxPrintPreview", "destroy", 1}, // 2412 obj destructor wxPrintPreview_destruct
+ {wxPrintPreview_GetCanvas, "wxPrintPreview", "getCanvas", 1}, // 2413
+ {wxPrintPreview_GetCurrentPage, "wxPrintPreview", "getCurrentPage", 1}, // 2414
+ {wxPrintPreview_GetFrame, "wxPrintPreview", "getFrame", 1}, // 2415
+ {wxPrintPreview_GetMaxPage, "wxPrintPreview", "getMaxPage", 1}, // 2416
+ {wxPrintPreview_GetMinPage, "wxPrintPreview", "getMinPage", 1}, // 2417
+ {wxPrintPreview_GetPrintout, "wxPrintPreview", "getPrintout", 1}, // 2418
+ {wxPrintPreview_GetPrintoutForPrinting, "wxPrintPreview", "getPrintoutForPrinting", 1}, // 2419
+ {wxPrintPreview_IsOk, "wxPrintPreview", "isOk", 1}, // 2420
+ {wxPrintPreview_PaintPage, "wxPrintPreview", "paintPage", 3}, // 2421
+ {wxPrintPreview_Print, "wxPrintPreview", "print", 2}, // 2422
+ {wxPrintPreview_RenderPage, "wxPrintPreview", "renderPage", 2}, // 2423
+ {wxPrintPreview_SetCanvas, "wxPrintPreview", "setCanvas", 2}, // 2424
+ {wxPrintPreview_SetCurrentPage, "wxPrintPreview", "setCurrentPage", 2}, // 2425
+ {wxPrintPreview_SetFrame, "wxPrintPreview", "setFrame", 2}, // 2426
+ {wxPrintPreview_SetPrintout, "wxPrintPreview", "setPrintout", 2}, // 2427
+ {wxPrintPreview_SetZoom, "wxPrintPreview", "setZoom", 2}, // 2428
+ {wxPreviewFrame_new, "wxPreviewFrame", "new", 3}, // 2429
+ {NULL, "wxPreviewFrame", "destroy", 1}, // 2430 obj destructor wxPreviewFrame_destruct
+ {wxPreviewFrame_CreateControlBar, "wxPreviewFrame", "createControlBar", 1}, // 2431
+ {wxPreviewFrame_CreateCanvas, "wxPreviewFrame", "createCanvas", 1}, // 2432
+ {wxPreviewFrame_Initialize, "wxPreviewFrame", "initialize", 1}, // 2433
+ {wxPreviewFrame_OnCloseWindow, "wxPreviewFrame", "onCloseWindow", 2}, // 2434
+ {wxPreviewControlBar_new, "wxPreviewControlBar", "new", 4}, // 2435
+ {NULL, "wxPreviewControlBar", "destroy", 1}, // 2436 obj destructor wxPreviewControlBar_destruct
+ {wxPreviewControlBar_CreateButtons, "wxPreviewControlBar", "createButtons", 1}, // 2437
+ {wxPreviewControlBar_GetPrintPreview, "wxPreviewControlBar", "getPrintPreview", 1}, // 2438
+ {wxPreviewControlBar_GetZoomControl, "wxPreviewControlBar", "getZoomControl", 1}, // 2439
+ {wxPreviewControlBar_SetZoomControl, "wxPreviewControlBar", "setZoomControl", 2}, // 2440
+ {wxPrinter_new, "wxPrinter", "new", 1}, // 2441
+ {wxPrinter_CreateAbortWindow, "wxPrinter", "createAbortWindow", 3}, // 2442
+ {wxPrinter_GetAbort, "wxPrinter", "getAbort", 1}, // 2443
+ {wxPrinter_GetLastError, "wxPrinter", "getLastError", 0}, // 2444
+ {wxPrinter_GetPrintDialogData, "wxPrinter", "getPrintDialogData", 1}, // 2445
+ {wxPrinter_Print, "wxPrinter", "print", 4}, // 2446
+ {wxPrinter_PrintDialog, "wxPrinter", "printDialog", 2}, // 2447
+ {wxPrinter_ReportError, "wxPrinter", "reportError", 4}, // 2448
+ {wxPrinter_Setup, "wxPrinter", "setup", 2}, // 2449
+ {NULL, "wxPrinter", "'Destroy'", 1}, // 2450 obj destructor wxPrinter_destroy
+ {wxXmlResource_new_2, "wxXmlResource", "new", 2}, // 2451
+ {wxXmlResource_new_1, "wxXmlResource", "new", 1}, // 2452
+ {NULL, "wxXmlResource", "destroy", 1}, // 2453 obj destructor wxXmlResource_destruct
+ {wxXmlResource_AttachUnknownControl, "wxXmlResource", "attachUnknownControl", 4}, // 2454
+ {wxXmlResource_ClearHandlers, "wxXmlResource", "clearHandlers", 1}, // 2455
+ {wxXmlResource_CompareVersion, "wxXmlResource", "compareVersion", 5}, // 2456
+ {wxXmlResource_Get, "wxXmlResource", "get", 0}, // 2457
+ {wxXmlResource_GetFlags, "wxXmlResource", "getFlags", 1}, // 2458
+ {wxXmlResource_GetVersion, "wxXmlResource", "getVersion", 1}, // 2459
+ {wxXmlResource_GetXRCID, "wxXmlResource", "getXRCID", 2}, // 2460
+ {wxXmlResource_InitAllHandlers, "wxXmlResource", "initAllHandlers", 1}, // 2461
+ {wxXmlResource_Load, "wxXmlResource", "load", 2}, // 2462
+ {wxXmlResource_LoadBitmap, "wxXmlResource", "loadBitmap", 2}, // 2463
+ {wxXmlResource_LoadDialog_2, "wxXmlResource", "loadDialog", 3}, // 2464
+ {wxXmlResource_LoadDialog_3, "wxXmlResource", "loadDialog", 4}, // 2465
+ {wxXmlResource_LoadFrame_2, "wxXmlResource", "loadFrame", 3}, // 2466
+ {wxXmlResource_LoadFrame_3, "wxXmlResource", "loadFrame", 4}, // 2467
+ {wxXmlResource_LoadIcon, "wxXmlResource", "loadIcon", 2}, // 2468
+ {wxXmlResource_LoadMenu, "wxXmlResource", "loadMenu", 2}, // 2469
+ {wxXmlResource_LoadMenuBar_2, "wxXmlResource", "loadMenuBar", 3}, // 2470
+ {wxXmlResource_LoadMenuBar_1, "wxXmlResource", "loadMenuBar", 2}, // 2471
+ {wxXmlResource_LoadPanel_2, "wxXmlResource", "loadPanel", 3}, // 2472
+ {wxXmlResource_LoadPanel_3, "wxXmlResource", "loadPanel", 4}, // 2473
+ {wxXmlResource_LoadToolBar, "wxXmlResource", "loadToolBar", 3}, // 2474
+ {wxXmlResource_Set, "wxXmlResource", "set", 1}, // 2475
+ {wxXmlResource_SetFlags, "wxXmlResource", "setFlags", 2}, // 2476
+ {wxXmlResource_Unload, "wxXmlResource", "unload", 2}, // 2477
+ {NULL, "wxXmlResource", "xrcctrl", 3}, // 2478 TaylorMade erl only wxXmlResource_xrcctrl
+ {wxHtmlEasyPrinting_new, "wxHtmlEasyPrinting", "new", 1}, // 2479
+ {wxHtmlEasyPrinting_GetPrintData, "wxHtmlEasyPrinting", "getPrintData", 1}, // 2480
+ {wxHtmlEasyPrinting_GetPageSetupData, "wxHtmlEasyPrinting", "getPageSetupData", 1}, // 2481
+ {wxHtmlEasyPrinting_PreviewFile, "wxHtmlEasyPrinting", "previewFile", 2}, // 2482
+ {wxHtmlEasyPrinting_PreviewText, "wxHtmlEasyPrinting", "previewText", 3}, // 2483
+ {wxHtmlEasyPrinting_PrintFile, "wxHtmlEasyPrinting", "printFile", 2}, // 2484
+ {wxHtmlEasyPrinting_PrintText, "wxHtmlEasyPrinting", "printText", 3}, // 2485
+ {wxHtmlEasyPrinting_PageSetup, "wxHtmlEasyPrinting", "pageSetup", 1}, // 2486
+ {wxHtmlEasyPrinting_SetFonts, "wxHtmlEasyPrinting", "setFonts", 4}, // 2487
+ {wxHtmlEasyPrinting_SetHeader, "wxHtmlEasyPrinting", "setHeader", 3}, // 2488
+ {wxHtmlEasyPrinting_SetFooter, "wxHtmlEasyPrinting", "setFooter", 3}, // 2489
+ {NULL, "wxHtmlEasyPrinting", "'Destroy'", 1}, // 2490 obj destructor wxHtmlEasyPrinting_destroy
#if wxUSE_GLCANVAS
- {wxGLCanvas_new, "wxGLCanvas", "new", 2}, // 2476
+ {wxGLCanvas_new, "wxGLCanvas", "new", 2}, // 2491
#else
- {NULL, "wxGLCanvas", "new", 0}, // 2476
+ {NULL, "wxGLCanvas", "new", 0}, // 2491
#endif // wxUSE_GLCANVAS
#if wxUSE_GLCANVAS
- {wxGLCanvas_SetCurrent, "wxGLCanvas", "setCurrent", 2}, // 2477
+ {wxGLCanvas_SetCurrent, "wxGLCanvas", "setCurrent", 2}, // 2492
#else
- {NULL, "wxGLCanvas", "setCurrent", 0}, // 2477
+ {NULL, "wxGLCanvas", "setCurrent", 0}, // 2492
#endif // wxUSE_GLCANVAS
#if wxUSE_GLCANVAS
- {wxGLCanvas_SwapBuffers, "wxGLCanvas", "swapBuffers", 1}, // 2478
+ {wxGLCanvas_SwapBuffers, "wxGLCanvas", "swapBuffers", 1}, // 2493
#else
- {NULL, "wxGLCanvas", "swapBuffers", 0}, // 2478
+ {NULL, "wxGLCanvas", "swapBuffers", 0}, // 2493
#endif // wxUSE_GLCANVAS
#if wxUSE_GLCANVAS
- {NULL, "wxGLCanvas", "'Destroy'", 1}, // 2479 obj destructor wxGLCanvas_destroy
+ {NULL, "wxGLCanvas", "'Destroy'", 1}, // 2494 obj destructor wxGLCanvas_destroy
#else
- {NULL, "wxGLCanvas", "'Destroy'", 0}, // 2479
+ {NULL, "wxGLCanvas", "'Destroy'", 0}, // 2494
#endif // wxUSE_GLCANVAS
#if wxUSE_GLCANVAS
- {wxGLContext_new, "wxGLContext", "new", 2}, // 2480
+ {wxGLContext_new, "wxGLContext", "new", 2}, // 2495
#else
- {NULL, "wxGLContext", "new", 0}, // 2480
+ {NULL, "wxGLContext", "new", 0}, // 2495
#endif // wxUSE_GLCANVAS
#if wxUSE_GLCANVAS
- {wxGLContext_SetCurrent, "wxGLContext", "setCurrent", 2}, // 2481
+ {wxGLContext_SetCurrent, "wxGLContext", "setCurrent", 2}, // 2496
#else
- {NULL, "wxGLContext", "setCurrent", 0}, // 2481
+ {NULL, "wxGLContext", "setCurrent", 0}, // 2496
#endif // wxUSE_GLCANVAS
#if wxUSE_GLCANVAS
- {NULL, "wxGLContext", "'Destroy'", 1}, // 2482 obj destructor wxGLContext_destroy
+ {NULL, "wxGLContext", "'Destroy'", 1}, // 2497 obj destructor wxGLContext_destroy
#else
- {NULL, "wxGLContext", "'Destroy'", 0}, // 2482
+ {NULL, "wxGLContext", "'Destroy'", 0}, // 2497
#endif // wxUSE_GLCANVAS
#if wxUSE_AUI
- {wxAuiManager_new, "wxAuiManager", "new", 1}, // 2483
+ {wxAuiManager_new, "wxAuiManager", "new", 1}, // 2498
#else
- {NULL, "wxAuiManager", "new", 0}, // 2483
+ {NULL, "wxAuiManager", "new", 0}, // 2498
#endif // wxUSE_AUI
#if wxUSE_AUI
- {NULL, "wxAuiManager", "destroy", 1}, // 2484 obj destructor wxAuiManager_destruct
+ {NULL, "wxAuiManager", "destroy", 1}, // 2499 obj destructor wxAuiManager_destruct
#else
- {NULL, "wxAuiManager", "destroy", 0}, // 2484
+ {NULL, "wxAuiManager", "destroy", 0}, // 2499
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_AddPane_2_1, "wxAuiManager", "addPane", 3}, // 2485
+ {wxAuiManager_AddPane_2_1, "wxAuiManager", "addPane", 3}, // 2500
#else
- {NULL, "wxAuiManager", "addPane", 0}, // 2485
+ {NULL, "wxAuiManager", "addPane", 0}, // 2500
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_AddPane_2_0, "wxAuiManager", "addPane", 3}, // 2486
+ {wxAuiManager_AddPane_2_0, "wxAuiManager", "addPane", 3}, // 2501
#else
- {NULL, "wxAuiManager", "addPane", 0}, // 2486
+ {NULL, "wxAuiManager", "addPane", 0}, // 2501
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_AddPane_3, "wxAuiManager", "addPane", 4}, // 2487
+ {wxAuiManager_AddPane_3, "wxAuiManager", "addPane", 4}, // 2502
#else
- {NULL, "wxAuiManager", "addPane", 0}, // 2487
+ {NULL, "wxAuiManager", "addPane", 0}, // 2502
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_DetachPane, "wxAuiManager", "detachPane", 2}, // 2488
+ {wxAuiManager_DetachPane, "wxAuiManager", "detachPane", 2}, // 2503
#else
- {NULL, "wxAuiManager", "detachPane", 0}, // 2488
+ {NULL, "wxAuiManager", "detachPane", 0}, // 2503
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_GetAllPanes, "wxAuiManager", "getAllPanes", 1}, // 2489
+ {wxAuiManager_GetAllPanes, "wxAuiManager", "getAllPanes", 1}, // 2504
#else
- {NULL, "wxAuiManager", "getAllPanes", 0}, // 2489
+ {NULL, "wxAuiManager", "getAllPanes", 0}, // 2504
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_GetArtProvider, "wxAuiManager", "getArtProvider", 1}, // 2490
+ {wxAuiManager_GetArtProvider, "wxAuiManager", "getArtProvider", 1}, // 2505
#else
- {NULL, "wxAuiManager", "getArtProvider", 0}, // 2490
+ {NULL, "wxAuiManager", "getArtProvider", 0}, // 2505
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_GetDockSizeConstraint, "wxAuiManager", "getDockSizeConstraint", 1}, // 2491
+ {wxAuiManager_GetDockSizeConstraint, "wxAuiManager", "getDockSizeConstraint", 1}, // 2506
#else
- {NULL, "wxAuiManager", "getDockSizeConstraint", 0}, // 2491
+ {NULL, "wxAuiManager", "getDockSizeConstraint", 0}, // 2506
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_GetFlags, "wxAuiManager", "getFlags", 1}, // 2492
+ {wxAuiManager_GetFlags, "wxAuiManager", "getFlags", 1}, // 2507
#else
- {NULL, "wxAuiManager", "getFlags", 0}, // 2492
+ {NULL, "wxAuiManager", "getFlags", 0}, // 2507
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_GetManagedWindow, "wxAuiManager", "getManagedWindow", 1}, // 2493
+ {wxAuiManager_GetManagedWindow, "wxAuiManager", "getManagedWindow", 1}, // 2508
#else
- {NULL, "wxAuiManager", "getManagedWindow", 0}, // 2493
+ {NULL, "wxAuiManager", "getManagedWindow", 0}, // 2508
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_GetManager, "wxAuiManager", "getManager", 1}, // 2494
+ {wxAuiManager_GetManager, "wxAuiManager", "getManager", 1}, // 2509
#else
- {NULL, "wxAuiManager", "getManager", 0}, // 2494
+ {NULL, "wxAuiManager", "getManager", 0}, // 2509
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_GetPane_1_1, "wxAuiManager", "getPane", 2}, // 2495
+ {wxAuiManager_GetPane_1_1, "wxAuiManager", "getPane", 2}, // 2510
#else
- {NULL, "wxAuiManager", "getPane", 0}, // 2495
+ {NULL, "wxAuiManager", "getPane", 0}, // 2510
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_GetPane_1_0, "wxAuiManager", "getPane", 2}, // 2496
+ {wxAuiManager_GetPane_1_0, "wxAuiManager", "getPane", 2}, // 2511
#else
- {NULL, "wxAuiManager", "getPane", 0}, // 2496
+ {NULL, "wxAuiManager", "getPane", 0}, // 2511
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_HideHint, "wxAuiManager", "hideHint", 1}, // 2497
+ {wxAuiManager_HideHint, "wxAuiManager", "hideHint", 1}, // 2512
#else
- {NULL, "wxAuiManager", "hideHint", 0}, // 2497
+ {NULL, "wxAuiManager", "hideHint", 0}, // 2512
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_InsertPane, "wxAuiManager", "insertPane", 4}, // 2498
+ {wxAuiManager_InsertPane, "wxAuiManager", "insertPane", 4}, // 2513
#else
- {NULL, "wxAuiManager", "insertPane", 0}, // 2498
+ {NULL, "wxAuiManager", "insertPane", 0}, // 2513
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_LoadPaneInfo, "wxAuiManager", "loadPaneInfo", 3}, // 2499
+ {wxAuiManager_LoadPaneInfo, "wxAuiManager", "loadPaneInfo", 3}, // 2514
#else
- {NULL, "wxAuiManager", "loadPaneInfo", 0}, // 2499
+ {NULL, "wxAuiManager", "loadPaneInfo", 0}, // 2514
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_LoadPerspective, "wxAuiManager", "loadPerspective", 3}, // 2500
+ {wxAuiManager_LoadPerspective, "wxAuiManager", "loadPerspective", 3}, // 2515
#else
- {NULL, "wxAuiManager", "loadPerspective", 0}, // 2500
+ {NULL, "wxAuiManager", "loadPerspective", 0}, // 2515
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_SavePaneInfo, "wxAuiManager", "savePaneInfo", 2}, // 2501
+ {wxAuiManager_SavePaneInfo, "wxAuiManager", "savePaneInfo", 2}, // 2516
#else
- {NULL, "wxAuiManager", "savePaneInfo", 0}, // 2501
+ {NULL, "wxAuiManager", "savePaneInfo", 0}, // 2516
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_SavePerspective, "wxAuiManager", "savePerspective", 1}, // 2502
+ {wxAuiManager_SavePerspective, "wxAuiManager", "savePerspective", 1}, // 2517
#else
- {NULL, "wxAuiManager", "savePerspective", 0}, // 2502
+ {NULL, "wxAuiManager", "savePerspective", 0}, // 2517
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_SetArtProvider, "wxAuiManager", "setArtProvider", 2}, // 2503
+ {wxAuiManager_SetArtProvider, "wxAuiManager", "setArtProvider", 2}, // 2518
#else
- {NULL, "wxAuiManager", "setArtProvider", 0}, // 2503
+ {NULL, "wxAuiManager", "setArtProvider", 0}, // 2518
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_SetDockSizeConstraint, "wxAuiManager", "setDockSizeConstraint", 3}, // 2504
+ {wxAuiManager_SetDockSizeConstraint, "wxAuiManager", "setDockSizeConstraint", 3}, // 2519
#else
- {NULL, "wxAuiManager", "setDockSizeConstraint", 0}, // 2504
+ {NULL, "wxAuiManager", "setDockSizeConstraint", 0}, // 2519
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_SetFlags, "wxAuiManager", "setFlags", 2}, // 2505
+ {wxAuiManager_SetFlags, "wxAuiManager", "setFlags", 2}, // 2520
#else
- {NULL, "wxAuiManager", "setFlags", 0}, // 2505
+ {NULL, "wxAuiManager", "setFlags", 0}, // 2520
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_SetManagedWindow, "wxAuiManager", "setManagedWindow", 2}, // 2506
+ {wxAuiManager_SetManagedWindow, "wxAuiManager", "setManagedWindow", 2}, // 2521
#else
- {NULL, "wxAuiManager", "setManagedWindow", 0}, // 2506
+ {NULL, "wxAuiManager", "setManagedWindow", 0}, // 2521
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_ShowHint, "wxAuiManager", "showHint", 2}, // 2507
+ {wxAuiManager_ShowHint, "wxAuiManager", "showHint", 2}, // 2522
#else
- {NULL, "wxAuiManager", "showHint", 0}, // 2507
+ {NULL, "wxAuiManager", "showHint", 0}, // 2522
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_UnInit, "wxAuiManager", "unInit", 1}, // 2508
+ {wxAuiManager_UnInit, "wxAuiManager", "unInit", 1}, // 2523
#else
- {NULL, "wxAuiManager", "unInit", 0}, // 2508
+ {NULL, "wxAuiManager", "unInit", 0}, // 2523
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiManager_Update, "wxAuiManager", "update", 1}, // 2509
+ {wxAuiManager_Update, "wxAuiManager", "update", 1}, // 2524
#else
- {NULL, "wxAuiManager", "update", 0}, // 2509
+ {NULL, "wxAuiManager", "update", 0}, // 2524
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_new_0, "wxAuiPaneInfo", "new", 0}, // 2510
+ {wxAuiPaneInfo_new_0, "wxAuiPaneInfo", "new", 0}, // 2525
#else
- {NULL, "wxAuiPaneInfo", "new", 0}, // 2510
+ {NULL, "wxAuiPaneInfo", "new", 0}, // 2525
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_new_1, "wxAuiPaneInfo", "new", 1}, // 2511
+ {wxAuiPaneInfo_new_1, "wxAuiPaneInfo", "new", 1}, // 2526
#else
- {NULL, "wxAuiPaneInfo", "new", 0}, // 2511
+ {NULL, "wxAuiPaneInfo", "new", 0}, // 2526
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_BestSize_1, "wxAuiPaneInfo", "bestSize", 2}, // 2512
+ {wxAuiPaneInfo_BestSize_1, "wxAuiPaneInfo", "bestSize", 2}, // 2527
#else
- {NULL, "wxAuiPaneInfo", "bestSize", 0}, // 2512
+ {NULL, "wxAuiPaneInfo", "bestSize", 0}, // 2527
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_BestSize_2, "wxAuiPaneInfo", "bestSize", 3}, // 2513
+ {wxAuiPaneInfo_BestSize_2, "wxAuiPaneInfo", "bestSize", 3}, // 2528
#else
- {NULL, "wxAuiPaneInfo", "bestSize", 0}, // 2513
+ {NULL, "wxAuiPaneInfo", "bestSize", 0}, // 2528
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Bottom, "wxAuiPaneInfo", "bottom", 1}, // 2514
+ {wxAuiPaneInfo_Bottom, "wxAuiPaneInfo", "bottom", 1}, // 2529
#else
- {NULL, "wxAuiPaneInfo", "bottom", 0}, // 2514
+ {NULL, "wxAuiPaneInfo", "bottom", 0}, // 2529
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_BottomDockable, "wxAuiPaneInfo", "bottomDockable", 2}, // 2515
+ {wxAuiPaneInfo_BottomDockable, "wxAuiPaneInfo", "bottomDockable", 2}, // 2530
#else
- {NULL, "wxAuiPaneInfo", "bottomDockable", 0}, // 2515
+ {NULL, "wxAuiPaneInfo", "bottomDockable", 0}, // 2530
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Caption, "wxAuiPaneInfo", "caption", 2}, // 2516
+ {wxAuiPaneInfo_Caption, "wxAuiPaneInfo", "caption", 2}, // 2531
#else
- {NULL, "wxAuiPaneInfo", "caption", 0}, // 2516
+ {NULL, "wxAuiPaneInfo", "caption", 0}, // 2531
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_CaptionVisible, "wxAuiPaneInfo", "captionVisible", 2}, // 2517
+ {wxAuiPaneInfo_CaptionVisible, "wxAuiPaneInfo", "captionVisible", 2}, // 2532
#else
- {NULL, "wxAuiPaneInfo", "captionVisible", 0}, // 2517
+ {NULL, "wxAuiPaneInfo", "captionVisible", 0}, // 2532
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Centre, "wxAuiPaneInfo", "centre", 1}, // 2518
+ {wxAuiPaneInfo_Centre, "wxAuiPaneInfo", "centre", 1}, // 2533
#else
- {NULL, "wxAuiPaneInfo", "centre", 0}, // 2518
+ {NULL, "wxAuiPaneInfo", "centre", 0}, // 2533
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_CentrePane, "wxAuiPaneInfo", "centrePane", 1}, // 2519
+ {wxAuiPaneInfo_CentrePane, "wxAuiPaneInfo", "centrePane", 1}, // 2534
#else
- {NULL, "wxAuiPaneInfo", "centrePane", 0}, // 2519
+ {NULL, "wxAuiPaneInfo", "centrePane", 0}, // 2534
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_CloseButton, "wxAuiPaneInfo", "closeButton", 2}, // 2520
+ {wxAuiPaneInfo_CloseButton, "wxAuiPaneInfo", "closeButton", 2}, // 2535
#else
- {NULL, "wxAuiPaneInfo", "closeButton", 0}, // 2520
+ {NULL, "wxAuiPaneInfo", "closeButton", 0}, // 2535
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_DefaultPane, "wxAuiPaneInfo", "defaultPane", 1}, // 2521
+ {wxAuiPaneInfo_DefaultPane, "wxAuiPaneInfo", "defaultPane", 1}, // 2536
#else
- {NULL, "wxAuiPaneInfo", "defaultPane", 0}, // 2521
+ {NULL, "wxAuiPaneInfo", "defaultPane", 0}, // 2536
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_DestroyOnClose, "wxAuiPaneInfo", "destroyOnClose", 2}, // 2522
+ {wxAuiPaneInfo_DestroyOnClose, "wxAuiPaneInfo", "destroyOnClose", 2}, // 2537
#else
- {NULL, "wxAuiPaneInfo", "destroyOnClose", 0}, // 2522
+ {NULL, "wxAuiPaneInfo", "destroyOnClose", 0}, // 2537
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Direction, "wxAuiPaneInfo", "direction", 2}, // 2523
+ {wxAuiPaneInfo_Direction, "wxAuiPaneInfo", "direction", 2}, // 2538
#else
- {NULL, "wxAuiPaneInfo", "direction", 0}, // 2523
+ {NULL, "wxAuiPaneInfo", "direction", 0}, // 2538
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Dock, "wxAuiPaneInfo", "dock", 1}, // 2524
+ {wxAuiPaneInfo_Dock, "wxAuiPaneInfo", "dock", 1}, // 2539
#else
- {NULL, "wxAuiPaneInfo", "dock", 0}, // 2524
+ {NULL, "wxAuiPaneInfo", "dock", 0}, // 2539
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Dockable, "wxAuiPaneInfo", "dockable", 2}, // 2525
+ {wxAuiPaneInfo_Dockable, "wxAuiPaneInfo", "dockable", 2}, // 2540
#else
- {NULL, "wxAuiPaneInfo", "dockable", 0}, // 2525
+ {NULL, "wxAuiPaneInfo", "dockable", 0}, // 2540
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Fixed, "wxAuiPaneInfo", "fixed", 1}, // 2526
+ {wxAuiPaneInfo_Fixed, "wxAuiPaneInfo", "fixed", 1}, // 2541
#else
- {NULL, "wxAuiPaneInfo", "fixed", 0}, // 2526
+ {NULL, "wxAuiPaneInfo", "fixed", 0}, // 2541
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Float, "wxAuiPaneInfo", "float", 1}, // 2527
+ {wxAuiPaneInfo_Float, "wxAuiPaneInfo", "float", 1}, // 2542
#else
- {NULL, "wxAuiPaneInfo", "float", 0}, // 2527
+ {NULL, "wxAuiPaneInfo", "float", 0}, // 2542
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Floatable, "wxAuiPaneInfo", "floatable", 2}, // 2528
+ {wxAuiPaneInfo_Floatable, "wxAuiPaneInfo", "floatable", 2}, // 2543
#else
- {NULL, "wxAuiPaneInfo", "floatable", 0}, // 2528
+ {NULL, "wxAuiPaneInfo", "floatable", 0}, // 2543
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_FloatingPosition_1, "wxAuiPaneInfo", "floatingPosition", 2}, // 2529
+ {wxAuiPaneInfo_FloatingPosition_1, "wxAuiPaneInfo", "floatingPosition", 2}, // 2544
#else
- {NULL, "wxAuiPaneInfo", "floatingPosition", 0}, // 2529
+ {NULL, "wxAuiPaneInfo", "floatingPosition", 0}, // 2544
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_FloatingPosition_2, "wxAuiPaneInfo", "floatingPosition", 3}, // 2530
+ {wxAuiPaneInfo_FloatingPosition_2, "wxAuiPaneInfo", "floatingPosition", 3}, // 2545
#else
- {NULL, "wxAuiPaneInfo", "floatingPosition", 0}, // 2530
+ {NULL, "wxAuiPaneInfo", "floatingPosition", 0}, // 2545
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_FloatingSize_1, "wxAuiPaneInfo", "floatingSize", 2}, // 2531
+ {wxAuiPaneInfo_FloatingSize_1, "wxAuiPaneInfo", "floatingSize", 2}, // 2546
#else
- {NULL, "wxAuiPaneInfo", "floatingSize", 0}, // 2531
+ {NULL, "wxAuiPaneInfo", "floatingSize", 0}, // 2546
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_FloatingSize_2, "wxAuiPaneInfo", "floatingSize", 3}, // 2532
+ {wxAuiPaneInfo_FloatingSize_2, "wxAuiPaneInfo", "floatingSize", 3}, // 2547
#else
- {NULL, "wxAuiPaneInfo", "floatingSize", 0}, // 2532
+ {NULL, "wxAuiPaneInfo", "floatingSize", 0}, // 2547
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Gripper, "wxAuiPaneInfo", "gripper", 2}, // 2533
+ {wxAuiPaneInfo_Gripper, "wxAuiPaneInfo", "gripper", 2}, // 2548
#else
- {NULL, "wxAuiPaneInfo", "gripper", 0}, // 2533
+ {NULL, "wxAuiPaneInfo", "gripper", 0}, // 2548
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_GripperTop, "wxAuiPaneInfo", "gripperTop", 2}, // 2534
+ {wxAuiPaneInfo_GripperTop, "wxAuiPaneInfo", "gripperTop", 2}, // 2549
#else
- {NULL, "wxAuiPaneInfo", "gripperTop", 0}, // 2534
+ {NULL, "wxAuiPaneInfo", "gripperTop", 0}, // 2549
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_HasBorder, "wxAuiPaneInfo", "hasBorder", 1}, // 2535
+ {wxAuiPaneInfo_HasBorder, "wxAuiPaneInfo", "hasBorder", 1}, // 2550
#else
- {NULL, "wxAuiPaneInfo", "hasBorder", 0}, // 2535
+ {NULL, "wxAuiPaneInfo", "hasBorder", 0}, // 2550
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_HasCaption, "wxAuiPaneInfo", "hasCaption", 1}, // 2536
+ {wxAuiPaneInfo_HasCaption, "wxAuiPaneInfo", "hasCaption", 1}, // 2551
#else
- {NULL, "wxAuiPaneInfo", "hasCaption", 0}, // 2536
+ {NULL, "wxAuiPaneInfo", "hasCaption", 0}, // 2551
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_HasCloseButton, "wxAuiPaneInfo", "hasCloseButton", 1}, // 2537
+ {wxAuiPaneInfo_HasCloseButton, "wxAuiPaneInfo", "hasCloseButton", 1}, // 2552
#else
- {NULL, "wxAuiPaneInfo", "hasCloseButton", 0}, // 2537
+ {NULL, "wxAuiPaneInfo", "hasCloseButton", 0}, // 2552
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_HasFlag, "wxAuiPaneInfo", "hasFlag", 2}, // 2538
+ {wxAuiPaneInfo_HasFlag, "wxAuiPaneInfo", "hasFlag", 2}, // 2553
#else
- {NULL, "wxAuiPaneInfo", "hasFlag", 0}, // 2538
+ {NULL, "wxAuiPaneInfo", "hasFlag", 0}, // 2553
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_HasGripper, "wxAuiPaneInfo", "hasGripper", 1}, // 2539
+ {wxAuiPaneInfo_HasGripper, "wxAuiPaneInfo", "hasGripper", 1}, // 2554
#else
- {NULL, "wxAuiPaneInfo", "hasGripper", 0}, // 2539
+ {NULL, "wxAuiPaneInfo", "hasGripper", 0}, // 2554
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_HasGripperTop, "wxAuiPaneInfo", "hasGripperTop", 1}, // 2540
+ {wxAuiPaneInfo_HasGripperTop, "wxAuiPaneInfo", "hasGripperTop", 1}, // 2555
#else
- {NULL, "wxAuiPaneInfo", "hasGripperTop", 0}, // 2540
+ {NULL, "wxAuiPaneInfo", "hasGripperTop", 0}, // 2555
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_HasMaximizeButton, "wxAuiPaneInfo", "hasMaximizeButton", 1}, // 2541
+ {wxAuiPaneInfo_HasMaximizeButton, "wxAuiPaneInfo", "hasMaximizeButton", 1}, // 2556
#else
- {NULL, "wxAuiPaneInfo", "hasMaximizeButton", 0}, // 2541
+ {NULL, "wxAuiPaneInfo", "hasMaximizeButton", 0}, // 2556
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_HasMinimizeButton, "wxAuiPaneInfo", "hasMinimizeButton", 1}, // 2542
+ {wxAuiPaneInfo_HasMinimizeButton, "wxAuiPaneInfo", "hasMinimizeButton", 1}, // 2557
#else
- {NULL, "wxAuiPaneInfo", "hasMinimizeButton", 0}, // 2542
+ {NULL, "wxAuiPaneInfo", "hasMinimizeButton", 0}, // 2557
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_HasPinButton, "wxAuiPaneInfo", "hasPinButton", 1}, // 2543
+ {wxAuiPaneInfo_HasPinButton, "wxAuiPaneInfo", "hasPinButton", 1}, // 2558
#else
- {NULL, "wxAuiPaneInfo", "hasPinButton", 0}, // 2543
+ {NULL, "wxAuiPaneInfo", "hasPinButton", 0}, // 2558
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Hide, "wxAuiPaneInfo", "hide", 1}, // 2544
+ {wxAuiPaneInfo_Hide, "wxAuiPaneInfo", "hide", 1}, // 2559
#else
- {NULL, "wxAuiPaneInfo", "hide", 0}, // 2544
+ {NULL, "wxAuiPaneInfo", "hide", 0}, // 2559
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_IsBottomDockable, "wxAuiPaneInfo", "isBottomDockable", 1}, // 2545
+ {wxAuiPaneInfo_IsBottomDockable, "wxAuiPaneInfo", "isBottomDockable", 1}, // 2560
#else
- {NULL, "wxAuiPaneInfo", "isBottomDockable", 0}, // 2545
+ {NULL, "wxAuiPaneInfo", "isBottomDockable", 0}, // 2560
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_IsDocked, "wxAuiPaneInfo", "isDocked", 1}, // 2546
+ {wxAuiPaneInfo_IsDocked, "wxAuiPaneInfo", "isDocked", 1}, // 2561
#else
- {NULL, "wxAuiPaneInfo", "isDocked", 0}, // 2546
+ {NULL, "wxAuiPaneInfo", "isDocked", 0}, // 2561
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_IsFixed, "wxAuiPaneInfo", "isFixed", 1}, // 2547
+ {wxAuiPaneInfo_IsFixed, "wxAuiPaneInfo", "isFixed", 1}, // 2562
#else
- {NULL, "wxAuiPaneInfo", "isFixed", 0}, // 2547
+ {NULL, "wxAuiPaneInfo", "isFixed", 0}, // 2562
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_IsFloatable, "wxAuiPaneInfo", "isFloatable", 1}, // 2548
+ {wxAuiPaneInfo_IsFloatable, "wxAuiPaneInfo", "isFloatable", 1}, // 2563
#else
- {NULL, "wxAuiPaneInfo", "isFloatable", 0}, // 2548
+ {NULL, "wxAuiPaneInfo", "isFloatable", 0}, // 2563
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_IsFloating, "wxAuiPaneInfo", "isFloating", 1}, // 2549
+ {wxAuiPaneInfo_IsFloating, "wxAuiPaneInfo", "isFloating", 1}, // 2564
#else
- {NULL, "wxAuiPaneInfo", "isFloating", 0}, // 2549
+ {NULL, "wxAuiPaneInfo", "isFloating", 0}, // 2564
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_IsLeftDockable, "wxAuiPaneInfo", "isLeftDockable", 1}, // 2550
+ {wxAuiPaneInfo_IsLeftDockable, "wxAuiPaneInfo", "isLeftDockable", 1}, // 2565
#else
- {NULL, "wxAuiPaneInfo", "isLeftDockable", 0}, // 2550
+ {NULL, "wxAuiPaneInfo", "isLeftDockable", 0}, // 2565
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_IsMovable, "wxAuiPaneInfo", "isMovable", 1}, // 2551
+ {wxAuiPaneInfo_IsMovable, "wxAuiPaneInfo", "isMovable", 1}, // 2566
#else
- {NULL, "wxAuiPaneInfo", "isMovable", 0}, // 2551
+ {NULL, "wxAuiPaneInfo", "isMovable", 0}, // 2566
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_IsOk, "wxAuiPaneInfo", "isOk", 1}, // 2552
+ {wxAuiPaneInfo_IsOk, "wxAuiPaneInfo", "isOk", 1}, // 2567
#else
- {NULL, "wxAuiPaneInfo", "isOk", 0}, // 2552
+ {NULL, "wxAuiPaneInfo", "isOk", 0}, // 2567
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_IsResizable, "wxAuiPaneInfo", "isResizable", 1}, // 2553
+ {wxAuiPaneInfo_IsResizable, "wxAuiPaneInfo", "isResizable", 1}, // 2568
#else
- {NULL, "wxAuiPaneInfo", "isResizable", 0}, // 2553
+ {NULL, "wxAuiPaneInfo", "isResizable", 0}, // 2568
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_IsRightDockable, "wxAuiPaneInfo", "isRightDockable", 1}, // 2554
+ {wxAuiPaneInfo_IsRightDockable, "wxAuiPaneInfo", "isRightDockable", 1}, // 2569
#else
- {NULL, "wxAuiPaneInfo", "isRightDockable", 0}, // 2554
+ {NULL, "wxAuiPaneInfo", "isRightDockable", 0}, // 2569
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_IsShown, "wxAuiPaneInfo", "isShown", 1}, // 2555
+ {wxAuiPaneInfo_IsShown, "wxAuiPaneInfo", "isShown", 1}, // 2570
#else
- {NULL, "wxAuiPaneInfo", "isShown", 0}, // 2555
+ {NULL, "wxAuiPaneInfo", "isShown", 0}, // 2570
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_IsToolbar, "wxAuiPaneInfo", "isToolbar", 1}, // 2556
+ {wxAuiPaneInfo_IsToolbar, "wxAuiPaneInfo", "isToolbar", 1}, // 2571
#else
- {NULL, "wxAuiPaneInfo", "isToolbar", 0}, // 2556
+ {NULL, "wxAuiPaneInfo", "isToolbar", 0}, // 2571
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_IsTopDockable, "wxAuiPaneInfo", "isTopDockable", 1}, // 2557
+ {wxAuiPaneInfo_IsTopDockable, "wxAuiPaneInfo", "isTopDockable", 1}, // 2572
#else
- {NULL, "wxAuiPaneInfo", "isTopDockable", 0}, // 2557
+ {NULL, "wxAuiPaneInfo", "isTopDockable", 0}, // 2572
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Layer, "wxAuiPaneInfo", "layer", 2}, // 2558
+ {wxAuiPaneInfo_Layer, "wxAuiPaneInfo", "layer", 2}, // 2573
#else
- {NULL, "wxAuiPaneInfo", "layer", 0}, // 2558
+ {NULL, "wxAuiPaneInfo", "layer", 0}, // 2573
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Left, "wxAuiPaneInfo", "left", 1}, // 2559
+ {wxAuiPaneInfo_Left, "wxAuiPaneInfo", "left", 1}, // 2574
#else
- {NULL, "wxAuiPaneInfo", "left", 0}, // 2559
+ {NULL, "wxAuiPaneInfo", "left", 0}, // 2574
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_LeftDockable, "wxAuiPaneInfo", "leftDockable", 2}, // 2560
+ {wxAuiPaneInfo_LeftDockable, "wxAuiPaneInfo", "leftDockable", 2}, // 2575
#else
- {NULL, "wxAuiPaneInfo", "leftDockable", 0}, // 2560
+ {NULL, "wxAuiPaneInfo", "leftDockable", 0}, // 2575
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_MaxSize_1, "wxAuiPaneInfo", "maxSize", 2}, // 2561
+ {wxAuiPaneInfo_MaxSize_1, "wxAuiPaneInfo", "maxSize", 2}, // 2576
#else
- {NULL, "wxAuiPaneInfo", "maxSize", 0}, // 2561
+ {NULL, "wxAuiPaneInfo", "maxSize", 0}, // 2576
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_MaxSize_2, "wxAuiPaneInfo", "maxSize", 3}, // 2562
+ {wxAuiPaneInfo_MaxSize_2, "wxAuiPaneInfo", "maxSize", 3}, // 2577
#else
- {NULL, "wxAuiPaneInfo", "maxSize", 0}, // 2562
+ {NULL, "wxAuiPaneInfo", "maxSize", 0}, // 2577
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_MaximizeButton, "wxAuiPaneInfo", "maximizeButton", 2}, // 2563
+ {wxAuiPaneInfo_MaximizeButton, "wxAuiPaneInfo", "maximizeButton", 2}, // 2578
#else
- {NULL, "wxAuiPaneInfo", "maximizeButton", 0}, // 2563
+ {NULL, "wxAuiPaneInfo", "maximizeButton", 0}, // 2578
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_MinSize_1, "wxAuiPaneInfo", "minSize", 2}, // 2564
+ {wxAuiPaneInfo_MinSize_1, "wxAuiPaneInfo", "minSize", 2}, // 2579
#else
- {NULL, "wxAuiPaneInfo", "minSize", 0}, // 2564
+ {NULL, "wxAuiPaneInfo", "minSize", 0}, // 2579
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_MinSize_2, "wxAuiPaneInfo", "minSize", 3}, // 2565
+ {wxAuiPaneInfo_MinSize_2, "wxAuiPaneInfo", "minSize", 3}, // 2580
#else
- {NULL, "wxAuiPaneInfo", "minSize", 0}, // 2565
+ {NULL, "wxAuiPaneInfo", "minSize", 0}, // 2580
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_MinimizeButton, "wxAuiPaneInfo", "minimizeButton", 2}, // 2566
+ {wxAuiPaneInfo_MinimizeButton, "wxAuiPaneInfo", "minimizeButton", 2}, // 2581
#else
- {NULL, "wxAuiPaneInfo", "minimizeButton", 0}, // 2566
+ {NULL, "wxAuiPaneInfo", "minimizeButton", 0}, // 2581
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Movable, "wxAuiPaneInfo", "movable", 2}, // 2567
+ {wxAuiPaneInfo_Movable, "wxAuiPaneInfo", "movable", 2}, // 2582
#else
- {NULL, "wxAuiPaneInfo", "movable", 0}, // 2567
+ {NULL, "wxAuiPaneInfo", "movable", 0}, // 2582
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Name, "wxAuiPaneInfo", "name", 2}, // 2568
+ {wxAuiPaneInfo_Name, "wxAuiPaneInfo", "name", 2}, // 2583
#else
- {NULL, "wxAuiPaneInfo", "name", 0}, // 2568
+ {NULL, "wxAuiPaneInfo", "name", 0}, // 2583
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_PaneBorder, "wxAuiPaneInfo", "paneBorder", 2}, // 2569
+ {wxAuiPaneInfo_PaneBorder, "wxAuiPaneInfo", "paneBorder", 2}, // 2584
#else
- {NULL, "wxAuiPaneInfo", "paneBorder", 0}, // 2569
+ {NULL, "wxAuiPaneInfo", "paneBorder", 0}, // 2584
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_PinButton, "wxAuiPaneInfo", "pinButton", 2}, // 2570
+ {wxAuiPaneInfo_PinButton, "wxAuiPaneInfo", "pinButton", 2}, // 2585
#else
- {NULL, "wxAuiPaneInfo", "pinButton", 0}, // 2570
+ {NULL, "wxAuiPaneInfo", "pinButton", 0}, // 2585
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Position, "wxAuiPaneInfo", "position", 2}, // 2571
+ {wxAuiPaneInfo_Position, "wxAuiPaneInfo", "position", 2}, // 2586
#else
- {NULL, "wxAuiPaneInfo", "position", 0}, // 2571
+ {NULL, "wxAuiPaneInfo", "position", 0}, // 2586
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Resizable, "wxAuiPaneInfo", "resizable", 2}, // 2572
+ {wxAuiPaneInfo_Resizable, "wxAuiPaneInfo", "resizable", 2}, // 2587
#else
- {NULL, "wxAuiPaneInfo", "resizable", 0}, // 2572
+ {NULL, "wxAuiPaneInfo", "resizable", 0}, // 2587
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Right, "wxAuiPaneInfo", "right", 1}, // 2573
+ {wxAuiPaneInfo_Right, "wxAuiPaneInfo", "right", 1}, // 2588
#else
- {NULL, "wxAuiPaneInfo", "right", 0}, // 2573
+ {NULL, "wxAuiPaneInfo", "right", 0}, // 2588
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_RightDockable, "wxAuiPaneInfo", "rightDockable", 2}, // 2574
+ {wxAuiPaneInfo_RightDockable, "wxAuiPaneInfo", "rightDockable", 2}, // 2589
#else
- {NULL, "wxAuiPaneInfo", "rightDockable", 0}, // 2574
+ {NULL, "wxAuiPaneInfo", "rightDockable", 0}, // 2589
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Row, "wxAuiPaneInfo", "row", 2}, // 2575
+ {wxAuiPaneInfo_Row, "wxAuiPaneInfo", "row", 2}, // 2590
#else
- {NULL, "wxAuiPaneInfo", "row", 0}, // 2575
+ {NULL, "wxAuiPaneInfo", "row", 0}, // 2590
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_SafeSet, "wxAuiPaneInfo", "safeSet", 2}, // 2576
+ {wxAuiPaneInfo_SafeSet, "wxAuiPaneInfo", "safeSet", 2}, // 2591
#else
- {NULL, "wxAuiPaneInfo", "safeSet", 0}, // 2576
+ {NULL, "wxAuiPaneInfo", "safeSet", 0}, // 2591
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_SetFlag, "wxAuiPaneInfo", "setFlag", 3}, // 2577
+ {wxAuiPaneInfo_SetFlag, "wxAuiPaneInfo", "setFlag", 3}, // 2592
#else
- {NULL, "wxAuiPaneInfo", "setFlag", 0}, // 2577
+ {NULL, "wxAuiPaneInfo", "setFlag", 0}, // 2592
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Show, "wxAuiPaneInfo", "show", 2}, // 2578
+ {wxAuiPaneInfo_Show, "wxAuiPaneInfo", "show", 2}, // 2593
#else
- {NULL, "wxAuiPaneInfo", "show", 0}, // 2578
+ {NULL, "wxAuiPaneInfo", "show", 0}, // 2593
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_ToolbarPane, "wxAuiPaneInfo", "toolbarPane", 1}, // 2579
+ {wxAuiPaneInfo_ToolbarPane, "wxAuiPaneInfo", "toolbarPane", 1}, // 2594
#else
- {NULL, "wxAuiPaneInfo", "toolbarPane", 0}, // 2579
+ {NULL, "wxAuiPaneInfo", "toolbarPane", 0}, // 2594
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Top, "wxAuiPaneInfo", "top", 1}, // 2580
+ {wxAuiPaneInfo_Top, "wxAuiPaneInfo", "top", 1}, // 2595
#else
- {NULL, "wxAuiPaneInfo", "top", 0}, // 2580
+ {NULL, "wxAuiPaneInfo", "top", 0}, // 2595
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_TopDockable, "wxAuiPaneInfo", "topDockable", 2}, // 2581
+ {wxAuiPaneInfo_TopDockable, "wxAuiPaneInfo", "topDockable", 2}, // 2596
#else
- {NULL, "wxAuiPaneInfo", "topDockable", 0}, // 2581
+ {NULL, "wxAuiPaneInfo", "topDockable", 0}, // 2596
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_Window, "wxAuiPaneInfo", "window", 2}, // 2582
+ {wxAuiPaneInfo_Window, "wxAuiPaneInfo", "window", 2}, // 2597
#else
- {NULL, "wxAuiPaneInfo", "window", 0}, // 2582
+ {NULL, "wxAuiPaneInfo", "window", 0}, // 2597
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_GetWindow, "wxAuiPaneInfo", "getWindow", 1}, // 2583
+ {wxAuiPaneInfo_GetWindow, "wxAuiPaneInfo", "getWindow", 1}, // 2598
#else
- {NULL, "wxAuiPaneInfo", "getWindow", 0}, // 2583
+ {NULL, "wxAuiPaneInfo", "getWindow", 0}, // 2598
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_GetFrame, "wxAuiPaneInfo", "getFrame", 1}, // 2584
+ {wxAuiPaneInfo_GetFrame, "wxAuiPaneInfo", "getFrame", 1}, // 2599
#else
- {NULL, "wxAuiPaneInfo", "getFrame", 0}, // 2584
+ {NULL, "wxAuiPaneInfo", "getFrame", 0}, // 2599
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_GetDirection, "wxAuiPaneInfo", "getDirection", 1}, // 2585
+ {wxAuiPaneInfo_GetDirection, "wxAuiPaneInfo", "getDirection", 1}, // 2600
#else
- {NULL, "wxAuiPaneInfo", "getDirection", 0}, // 2585
+ {NULL, "wxAuiPaneInfo", "getDirection", 0}, // 2600
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_GetLayer, "wxAuiPaneInfo", "getLayer", 1}, // 2586
+ {wxAuiPaneInfo_GetLayer, "wxAuiPaneInfo", "getLayer", 1}, // 2601
#else
- {NULL, "wxAuiPaneInfo", "getLayer", 0}, // 2586
+ {NULL, "wxAuiPaneInfo", "getLayer", 0}, // 2601
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_GetRow, "wxAuiPaneInfo", "getRow", 1}, // 2587
+ {wxAuiPaneInfo_GetRow, "wxAuiPaneInfo", "getRow", 1}, // 2602
#else
- {NULL, "wxAuiPaneInfo", "getRow", 0}, // 2587
+ {NULL, "wxAuiPaneInfo", "getRow", 0}, // 2602
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_GetPosition, "wxAuiPaneInfo", "getPosition", 1}, // 2588
+ {wxAuiPaneInfo_GetPosition, "wxAuiPaneInfo", "getPosition", 1}, // 2603
#else
- {NULL, "wxAuiPaneInfo", "getPosition", 0}, // 2588
+ {NULL, "wxAuiPaneInfo", "getPosition", 0}, // 2603
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_GetFloatingPosition, "wxAuiPaneInfo", "getFloatingPosition", 1}, // 2589
+ {wxAuiPaneInfo_GetFloatingPosition, "wxAuiPaneInfo", "getFloatingPosition", 1}, // 2604
#else
- {NULL, "wxAuiPaneInfo", "getFloatingPosition", 0}, // 2589
+ {NULL, "wxAuiPaneInfo", "getFloatingPosition", 0}, // 2604
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_GetFloatingSize, "wxAuiPaneInfo", "getFloatingSize", 1}, // 2590
+ {wxAuiPaneInfo_GetFloatingSize, "wxAuiPaneInfo", "getFloatingSize", 1}, // 2605
#else
- {NULL, "wxAuiPaneInfo", "getFloatingSize", 0}, // 2590
+ {NULL, "wxAuiPaneInfo", "getFloatingSize", 0}, // 2605
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiPaneInfo_destroy, "wxAuiPaneInfo", "'Destroy'", 1}, // 2591
+ {wxAuiPaneInfo_destroy, "wxAuiPaneInfo", "'Destroy'", 1}, // 2606
#else
- {NULL, "wxAuiPaneInfo", "'Destroy'", 0}, // 2591
+ {NULL, "wxAuiPaneInfo", "'Destroy'", 0}, // 2606
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_new_0, "wxAuiNotebook", "new", 0}, // 2592
+ {wxAuiNotebook_new_0, "wxAuiNotebook", "new", 0}, // 2607
#else
- {NULL, "wxAuiNotebook", "new", 0}, // 2592
+ {NULL, "wxAuiNotebook", "new", 0}, // 2607
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_new_2, "wxAuiNotebook", "new", 2}, // 2593
+ {wxAuiNotebook_new_2, "wxAuiNotebook", "new", 2}, // 2608
#else
- {NULL, "wxAuiNotebook", "new", 0}, // 2593
+ {NULL, "wxAuiNotebook", "new", 0}, // 2608
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_AddPage_3, "wxAuiNotebook", "addPage", 4}, // 2594
+ {wxAuiNotebook_AddPage_3, "wxAuiNotebook", "addPage", 4}, // 2609
#else
- {NULL, "wxAuiNotebook", "addPage", 0}, // 2594
+ {NULL, "wxAuiNotebook", "addPage", 0}, // 2609
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_AddPage_4, "wxAuiNotebook", "addPage", 5}, // 2595
+ {wxAuiNotebook_AddPage_4, "wxAuiNotebook", "addPage", 5}, // 2610
#else
- {NULL, "wxAuiNotebook", "addPage", 0}, // 2595
+ {NULL, "wxAuiNotebook", "addPage", 0}, // 2610
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_Create_2, "wxAuiNotebook", "create", 3}, // 2596
+ {wxAuiNotebook_Create_2, "wxAuiNotebook", "create", 3}, // 2611
#else
- {NULL, "wxAuiNotebook", "create", 0}, // 2596
+ {NULL, "wxAuiNotebook", "create", 0}, // 2611
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_Create_3, "wxAuiNotebook", "create", 4}, // 2597
+ {wxAuiNotebook_Create_3, "wxAuiNotebook", "create", 4}, // 2612
#else
- {NULL, "wxAuiNotebook", "create", 0}, // 2597
+ {NULL, "wxAuiNotebook", "create", 0}, // 2612
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_DeletePage, "wxAuiNotebook", "deletePage", 2}, // 2598
+ {wxAuiNotebook_DeletePage, "wxAuiNotebook", "deletePage", 2}, // 2613
#else
- {NULL, "wxAuiNotebook", "deletePage", 0}, // 2598
+ {NULL, "wxAuiNotebook", "deletePage", 0}, // 2613
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_GetArtProvider, "wxAuiNotebook", "getArtProvider", 1}, // 2599
+ {wxAuiNotebook_GetArtProvider, "wxAuiNotebook", "getArtProvider", 1}, // 2614
#else
- {NULL, "wxAuiNotebook", "getArtProvider", 0}, // 2599
+ {NULL, "wxAuiNotebook", "getArtProvider", 0}, // 2614
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_GetPage, "wxAuiNotebook", "getPage", 2}, // 2600
+ {wxAuiNotebook_GetPage, "wxAuiNotebook", "getPage", 2}, // 2615
#else
- {NULL, "wxAuiNotebook", "getPage", 0}, // 2600
+ {NULL, "wxAuiNotebook", "getPage", 0}, // 2615
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_GetPageBitmap, "wxAuiNotebook", "getPageBitmap", 2}, // 2601
+ {wxAuiNotebook_GetPageBitmap, "wxAuiNotebook", "getPageBitmap", 2}, // 2616
#else
- {NULL, "wxAuiNotebook", "getPageBitmap", 0}, // 2601
+ {NULL, "wxAuiNotebook", "getPageBitmap", 0}, // 2616
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_GetPageCount, "wxAuiNotebook", "getPageCount", 1}, // 2602
+ {wxAuiNotebook_GetPageCount, "wxAuiNotebook", "getPageCount", 1}, // 2617
#else
- {NULL, "wxAuiNotebook", "getPageCount", 0}, // 2602
+ {NULL, "wxAuiNotebook", "getPageCount", 0}, // 2617
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_GetPageIndex, "wxAuiNotebook", "getPageIndex", 2}, // 2603
+ {wxAuiNotebook_GetPageIndex, "wxAuiNotebook", "getPageIndex", 2}, // 2618
#else
- {NULL, "wxAuiNotebook", "getPageIndex", 0}, // 2603
+ {NULL, "wxAuiNotebook", "getPageIndex", 0}, // 2618
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_GetPageText, "wxAuiNotebook", "getPageText", 2}, // 2604
+ {wxAuiNotebook_GetPageText, "wxAuiNotebook", "getPageText", 2}, // 2619
#else
- {NULL, "wxAuiNotebook", "getPageText", 0}, // 2604
+ {NULL, "wxAuiNotebook", "getPageText", 0}, // 2619
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_GetSelection, "wxAuiNotebook", "getSelection", 1}, // 2605
+ {wxAuiNotebook_GetSelection, "wxAuiNotebook", "getSelection", 1}, // 2620
#else
- {NULL, "wxAuiNotebook", "getSelection", 0}, // 2605
+ {NULL, "wxAuiNotebook", "getSelection", 0}, // 2620
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_InsertPage_4, "wxAuiNotebook", "insertPage", 5}, // 2606
+ {wxAuiNotebook_InsertPage_4, "wxAuiNotebook", "insertPage", 5}, // 2621
#else
- {NULL, "wxAuiNotebook", "insertPage", 0}, // 2606
+ {NULL, "wxAuiNotebook", "insertPage", 0}, // 2621
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_InsertPage_5, "wxAuiNotebook", "insertPage", 6}, // 2607
+ {wxAuiNotebook_InsertPage_5, "wxAuiNotebook", "insertPage", 6}, // 2622
#else
- {NULL, "wxAuiNotebook", "insertPage", 0}, // 2607
+ {NULL, "wxAuiNotebook", "insertPage", 0}, // 2622
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_RemovePage, "wxAuiNotebook", "removePage", 2}, // 2608
+ {wxAuiNotebook_RemovePage, "wxAuiNotebook", "removePage", 2}, // 2623
#else
- {NULL, "wxAuiNotebook", "removePage", 0}, // 2608
+ {NULL, "wxAuiNotebook", "removePage", 0}, // 2623
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_SetArtProvider, "wxAuiNotebook", "setArtProvider", 2}, // 2609
+ {wxAuiNotebook_SetArtProvider, "wxAuiNotebook", "setArtProvider", 2}, // 2624
#else
- {NULL, "wxAuiNotebook", "setArtProvider", 0}, // 2609
+ {NULL, "wxAuiNotebook", "setArtProvider", 0}, // 2624
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_SetFont, "wxAuiNotebook", "setFont", 2}, // 2610
+ {wxAuiNotebook_SetFont, "wxAuiNotebook", "setFont", 2}, // 2625
#else
- {NULL, "wxAuiNotebook", "setFont", 0}, // 2610
+ {NULL, "wxAuiNotebook", "setFont", 0}, // 2625
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_SetPageBitmap, "wxAuiNotebook", "setPageBitmap", 3}, // 2611
+ {wxAuiNotebook_SetPageBitmap, "wxAuiNotebook", "setPageBitmap", 3}, // 2626
#else
- {NULL, "wxAuiNotebook", "setPageBitmap", 0}, // 2611
+ {NULL, "wxAuiNotebook", "setPageBitmap", 0}, // 2626
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_SetPageText, "wxAuiNotebook", "setPageText", 3}, // 2612
+ {wxAuiNotebook_SetPageText, "wxAuiNotebook", "setPageText", 3}, // 2627
#else
- {NULL, "wxAuiNotebook", "setPageText", 0}, // 2612
+ {NULL, "wxAuiNotebook", "setPageText", 0}, // 2627
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_SetSelection, "wxAuiNotebook", "setSelection", 2}, // 2613
+ {wxAuiNotebook_SetSelection, "wxAuiNotebook", "setSelection", 2}, // 2628
#else
- {NULL, "wxAuiNotebook", "setSelection", 0}, // 2613
+ {NULL, "wxAuiNotebook", "setSelection", 0}, // 2628
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_SetTabCtrlHeight, "wxAuiNotebook", "setTabCtrlHeight", 2}, // 2614
+ {wxAuiNotebook_SetTabCtrlHeight, "wxAuiNotebook", "setTabCtrlHeight", 2}, // 2629
#else
- {NULL, "wxAuiNotebook", "setTabCtrlHeight", 0}, // 2614
+ {NULL, "wxAuiNotebook", "setTabCtrlHeight", 0}, // 2629
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiNotebook_SetUniformBitmapSize, "wxAuiNotebook", "setUniformBitmapSize", 2}, // 2615
+ {wxAuiNotebook_SetUniformBitmapSize, "wxAuiNotebook", "setUniformBitmapSize", 2}, // 2630
#else
- {NULL, "wxAuiNotebook", "setUniformBitmapSize", 0}, // 2615
+ {NULL, "wxAuiNotebook", "setUniformBitmapSize", 0}, // 2630
#endif // wxUSE_AUI
#if wxUSE_AUI
- {NULL, "wxAuiNotebook", "'Destroy'", 1}, // 2616 obj destructor wxAuiNotebook_destroy
+ {NULL, "wxAuiNotebook", "'Destroy'", 1}, // 2631 obj destructor wxAuiNotebook_destroy
#else
- {NULL, "wxAuiNotebook", "'Destroy'", 0}, // 2616
+ {NULL, "wxAuiNotebook", "'Destroy'", 0}, // 2631
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiTabArt_SetFlags, "wxAuiTabArt", "setFlags", 2}, // 2617
+ {wxAuiTabArt_SetFlags, "wxAuiTabArt", "setFlags", 2}, // 2632
#else
- {NULL, "wxAuiTabArt", "setFlags", 0}, // 2617
+ {NULL, "wxAuiTabArt", "setFlags", 0}, // 2632
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiTabArt_SetMeasuringFont, "wxAuiTabArt", "setMeasuringFont", 2}, // 2618
+ {wxAuiTabArt_SetMeasuringFont, "wxAuiTabArt", "setMeasuringFont", 2}, // 2633
#else
- {NULL, "wxAuiTabArt", "setMeasuringFont", 0}, // 2618
+ {NULL, "wxAuiTabArt", "setMeasuringFont", 0}, // 2633
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiTabArt_SetNormalFont, "wxAuiTabArt", "setNormalFont", 2}, // 2619
+ {wxAuiTabArt_SetNormalFont, "wxAuiTabArt", "setNormalFont", 2}, // 2634
#else
- {NULL, "wxAuiTabArt", "setNormalFont", 0}, // 2619
+ {NULL, "wxAuiTabArt", "setNormalFont", 0}, // 2634
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiTabArt_SetSelectedFont, "wxAuiTabArt", "setSelectedFont", 2}, // 2620
+ {wxAuiTabArt_SetSelectedFont, "wxAuiTabArt", "setSelectedFont", 2}, // 2635
#else
- {NULL, "wxAuiTabArt", "setSelectedFont", 0}, // 2620
+ {NULL, "wxAuiTabArt", "setSelectedFont", 0}, // 2635
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiTabArt_SetColour, "wxAuiTabArt", "setColour", 2}, // 2621
+ {wxAuiTabArt_SetColour, "wxAuiTabArt", "setColour", 2}, // 2636
#else
- {NULL, "wxAuiTabArt", "setColour", 0}, // 2621
+ {NULL, "wxAuiTabArt", "setColour", 0}, // 2636
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiTabArt_SetActiveColour, "wxAuiTabArt", "setActiveColour", 2}, // 2622
+ {wxAuiTabArt_SetActiveColour, "wxAuiTabArt", "setActiveColour", 2}, // 2637
#else
- {NULL, "wxAuiTabArt", "setActiveColour", 0}, // 2622
+ {NULL, "wxAuiTabArt", "setActiveColour", 0}, // 2637
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiDockArt_GetColour, "wxAuiDockArt", "getColour", 2}, // 2623
+ {wxAuiDockArt_GetColour, "wxAuiDockArt", "getColour", 2}, // 2638
#else
- {NULL, "wxAuiDockArt", "getColour", 0}, // 2623
+ {NULL, "wxAuiDockArt", "getColour", 0}, // 2638
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiDockArt_GetFont, "wxAuiDockArt", "getFont", 2}, // 2624
+ {wxAuiDockArt_GetFont, "wxAuiDockArt", "getFont", 2}, // 2639
#else
- {NULL, "wxAuiDockArt", "getFont", 0}, // 2624
+ {NULL, "wxAuiDockArt", "getFont", 0}, // 2639
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiDockArt_GetMetric, "wxAuiDockArt", "getMetric", 2}, // 2625
+ {wxAuiDockArt_GetMetric, "wxAuiDockArt", "getMetric", 2}, // 2640
#else
- {NULL, "wxAuiDockArt", "getMetric", 0}, // 2625
+ {NULL, "wxAuiDockArt", "getMetric", 0}, // 2640
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiDockArt_SetColour, "wxAuiDockArt", "setColour", 3}, // 2626
+ {wxAuiDockArt_SetColour, "wxAuiDockArt", "setColour", 3}, // 2641
#else
- {NULL, "wxAuiDockArt", "setColour", 0}, // 2626
+ {NULL, "wxAuiDockArt", "setColour", 0}, // 2641
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiDockArt_SetFont, "wxAuiDockArt", "setFont", 3}, // 2627
+ {wxAuiDockArt_SetFont, "wxAuiDockArt", "setFont", 3}, // 2642
#else
- {NULL, "wxAuiDockArt", "setFont", 0}, // 2627
+ {NULL, "wxAuiDockArt", "setFont", 0}, // 2642
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiDockArt_SetMetric, "wxAuiDockArt", "setMetric", 3}, // 2628
+ {wxAuiDockArt_SetMetric, "wxAuiDockArt", "setMetric", 3}, // 2643
#else
- {NULL, "wxAuiDockArt", "setMetric", 0}, // 2628
+ {NULL, "wxAuiDockArt", "setMetric", 0}, // 2643
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiSimpleTabArt_new, "wxAuiSimpleTabArt", "new", 0}, // 2629
+ {wxAuiSimpleTabArt_new, "wxAuiSimpleTabArt", "new", 0}, // 2644
#else
- {NULL, "wxAuiSimpleTabArt", "new", 0}, // 2629
+ {NULL, "wxAuiSimpleTabArt", "new", 0}, // 2644
#endif // wxUSE_AUI
#if wxUSE_AUI
- {wxAuiSimpleTabArt_destroy, "wxAuiSimpleTabArt", "'Destroy'", 1}, // 2630
+ {wxAuiSimpleTabArt_destroy, "wxAuiSimpleTabArt", "'Destroy'", 1}, // 2645
#else
- {NULL, "wxAuiSimpleTabArt", "'Destroy'", 0}, // 2630
+ {NULL, "wxAuiSimpleTabArt", "'Destroy'", 0}, // 2645
#endif // wxUSE_AUI
- {wxMDIParentFrame_new_0, "wxMDIParentFrame", "new", 0}, // 2631
- {wxMDIParentFrame_new_4, "wxMDIParentFrame", "new", 4}, // 2632
- {NULL, "wxMDIParentFrame", "destroy", 1}, // 2633 obj destructor wxMDIParentFrame_destruct
- {wxMDIParentFrame_ActivateNext, "wxMDIParentFrame", "activateNext", 1}, // 2634
- {wxMDIParentFrame_ActivatePrevious, "wxMDIParentFrame", "activatePrevious", 1}, // 2635
- {wxMDIParentFrame_ArrangeIcons, "wxMDIParentFrame", "arrangeIcons", 1}, // 2636
- {wxMDIParentFrame_Cascade, "wxMDIParentFrame", "cascade", 1}, // 2637
- {wxMDIParentFrame_Create, "wxMDIParentFrame", "create", 5}, // 2638
- {wxMDIParentFrame_GetActiveChild, "wxMDIParentFrame", "getActiveChild", 1}, // 2639
- {wxMDIParentFrame_GetClientWindow, "wxMDIParentFrame", "getClientWindow", 1}, // 2640
- {wxMDIParentFrame_Tile, "wxMDIParentFrame", "tile", 2}, // 2641
- {wxMDIChildFrame_new_0, "wxMDIChildFrame", "new", 0}, // 2642
- {wxMDIChildFrame_new_4, "wxMDIChildFrame", "new", 4}, // 2643
- {NULL, "wxMDIChildFrame", "destroy", 1}, // 2644 obj destructor wxMDIChildFrame_destruct
- {wxMDIChildFrame_Activate, "wxMDIChildFrame", "activate", 1}, // 2645
- {wxMDIChildFrame_Create, "wxMDIChildFrame", "create", 5}, // 2646
- {wxMDIChildFrame_Maximize, "wxMDIChildFrame", "maximize", 2}, // 2647
- {wxMDIChildFrame_Restore, "wxMDIChildFrame", "restore", 1}, // 2648
- {wxMDIClientWindow_new, "wxMDIClientWindow", "new", 0}, // 2649
- {wxMDIClientWindow_CreateClient, "wxMDIClientWindow", "createClient", 3}, // 2650
- {NULL, "wxMDIClientWindow", "'Destroy'", 1}, // 2651 obj destructor wxMDIClientWindow_destroy
- {wxLayoutAlgorithm_new, "wxLayoutAlgorithm", "new", 0}, // 2652
- {NULL, "wxLayoutAlgorithm", "destroy", 1}, // 2653 obj destructor wxLayoutAlgorithm_destruct
- {wxLayoutAlgorithm_LayoutFrame, "wxLayoutAlgorithm", "layoutFrame", 3}, // 2654
- {wxLayoutAlgorithm_LayoutMDIFrame, "wxLayoutAlgorithm", "layoutMDIFrame", 3}, // 2655
- {wxLayoutAlgorithm_LayoutWindow, "wxLayoutAlgorithm", "layoutWindow", 3}, // 2656
- {wxEvent_GetId, "wxEvent", "getId", 1}, // 2657
- {wxEvent_GetSkipped, "wxEvent", "getSkipped", 1}, // 2658
- {wxEvent_GetTimestamp, "wxEvent", "getTimestamp", 1}, // 2659
- {wxEvent_IsCommandEvent, "wxEvent", "isCommandEvent", 1}, // 2660
- {wxEvent_ResumePropagation, "wxEvent", "resumePropagation", 2}, // 2661
- {wxEvent_ShouldPropagate, "wxEvent", "shouldPropagate", 1}, // 2662
- {wxEvent_Skip, "wxEvent", "skip", 2}, // 2663
- {wxEvent_StopPropagation, "wxEvent", "stopPropagation", 1}, // 2664
- {wxCommandEvent_getClientData, "wxCommandEvent", "getClientData", 1}, // 2665
- {wxCommandEvent_GetExtraLong, "wxCommandEvent", "getExtraLong", 1}, // 2666
- {wxCommandEvent_GetInt, "wxCommandEvent", "getInt", 1}, // 2667
- {wxCommandEvent_GetSelection, "wxCommandEvent", "getSelection", 1}, // 2668
- {wxCommandEvent_GetString, "wxCommandEvent", "getString", 1}, // 2669
- {wxCommandEvent_IsChecked, "wxCommandEvent", "isChecked", 1}, // 2670
- {wxCommandEvent_IsSelection, "wxCommandEvent", "isSelection", 1}, // 2671
- {wxCommandEvent_SetInt, "wxCommandEvent", "setInt", 2}, // 2672
- {wxCommandEvent_SetString, "wxCommandEvent", "setString", 2}, // 2673
- {wxScrollEvent_GetOrientation, "wxScrollEvent", "getOrientation", 1}, // 2674
- {wxScrollEvent_GetPosition, "wxScrollEvent", "getPosition", 1}, // 2675
- {wxScrollWinEvent_GetOrientation, "wxScrollWinEvent", "getOrientation", 1}, // 2676
- {wxScrollWinEvent_GetPosition, "wxScrollWinEvent", "getPosition", 1}, // 2677
- {wxMouseEvent_AltDown, "wxMouseEvent", "altDown", 1}, // 2678
- {wxMouseEvent_Button, "wxMouseEvent", "button", 2}, // 2679
- {wxMouseEvent_ButtonDClick, "wxMouseEvent", "buttonDClick", 2}, // 2680
- {wxMouseEvent_ButtonDown, "wxMouseEvent", "buttonDown", 2}, // 2681
- {wxMouseEvent_ButtonUp, "wxMouseEvent", "buttonUp", 2}, // 2682
- {wxMouseEvent_CmdDown, "wxMouseEvent", "cmdDown", 1}, // 2683
- {wxMouseEvent_ControlDown, "wxMouseEvent", "controlDown", 1}, // 2684
- {wxMouseEvent_Dragging, "wxMouseEvent", "dragging", 1}, // 2685
- {wxMouseEvent_Entering, "wxMouseEvent", "entering", 1}, // 2686
- {wxMouseEvent_GetButton, "wxMouseEvent", "getButton", 1}, // 2687
- {wxMouseEvent_GetPosition, "wxMouseEvent", "getPosition", 1}, // 2688
- {NULL, "", "", 0}, // 2689
- {wxMouseEvent_GetLogicalPosition, "wxMouseEvent", "getLogicalPosition", 2}, // 2690
- {wxMouseEvent_GetLinesPerAction, "wxMouseEvent", "getLinesPerAction", 1}, // 2691
- {wxMouseEvent_GetWheelRotation, "wxMouseEvent", "getWheelRotation", 1}, // 2692
- {wxMouseEvent_GetWheelDelta, "wxMouseEvent", "getWheelDelta", 1}, // 2693
- {wxMouseEvent_GetX, "wxMouseEvent", "getX", 1}, // 2694
- {wxMouseEvent_GetY, "wxMouseEvent", "getY", 1}, // 2695
- {wxMouseEvent_IsButton, "wxMouseEvent", "isButton", 1}, // 2696
- {wxMouseEvent_IsPageScroll, "wxMouseEvent", "isPageScroll", 1}, // 2697
- {wxMouseEvent_Leaving, "wxMouseEvent", "leaving", 1}, // 2698
- {wxMouseEvent_LeftDClick, "wxMouseEvent", "leftDClick", 1}, // 2699
- {wxMouseEvent_LeftDown, "wxMouseEvent", "leftDown", 1}, // 2700
- {wxMouseEvent_LeftIsDown, "wxMouseEvent", "leftIsDown", 1}, // 2701
- {wxMouseEvent_LeftUp, "wxMouseEvent", "leftUp", 1}, // 2702
- {wxMouseEvent_MetaDown, "wxMouseEvent", "metaDown", 1}, // 2703
- {wxMouseEvent_MiddleDClick, "wxMouseEvent", "middleDClick", 1}, // 2704
- {wxMouseEvent_MiddleDown, "wxMouseEvent", "middleDown", 1}, // 2705
- {wxMouseEvent_MiddleIsDown, "wxMouseEvent", "middleIsDown", 1}, // 2706
- {wxMouseEvent_MiddleUp, "wxMouseEvent", "middleUp", 1}, // 2707
- {wxMouseEvent_Moving, "wxMouseEvent", "moving", 1}, // 2708
- {wxMouseEvent_RightDClick, "wxMouseEvent", "rightDClick", 1}, // 2709
- {wxMouseEvent_RightDown, "wxMouseEvent", "rightDown", 1}, // 2710
- {wxMouseEvent_RightIsDown, "wxMouseEvent", "rightIsDown", 1}, // 2711
- {wxMouseEvent_RightUp, "wxMouseEvent", "rightUp", 1}, // 2712
- {wxMouseEvent_ShiftDown, "wxMouseEvent", "shiftDown", 1}, // 2713
- {wxMouseEvent_GetWheelAxis, "wxMouseEvent", "getWheelAxis", 1}, // 2714
- {wxSetCursorEvent_GetCursor, "wxSetCursorEvent", "getCursor", 1}, // 2715
- {wxSetCursorEvent_GetX, "wxSetCursorEvent", "getX", 1}, // 2716
- {wxSetCursorEvent_GetY, "wxSetCursorEvent", "getY", 1}, // 2717
- {wxSetCursorEvent_HasCursor, "wxSetCursorEvent", "hasCursor", 1}, // 2718
- {wxSetCursorEvent_SetCursor, "wxSetCursorEvent", "setCursor", 2}, // 2719
- {wxKeyEvent_AltDown, "wxKeyEvent", "altDown", 1}, // 2720
- {wxKeyEvent_CmdDown, "wxKeyEvent", "cmdDown", 1}, // 2721
- {wxKeyEvent_ControlDown, "wxKeyEvent", "controlDown", 1}, // 2722
- {wxKeyEvent_GetKeyCode, "wxKeyEvent", "getKeyCode", 1}, // 2723
- {wxKeyEvent_GetModifiers, "wxKeyEvent", "getModifiers", 1}, // 2724
- {wxKeyEvent_GetPosition, "wxKeyEvent", "getPosition", 1}, // 2725
- {NULL, "", "", 0}, // 2726
- {wxKeyEvent_GetRawKeyCode, "wxKeyEvent", "getRawKeyCode", 1}, // 2727
- {wxKeyEvent_GetRawKeyFlags, "wxKeyEvent", "getRawKeyFlags", 1}, // 2728
- {wxKeyEvent_GetUnicodeKey, "wxKeyEvent", "getUnicodeKey", 1}, // 2729
- {wxKeyEvent_GetX, "wxKeyEvent", "getX", 1}, // 2730
- {wxKeyEvent_GetY, "wxKeyEvent", "getY", 1}, // 2731
- {wxKeyEvent_HasModifiers, "wxKeyEvent", "hasModifiers", 1}, // 2732
- {wxKeyEvent_MetaDown, "wxKeyEvent", "metaDown", 1}, // 2733
- {wxKeyEvent_ShiftDown, "wxKeyEvent", "shiftDown", 1}, // 2734
- {wxSizeEvent_GetSize, "wxSizeEvent", "getSize", 1}, // 2735
- {wxSizeEvent_GetRect, "wxSizeEvent", "getRect", 1}, // 2736
- {wxMoveEvent_GetPosition, "wxMoveEvent", "getPosition", 1}, // 2737
- {wxMoveEvent_GetRect, "wxMoveEvent", "getRect", 1}, // 2738
- {wxEraseEvent_GetDC, "wxEraseEvent", "getDC", 1}, // 2739
- {wxFocusEvent_GetWindow, "wxFocusEvent", "getWindow", 1}, // 2740
- {wxChildFocusEvent_GetWindow, "wxChildFocusEvent", "getWindow", 1}, // 2741
- {wxMenuEvent_GetMenu, "wxMenuEvent", "getMenu", 1}, // 2742
- {wxMenuEvent_GetMenuId, "wxMenuEvent", "getMenuId", 1}, // 2743
- {wxMenuEvent_IsPopup, "wxMenuEvent", "isPopup", 1}, // 2744
- {wxCloseEvent_CanVeto, "wxCloseEvent", "canVeto", 1}, // 2745
- {wxCloseEvent_GetLoggingOff, "wxCloseEvent", "getLoggingOff", 1}, // 2746
- {wxCloseEvent_SetCanVeto, "wxCloseEvent", "setCanVeto", 2}, // 2747
- {wxCloseEvent_SetLoggingOff, "wxCloseEvent", "setLoggingOff", 2}, // 2748
- {wxCloseEvent_Veto, "wxCloseEvent", "veto", 2}, // 2749
- {wxShowEvent_SetShow, "wxShowEvent", "setShow", 2}, // 2750
- {wxShowEvent_IsShown, "wxShowEvent", "isShown", 1}, // 2751
- {wxIconizeEvent_IsIconized, "wxIconizeEvent", "isIconized", 1}, // 2752
- {wxJoystickEvent_ButtonDown, "wxJoystickEvent", "buttonDown", 2}, // 2753
- {wxJoystickEvent_ButtonIsDown, "wxJoystickEvent", "buttonIsDown", 2}, // 2754
- {wxJoystickEvent_ButtonUp, "wxJoystickEvent", "buttonUp", 2}, // 2755
- {wxJoystickEvent_GetButtonChange, "wxJoystickEvent", "getButtonChange", 1}, // 2756
- {wxJoystickEvent_GetButtonState, "wxJoystickEvent", "getButtonState", 1}, // 2757
- {wxJoystickEvent_GetJoystick, "wxJoystickEvent", "getJoystick", 1}, // 2758
- {wxJoystickEvent_GetPosition, "wxJoystickEvent", "getPosition", 1}, // 2759
- {wxJoystickEvent_GetZPosition, "wxJoystickEvent", "getZPosition", 1}, // 2760
- {wxJoystickEvent_IsButton, "wxJoystickEvent", "isButton", 1}, // 2761
- {wxJoystickEvent_IsMove, "wxJoystickEvent", "isMove", 1}, // 2762
- {wxJoystickEvent_IsZMove, "wxJoystickEvent", "isZMove", 1}, // 2763
- {wxUpdateUIEvent_CanUpdate, "wxUpdateUIEvent", "canUpdate", 1}, // 2764
- {wxUpdateUIEvent_Check, "wxUpdateUIEvent", "check", 2}, // 2765
- {wxUpdateUIEvent_Enable, "wxUpdateUIEvent", "enable", 2}, // 2766
- {wxUpdateUIEvent_Show, "wxUpdateUIEvent", "show", 2}, // 2767
- {wxUpdateUIEvent_GetChecked, "wxUpdateUIEvent", "getChecked", 1}, // 2768
- {wxUpdateUIEvent_GetEnabled, "wxUpdateUIEvent", "getEnabled", 1}, // 2769
- {wxUpdateUIEvent_GetShown, "wxUpdateUIEvent", "getShown", 1}, // 2770
- {wxUpdateUIEvent_GetSetChecked, "wxUpdateUIEvent", "getSetChecked", 1}, // 2771
- {wxUpdateUIEvent_GetSetEnabled, "wxUpdateUIEvent", "getSetEnabled", 1}, // 2772
- {wxUpdateUIEvent_GetSetShown, "wxUpdateUIEvent", "getSetShown", 1}, // 2773
- {wxUpdateUIEvent_GetSetText, "wxUpdateUIEvent", "getSetText", 1}, // 2774
- {wxUpdateUIEvent_GetText, "wxUpdateUIEvent", "getText", 1}, // 2775
- {wxUpdateUIEvent_GetMode, "wxUpdateUIEvent", "getMode", 0}, // 2776
- {wxUpdateUIEvent_GetUpdateInterval, "wxUpdateUIEvent", "getUpdateInterval", 0}, // 2777
- {wxUpdateUIEvent_ResetUpdateTime, "wxUpdateUIEvent", "resetUpdateTime", 0}, // 2778
- {wxUpdateUIEvent_SetMode, "wxUpdateUIEvent", "setMode", 1}, // 2779
- {wxUpdateUIEvent_SetText, "wxUpdateUIEvent", "setText", 2}, // 2780
- {wxUpdateUIEvent_SetUpdateInterval, "wxUpdateUIEvent", "setUpdateInterval", 1}, // 2781
- {wxMouseCaptureChangedEvent_GetCapturedWindow, "wxMouseCaptureChangedEvent", "getCapturedWindow", 1}, // 2782
- {wxPaletteChangedEvent_SetChangedWindow, "wxPaletteChangedEvent", "setChangedWindow", 2}, // 2783
- {wxPaletteChangedEvent_GetChangedWindow, "wxPaletteChangedEvent", "getChangedWindow", 1}, // 2784
- {wxQueryNewPaletteEvent_SetPaletteRealized, "wxQueryNewPaletteEvent", "setPaletteRealized", 2}, // 2785
- {wxQueryNewPaletteEvent_GetPaletteRealized, "wxQueryNewPaletteEvent", "getPaletteRealized", 1}, // 2786
- {wxNavigationKeyEvent_GetDirection, "wxNavigationKeyEvent", "getDirection", 1}, // 2787
- {wxNavigationKeyEvent_SetDirection, "wxNavigationKeyEvent", "setDirection", 2}, // 2788
- {wxNavigationKeyEvent_IsWindowChange, "wxNavigationKeyEvent", "isWindowChange", 1}, // 2789
- {wxNavigationKeyEvent_SetWindowChange, "wxNavigationKeyEvent", "setWindowChange", 2}, // 2790
- {wxNavigationKeyEvent_IsFromTab, "wxNavigationKeyEvent", "isFromTab", 1}, // 2791
- {wxNavigationKeyEvent_SetFromTab, "wxNavigationKeyEvent", "setFromTab", 2}, // 2792
- {wxNavigationKeyEvent_GetCurrentFocus, "wxNavigationKeyEvent", "getCurrentFocus", 1}, // 2793
- {wxNavigationKeyEvent_SetCurrentFocus, "wxNavigationKeyEvent", "setCurrentFocus", 2}, // 2794
- {wxHelpEvent_GetOrigin, "wxHelpEvent", "getOrigin", 1}, // 2795
- {wxHelpEvent_GetPosition, "wxHelpEvent", "getPosition", 1}, // 2796
- {wxHelpEvent_SetOrigin, "wxHelpEvent", "setOrigin", 2}, // 2797
- {wxHelpEvent_SetPosition, "wxHelpEvent", "setPosition", 2}, // 2798
- {wxContextMenuEvent_GetPosition, "wxContextMenuEvent", "getPosition", 1}, // 2799
- {wxContextMenuEvent_SetPosition, "wxContextMenuEvent", "setPosition", 2}, // 2800
- {wxIdleEvent_GetMode, "wxIdleEvent", "getMode", 0}, // 2801
- {wxIdleEvent_RequestMore, "wxIdleEvent", "requestMore", 2}, // 2802
- {wxIdleEvent_MoreRequested, "wxIdleEvent", "moreRequested", 1}, // 2803
- {wxIdleEvent_SetMode, "wxIdleEvent", "setMode", 1}, // 2804
- {wxGridEvent_AltDown, "wxGridEvent", "altDown", 1}, // 2805
- {wxGridEvent_ControlDown, "wxGridEvent", "controlDown", 1}, // 2806
- {wxGridEvent_GetCol, "wxGridEvent", "getCol", 1}, // 2807
- {wxGridEvent_GetPosition, "wxGridEvent", "getPosition", 1}, // 2808
- {wxGridEvent_GetRow, "wxGridEvent", "getRow", 1}, // 2809
- {wxGridEvent_MetaDown, "wxGridEvent", "metaDown", 1}, // 2810
- {wxGridEvent_Selecting, "wxGridEvent", "selecting", 1}, // 2811
- {wxGridEvent_ShiftDown, "wxGridEvent", "shiftDown", 1}, // 2812
- {wxNotifyEvent_Allow, "wxNotifyEvent", "allow", 1}, // 2813
- {wxNotifyEvent_IsAllowed, "wxNotifyEvent", "isAllowed", 1}, // 2814
- {wxNotifyEvent_Veto, "wxNotifyEvent", "veto", 1}, // 2815
- {wxSashEvent_GetEdge, "wxSashEvent", "getEdge", 1}, // 2816
- {wxSashEvent_GetDragRect, "wxSashEvent", "getDragRect", 1}, // 2817
- {wxSashEvent_GetDragStatus, "wxSashEvent", "getDragStatus", 1}, // 2818
- {wxListEvent_GetCacheFrom, "wxListEvent", "getCacheFrom", 1}, // 2819
- {wxListEvent_GetCacheTo, "wxListEvent", "getCacheTo", 1}, // 2820
- {wxListEvent_GetKeyCode, "wxListEvent", "getKeyCode", 1}, // 2821
- {wxListEvent_GetIndex, "wxListEvent", "getIndex", 1}, // 2822
- {wxListEvent_GetColumn, "wxListEvent", "getColumn", 1}, // 2823
- {wxListEvent_GetPoint, "wxListEvent", "getPoint", 1}, // 2824
- {wxListEvent_GetLabel, "wxListEvent", "getLabel", 1}, // 2825
- {wxListEvent_GetText, "wxListEvent", "getText", 1}, // 2826
- {wxListEvent_GetImage, "wxListEvent", "getImage", 1}, // 2827
- {wxListEvent_GetData, "wxListEvent", "getData", 1}, // 2828
- {wxListEvent_GetMask, "wxListEvent", "getMask", 1}, // 2829
- {wxListEvent_GetItem, "wxListEvent", "getItem", 1}, // 2830
- {wxListEvent_IsEditCancelled, "wxListEvent", "isEditCancelled", 1}, // 2831
- {wxDateEvent_GetDate, "wxDateEvent", "getDate", 1}, // 2832
- {wxCalendarEvent_GetWeekDay, "wxCalendarEvent", "getWeekDay", 1}, // 2833
- {wxCalendarEvent_GetDate, "wxCalendarEvent", "getDate", 1}, // 2834
- {wxFileDirPickerEvent_GetPath, "wxFileDirPickerEvent", "getPath", 1}, // 2835
- {wxColourPickerEvent_GetColour, "wxColourPickerEvent", "getColour", 1}, // 2836
- {wxFontPickerEvent_GetFont, "wxFontPickerEvent", "getFont", 1}, // 2837
- {wxStyledTextEvent_GetPosition, "wxStyledTextEvent", "getPosition", 1}, // 2838
- {wxStyledTextEvent_GetKey, "wxStyledTextEvent", "getKey", 1}, // 2839
- {wxStyledTextEvent_GetModifiers, "wxStyledTextEvent", "getModifiers", 1}, // 2840
- {wxStyledTextEvent_GetModificationType, "wxStyledTextEvent", "getModificationType", 1}, // 2841
- {wxStyledTextEvent_GetText, "wxStyledTextEvent", "getText", 1}, // 2842
- {wxStyledTextEvent_GetLength, "wxStyledTextEvent", "getLength", 1}, // 2843
- {wxStyledTextEvent_GetLinesAdded, "wxStyledTextEvent", "getLinesAdded", 1}, // 2844
- {wxStyledTextEvent_GetLine, "wxStyledTextEvent", "getLine", 1}, // 2845
- {wxStyledTextEvent_GetFoldLevelNow, "wxStyledTextEvent", "getFoldLevelNow", 1}, // 2846
- {wxStyledTextEvent_GetFoldLevelPrev, "wxStyledTextEvent", "getFoldLevelPrev", 1}, // 2847
- {wxStyledTextEvent_GetMargin, "wxStyledTextEvent", "getMargin", 1}, // 2848
- {wxStyledTextEvent_GetMessage, "wxStyledTextEvent", "getMessage", 1}, // 2849
- {wxStyledTextEvent_GetWParam, "wxStyledTextEvent", "getWParam", 1}, // 2850
- {wxStyledTextEvent_GetLParam, "wxStyledTextEvent", "getLParam", 1}, // 2851
- {wxStyledTextEvent_GetListType, "wxStyledTextEvent", "getListType", 1}, // 2852
- {wxStyledTextEvent_GetX, "wxStyledTextEvent", "getX", 1}, // 2853
- {wxStyledTextEvent_GetY, "wxStyledTextEvent", "getY", 1}, // 2854
- {wxStyledTextEvent_GetDragText, "wxStyledTextEvent", "getDragText", 1}, // 2855
- {wxStyledTextEvent_GetDragAllowMove, "wxStyledTextEvent", "getDragAllowMove", 1}, // 2856
- {wxStyledTextEvent_GetDragResult, "wxStyledTextEvent", "getDragResult", 1}, // 2857
- {wxStyledTextEvent_GetShift, "wxStyledTextEvent", "getShift", 1}, // 2858
- {wxStyledTextEvent_GetControl, "wxStyledTextEvent", "getControl", 1}, // 2859
- {wxStyledTextEvent_GetAlt, "wxStyledTextEvent", "getAlt", 1}, // 2860
- {utils_wxGetKeyState, "utils", "getKeyState", 1}, // 2861
- {utils_wxGetMousePosition, "utils", "getMousePosition", 0}, // 2862
- {utils_wxGetMouseState, "utils", "getMouseState", 0}, // 2863
- {utils_wxSetDetectableAutoRepeat, "utils", "setDetectableAutoRepeat", 1}, // 2864
- {utils_wxBell, "utils", "bell", 0}, // 2865
- {utils_wxFindMenuItemId, "utils", "findMenuItemId", 3}, // 2866
- {utils_wxFindWindowAtPoint, "utils", "findWindowAtPoint", 1}, // 2867
- {utils_wxBeginBusyCursor, "utils", "beginBusyCursor", 1}, // 2868
- {utils_wxEndBusyCursor, "utils", "endBusyCursor", 0}, // 2869
- {utils_wxIsBusy, "utils", "isBusy", 0}, // 2870
- {utils_wxShutdown, "utils", "shutdown", 1}, // 2871
- {utils_wxShell, "utils", "shell", 1}, // 2872
- {utils_wxLaunchDefaultBrowser, "utils", "launchDefaultBrowser", 2}, // 2873
- {utils_wxGetEmailAddress, "utils", "getEmailAddress", 0}, // 2874
- {utils_wxGetUserId, "utils", "getUserId", 0}, // 2875
- {utils_wxGetHomeDir, "utils", "getHomeDir", 0}, // 2876
- {utils_wxNewId, "utils", "newId", 0}, // 2877
- {utils_wxRegisterId, "utils", "registerId", 1}, // 2878
- {utils_wxGetCurrentId, "utils", "getCurrentId", 0}, // 2879
- {utils_wxGetOsDescription, "utils", "getOsDescription", 0}, // 2880
- {utils_wxIsPlatformLittleEndian, "utils", "isPlatformLittleEndian", 0}, // 2881
- {utils_wxIsPlatform64Bit, "utils", "isPlatform64Bit", 0}, // 2882
- {gdicmn_wxDisplaySize, "gdicmn", "displaySize", 0}, // 2883
- {gdicmn_wxSetCursor, "gdicmn", "setCursor", 1}, // 2884
- {wxPrintout_new, "wxPrintout", "new", 3}, // 2885
- {NULL, "wxPrintout", "destroy", 1}, // 2886 obj destructor wxPrintout_destruct
- {wxPrintout_GetDC, "wxPrintout", "getDC", 1}, // 2887
- {wxPrintout_GetPageSizeMM, "wxPrintout", "getPageSizeMM", 1}, // 2888
- {wxPrintout_GetPageSizePixels, "wxPrintout", "getPageSizePixels", 1}, // 2889
- {wxPrintout_GetPaperRectPixels, "wxPrintout", "getPaperRectPixels", 1}, // 2890
- {wxPrintout_GetPPIPrinter, "wxPrintout", "getPPIPrinter", 1}, // 2891
- {wxPrintout_GetPPIScreen, "wxPrintout", "getPPIScreen", 1}, // 2892
- {wxPrintout_GetTitle, "wxPrintout", "getTitle", 1}, // 2893
- {wxPrintout_IsPreview, "wxPrintout", "isPreview", 1}, // 2894
- {wxPrintout_FitThisSizeToPaper, "wxPrintout", "fitThisSizeToPaper", 2}, // 2895
- {wxPrintout_FitThisSizeToPage, "wxPrintout", "fitThisSizeToPage", 2}, // 2896
- {wxPrintout_FitThisSizeToPageMargins, "wxPrintout", "fitThisSizeToPageMargins", 3}, // 2897
- {wxPrintout_MapScreenSizeToPaper, "wxPrintout", "mapScreenSizeToPaper", 1}, // 2898
- {wxPrintout_MapScreenSizeToPage, "wxPrintout", "mapScreenSizeToPage", 1}, // 2899
- {wxPrintout_MapScreenSizeToPageMargins, "wxPrintout", "mapScreenSizeToPageMargins", 2}, // 2900
- {wxPrintout_MapScreenSizeToDevice, "wxPrintout", "mapScreenSizeToDevice", 1}, // 2901
- {wxPrintout_GetLogicalPaperRect, "wxPrintout", "getLogicalPaperRect", 1}, // 2902
- {wxPrintout_GetLogicalPageRect, "wxPrintout", "getLogicalPageRect", 1}, // 2903
- {wxPrintout_GetLogicalPageMarginsRect, "wxPrintout", "getLogicalPageMarginsRect", 2}, // 2904
- {wxPrintout_SetLogicalOrigin, "wxPrintout", "setLogicalOrigin", 3}, // 2905
- {wxPrintout_OffsetLogicalOrigin, "wxPrintout", "offsetLogicalOrigin", 3}, // 2906
- {wxStyledTextCtrl_new_2, "wxStyledTextCtrl", "new", 2}, // 2907
- {wxStyledTextCtrl_new_0, "wxStyledTextCtrl", "new", 0}, // 2908
- {NULL, "wxStyledTextCtrl", "destroy", 1}, // 2909 obj destructor wxStyledTextCtrl_destruct
- {wxStyledTextCtrl_Create, "wxStyledTextCtrl", "create", 3}, // 2910
- {wxStyledTextCtrl_AddText, "wxStyledTextCtrl", "addText", 2}, // 2911
- {wxStyledTextCtrl_InsertText, "wxStyledTextCtrl", "insertText", 3}, // 2912
- {wxStyledTextCtrl_ClearAll, "wxStyledTextCtrl", "clearAll", 1}, // 2913
- {wxStyledTextCtrl_ClearDocumentStyle, "wxStyledTextCtrl", "clearDocumentStyle", 1}, // 2914
- {wxStyledTextCtrl_GetLength, "wxStyledTextCtrl", "getLength", 1}, // 2915
- {wxStyledTextCtrl_GetCharAt, "wxStyledTextCtrl", "getCharAt", 2}, // 2916
- {wxStyledTextCtrl_GetCurrentPos, "wxStyledTextCtrl", "getCurrentPos", 1}, // 2917
- {wxStyledTextCtrl_GetAnchor, "wxStyledTextCtrl", "getAnchor", 1}, // 2918
- {wxStyledTextCtrl_GetStyleAt, "wxStyledTextCtrl", "getStyleAt", 2}, // 2919
- {wxStyledTextCtrl_Redo, "wxStyledTextCtrl", "redo", 1}, // 2920
- {wxStyledTextCtrl_SetUndoCollection, "wxStyledTextCtrl", "setUndoCollection", 2}, // 2921
- {wxStyledTextCtrl_SelectAll, "wxStyledTextCtrl", "selectAll", 1}, // 2922
- {wxStyledTextCtrl_SetSavePoint, "wxStyledTextCtrl", "setSavePoint", 1}, // 2923
- {wxStyledTextCtrl_CanRedo, "wxStyledTextCtrl", "canRedo", 1}, // 2924
- {wxStyledTextCtrl_MarkerLineFromHandle, "wxStyledTextCtrl", "markerLineFromHandle", 2}, // 2925
- {wxStyledTextCtrl_MarkerDeleteHandle, "wxStyledTextCtrl", "markerDeleteHandle", 2}, // 2926
- {wxStyledTextCtrl_GetUndoCollection, "wxStyledTextCtrl", "getUndoCollection", 1}, // 2927
- {wxStyledTextCtrl_GetViewWhiteSpace, "wxStyledTextCtrl", "getViewWhiteSpace", 1}, // 2928
- {wxStyledTextCtrl_SetViewWhiteSpace, "wxStyledTextCtrl", "setViewWhiteSpace", 2}, // 2929
- {wxStyledTextCtrl_PositionFromPoint, "wxStyledTextCtrl", "positionFromPoint", 2}, // 2930
- {wxStyledTextCtrl_PositionFromPointClose, "wxStyledTextCtrl", "positionFromPointClose", 3}, // 2931
- {wxStyledTextCtrl_GotoLine, "wxStyledTextCtrl", "gotoLine", 2}, // 2932
- {wxStyledTextCtrl_GotoPos, "wxStyledTextCtrl", "gotoPos", 2}, // 2933
- {wxStyledTextCtrl_SetAnchor, "wxStyledTextCtrl", "setAnchor", 2}, // 2934
- {wxStyledTextCtrl_GetCurLine, "wxStyledTextCtrl", "getCurLine", 1}, // 2935
- {wxStyledTextCtrl_GetEndStyled, "wxStyledTextCtrl", "getEndStyled", 1}, // 2936
- {wxStyledTextCtrl_ConvertEOLs, "wxStyledTextCtrl", "convertEOLs", 2}, // 2937
- {wxStyledTextCtrl_GetEOLMode, "wxStyledTextCtrl", "getEOLMode", 1}, // 2938
- {wxStyledTextCtrl_SetEOLMode, "wxStyledTextCtrl", "setEOLMode", 2}, // 2939
- {wxStyledTextCtrl_StartStyling, "wxStyledTextCtrl", "startStyling", 2}, // 2940
- {wxStyledTextCtrl_SetStyling, "wxStyledTextCtrl", "setStyling", 3}, // 2941
- {wxStyledTextCtrl_GetBufferedDraw, "wxStyledTextCtrl", "getBufferedDraw", 1}, // 2942
- {wxStyledTextCtrl_SetBufferedDraw, "wxStyledTextCtrl", "setBufferedDraw", 2}, // 2943
- {wxStyledTextCtrl_SetTabWidth, "wxStyledTextCtrl", "setTabWidth", 2}, // 2944
- {wxStyledTextCtrl_GetTabWidth, "wxStyledTextCtrl", "getTabWidth", 1}, // 2945
- {wxStyledTextCtrl_SetCodePage, "wxStyledTextCtrl", "setCodePage", 2}, // 2946
- {wxStyledTextCtrl_MarkerDefine, "wxStyledTextCtrl", "markerDefine", 4}, // 2947
- {wxStyledTextCtrl_MarkerSetForeground, "wxStyledTextCtrl", "markerSetForeground", 3}, // 2948
- {wxStyledTextCtrl_MarkerSetBackground, "wxStyledTextCtrl", "markerSetBackground", 3}, // 2949
- {wxStyledTextCtrl_MarkerAdd, "wxStyledTextCtrl", "markerAdd", 3}, // 2950
- {wxStyledTextCtrl_MarkerDelete, "wxStyledTextCtrl", "markerDelete", 3}, // 2951
- {wxStyledTextCtrl_MarkerDeleteAll, "wxStyledTextCtrl", "markerDeleteAll", 2}, // 2952
- {wxStyledTextCtrl_MarkerGet, "wxStyledTextCtrl", "markerGet", 2}, // 2953
- {wxStyledTextCtrl_MarkerNext, "wxStyledTextCtrl", "markerNext", 3}, // 2954
- {wxStyledTextCtrl_MarkerPrevious, "wxStyledTextCtrl", "markerPrevious", 3}, // 2955
- {wxStyledTextCtrl_MarkerDefineBitmap, "wxStyledTextCtrl", "markerDefineBitmap", 3}, // 2956
- {wxStyledTextCtrl_MarkerAddSet, "wxStyledTextCtrl", "markerAddSet", 3}, // 2957
- {wxStyledTextCtrl_MarkerSetAlpha, "wxStyledTextCtrl", "markerSetAlpha", 3}, // 2958
- {wxStyledTextCtrl_SetMarginType, "wxStyledTextCtrl", "setMarginType", 3}, // 2959
- {wxStyledTextCtrl_GetMarginType, "wxStyledTextCtrl", "getMarginType", 2}, // 2960
- {wxStyledTextCtrl_SetMarginWidth, "wxStyledTextCtrl", "setMarginWidth", 3}, // 2961
- {wxStyledTextCtrl_GetMarginWidth, "wxStyledTextCtrl", "getMarginWidth", 2}, // 2962
- {wxStyledTextCtrl_SetMarginMask, "wxStyledTextCtrl", "setMarginMask", 3}, // 2963
- {wxStyledTextCtrl_GetMarginMask, "wxStyledTextCtrl", "getMarginMask", 2}, // 2964
- {wxStyledTextCtrl_SetMarginSensitive, "wxStyledTextCtrl", "setMarginSensitive", 3}, // 2965
- {wxStyledTextCtrl_GetMarginSensitive, "wxStyledTextCtrl", "getMarginSensitive", 2}, // 2966
- {wxStyledTextCtrl_StyleClearAll, "wxStyledTextCtrl", "styleClearAll", 1}, // 2967
- {wxStyledTextCtrl_StyleSetForeground, "wxStyledTextCtrl", "styleSetForeground", 3}, // 2968
- {wxStyledTextCtrl_StyleSetBackground, "wxStyledTextCtrl", "styleSetBackground", 3}, // 2969
- {wxStyledTextCtrl_StyleSetBold, "wxStyledTextCtrl", "styleSetBold", 3}, // 2970
- {wxStyledTextCtrl_StyleSetItalic, "wxStyledTextCtrl", "styleSetItalic", 3}, // 2971
- {wxStyledTextCtrl_StyleSetSize, "wxStyledTextCtrl", "styleSetSize", 3}, // 2972
- {wxStyledTextCtrl_StyleSetFaceName, "wxStyledTextCtrl", "styleSetFaceName", 3}, // 2973
- {wxStyledTextCtrl_StyleSetEOLFilled, "wxStyledTextCtrl", "styleSetEOLFilled", 3}, // 2974
- {wxStyledTextCtrl_StyleResetDefault, "wxStyledTextCtrl", "styleResetDefault", 1}, // 2975
- {wxStyledTextCtrl_StyleSetUnderline, "wxStyledTextCtrl", "styleSetUnderline", 3}, // 2976
- {wxStyledTextCtrl_StyleSetCase, "wxStyledTextCtrl", "styleSetCase", 3}, // 2977
- {wxStyledTextCtrl_StyleSetHotSpot, "wxStyledTextCtrl", "styleSetHotSpot", 3}, // 2978
- {wxStyledTextCtrl_SetSelForeground, "wxStyledTextCtrl", "setSelForeground", 3}, // 2979
- {wxStyledTextCtrl_SetSelBackground, "wxStyledTextCtrl", "setSelBackground", 3}, // 2980
- {wxStyledTextCtrl_GetSelAlpha, "wxStyledTextCtrl", "getSelAlpha", 1}, // 2981
- {wxStyledTextCtrl_SetSelAlpha, "wxStyledTextCtrl", "setSelAlpha", 2}, // 2982
- {wxStyledTextCtrl_SetCaretForeground, "wxStyledTextCtrl", "setCaretForeground", 2}, // 2983
- {wxStyledTextCtrl_CmdKeyAssign, "wxStyledTextCtrl", "cmdKeyAssign", 4}, // 2984
- {wxStyledTextCtrl_CmdKeyClear, "wxStyledTextCtrl", "cmdKeyClear", 3}, // 2985
- {wxStyledTextCtrl_CmdKeyClearAll, "wxStyledTextCtrl", "cmdKeyClearAll", 1}, // 2986
- {wxStyledTextCtrl_SetStyleBytes, "wxStyledTextCtrl", "setStyleBytes", 2}, // 2987
- {wxStyledTextCtrl_StyleSetVisible, "wxStyledTextCtrl", "styleSetVisible", 3}, // 2988
- {wxStyledTextCtrl_GetCaretPeriod, "wxStyledTextCtrl", "getCaretPeriod", 1}, // 2989
- {wxStyledTextCtrl_SetCaretPeriod, "wxStyledTextCtrl", "setCaretPeriod", 2}, // 2990
- {wxStyledTextCtrl_SetWordChars, "wxStyledTextCtrl", "setWordChars", 2}, // 2991
- {wxStyledTextCtrl_BeginUndoAction, "wxStyledTextCtrl", "beginUndoAction", 1}, // 2992
- {wxStyledTextCtrl_EndUndoAction, "wxStyledTextCtrl", "endUndoAction", 1}, // 2993
- {wxStyledTextCtrl_IndicatorSetStyle, "wxStyledTextCtrl", "indicatorSetStyle", 3}, // 2994
- {wxStyledTextCtrl_IndicatorGetStyle, "wxStyledTextCtrl", "indicatorGetStyle", 2}, // 2995
- {wxStyledTextCtrl_IndicatorSetForeground, "wxStyledTextCtrl", "indicatorSetForeground", 3}, // 2996
- {wxStyledTextCtrl_IndicatorGetForeground, "wxStyledTextCtrl", "indicatorGetForeground", 2}, // 2997
- {wxStyledTextCtrl_SetWhitespaceForeground, "wxStyledTextCtrl", "setWhitespaceForeground", 3}, // 2998
- {wxStyledTextCtrl_SetWhitespaceBackground, "wxStyledTextCtrl", "setWhitespaceBackground", 3}, // 2999
- {wxStyledTextCtrl_GetStyleBits, "wxStyledTextCtrl", "getStyleBits", 1}, // 3000
- {wxStyledTextCtrl_SetLineState, "wxStyledTextCtrl", "setLineState", 3}, // 3001
- {wxStyledTextCtrl_GetLineState, "wxStyledTextCtrl", "getLineState", 2}, // 3002
- {wxStyledTextCtrl_GetMaxLineState, "wxStyledTextCtrl", "getMaxLineState", 1}, // 3003
- {wxStyledTextCtrl_GetCaretLineVisible, "wxStyledTextCtrl", "getCaretLineVisible", 1}, // 3004
- {wxStyledTextCtrl_SetCaretLineVisible, "wxStyledTextCtrl", "setCaretLineVisible", 2}, // 3005
- {wxStyledTextCtrl_GetCaretLineBackground, "wxStyledTextCtrl", "getCaretLineBackground", 1}, // 3006
- {wxStyledTextCtrl_SetCaretLineBackground, "wxStyledTextCtrl", "setCaretLineBackground", 2}, // 3007
- {wxStyledTextCtrl_AutoCompShow, "wxStyledTextCtrl", "autoCompShow", 3}, // 3008
- {wxStyledTextCtrl_AutoCompCancel, "wxStyledTextCtrl", "autoCompCancel", 1}, // 3009
- {wxStyledTextCtrl_AutoCompActive, "wxStyledTextCtrl", "autoCompActive", 1}, // 3010
- {wxStyledTextCtrl_AutoCompPosStart, "wxStyledTextCtrl", "autoCompPosStart", 1}, // 3011
- {wxStyledTextCtrl_AutoCompComplete, "wxStyledTextCtrl", "autoCompComplete", 1}, // 3012
- {wxStyledTextCtrl_AutoCompStops, "wxStyledTextCtrl", "autoCompStops", 2}, // 3013
- {wxStyledTextCtrl_AutoCompSetSeparator, "wxStyledTextCtrl", "autoCompSetSeparator", 2}, // 3014
- {wxStyledTextCtrl_AutoCompGetSeparator, "wxStyledTextCtrl", "autoCompGetSeparator", 1}, // 3015
- {wxStyledTextCtrl_AutoCompSelect, "wxStyledTextCtrl", "autoCompSelect", 2}, // 3016
- {wxStyledTextCtrl_AutoCompSetCancelAtStart, "wxStyledTextCtrl", "autoCompSetCancelAtStart", 2}, // 3017
- {wxStyledTextCtrl_AutoCompGetCancelAtStart, "wxStyledTextCtrl", "autoCompGetCancelAtStart", 1}, // 3018
- {wxStyledTextCtrl_AutoCompSetFillUps, "wxStyledTextCtrl", "autoCompSetFillUps", 2}, // 3019
- {wxStyledTextCtrl_AutoCompSetChooseSingle, "wxStyledTextCtrl", "autoCompSetChooseSingle", 2}, // 3020
- {wxStyledTextCtrl_AutoCompGetChooseSingle, "wxStyledTextCtrl", "autoCompGetChooseSingle", 1}, // 3021
- {wxStyledTextCtrl_AutoCompSetIgnoreCase, "wxStyledTextCtrl", "autoCompSetIgnoreCase", 2}, // 3022
- {wxStyledTextCtrl_AutoCompGetIgnoreCase, "wxStyledTextCtrl", "autoCompGetIgnoreCase", 1}, // 3023
- {wxStyledTextCtrl_UserListShow, "wxStyledTextCtrl", "userListShow", 3}, // 3024
- {wxStyledTextCtrl_AutoCompSetAutoHide, "wxStyledTextCtrl", "autoCompSetAutoHide", 2}, // 3025
- {wxStyledTextCtrl_AutoCompGetAutoHide, "wxStyledTextCtrl", "autoCompGetAutoHide", 1}, // 3026
- {wxStyledTextCtrl_AutoCompSetDropRestOfWord, "wxStyledTextCtrl", "autoCompSetDropRestOfWord", 2}, // 3027
- {wxStyledTextCtrl_AutoCompGetDropRestOfWord, "wxStyledTextCtrl", "autoCompGetDropRestOfWord", 1}, // 3028
- {wxStyledTextCtrl_RegisterImage, "wxStyledTextCtrl", "registerImage", 3}, // 3029
- {wxStyledTextCtrl_ClearRegisteredImages, "wxStyledTextCtrl", "clearRegisteredImages", 1}, // 3030
- {wxStyledTextCtrl_AutoCompGetTypeSeparator, "wxStyledTextCtrl", "autoCompGetTypeSeparator", 1}, // 3031
- {wxStyledTextCtrl_AutoCompSetTypeSeparator, "wxStyledTextCtrl", "autoCompSetTypeSeparator", 2}, // 3032
- {wxStyledTextCtrl_AutoCompSetMaxWidth, "wxStyledTextCtrl", "autoCompSetMaxWidth", 2}, // 3033
- {wxStyledTextCtrl_AutoCompGetMaxWidth, "wxStyledTextCtrl", "autoCompGetMaxWidth", 1}, // 3034
- {wxStyledTextCtrl_AutoCompSetMaxHeight, "wxStyledTextCtrl", "autoCompSetMaxHeight", 2}, // 3035
- {wxStyledTextCtrl_AutoCompGetMaxHeight, "wxStyledTextCtrl", "autoCompGetMaxHeight", 1}, // 3036
- {wxStyledTextCtrl_SetIndent, "wxStyledTextCtrl", "setIndent", 2}, // 3037
- {wxStyledTextCtrl_GetIndent, "wxStyledTextCtrl", "getIndent", 1}, // 3038
- {wxStyledTextCtrl_SetUseTabs, "wxStyledTextCtrl", "setUseTabs", 2}, // 3039
- {wxStyledTextCtrl_GetUseTabs, "wxStyledTextCtrl", "getUseTabs", 1}, // 3040
- {wxStyledTextCtrl_SetLineIndentation, "wxStyledTextCtrl", "setLineIndentation", 3}, // 3041
- {wxStyledTextCtrl_GetLineIndentation, "wxStyledTextCtrl", "getLineIndentation", 2}, // 3042
- {wxStyledTextCtrl_GetLineIndentPosition, "wxStyledTextCtrl", "getLineIndentPosition", 2}, // 3043
- {wxStyledTextCtrl_GetColumn, "wxStyledTextCtrl", "getColumn", 2}, // 3044
- {wxStyledTextCtrl_SetUseHorizontalScrollBar, "wxStyledTextCtrl", "setUseHorizontalScrollBar", 2}, // 3045
- {wxStyledTextCtrl_GetUseHorizontalScrollBar, "wxStyledTextCtrl", "getUseHorizontalScrollBar", 1}, // 3046
- {wxStyledTextCtrl_SetIndentationGuides, "wxStyledTextCtrl", "setIndentationGuides", 2}, // 3047
- {wxStyledTextCtrl_GetIndentationGuides, "wxStyledTextCtrl", "getIndentationGuides", 1}, // 3048
- {wxStyledTextCtrl_SetHighlightGuide, "wxStyledTextCtrl", "setHighlightGuide", 2}, // 3049
- {wxStyledTextCtrl_GetHighlightGuide, "wxStyledTextCtrl", "getHighlightGuide", 1}, // 3050
- {wxStyledTextCtrl_GetLineEndPosition, "wxStyledTextCtrl", "getLineEndPosition", 2}, // 3051
- {wxStyledTextCtrl_GetCodePage, "wxStyledTextCtrl", "getCodePage", 1}, // 3052
- {wxStyledTextCtrl_GetCaretForeground, "wxStyledTextCtrl", "getCaretForeground", 1}, // 3053
- {wxStyledTextCtrl_GetReadOnly, "wxStyledTextCtrl", "getReadOnly", 1}, // 3054
- {wxStyledTextCtrl_SetCurrentPos, "wxStyledTextCtrl", "setCurrentPos", 2}, // 3055
- {wxStyledTextCtrl_SetSelectionStart, "wxStyledTextCtrl", "setSelectionStart", 2}, // 3056
- {wxStyledTextCtrl_GetSelectionStart, "wxStyledTextCtrl", "getSelectionStart", 1}, // 3057
- {wxStyledTextCtrl_SetSelectionEnd, "wxStyledTextCtrl", "setSelectionEnd", 2}, // 3058
- {wxStyledTextCtrl_GetSelectionEnd, "wxStyledTextCtrl", "getSelectionEnd", 1}, // 3059
- {wxStyledTextCtrl_SetPrintMagnification, "wxStyledTextCtrl", "setPrintMagnification", 2}, // 3060
- {wxStyledTextCtrl_GetPrintMagnification, "wxStyledTextCtrl", "getPrintMagnification", 1}, // 3061
- {wxStyledTextCtrl_SetPrintColourMode, "wxStyledTextCtrl", "setPrintColourMode", 2}, // 3062
- {wxStyledTextCtrl_GetPrintColourMode, "wxStyledTextCtrl", "getPrintColourMode", 1}, // 3063
- {wxStyledTextCtrl_FindText, "wxStyledTextCtrl", "findText", 5}, // 3064
- {wxStyledTextCtrl_FormatRange, "wxStyledTextCtrl", "formatRange", 8}, // 3065
- {wxStyledTextCtrl_GetFirstVisibleLine, "wxStyledTextCtrl", "getFirstVisibleLine", 1}, // 3066
- {wxStyledTextCtrl_GetLine, "wxStyledTextCtrl", "getLine", 2}, // 3067
- {wxStyledTextCtrl_GetLineCount, "wxStyledTextCtrl", "getLineCount", 1}, // 3068
- {wxStyledTextCtrl_SetMarginLeft, "wxStyledTextCtrl", "setMarginLeft", 2}, // 3069
- {wxStyledTextCtrl_GetMarginLeft, "wxStyledTextCtrl", "getMarginLeft", 1}, // 3070
- {wxStyledTextCtrl_SetMarginRight, "wxStyledTextCtrl", "setMarginRight", 2}, // 3071
- {wxStyledTextCtrl_GetMarginRight, "wxStyledTextCtrl", "getMarginRight", 1}, // 3072
- {wxStyledTextCtrl_GetModify, "wxStyledTextCtrl", "getModify", 1}, // 3073
- {wxStyledTextCtrl_SetSelection, "wxStyledTextCtrl", "setSelection", 3}, // 3074
- {wxStyledTextCtrl_GetSelectedText, "wxStyledTextCtrl", "getSelectedText", 1}, // 3075
- {wxStyledTextCtrl_GetTextRange, "wxStyledTextCtrl", "getTextRange", 3}, // 3076
- {wxStyledTextCtrl_HideSelection, "wxStyledTextCtrl", "hideSelection", 2}, // 3077
- {wxStyledTextCtrl_LineFromPosition, "wxStyledTextCtrl", "lineFromPosition", 2}, // 3078
- {wxStyledTextCtrl_PositionFromLine, "wxStyledTextCtrl", "positionFromLine", 2}, // 3079
- {wxStyledTextCtrl_LineScroll, "wxStyledTextCtrl", "lineScroll", 3}, // 3080
- {wxStyledTextCtrl_EnsureCaretVisible, "wxStyledTextCtrl", "ensureCaretVisible", 1}, // 3081
- {wxStyledTextCtrl_ReplaceSelection, "wxStyledTextCtrl", "replaceSelection", 2}, // 3082
- {wxStyledTextCtrl_SetReadOnly, "wxStyledTextCtrl", "setReadOnly", 2}, // 3083
- {wxStyledTextCtrl_CanPaste, "wxStyledTextCtrl", "canPaste", 1}, // 3084
- {wxStyledTextCtrl_CanUndo, "wxStyledTextCtrl", "canUndo", 1}, // 3085
- {wxStyledTextCtrl_EmptyUndoBuffer, "wxStyledTextCtrl", "emptyUndoBuffer", 1}, // 3086
- {wxStyledTextCtrl_Undo, "wxStyledTextCtrl", "undo", 1}, // 3087
- {wxStyledTextCtrl_Cut, "wxStyledTextCtrl", "cut", 1}, // 3088
- {wxStyledTextCtrl_Copy, "wxStyledTextCtrl", "copy", 1}, // 3089
- {wxStyledTextCtrl_Paste, "wxStyledTextCtrl", "paste", 1}, // 3090
- {wxStyledTextCtrl_Clear, "wxStyledTextCtrl", "clear", 1}, // 3091
- {wxStyledTextCtrl_SetText, "wxStyledTextCtrl", "setText", 2}, // 3092
- {wxStyledTextCtrl_GetText, "wxStyledTextCtrl", "getText", 1}, // 3093
- {wxStyledTextCtrl_GetTextLength, "wxStyledTextCtrl", "getTextLength", 1}, // 3094
- {wxStyledTextCtrl_GetOvertype, "wxStyledTextCtrl", "getOvertype", 1}, // 3095
- {wxStyledTextCtrl_SetCaretWidth, "wxStyledTextCtrl", "setCaretWidth", 2}, // 3096
- {wxStyledTextCtrl_GetCaretWidth, "wxStyledTextCtrl", "getCaretWidth", 1}, // 3097
- {wxStyledTextCtrl_SetTargetStart, "wxStyledTextCtrl", "setTargetStart", 2}, // 3098
- {wxStyledTextCtrl_GetTargetStart, "wxStyledTextCtrl", "getTargetStart", 1}, // 3099
- {wxStyledTextCtrl_SetTargetEnd, "wxStyledTextCtrl", "setTargetEnd", 2}, // 3100
- {wxStyledTextCtrl_GetTargetEnd, "wxStyledTextCtrl", "getTargetEnd", 1}, // 3101
- {wxStyledTextCtrl_ReplaceTarget, "wxStyledTextCtrl", "replaceTarget", 2}, // 3102
- {wxStyledTextCtrl_SearchInTarget, "wxStyledTextCtrl", "searchInTarget", 2}, // 3103
- {wxStyledTextCtrl_SetSearchFlags, "wxStyledTextCtrl", "setSearchFlags", 2}, // 3104
- {wxStyledTextCtrl_GetSearchFlags, "wxStyledTextCtrl", "getSearchFlags", 1}, // 3105
- {wxStyledTextCtrl_CallTipShow, "wxStyledTextCtrl", "callTipShow", 3}, // 3106
- {wxStyledTextCtrl_CallTipCancel, "wxStyledTextCtrl", "callTipCancel", 1}, // 3107
- {wxStyledTextCtrl_CallTipActive, "wxStyledTextCtrl", "callTipActive", 1}, // 3108
- {wxStyledTextCtrl_CallTipPosAtStart, "wxStyledTextCtrl", "callTipPosAtStart", 1}, // 3109
- {wxStyledTextCtrl_CallTipSetHighlight, "wxStyledTextCtrl", "callTipSetHighlight", 3}, // 3110
- {wxStyledTextCtrl_CallTipSetBackground, "wxStyledTextCtrl", "callTipSetBackground", 2}, // 3111
- {wxStyledTextCtrl_CallTipSetForeground, "wxStyledTextCtrl", "callTipSetForeground", 2}, // 3112
- {wxStyledTextCtrl_CallTipSetForegroundHighlight, "wxStyledTextCtrl", "callTipSetForegroundHighlight", 2}, // 3113
- {wxStyledTextCtrl_CallTipUseStyle, "wxStyledTextCtrl", "callTipUseStyle", 2}, // 3114
- {wxStyledTextCtrl_VisibleFromDocLine, "wxStyledTextCtrl", "visibleFromDocLine", 2}, // 3115
- {wxStyledTextCtrl_DocLineFromVisible, "wxStyledTextCtrl", "docLineFromVisible", 2}, // 3116
- {wxStyledTextCtrl_WrapCount, "wxStyledTextCtrl", "wrapCount", 2}, // 3117
- {wxStyledTextCtrl_SetFoldLevel, "wxStyledTextCtrl", "setFoldLevel", 3}, // 3118
- {wxStyledTextCtrl_GetFoldLevel, "wxStyledTextCtrl", "getFoldLevel", 2}, // 3119
- {wxStyledTextCtrl_GetLastChild, "wxStyledTextCtrl", "getLastChild", 3}, // 3120
- {wxStyledTextCtrl_GetFoldParent, "wxStyledTextCtrl", "getFoldParent", 2}, // 3121
- {wxStyledTextCtrl_ShowLines, "wxStyledTextCtrl", "showLines", 3}, // 3122
- {wxStyledTextCtrl_HideLines, "wxStyledTextCtrl", "hideLines", 3}, // 3123
- {wxStyledTextCtrl_GetLineVisible, "wxStyledTextCtrl", "getLineVisible", 2}, // 3124
- {wxStyledTextCtrl_SetFoldExpanded, "wxStyledTextCtrl", "setFoldExpanded", 3}, // 3125
- {wxStyledTextCtrl_GetFoldExpanded, "wxStyledTextCtrl", "getFoldExpanded", 2}, // 3126
- {wxStyledTextCtrl_ToggleFold, "wxStyledTextCtrl", "toggleFold", 2}, // 3127
- {wxStyledTextCtrl_EnsureVisible, "wxStyledTextCtrl", "ensureVisible", 2}, // 3128
- {wxStyledTextCtrl_SetFoldFlags, "wxStyledTextCtrl", "setFoldFlags", 2}, // 3129
- {wxStyledTextCtrl_EnsureVisibleEnforcePolicy, "wxStyledTextCtrl", "ensureVisibleEnforcePolicy", 2}, // 3130
- {wxStyledTextCtrl_SetTabIndents, "wxStyledTextCtrl", "setTabIndents", 2}, // 3131
- {wxStyledTextCtrl_GetTabIndents, "wxStyledTextCtrl", "getTabIndents", 1}, // 3132
- {wxStyledTextCtrl_SetBackSpaceUnIndents, "wxStyledTextCtrl", "setBackSpaceUnIndents", 2}, // 3133
- {wxStyledTextCtrl_GetBackSpaceUnIndents, "wxStyledTextCtrl", "getBackSpaceUnIndents", 1}, // 3134
- {wxStyledTextCtrl_SetMouseDwellTime, "wxStyledTextCtrl", "setMouseDwellTime", 2}, // 3135
- {wxStyledTextCtrl_GetMouseDwellTime, "wxStyledTextCtrl", "getMouseDwellTime", 1}, // 3136
- {wxStyledTextCtrl_WordStartPosition, "wxStyledTextCtrl", "wordStartPosition", 3}, // 3137
- {wxStyledTextCtrl_WordEndPosition, "wxStyledTextCtrl", "wordEndPosition", 3}, // 3138
- {wxStyledTextCtrl_SetWrapMode, "wxStyledTextCtrl", "setWrapMode", 2}, // 3139
- {wxStyledTextCtrl_GetWrapMode, "wxStyledTextCtrl", "getWrapMode", 1}, // 3140
- {wxStyledTextCtrl_SetWrapVisualFlags, "wxStyledTextCtrl", "setWrapVisualFlags", 2}, // 3141
- {wxStyledTextCtrl_GetWrapVisualFlags, "wxStyledTextCtrl", "getWrapVisualFlags", 1}, // 3142
- {wxStyledTextCtrl_SetWrapVisualFlagsLocation, "wxStyledTextCtrl", "setWrapVisualFlagsLocation", 2}, // 3143
- {wxStyledTextCtrl_GetWrapVisualFlagsLocation, "wxStyledTextCtrl", "getWrapVisualFlagsLocation", 1}, // 3144
- {wxStyledTextCtrl_SetWrapStartIndent, "wxStyledTextCtrl", "setWrapStartIndent", 2}, // 3145
- {wxStyledTextCtrl_GetWrapStartIndent, "wxStyledTextCtrl", "getWrapStartIndent", 1}, // 3146
- {wxStyledTextCtrl_SetLayoutCache, "wxStyledTextCtrl", "setLayoutCache", 2}, // 3147
- {wxStyledTextCtrl_GetLayoutCache, "wxStyledTextCtrl", "getLayoutCache", 1}, // 3148
- {wxStyledTextCtrl_SetScrollWidth, "wxStyledTextCtrl", "setScrollWidth", 2}, // 3149
- {wxStyledTextCtrl_GetScrollWidth, "wxStyledTextCtrl", "getScrollWidth", 1}, // 3150
- {wxStyledTextCtrl_TextWidth, "wxStyledTextCtrl", "textWidth", 3}, // 3151
- {wxStyledTextCtrl_GetEndAtLastLine, "wxStyledTextCtrl", "getEndAtLastLine", 1}, // 3152
- {wxStyledTextCtrl_TextHeight, "wxStyledTextCtrl", "textHeight", 2}, // 3153
- {wxStyledTextCtrl_SetUseVerticalScrollBar, "wxStyledTextCtrl", "setUseVerticalScrollBar", 2}, // 3154
- {wxStyledTextCtrl_GetUseVerticalScrollBar, "wxStyledTextCtrl", "getUseVerticalScrollBar", 1}, // 3155
- {wxStyledTextCtrl_AppendText, "wxStyledTextCtrl", "appendText", 2}, // 3156
- {wxStyledTextCtrl_GetTwoPhaseDraw, "wxStyledTextCtrl", "getTwoPhaseDraw", 1}, // 3157
- {wxStyledTextCtrl_SetTwoPhaseDraw, "wxStyledTextCtrl", "setTwoPhaseDraw", 2}, // 3158
- {wxStyledTextCtrl_TargetFromSelection, "wxStyledTextCtrl", "targetFromSelection", 1}, // 3159
- {wxStyledTextCtrl_LinesJoin, "wxStyledTextCtrl", "linesJoin", 1}, // 3160
- {wxStyledTextCtrl_LinesSplit, "wxStyledTextCtrl", "linesSplit", 2}, // 3161
- {wxStyledTextCtrl_SetFoldMarginColour, "wxStyledTextCtrl", "setFoldMarginColour", 3}, // 3162
- {wxStyledTextCtrl_SetFoldMarginHiColour, "wxStyledTextCtrl", "setFoldMarginHiColour", 3}, // 3163
- {wxStyledTextCtrl_LineDown, "wxStyledTextCtrl", "lineDown", 1}, // 3164
- {wxStyledTextCtrl_LineDownExtend, "wxStyledTextCtrl", "lineDownExtend", 1}, // 3165
- {wxStyledTextCtrl_LineUp, "wxStyledTextCtrl", "lineUp", 1}, // 3166
- {wxStyledTextCtrl_LineUpExtend, "wxStyledTextCtrl", "lineUpExtend", 1}, // 3167
- {wxStyledTextCtrl_CharLeft, "wxStyledTextCtrl", "charLeft", 1}, // 3168
- {wxStyledTextCtrl_CharLeftExtend, "wxStyledTextCtrl", "charLeftExtend", 1}, // 3169
- {wxStyledTextCtrl_CharRight, "wxStyledTextCtrl", "charRight", 1}, // 3170
- {wxStyledTextCtrl_CharRightExtend, "wxStyledTextCtrl", "charRightExtend", 1}, // 3171
- {wxStyledTextCtrl_WordLeft, "wxStyledTextCtrl", "wordLeft", 1}, // 3172
- {wxStyledTextCtrl_WordLeftExtend, "wxStyledTextCtrl", "wordLeftExtend", 1}, // 3173
- {wxStyledTextCtrl_WordRight, "wxStyledTextCtrl", "wordRight", 1}, // 3174
- {wxStyledTextCtrl_WordRightExtend, "wxStyledTextCtrl", "wordRightExtend", 1}, // 3175
- {wxStyledTextCtrl_Home, "wxStyledTextCtrl", "home", 1}, // 3176
- {wxStyledTextCtrl_HomeExtend, "wxStyledTextCtrl", "homeExtend", 1}, // 3177
- {wxStyledTextCtrl_LineEnd, "wxStyledTextCtrl", "lineEnd", 1}, // 3178
- {wxStyledTextCtrl_LineEndExtend, "wxStyledTextCtrl", "lineEndExtend", 1}, // 3179
- {wxStyledTextCtrl_DocumentStart, "wxStyledTextCtrl", "documentStart", 1}, // 3180
- {wxStyledTextCtrl_DocumentStartExtend, "wxStyledTextCtrl", "documentStartExtend", 1}, // 3181
- {wxStyledTextCtrl_DocumentEnd, "wxStyledTextCtrl", "documentEnd", 1}, // 3182
- {wxStyledTextCtrl_DocumentEndExtend, "wxStyledTextCtrl", "documentEndExtend", 1}, // 3183
- {wxStyledTextCtrl_PageUp, "wxStyledTextCtrl", "pageUp", 1}, // 3184
- {wxStyledTextCtrl_PageUpExtend, "wxStyledTextCtrl", "pageUpExtend", 1}, // 3185
- {wxStyledTextCtrl_PageDown, "wxStyledTextCtrl", "pageDown", 1}, // 3186
- {wxStyledTextCtrl_PageDownExtend, "wxStyledTextCtrl", "pageDownExtend", 1}, // 3187
- {wxStyledTextCtrl_EditToggleOvertype, "wxStyledTextCtrl", "editToggleOvertype", 1}, // 3188
- {wxStyledTextCtrl_Cancel, "wxStyledTextCtrl", "cancel", 1}, // 3189
- {wxStyledTextCtrl_DeleteBack, "wxStyledTextCtrl", "deleteBack", 1}, // 3190
- {wxStyledTextCtrl_Tab, "wxStyledTextCtrl", "tab", 1}, // 3191
- {wxStyledTextCtrl_BackTab, "wxStyledTextCtrl", "backTab", 1}, // 3192
- {wxStyledTextCtrl_NewLine, "wxStyledTextCtrl", "newLine", 1}, // 3193
- {wxStyledTextCtrl_FormFeed, "wxStyledTextCtrl", "formFeed", 1}, // 3194
- {wxStyledTextCtrl_VCHome, "wxStyledTextCtrl", "vCHome", 1}, // 3195
- {wxStyledTextCtrl_VCHomeExtend, "wxStyledTextCtrl", "vCHomeExtend", 1}, // 3196
- {wxStyledTextCtrl_ZoomIn, "wxStyledTextCtrl", "zoomIn", 1}, // 3197
- {wxStyledTextCtrl_ZoomOut, "wxStyledTextCtrl", "zoomOut", 1}, // 3198
- {wxStyledTextCtrl_DelWordLeft, "wxStyledTextCtrl", "delWordLeft", 1}, // 3199
- {wxStyledTextCtrl_DelWordRight, "wxStyledTextCtrl", "delWordRight", 1}, // 3200
- {wxStyledTextCtrl_LineCut, "wxStyledTextCtrl", "lineCut", 1}, // 3201
- {wxStyledTextCtrl_LineDelete, "wxStyledTextCtrl", "lineDelete", 1}, // 3202
- {wxStyledTextCtrl_LineTranspose, "wxStyledTextCtrl", "lineTranspose", 1}, // 3203
- {wxStyledTextCtrl_LineDuplicate, "wxStyledTextCtrl", "lineDuplicate", 1}, // 3204
- {wxStyledTextCtrl_LowerCase, "wxStyledTextCtrl", "lowerCase", 1}, // 3205
- {wxStyledTextCtrl_UpperCase, "wxStyledTextCtrl", "upperCase", 1}, // 3206
- {wxStyledTextCtrl_LineScrollDown, "wxStyledTextCtrl", "lineScrollDown", 1}, // 3207
- {wxStyledTextCtrl_LineScrollUp, "wxStyledTextCtrl", "lineScrollUp", 1}, // 3208
- {wxStyledTextCtrl_DeleteBackNotLine, "wxStyledTextCtrl", "deleteBackNotLine", 1}, // 3209
- {wxStyledTextCtrl_HomeDisplay, "wxStyledTextCtrl", "homeDisplay", 1}, // 3210
- {wxStyledTextCtrl_HomeDisplayExtend, "wxStyledTextCtrl", "homeDisplayExtend", 1}, // 3211
- {wxStyledTextCtrl_LineEndDisplay, "wxStyledTextCtrl", "lineEndDisplay", 1}, // 3212
- {wxStyledTextCtrl_LineEndDisplayExtend, "wxStyledTextCtrl", "lineEndDisplayExtend", 1}, // 3213
- {wxStyledTextCtrl_HomeWrapExtend, "wxStyledTextCtrl", "homeWrapExtend", 1}, // 3214
- {wxStyledTextCtrl_LineEndWrap, "wxStyledTextCtrl", "lineEndWrap", 1}, // 3215
- {wxStyledTextCtrl_LineEndWrapExtend, "wxStyledTextCtrl", "lineEndWrapExtend", 1}, // 3216
- {wxStyledTextCtrl_VCHomeWrap, "wxStyledTextCtrl", "vCHomeWrap", 1}, // 3217
- {wxStyledTextCtrl_VCHomeWrapExtend, "wxStyledTextCtrl", "vCHomeWrapExtend", 1}, // 3218
- {wxStyledTextCtrl_LineCopy, "wxStyledTextCtrl", "lineCopy", 1}, // 3219
- {wxStyledTextCtrl_MoveCaretInsideView, "wxStyledTextCtrl", "moveCaretInsideView", 1}, // 3220
- {wxStyledTextCtrl_LineLength, "wxStyledTextCtrl", "lineLength", 2}, // 3221
- {wxStyledTextCtrl_BraceHighlight, "wxStyledTextCtrl", "braceHighlight", 3}, // 3222
- {wxStyledTextCtrl_BraceBadLight, "wxStyledTextCtrl", "braceBadLight", 2}, // 3223
- {wxStyledTextCtrl_BraceMatch, "wxStyledTextCtrl", "braceMatch", 2}, // 3224
- {wxStyledTextCtrl_GetViewEOL, "wxStyledTextCtrl", "getViewEOL", 1}, // 3225
- {wxStyledTextCtrl_SetViewEOL, "wxStyledTextCtrl", "setViewEOL", 2}, // 3226
- {wxStyledTextCtrl_SetModEventMask, "wxStyledTextCtrl", "setModEventMask", 2}, // 3227
- {wxStyledTextCtrl_GetEdgeColumn, "wxStyledTextCtrl", "getEdgeColumn", 1}, // 3228
- {wxStyledTextCtrl_SetEdgeColumn, "wxStyledTextCtrl", "setEdgeColumn", 2}, // 3229
- {wxStyledTextCtrl_SetEdgeMode, "wxStyledTextCtrl", "setEdgeMode", 2}, // 3230
- {wxStyledTextCtrl_GetEdgeMode, "wxStyledTextCtrl", "getEdgeMode", 1}, // 3231
- {wxStyledTextCtrl_GetEdgeColour, "wxStyledTextCtrl", "getEdgeColour", 1}, // 3232
- {wxStyledTextCtrl_SetEdgeColour, "wxStyledTextCtrl", "setEdgeColour", 2}, // 3233
- {wxStyledTextCtrl_SearchAnchor, "wxStyledTextCtrl", "searchAnchor", 1}, // 3234
- {wxStyledTextCtrl_SearchNext, "wxStyledTextCtrl", "searchNext", 3}, // 3235
- {wxStyledTextCtrl_SearchPrev, "wxStyledTextCtrl", "searchPrev", 3}, // 3236
- {wxStyledTextCtrl_LinesOnScreen, "wxStyledTextCtrl", "linesOnScreen", 1}, // 3237
- {wxStyledTextCtrl_UsePopUp, "wxStyledTextCtrl", "usePopUp", 2}, // 3238
- {wxStyledTextCtrl_SelectionIsRectangle, "wxStyledTextCtrl", "selectionIsRectangle", 1}, // 3239
- {wxStyledTextCtrl_SetZoom, "wxStyledTextCtrl", "setZoom", 2}, // 3240
- {wxStyledTextCtrl_GetZoom, "wxStyledTextCtrl", "getZoom", 1}, // 3241
- {wxStyledTextCtrl_GetModEventMask, "wxStyledTextCtrl", "getModEventMask", 1}, // 3242
- {wxStyledTextCtrl_SetSTCFocus, "wxStyledTextCtrl", "setSTCFocus", 2}, // 3243
- {wxStyledTextCtrl_GetSTCFocus, "wxStyledTextCtrl", "getSTCFocus", 1}, // 3244
- {wxStyledTextCtrl_SetStatus, "wxStyledTextCtrl", "setStatus", 2}, // 3245
- {wxStyledTextCtrl_GetStatus, "wxStyledTextCtrl", "getStatus", 1}, // 3246
- {wxStyledTextCtrl_SetMouseDownCaptures, "wxStyledTextCtrl", "setMouseDownCaptures", 2}, // 3247
- {wxStyledTextCtrl_GetMouseDownCaptures, "wxStyledTextCtrl", "getMouseDownCaptures", 1}, // 3248
- {wxStyledTextCtrl_SetSTCCursor, "wxStyledTextCtrl", "setSTCCursor", 2}, // 3249
- {wxStyledTextCtrl_GetSTCCursor, "wxStyledTextCtrl", "getSTCCursor", 1}, // 3250
- {wxStyledTextCtrl_SetControlCharSymbol, "wxStyledTextCtrl", "setControlCharSymbol", 2}, // 3251
- {wxStyledTextCtrl_GetControlCharSymbol, "wxStyledTextCtrl", "getControlCharSymbol", 1}, // 3252
- {wxStyledTextCtrl_WordPartLeft, "wxStyledTextCtrl", "wordPartLeft", 1}, // 3253
- {wxStyledTextCtrl_WordPartLeftExtend, "wxStyledTextCtrl", "wordPartLeftExtend", 1}, // 3254
- {wxStyledTextCtrl_WordPartRight, "wxStyledTextCtrl", "wordPartRight", 1}, // 3255
- {wxStyledTextCtrl_WordPartRightExtend, "wxStyledTextCtrl", "wordPartRightExtend", 1}, // 3256
- {wxStyledTextCtrl_SetVisiblePolicy, "wxStyledTextCtrl", "setVisiblePolicy", 3}, // 3257
- {wxStyledTextCtrl_DelLineLeft, "wxStyledTextCtrl", "delLineLeft", 1}, // 3258
- {wxStyledTextCtrl_DelLineRight, "wxStyledTextCtrl", "delLineRight", 1}, // 3259
- {wxStyledTextCtrl_GetXOffset, "wxStyledTextCtrl", "getXOffset", 1}, // 3260
- {wxStyledTextCtrl_ChooseCaretX, "wxStyledTextCtrl", "chooseCaretX", 1}, // 3261
- {wxStyledTextCtrl_SetXCaretPolicy, "wxStyledTextCtrl", "setXCaretPolicy", 3}, // 3262
- {wxStyledTextCtrl_SetYCaretPolicy, "wxStyledTextCtrl", "setYCaretPolicy", 3}, // 3263
- {wxStyledTextCtrl_GetPrintWrapMode, "wxStyledTextCtrl", "getPrintWrapMode", 1}, // 3264
- {wxStyledTextCtrl_SetHotspotActiveForeground, "wxStyledTextCtrl", "setHotspotActiveForeground", 3}, // 3265
- {wxStyledTextCtrl_SetHotspotActiveBackground, "wxStyledTextCtrl", "setHotspotActiveBackground", 3}, // 3266
- {wxStyledTextCtrl_SetHotspotActiveUnderline, "wxStyledTextCtrl", "setHotspotActiveUnderline", 2}, // 3267
- {wxStyledTextCtrl_SetHotspotSingleLine, "wxStyledTextCtrl", "setHotspotSingleLine", 2}, // 3268
- {wxStyledTextCtrl_ParaDownExtend, "wxStyledTextCtrl", "paraDownExtend", 1}, // 3269
- {wxStyledTextCtrl_ParaUp, "wxStyledTextCtrl", "paraUp", 1}, // 3270
- {wxStyledTextCtrl_ParaUpExtend, "wxStyledTextCtrl", "paraUpExtend", 1}, // 3271
- {wxStyledTextCtrl_PositionBefore, "wxStyledTextCtrl", "positionBefore", 2}, // 3272
- {wxStyledTextCtrl_PositionAfter, "wxStyledTextCtrl", "positionAfter", 2}, // 3273
- {wxStyledTextCtrl_CopyRange, "wxStyledTextCtrl", "copyRange", 3}, // 3274
- {wxStyledTextCtrl_CopyText, "wxStyledTextCtrl", "copyText", 3}, // 3275
- {wxStyledTextCtrl_SetSelectionMode, "wxStyledTextCtrl", "setSelectionMode", 2}, // 3276
- {wxStyledTextCtrl_GetSelectionMode, "wxStyledTextCtrl", "getSelectionMode", 1}, // 3277
- {wxStyledTextCtrl_LineDownRectExtend, "wxStyledTextCtrl", "lineDownRectExtend", 1}, // 3278
- {wxStyledTextCtrl_LineUpRectExtend, "wxStyledTextCtrl", "lineUpRectExtend", 1}, // 3279
- {wxStyledTextCtrl_CharLeftRectExtend, "wxStyledTextCtrl", "charLeftRectExtend", 1}, // 3280
- {wxStyledTextCtrl_CharRightRectExtend, "wxStyledTextCtrl", "charRightRectExtend", 1}, // 3281
- {wxStyledTextCtrl_HomeRectExtend, "wxStyledTextCtrl", "homeRectExtend", 1}, // 3282
- {wxStyledTextCtrl_VCHomeRectExtend, "wxStyledTextCtrl", "vCHomeRectExtend", 1}, // 3283
- {wxStyledTextCtrl_LineEndRectExtend, "wxStyledTextCtrl", "lineEndRectExtend", 1}, // 3284
- {wxStyledTextCtrl_PageUpRectExtend, "wxStyledTextCtrl", "pageUpRectExtend", 1}, // 3285
- {wxStyledTextCtrl_PageDownRectExtend, "wxStyledTextCtrl", "pageDownRectExtend", 1}, // 3286
- {wxStyledTextCtrl_StutteredPageUp, "wxStyledTextCtrl", "stutteredPageUp", 1}, // 3287
- {wxStyledTextCtrl_StutteredPageUpExtend, "wxStyledTextCtrl", "stutteredPageUpExtend", 1}, // 3288
- {wxStyledTextCtrl_StutteredPageDown, "wxStyledTextCtrl", "stutteredPageDown", 1}, // 3289
- {wxStyledTextCtrl_StutteredPageDownExtend, "wxStyledTextCtrl", "stutteredPageDownExtend", 1}, // 3290
- {wxStyledTextCtrl_WordLeftEnd, "wxStyledTextCtrl", "wordLeftEnd", 1}, // 3291
- {wxStyledTextCtrl_WordLeftEndExtend, "wxStyledTextCtrl", "wordLeftEndExtend", 1}, // 3292
- {wxStyledTextCtrl_WordRightEnd, "wxStyledTextCtrl", "wordRightEnd", 1}, // 3293
- {wxStyledTextCtrl_WordRightEndExtend, "wxStyledTextCtrl", "wordRightEndExtend", 1}, // 3294
- {wxStyledTextCtrl_SetWhitespaceChars, "wxStyledTextCtrl", "setWhitespaceChars", 2}, // 3295
- {wxStyledTextCtrl_SetCharsDefault, "wxStyledTextCtrl", "setCharsDefault", 1}, // 3296
- {wxStyledTextCtrl_AutoCompGetCurrent, "wxStyledTextCtrl", "autoCompGetCurrent", 1}, // 3297
- {wxStyledTextCtrl_Allocate, "wxStyledTextCtrl", "allocate", 2}, // 3298
- {wxStyledTextCtrl_FindColumn, "wxStyledTextCtrl", "findColumn", 3}, // 3299
- {wxStyledTextCtrl_GetCaretSticky, "wxStyledTextCtrl", "getCaretSticky", 1}, // 3300
- {wxStyledTextCtrl_SetCaretSticky, "wxStyledTextCtrl", "setCaretSticky", 2}, // 3301
- {wxStyledTextCtrl_ToggleCaretSticky, "wxStyledTextCtrl", "toggleCaretSticky", 1}, // 3302
- {wxStyledTextCtrl_SetPasteConvertEndings, "wxStyledTextCtrl", "setPasteConvertEndings", 2}, // 3303
- {wxStyledTextCtrl_GetPasteConvertEndings, "wxStyledTextCtrl", "getPasteConvertEndings", 1}, // 3304
- {wxStyledTextCtrl_SelectionDuplicate, "wxStyledTextCtrl", "selectionDuplicate", 1}, // 3305
- {wxStyledTextCtrl_SetCaretLineBackAlpha, "wxStyledTextCtrl", "setCaretLineBackAlpha", 2}, // 3306
- {wxStyledTextCtrl_GetCaretLineBackAlpha, "wxStyledTextCtrl", "getCaretLineBackAlpha", 1}, // 3307
- {wxStyledTextCtrl_StartRecord, "wxStyledTextCtrl", "startRecord", 1}, // 3308
- {wxStyledTextCtrl_StopRecord, "wxStyledTextCtrl", "stopRecord", 1}, // 3309
- {wxStyledTextCtrl_SetLexer, "wxStyledTextCtrl", "setLexer", 2}, // 3310
- {wxStyledTextCtrl_GetLexer, "wxStyledTextCtrl", "getLexer", 1}, // 3311
- {wxStyledTextCtrl_Colourise, "wxStyledTextCtrl", "colourise", 3}, // 3312
- {wxStyledTextCtrl_SetProperty, "wxStyledTextCtrl", "setProperty", 3}, // 3313
- {wxStyledTextCtrl_SetKeyWords, "wxStyledTextCtrl", "setKeyWords", 3}, // 3314
- {wxStyledTextCtrl_SetLexerLanguage, "wxStyledTextCtrl", "setLexerLanguage", 2}, // 3315
- {wxStyledTextCtrl_GetProperty, "wxStyledTextCtrl", "getProperty", 2}, // 3316
- {wxStyledTextCtrl_GetStyleBitsNeeded, "wxStyledTextCtrl", "getStyleBitsNeeded", 1}, // 3317
- {wxStyledTextCtrl_GetCurrentLine, "wxStyledTextCtrl", "getCurrentLine", 1}, // 3318
- {wxStyledTextCtrl_StyleSetSpec, "wxStyledTextCtrl", "styleSetSpec", 3}, // 3319
- {wxStyledTextCtrl_StyleSetFont, "wxStyledTextCtrl", "styleSetFont", 3}, // 3320
- {wxStyledTextCtrl_StyleSetFontAttr, "wxStyledTextCtrl", "styleSetFontAttr", 8}, // 3321
- {wxStyledTextCtrl_StyleSetCharacterSet, "wxStyledTextCtrl", "styleSetCharacterSet", 3}, // 3322
- {wxStyledTextCtrl_StyleSetFontEncoding, "wxStyledTextCtrl", "styleSetFontEncoding", 3}, // 3323
- {wxStyledTextCtrl_CmdKeyExecute, "wxStyledTextCtrl", "cmdKeyExecute", 2}, // 3324
- {wxStyledTextCtrl_SetMargins, "wxStyledTextCtrl", "setMargins", 3}, // 3325
- {wxStyledTextCtrl_GetSelection, "wxStyledTextCtrl", "getSelection", 1}, // 3326
- {wxStyledTextCtrl_PointFromPosition, "wxStyledTextCtrl", "pointFromPosition", 2}, // 3327
- {wxStyledTextCtrl_ScrollToLine, "wxStyledTextCtrl", "scrollToLine", 2}, // 3328
- {wxStyledTextCtrl_ScrollToColumn, "wxStyledTextCtrl", "scrollToColumn", 2}, // 3329
- {wxStyledTextCtrl_SetVScrollBar, "wxStyledTextCtrl", "setVScrollBar", 2}, // 3330
- {wxStyledTextCtrl_SetHScrollBar, "wxStyledTextCtrl", "setHScrollBar", 2}, // 3331
- {wxStyledTextCtrl_GetLastKeydownProcessed, "wxStyledTextCtrl", "getLastKeydownProcessed", 1}, // 3332
- {wxStyledTextCtrl_SetLastKeydownProcessed, "wxStyledTextCtrl", "setLastKeydownProcessed", 2}, // 3333
- {wxStyledTextCtrl_SaveFile, "wxStyledTextCtrl", "saveFile", 2}, // 3334
- {wxStyledTextCtrl_LoadFile, "wxStyledTextCtrl", "loadFile", 2}, // 3335
- {wxStyledTextCtrl_DoDragOver, "wxStyledTextCtrl", "doDragOver", 4}, // 3336
- {wxStyledTextCtrl_DoDropText, "wxStyledTextCtrl", "doDropText", 4}, // 3337
- {wxStyledTextCtrl_GetUseAntiAliasing, "wxStyledTextCtrl", "getUseAntiAliasing", 1}, // 3338
- {wxStyledTextCtrl_AddTextRaw, "wxStyledTextCtrl", "addTextRaw", 3}, // 3339
- {wxStyledTextCtrl_InsertTextRaw, "wxStyledTextCtrl", "insertTextRaw", 3}, // 3340
- {wxStyledTextCtrl_GetCurLineRaw, "wxStyledTextCtrl", "getCurLineRaw", 1}, // 3341
- {wxStyledTextCtrl_GetLineRaw, "wxStyledTextCtrl", "getLineRaw", 2}, // 3342
- {wxStyledTextCtrl_GetSelectedTextRaw, "wxStyledTextCtrl", "getSelectedTextRaw", 1}, // 3343
- {wxStyledTextCtrl_GetTextRangeRaw, "wxStyledTextCtrl", "getTextRangeRaw", 3}, // 3344
- {wxStyledTextCtrl_SetTextRaw, "wxStyledTextCtrl", "setTextRaw", 2}, // 3345
- {wxStyledTextCtrl_GetTextRaw, "wxStyledTextCtrl", "getTextRaw", 1}, // 3346
- {wxStyledTextCtrl_AppendTextRaw, "wxStyledTextCtrl", "appendTextRaw", 3}, // 3347
- {wxArtProvider_GetBitmap, "wxArtProvider", "getBitmap", 2}, // 3348
- {wxArtProvider_GetIcon, "wxArtProvider", "getIcon", 2}, // 3349
- {wxTreeEvent_GetKeyCode, "wxTreeEvent", "getKeyCode", 1}, // 3350
- {wxTreeEvent_GetItem, "wxTreeEvent", "getItem", 1}, // 3351
- {wxTreeEvent_GetKeyEvent, "wxTreeEvent", "getKeyEvent", 1}, // 3352
- {wxTreeEvent_GetLabel, "wxTreeEvent", "getLabel", 1}, // 3353
- {wxTreeEvent_GetOldItem, "wxTreeEvent", "getOldItem", 1}, // 3354
- {wxTreeEvent_GetPoint, "wxTreeEvent", "getPoint", 1}, // 3355
- {wxTreeEvent_IsEditCancelled, "wxTreeEvent", "isEditCancelled", 1}, // 3356
- {wxTreeEvent_SetToolTip, "wxTreeEvent", "setToolTip", 2}, // 3357
- {wxBookCtrlEvent_GetOldSelection, "wxBookCtrlEvent", "getOldSelection", 1}, // 3358
- {wxBookCtrlEvent_GetSelection, "wxBookCtrlEvent", "getSelection", 1}, // 3359
- {wxBookCtrlEvent_SetOldSelection, "wxBookCtrlEvent", "setOldSelection", 2}, // 3360
- {wxBookCtrlEvent_SetSelection, "wxBookCtrlEvent", "setSelection", 2}, // 3361
- {wxFileDataObject_new, "wxFileDataObject", "new", 0}, // 3362
- {wxFileDataObject_AddFile, "wxFileDataObject", "addFile", 2}, // 3363
- {wxFileDataObject_GetFilenames, "wxFileDataObject", "getFilenames", 1}, // 3364
- {wxFileDataObject_destroy, "wxFileDataObject", "'Destroy'", 1}, // 3365
- {wxTextDataObject_new, "wxTextDataObject", "new", 1}, // 3366
- {wxTextDataObject_GetTextLength, "wxTextDataObject", "getTextLength", 1}, // 3367
- {wxTextDataObject_GetText, "wxTextDataObject", "getText", 1}, // 3368
- {wxTextDataObject_SetText, "wxTextDataObject", "setText", 2}, // 3369
- {wxTextDataObject_destroy, "wxTextDataObject", "'Destroy'", 1}, // 3370
- {wxBitmapDataObject_new_1_1, "wxBitmapDataObject", "new", 1}, // 3371
- {wxBitmapDataObject_new_1_0, "wxBitmapDataObject", "new", 1}, // 3372
- {wxBitmapDataObject_GetBitmap, "wxBitmapDataObject", "getBitmap", 1}, // 3373
- {wxBitmapDataObject_SetBitmap, "wxBitmapDataObject", "setBitmap", 2}, // 3374
- {wxBitmapDataObject_destroy, "wxBitmapDataObject", "'Destroy'", 1}, // 3375
- {wxClipboard_new, "wxClipboard", "new", 0}, // 3376
- {NULL, "wxClipboard", "destroy", 1}, // 3377 obj destructor wxClipboard_destruct
- {wxClipboard_AddData, "wxClipboard", "addData", 2}, // 3378
- {wxClipboard_Clear, "wxClipboard", "clear", 1}, // 3379
- {wxClipboard_Close, "wxClipboard", "close", 1}, // 3380
- {wxClipboard_Flush, "wxClipboard", "flush", 1}, // 3381
- {wxClipboard_GetData, "wxClipboard", "getData", 2}, // 3382
- {wxClipboard_IsOpened, "wxClipboard", "isOpened", 1}, // 3383
- {wxClipboard_Open, "wxClipboard", "open", 1}, // 3384
- {wxClipboard_SetData, "wxClipboard", "setData", 2}, // 3385
- {wxClipboard_UsePrimarySelection, "wxClipboard", "usePrimarySelection", 2}, // 3386
- {wxClipboard_IsSupported, "wxClipboard", "isSupported", 2}, // 3387
- {wxClipboard_Get, "wxClipboard", "get", 0}, // 3388
- {wxSpinEvent_GetPosition, "wxSpinEvent", "getPosition", 1}, // 3389
- {wxSpinEvent_SetPosition, "wxSpinEvent", "setPosition", 2}, // 3390
- {wxSplitterWindow_new_0, "wxSplitterWindow", "new", 0}, // 3391
- {wxSplitterWindow_new_2, "wxSplitterWindow", "new", 2}, // 3392
- {NULL, "wxSplitterWindow", "destroy", 1}, // 3393 obj destructor wxSplitterWindow_destruct
- {wxSplitterWindow_Create, "wxSplitterWindow", "create", 3}, // 3394
- {wxSplitterWindow_GetMinimumPaneSize, "wxSplitterWindow", "getMinimumPaneSize", 1}, // 3395
- {wxSplitterWindow_GetSashGravity, "wxSplitterWindow", "getSashGravity", 1}, // 3396
- {wxSplitterWindow_GetSashPosition, "wxSplitterWindow", "getSashPosition", 1}, // 3397
- {wxSplitterWindow_GetSplitMode, "wxSplitterWindow", "getSplitMode", 1}, // 3398
- {wxSplitterWindow_GetWindow1, "wxSplitterWindow", "getWindow1", 1}, // 3399
- {wxSplitterWindow_GetWindow2, "wxSplitterWindow", "getWindow2", 1}, // 3400
- {wxSplitterWindow_Initialize, "wxSplitterWindow", "initialize", 2}, // 3401
- {wxSplitterWindow_IsSplit, "wxSplitterWindow", "isSplit", 1}, // 3402
- {wxSplitterWindow_ReplaceWindow, "wxSplitterWindow", "replaceWindow", 3}, // 3403
- {wxSplitterWindow_SetSashGravity, "wxSplitterWindow", "setSashGravity", 2}, // 3404
- {wxSplitterWindow_SetSashPosition, "wxSplitterWindow", "setSashPosition", 3}, // 3405
- {wxSplitterWindow_SetMinimumPaneSize, "wxSplitterWindow", "setMinimumPaneSize", 2}, // 3406
- {wxSplitterWindow_SetSplitMode, "wxSplitterWindow", "setSplitMode", 2}, // 3407
- {wxSplitterWindow_SplitHorizontally, "wxSplitterWindow", "splitHorizontally", 4}, // 3408
- {wxSplitterWindow_SplitVertically, "wxSplitterWindow", "splitVertically", 4}, // 3409
- {wxSplitterWindow_Unsplit, "wxSplitterWindow", "unsplit", 2}, // 3410
- {wxSplitterWindow_UpdateSize, "wxSplitterWindow", "updateSize", 1}, // 3411
- {wxSplitterEvent_GetSashPosition, "wxSplitterEvent", "getSashPosition", 1}, // 3412
- {wxSplitterEvent_GetX, "wxSplitterEvent", "getX", 1}, // 3413
- {wxSplitterEvent_GetY, "wxSplitterEvent", "getY", 1}, // 3414
- {wxSplitterEvent_GetWindowBeingRemoved, "wxSplitterEvent", "getWindowBeingRemoved", 1}, // 3415
- {wxSplitterEvent_SetSashPosition, "wxSplitterEvent", "setSashPosition", 2}, // 3416
- {wxHtmlWindow_new_0, "wxHtmlWindow", "new", 0}, // 3417
- {wxHtmlWindow_new_2, "wxHtmlWindow", "new", 2}, // 3418
- {wxHtmlWindow_AppendToPage, "wxHtmlWindow", "appendToPage", 2}, // 3419
- {wxHtmlWindow_GetOpenedAnchor, "wxHtmlWindow", "getOpenedAnchor", 1}, // 3420
- {wxHtmlWindow_GetOpenedPage, "wxHtmlWindow", "getOpenedPage", 1}, // 3421
- {wxHtmlWindow_GetOpenedPageTitle, "wxHtmlWindow", "getOpenedPageTitle", 1}, // 3422
- {wxHtmlWindow_GetRelatedFrame, "wxHtmlWindow", "getRelatedFrame", 1}, // 3423
- {wxHtmlWindow_HistoryBack, "wxHtmlWindow", "historyBack", 1}, // 3424
- {wxHtmlWindow_HistoryCanBack, "wxHtmlWindow", "historyCanBack", 1}, // 3425
- {wxHtmlWindow_HistoryCanForward, "wxHtmlWindow", "historyCanForward", 1}, // 3426
- {wxHtmlWindow_HistoryClear, "wxHtmlWindow", "historyClear", 1}, // 3427
- {wxHtmlWindow_HistoryForward, "wxHtmlWindow", "historyForward", 1}, // 3428
- {wxHtmlWindow_LoadFile, "wxHtmlWindow", "loadFile", 2}, // 3429
- {wxHtmlWindow_LoadPage, "wxHtmlWindow", "loadPage", 2}, // 3430
- {wxHtmlWindow_SelectAll, "wxHtmlWindow", "selectAll", 1}, // 3431
- {wxHtmlWindow_SelectionToText, "wxHtmlWindow", "selectionToText", 1}, // 3432
- {wxHtmlWindow_SelectLine, "wxHtmlWindow", "selectLine", 2}, // 3433
- {wxHtmlWindow_SelectWord, "wxHtmlWindow", "selectWord", 2}, // 3434
- {wxHtmlWindow_SetBorders, "wxHtmlWindow", "setBorders", 2}, // 3435
- {wxHtmlWindow_SetFonts, "wxHtmlWindow", "setFonts", 4}, // 3436
- {wxHtmlWindow_SetPage, "wxHtmlWindow", "setPage", 2}, // 3437
- {wxHtmlWindow_SetRelatedFrame, "wxHtmlWindow", "setRelatedFrame", 3}, // 3438
- {wxHtmlWindow_SetRelatedStatusBar_1, "wxHtmlWindow", "setRelatedStatusBar", 2}, // 3439
- {wxHtmlWindow_SetRelatedStatusBar_2, "wxHtmlWindow", "setRelatedStatusBar", 3}, // 3440
- {wxHtmlWindow_ToText, "wxHtmlWindow", "toText", 1}, // 3441
- {NULL, "wxHtmlWindow", "'Destroy'", 1}, // 3442 obj destructor wxHtmlWindow_destroy
- {wxHtmlLinkEvent_GetLinkInfo, "wxHtmlLinkEvent", "getLinkInfo", 1}, // 3443
- {wxSystemSettings_GetColour, "wxSystemSettings", "getColour", 1}, // 3444
- {wxSystemSettings_GetFont, "wxSystemSettings", "getFont", 1}, // 3445
- {wxSystemSettings_GetMetric, "wxSystemSettings", "getMetric", 2}, // 3446
- {wxSystemSettings_GetScreenType, "wxSystemSettings", "getScreenType", 0}, // 3447
- {wxSystemOptions_GetOption, "wxSystemOptions", "getOption", 1}, // 3448
- {wxSystemOptions_GetOptionInt, "wxSystemOptions", "getOptionInt", 1}, // 3449
- {wxSystemOptions_HasOption, "wxSystemOptions", "hasOption", 1}, // 3450
- {wxSystemOptions_IsFalse, "wxSystemOptions", "isFalse", 1}, // 3451
- {wxSystemOptions_SetOption_2_1, "wxSystemOptions", "setOption", 2}, // 3452
- {wxSystemOptions_SetOption_2_0, "wxSystemOptions", "setOption", 2}, // 3453
- {wxAuiNotebookEvent_SetSelection, "wxAuiNotebookEvent", "setSelection", 2}, // 3454
- {wxAuiNotebookEvent_GetSelection, "wxAuiNotebookEvent", "getSelection", 1}, // 3455
- {wxAuiNotebookEvent_SetOldSelection, "wxAuiNotebookEvent", "setOldSelection", 2}, // 3456
- {wxAuiNotebookEvent_GetOldSelection, "wxAuiNotebookEvent", "getOldSelection", 1}, // 3457
- {wxAuiNotebookEvent_SetDragSource, "wxAuiNotebookEvent", "setDragSource", 2}, // 3458
- {wxAuiNotebookEvent_GetDragSource, "wxAuiNotebookEvent", "getDragSource", 1}, // 3459
- {wxAuiManagerEvent_SetManager, "wxAuiManagerEvent", "setManager", 2}, // 3460
- {wxAuiManagerEvent_GetManager, "wxAuiManagerEvent", "getManager", 1}, // 3461
- {wxAuiManagerEvent_SetPane, "wxAuiManagerEvent", "setPane", 2}, // 3462
- {wxAuiManagerEvent_GetPane, "wxAuiManagerEvent", "getPane", 1}, // 3463
- {wxAuiManagerEvent_SetButton, "wxAuiManagerEvent", "setButton", 2}, // 3464
- {wxAuiManagerEvent_GetButton, "wxAuiManagerEvent", "getButton", 1}, // 3465
- {wxAuiManagerEvent_SetDC, "wxAuiManagerEvent", "setDC", 2}, // 3466
- {wxAuiManagerEvent_GetDC, "wxAuiManagerEvent", "getDC", 1}, // 3467
- {wxAuiManagerEvent_Veto, "wxAuiManagerEvent", "veto", 2}, // 3468
- {wxAuiManagerEvent_GetVeto, "wxAuiManagerEvent", "getVeto", 1}, // 3469
- {wxAuiManagerEvent_SetCanVeto, "wxAuiManagerEvent", "setCanVeto", 2}, // 3470
- {wxAuiManagerEvent_CanVeto, "wxAuiManagerEvent", "canVeto", 1}, // 3471
- {wxLogNull_new, "wxLogNull", "new", 0}, // 3472
- {wxLogNull_destruct, "wxLogNull", "destroy", 1}, // 3473
- {wxTaskBarIcon_new, "wxTaskBarIcon", "new", 1}, // 3474
- {NULL, "wxTaskBarIcon", "destroy", 1}, // 3475 obj destructor wxTaskBarIcon_destruct
- {wxTaskBarIcon_PopupMenu, "wxTaskBarIcon", "popupMenu", 2}, // 3476
- {wxTaskBarIcon_RemoveIcon, "wxTaskBarIcon", "removeIcon", 1}, // 3477
- {wxTaskBarIcon_SetIcon, "wxTaskBarIcon", "setIcon", 3}, // 3478
- {wxLocale_new_0, "wxLocale", "new", 0}, // 3479
- {wxLocale_new_2_0, "wxLocale", "new", 2}, // 3480
- {wxLocale_new_2_1, "wxLocale", "new", 2}, // 3481
- {wxLocale_destruct, "wxLocale", "destroy", 1}, // 3482
- {wxLocale_Init_1, "wxLocale", "init", 2}, // 3483
- {wxLocale_Init_2, "wxLocale", "init", 3}, // 3484
- {wxLocale_AddCatalog_1, "wxLocale", "addCatalog", 2}, // 3485
- {wxLocale_AddCatalog_2, "wxLocale", "addCatalog", 3}, // 3486
- {wxLocale_AddCatalog_3, "wxLocale", "addCatalog", 4}, // 3487
- {wxLocale_AddCatalogLookupPathPrefix, "wxLocale", "addCatalogLookupPathPrefix", 1}, // 3488
- {wxLocale_GetCanonicalName, "wxLocale", "getCanonicalName", 1}, // 3489
- {wxLocale_GetLanguage, "wxLocale", "getLanguage", 1}, // 3490
- {wxLocale_GetLanguageName, "wxLocale", "getLanguageName", 1}, // 3491
- {wxLocale_GetLocale, "wxLocale", "getLocale", 1}, // 3492
- {wxLocale_GetName, "wxLocale", "getName", 1}, // 3493
- {wxLocale_GetString_2, "wxLocale", "getString", 3}, // 3494
- {wxLocale_GetString_4, "wxLocale", "getString", 5}, // 3495
- {wxLocale_GetHeaderValue, "wxLocale", "getHeaderValue", 3}, // 3496
- {wxLocale_GetSysName, "wxLocale", "getSysName", 1}, // 3497
- {wxLocale_GetSystemEncoding, "wxLocale", "getSystemEncoding", 0}, // 3498
- {wxLocale_GetSystemEncodingName, "wxLocale", "getSystemEncodingName", 0}, // 3499
- {wxLocale_GetSystemLanguage, "wxLocale", "getSystemLanguage", 0}, // 3500
- {wxLocale_IsLoaded, "wxLocale", "isLoaded", 2}, // 3501
- {wxLocale_IsOk, "wxLocale", "isOk", 1}, // 3502
- {wxActivateEvent_GetActive, "wxActivateEvent", "getActive", 1}, // 3503
+ {wxMDIParentFrame_new_0, "wxMDIParentFrame", "new", 0}, // 2646
+ {wxMDIParentFrame_new_4, "wxMDIParentFrame", "new", 4}, // 2647
+ {NULL, "wxMDIParentFrame", "destroy", 1}, // 2648 obj destructor wxMDIParentFrame_destruct
+ {wxMDIParentFrame_ActivateNext, "wxMDIParentFrame", "activateNext", 1}, // 2649
+ {wxMDIParentFrame_ActivatePrevious, "wxMDIParentFrame", "activatePrevious", 1}, // 2650
+ {wxMDIParentFrame_ArrangeIcons, "wxMDIParentFrame", "arrangeIcons", 1}, // 2651
+ {wxMDIParentFrame_Cascade, "wxMDIParentFrame", "cascade", 1}, // 2652
+ {wxMDIParentFrame_Create, "wxMDIParentFrame", "create", 5}, // 2653
+ {wxMDIParentFrame_GetActiveChild, "wxMDIParentFrame", "getActiveChild", 1}, // 2654
+ {wxMDIParentFrame_GetClientWindow, "wxMDIParentFrame", "getClientWindow", 1}, // 2655
+ {wxMDIParentFrame_Tile, "wxMDIParentFrame", "tile", 2}, // 2656
+ {wxMDIChildFrame_new_0, "wxMDIChildFrame", "new", 0}, // 2657
+ {wxMDIChildFrame_new_4, "wxMDIChildFrame", "new", 4}, // 2658
+ {NULL, "wxMDIChildFrame", "destroy", 1}, // 2659 obj destructor wxMDIChildFrame_destruct
+ {wxMDIChildFrame_Activate, "wxMDIChildFrame", "activate", 1}, // 2660
+ {wxMDIChildFrame_Create, "wxMDIChildFrame", "create", 5}, // 2661
+ {wxMDIChildFrame_Maximize, "wxMDIChildFrame", "maximize", 2}, // 2662
+ {wxMDIChildFrame_Restore, "wxMDIChildFrame", "restore", 1}, // 2663
+ {wxMDIClientWindow_new, "wxMDIClientWindow", "new", 0}, // 2664
+ {wxMDIClientWindow_CreateClient, "wxMDIClientWindow", "createClient", 3}, // 2665
+ {NULL, "wxMDIClientWindow", "'Destroy'", 1}, // 2666 obj destructor wxMDIClientWindow_destroy
+ {wxLayoutAlgorithm_new, "wxLayoutAlgorithm", "new", 0}, // 2667
+ {NULL, "wxLayoutAlgorithm", "destroy", 1}, // 2668 obj destructor wxLayoutAlgorithm_destruct
+ {wxLayoutAlgorithm_LayoutFrame, "wxLayoutAlgorithm", "layoutFrame", 3}, // 2669
+ {wxLayoutAlgorithm_LayoutMDIFrame, "wxLayoutAlgorithm", "layoutMDIFrame", 3}, // 2670
+ {wxLayoutAlgorithm_LayoutWindow, "wxLayoutAlgorithm", "layoutWindow", 3}, // 2671
+ {wxEvent_GetId, "wxEvent", "getId", 1}, // 2672
+ {wxEvent_GetSkipped, "wxEvent", "getSkipped", 1}, // 2673
+ {wxEvent_GetTimestamp, "wxEvent", "getTimestamp", 1}, // 2674
+ {wxEvent_IsCommandEvent, "wxEvent", "isCommandEvent", 1}, // 2675
+ {wxEvent_ResumePropagation, "wxEvent", "resumePropagation", 2}, // 2676
+ {wxEvent_ShouldPropagate, "wxEvent", "shouldPropagate", 1}, // 2677
+ {wxEvent_Skip, "wxEvent", "skip", 2}, // 2678
+ {wxEvent_StopPropagation, "wxEvent", "stopPropagation", 1}, // 2679
+ {wxCommandEvent_getClientData, "wxCommandEvent", "getClientData", 1}, // 2680
+ {wxCommandEvent_GetExtraLong, "wxCommandEvent", "getExtraLong", 1}, // 2681
+ {wxCommandEvent_GetInt, "wxCommandEvent", "getInt", 1}, // 2682
+ {wxCommandEvent_GetSelection, "wxCommandEvent", "getSelection", 1}, // 2683
+ {wxCommandEvent_GetString, "wxCommandEvent", "getString", 1}, // 2684
+ {wxCommandEvent_IsChecked, "wxCommandEvent", "isChecked", 1}, // 2685
+ {wxCommandEvent_IsSelection, "wxCommandEvent", "isSelection", 1}, // 2686
+ {wxCommandEvent_SetInt, "wxCommandEvent", "setInt", 2}, // 2687
+ {wxCommandEvent_SetString, "wxCommandEvent", "setString", 2}, // 2688
+ {wxScrollEvent_GetOrientation, "wxScrollEvent", "getOrientation", 1}, // 2689
+ {wxScrollEvent_GetPosition, "wxScrollEvent", "getPosition", 1}, // 2690
+ {wxScrollWinEvent_GetOrientation, "wxScrollWinEvent", "getOrientation", 1}, // 2691
+ {wxScrollWinEvent_GetPosition, "wxScrollWinEvent", "getPosition", 1}, // 2692
+ {wxMouseEvent_AltDown, "wxMouseEvent", "altDown", 1}, // 2693
+ {wxMouseEvent_Button, "wxMouseEvent", "button", 2}, // 2694
+ {wxMouseEvent_ButtonDClick, "wxMouseEvent", "buttonDClick", 2}, // 2695
+ {wxMouseEvent_ButtonDown, "wxMouseEvent", "buttonDown", 2}, // 2696
+ {wxMouseEvent_ButtonUp, "wxMouseEvent", "buttonUp", 2}, // 2697
+ {wxMouseEvent_CmdDown, "wxMouseEvent", "cmdDown", 1}, // 2698
+ {wxMouseEvent_ControlDown, "wxMouseEvent", "controlDown", 1}, // 2699
+ {wxMouseEvent_Dragging, "wxMouseEvent", "dragging", 1}, // 2700
+ {wxMouseEvent_Entering, "wxMouseEvent", "entering", 1}, // 2701
+ {wxMouseEvent_GetButton, "wxMouseEvent", "getButton", 1}, // 2702
+ {wxMouseEvent_GetPosition, "wxMouseEvent", "getPosition", 1}, // 2703
+ {NULL, "", "", 0}, // 2704
+ {wxMouseEvent_GetLogicalPosition, "wxMouseEvent", "getLogicalPosition", 2}, // 2705
+ {wxMouseEvent_GetLinesPerAction, "wxMouseEvent", "getLinesPerAction", 1}, // 2706
+ {wxMouseEvent_GetWheelRotation, "wxMouseEvent", "getWheelRotation", 1}, // 2707
+ {wxMouseEvent_GetWheelDelta, "wxMouseEvent", "getWheelDelta", 1}, // 2708
+ {wxMouseEvent_GetX, "wxMouseEvent", "getX", 1}, // 2709
+ {wxMouseEvent_GetY, "wxMouseEvent", "getY", 1}, // 2710
+ {wxMouseEvent_IsButton, "wxMouseEvent", "isButton", 1}, // 2711
+ {wxMouseEvent_IsPageScroll, "wxMouseEvent", "isPageScroll", 1}, // 2712
+ {wxMouseEvent_Leaving, "wxMouseEvent", "leaving", 1}, // 2713
+ {wxMouseEvent_LeftDClick, "wxMouseEvent", "leftDClick", 1}, // 2714
+ {wxMouseEvent_LeftDown, "wxMouseEvent", "leftDown", 1}, // 2715
+ {wxMouseEvent_LeftIsDown, "wxMouseEvent", "leftIsDown", 1}, // 2716
+ {wxMouseEvent_LeftUp, "wxMouseEvent", "leftUp", 1}, // 2717
+ {wxMouseEvent_MetaDown, "wxMouseEvent", "metaDown", 1}, // 2718
+ {wxMouseEvent_MiddleDClick, "wxMouseEvent", "middleDClick", 1}, // 2719
+ {wxMouseEvent_MiddleDown, "wxMouseEvent", "middleDown", 1}, // 2720
+ {wxMouseEvent_MiddleIsDown, "wxMouseEvent", "middleIsDown", 1}, // 2721
+ {wxMouseEvent_MiddleUp, "wxMouseEvent", "middleUp", 1}, // 2722
+ {wxMouseEvent_Moving, "wxMouseEvent", "moving", 1}, // 2723
+ {wxMouseEvent_RightDClick, "wxMouseEvent", "rightDClick", 1}, // 2724
+ {wxMouseEvent_RightDown, "wxMouseEvent", "rightDown", 1}, // 2725
+ {wxMouseEvent_RightIsDown, "wxMouseEvent", "rightIsDown", 1}, // 2726
+ {wxMouseEvent_RightUp, "wxMouseEvent", "rightUp", 1}, // 2727
+ {wxMouseEvent_ShiftDown, "wxMouseEvent", "shiftDown", 1}, // 2728
+ {wxMouseEvent_GetWheelAxis, "wxMouseEvent", "getWheelAxis", 1}, // 2729
+ {wxSetCursorEvent_GetCursor, "wxSetCursorEvent", "getCursor", 1}, // 2730
+ {wxSetCursorEvent_GetX, "wxSetCursorEvent", "getX", 1}, // 2731
+ {wxSetCursorEvent_GetY, "wxSetCursorEvent", "getY", 1}, // 2732
+ {wxSetCursorEvent_HasCursor, "wxSetCursorEvent", "hasCursor", 1}, // 2733
+ {wxSetCursorEvent_SetCursor, "wxSetCursorEvent", "setCursor", 2}, // 2734
+ {wxKeyEvent_AltDown, "wxKeyEvent", "altDown", 1}, // 2735
+ {wxKeyEvent_CmdDown, "wxKeyEvent", "cmdDown", 1}, // 2736
+ {wxKeyEvent_ControlDown, "wxKeyEvent", "controlDown", 1}, // 2737
+ {wxKeyEvent_GetKeyCode, "wxKeyEvent", "getKeyCode", 1}, // 2738
+ {wxKeyEvent_GetModifiers, "wxKeyEvent", "getModifiers", 1}, // 2739
+ {wxKeyEvent_GetPosition, "wxKeyEvent", "getPosition", 1}, // 2740
+ {NULL, "", "", 0}, // 2741
+ {wxKeyEvent_GetRawKeyCode, "wxKeyEvent", "getRawKeyCode", 1}, // 2742
+ {wxKeyEvent_GetRawKeyFlags, "wxKeyEvent", "getRawKeyFlags", 1}, // 2743
+ {wxKeyEvent_GetUnicodeKey, "wxKeyEvent", "getUnicodeKey", 1}, // 2744
+ {wxKeyEvent_GetX, "wxKeyEvent", "getX", 1}, // 2745
+ {wxKeyEvent_GetY, "wxKeyEvent", "getY", 1}, // 2746
+ {wxKeyEvent_HasModifiers, "wxKeyEvent", "hasModifiers", 1}, // 2747
+ {wxKeyEvent_MetaDown, "wxKeyEvent", "metaDown", 1}, // 2748
+ {wxKeyEvent_ShiftDown, "wxKeyEvent", "shiftDown", 1}, // 2749
+ {wxSizeEvent_GetSize, "wxSizeEvent", "getSize", 1}, // 2750
+ {wxSizeEvent_GetRect, "wxSizeEvent", "getRect", 1}, // 2751
+ {wxMoveEvent_GetPosition, "wxMoveEvent", "getPosition", 1}, // 2752
+ {wxMoveEvent_GetRect, "wxMoveEvent", "getRect", 1}, // 2753
+ {wxEraseEvent_GetDC, "wxEraseEvent", "getDC", 1}, // 2754
+ {wxFocusEvent_GetWindow, "wxFocusEvent", "getWindow", 1}, // 2755
+ {wxChildFocusEvent_GetWindow, "wxChildFocusEvent", "getWindow", 1}, // 2756
+ {wxMenuEvent_GetMenu, "wxMenuEvent", "getMenu", 1}, // 2757
+ {wxMenuEvent_GetMenuId, "wxMenuEvent", "getMenuId", 1}, // 2758
+ {wxMenuEvent_IsPopup, "wxMenuEvent", "isPopup", 1}, // 2759
+ {wxCloseEvent_CanVeto, "wxCloseEvent", "canVeto", 1}, // 2760
+ {wxCloseEvent_GetLoggingOff, "wxCloseEvent", "getLoggingOff", 1}, // 2761
+ {wxCloseEvent_SetCanVeto, "wxCloseEvent", "setCanVeto", 2}, // 2762
+ {wxCloseEvent_SetLoggingOff, "wxCloseEvent", "setLoggingOff", 2}, // 2763
+ {wxCloseEvent_Veto, "wxCloseEvent", "veto", 2}, // 2764
+ {wxShowEvent_SetShow, "wxShowEvent", "setShow", 2}, // 2765
+ {wxShowEvent_IsShown, "wxShowEvent", "isShown", 1}, // 2766
+ {wxIconizeEvent_IsIconized, "wxIconizeEvent", "isIconized", 1}, // 2767
+ {wxJoystickEvent_ButtonDown, "wxJoystickEvent", "buttonDown", 2}, // 2768
+ {wxJoystickEvent_ButtonIsDown, "wxJoystickEvent", "buttonIsDown", 2}, // 2769
+ {wxJoystickEvent_ButtonUp, "wxJoystickEvent", "buttonUp", 2}, // 2770
+ {wxJoystickEvent_GetButtonChange, "wxJoystickEvent", "getButtonChange", 1}, // 2771
+ {wxJoystickEvent_GetButtonState, "wxJoystickEvent", "getButtonState", 1}, // 2772
+ {wxJoystickEvent_GetJoystick, "wxJoystickEvent", "getJoystick", 1}, // 2773
+ {wxJoystickEvent_GetPosition, "wxJoystickEvent", "getPosition", 1}, // 2774
+ {wxJoystickEvent_GetZPosition, "wxJoystickEvent", "getZPosition", 1}, // 2775
+ {wxJoystickEvent_IsButton, "wxJoystickEvent", "isButton", 1}, // 2776
+ {wxJoystickEvent_IsMove, "wxJoystickEvent", "isMove", 1}, // 2777
+ {wxJoystickEvent_IsZMove, "wxJoystickEvent", "isZMove", 1}, // 2778
+ {wxUpdateUIEvent_CanUpdate, "wxUpdateUIEvent", "canUpdate", 1}, // 2779
+ {wxUpdateUIEvent_Check, "wxUpdateUIEvent", "check", 2}, // 2780
+ {wxUpdateUIEvent_Enable, "wxUpdateUIEvent", "enable", 2}, // 2781
+ {wxUpdateUIEvent_Show, "wxUpdateUIEvent", "show", 2}, // 2782
+ {wxUpdateUIEvent_GetChecked, "wxUpdateUIEvent", "getChecked", 1}, // 2783
+ {wxUpdateUIEvent_GetEnabled, "wxUpdateUIEvent", "getEnabled", 1}, // 2784
+ {wxUpdateUIEvent_GetShown, "wxUpdateUIEvent", "getShown", 1}, // 2785
+ {wxUpdateUIEvent_GetSetChecked, "wxUpdateUIEvent", "getSetChecked", 1}, // 2786
+ {wxUpdateUIEvent_GetSetEnabled, "wxUpdateUIEvent", "getSetEnabled", 1}, // 2787
+ {wxUpdateUIEvent_GetSetShown, "wxUpdateUIEvent", "getSetShown", 1}, // 2788
+ {wxUpdateUIEvent_GetSetText, "wxUpdateUIEvent", "getSetText", 1}, // 2789
+ {wxUpdateUIEvent_GetText, "wxUpdateUIEvent", "getText", 1}, // 2790
+ {wxUpdateUIEvent_GetMode, "wxUpdateUIEvent", "getMode", 0}, // 2791
+ {wxUpdateUIEvent_GetUpdateInterval, "wxUpdateUIEvent", "getUpdateInterval", 0}, // 2792
+ {wxUpdateUIEvent_ResetUpdateTime, "wxUpdateUIEvent", "resetUpdateTime", 0}, // 2793
+ {wxUpdateUIEvent_SetMode, "wxUpdateUIEvent", "setMode", 1}, // 2794
+ {wxUpdateUIEvent_SetText, "wxUpdateUIEvent", "setText", 2}, // 2795
+ {wxUpdateUIEvent_SetUpdateInterval, "wxUpdateUIEvent", "setUpdateInterval", 1}, // 2796
+ {wxMouseCaptureChangedEvent_GetCapturedWindow, "wxMouseCaptureChangedEvent", "getCapturedWindow", 1}, // 2797
+ {wxPaletteChangedEvent_SetChangedWindow, "wxPaletteChangedEvent", "setChangedWindow", 2}, // 2798
+ {wxPaletteChangedEvent_GetChangedWindow, "wxPaletteChangedEvent", "getChangedWindow", 1}, // 2799
+ {wxQueryNewPaletteEvent_SetPaletteRealized, "wxQueryNewPaletteEvent", "setPaletteRealized", 2}, // 2800
+ {wxQueryNewPaletteEvent_GetPaletteRealized, "wxQueryNewPaletteEvent", "getPaletteRealized", 1}, // 2801
+ {wxNavigationKeyEvent_GetDirection, "wxNavigationKeyEvent", "getDirection", 1}, // 2802
+ {wxNavigationKeyEvent_SetDirection, "wxNavigationKeyEvent", "setDirection", 2}, // 2803
+ {wxNavigationKeyEvent_IsWindowChange, "wxNavigationKeyEvent", "isWindowChange", 1}, // 2804
+ {wxNavigationKeyEvent_SetWindowChange, "wxNavigationKeyEvent", "setWindowChange", 2}, // 2805
+ {wxNavigationKeyEvent_IsFromTab, "wxNavigationKeyEvent", "isFromTab", 1}, // 2806
+ {wxNavigationKeyEvent_SetFromTab, "wxNavigationKeyEvent", "setFromTab", 2}, // 2807
+ {wxNavigationKeyEvent_GetCurrentFocus, "wxNavigationKeyEvent", "getCurrentFocus", 1}, // 2808
+ {wxNavigationKeyEvent_SetCurrentFocus, "wxNavigationKeyEvent", "setCurrentFocus", 2}, // 2809
+ {wxHelpEvent_GetOrigin, "wxHelpEvent", "getOrigin", 1}, // 2810
+ {wxHelpEvent_GetPosition, "wxHelpEvent", "getPosition", 1}, // 2811
+ {wxHelpEvent_SetOrigin, "wxHelpEvent", "setOrigin", 2}, // 2812
+ {wxHelpEvent_SetPosition, "wxHelpEvent", "setPosition", 2}, // 2813
+ {wxContextMenuEvent_GetPosition, "wxContextMenuEvent", "getPosition", 1}, // 2814
+ {wxContextMenuEvent_SetPosition, "wxContextMenuEvent", "setPosition", 2}, // 2815
+ {wxIdleEvent_GetMode, "wxIdleEvent", "getMode", 0}, // 2816
+ {wxIdleEvent_RequestMore, "wxIdleEvent", "requestMore", 2}, // 2817
+ {wxIdleEvent_MoreRequested, "wxIdleEvent", "moreRequested", 1}, // 2818
+ {wxIdleEvent_SetMode, "wxIdleEvent", "setMode", 1}, // 2819
+ {wxGridEvent_AltDown, "wxGridEvent", "altDown", 1}, // 2820
+ {wxGridEvent_ControlDown, "wxGridEvent", "controlDown", 1}, // 2821
+ {wxGridEvent_GetCol, "wxGridEvent", "getCol", 1}, // 2822
+ {wxGridEvent_GetPosition, "wxGridEvent", "getPosition", 1}, // 2823
+ {wxGridEvent_GetRow, "wxGridEvent", "getRow", 1}, // 2824
+ {wxGridEvent_MetaDown, "wxGridEvent", "metaDown", 1}, // 2825
+ {wxGridEvent_Selecting, "wxGridEvent", "selecting", 1}, // 2826
+ {wxGridEvent_ShiftDown, "wxGridEvent", "shiftDown", 1}, // 2827
+ {wxNotifyEvent_Allow, "wxNotifyEvent", "allow", 1}, // 2828
+ {wxNotifyEvent_IsAllowed, "wxNotifyEvent", "isAllowed", 1}, // 2829
+ {wxNotifyEvent_Veto, "wxNotifyEvent", "veto", 1}, // 2830
+ {wxSashEvent_GetEdge, "wxSashEvent", "getEdge", 1}, // 2831
+ {wxSashEvent_GetDragRect, "wxSashEvent", "getDragRect", 1}, // 2832
+ {wxSashEvent_GetDragStatus, "wxSashEvent", "getDragStatus", 1}, // 2833
+ {wxListEvent_GetCacheFrom, "wxListEvent", "getCacheFrom", 1}, // 2834
+ {wxListEvent_GetCacheTo, "wxListEvent", "getCacheTo", 1}, // 2835
+ {wxListEvent_GetKeyCode, "wxListEvent", "getKeyCode", 1}, // 2836
+ {wxListEvent_GetIndex, "wxListEvent", "getIndex", 1}, // 2837
+ {wxListEvent_GetColumn, "wxListEvent", "getColumn", 1}, // 2838
+ {wxListEvent_GetPoint, "wxListEvent", "getPoint", 1}, // 2839
+ {wxListEvent_GetLabel, "wxListEvent", "getLabel", 1}, // 2840
+ {wxListEvent_GetText, "wxListEvent", "getText", 1}, // 2841
+ {wxListEvent_GetImage, "wxListEvent", "getImage", 1}, // 2842
+ {wxListEvent_GetData, "wxListEvent", "getData", 1}, // 2843
+ {wxListEvent_GetMask, "wxListEvent", "getMask", 1}, // 2844
+ {wxListEvent_GetItem, "wxListEvent", "getItem", 1}, // 2845
+ {wxListEvent_IsEditCancelled, "wxListEvent", "isEditCancelled", 1}, // 2846
+ {wxDateEvent_GetDate, "wxDateEvent", "getDate", 1}, // 2847
+ {wxCalendarEvent_GetWeekDay, "wxCalendarEvent", "getWeekDay", 1}, // 2848
+ {wxCalendarEvent_GetDate, "wxCalendarEvent", "getDate", 1}, // 2849
+ {wxFileDirPickerEvent_GetPath, "wxFileDirPickerEvent", "getPath", 1}, // 2850
+ {wxColourPickerEvent_GetColour, "wxColourPickerEvent", "getColour", 1}, // 2851
+ {wxFontPickerEvent_GetFont, "wxFontPickerEvent", "getFont", 1}, // 2852
+ {wxStyledTextEvent_GetPosition, "wxStyledTextEvent", "getPosition", 1}, // 2853
+ {wxStyledTextEvent_GetKey, "wxStyledTextEvent", "getKey", 1}, // 2854
+ {wxStyledTextEvent_GetModifiers, "wxStyledTextEvent", "getModifiers", 1}, // 2855
+ {wxStyledTextEvent_GetModificationType, "wxStyledTextEvent", "getModificationType", 1}, // 2856
+ {wxStyledTextEvent_GetText, "wxStyledTextEvent", "getText", 1}, // 2857
+ {wxStyledTextEvent_GetLength, "wxStyledTextEvent", "getLength", 1}, // 2858
+ {wxStyledTextEvent_GetLinesAdded, "wxStyledTextEvent", "getLinesAdded", 1}, // 2859
+ {wxStyledTextEvent_GetLine, "wxStyledTextEvent", "getLine", 1}, // 2860
+ {wxStyledTextEvent_GetFoldLevelNow, "wxStyledTextEvent", "getFoldLevelNow", 1}, // 2861
+ {wxStyledTextEvent_GetFoldLevelPrev, "wxStyledTextEvent", "getFoldLevelPrev", 1}, // 2862
+ {wxStyledTextEvent_GetMargin, "wxStyledTextEvent", "getMargin", 1}, // 2863
+ {wxStyledTextEvent_GetMessage, "wxStyledTextEvent", "getMessage", 1}, // 2864
+ {wxStyledTextEvent_GetWParam, "wxStyledTextEvent", "getWParam", 1}, // 2865
+ {wxStyledTextEvent_GetLParam, "wxStyledTextEvent", "getLParam", 1}, // 2866
+ {wxStyledTextEvent_GetListType, "wxStyledTextEvent", "getListType", 1}, // 2867
+ {wxStyledTextEvent_GetX, "wxStyledTextEvent", "getX", 1}, // 2868
+ {wxStyledTextEvent_GetY, "wxStyledTextEvent", "getY", 1}, // 2869
+ {wxStyledTextEvent_GetDragText, "wxStyledTextEvent", "getDragText", 1}, // 2870
+ {wxStyledTextEvent_GetDragAllowMove, "wxStyledTextEvent", "getDragAllowMove", 1}, // 2871
+ {wxStyledTextEvent_GetDragResult, "wxStyledTextEvent", "getDragResult", 1}, // 2872
+ {wxStyledTextEvent_GetShift, "wxStyledTextEvent", "getShift", 1}, // 2873
+ {wxStyledTextEvent_GetControl, "wxStyledTextEvent", "getControl", 1}, // 2874
+ {wxStyledTextEvent_GetAlt, "wxStyledTextEvent", "getAlt", 1}, // 2875
+ {utils_wxGetKeyState, "utils", "getKeyState", 1}, // 2876
+ {utils_wxGetMousePosition, "utils", "getMousePosition", 0}, // 2877
+ {utils_wxGetMouseState, "utils", "getMouseState", 0}, // 2878
+ {utils_wxSetDetectableAutoRepeat, "utils", "setDetectableAutoRepeat", 1}, // 2879
+ {utils_wxBell, "utils", "bell", 0}, // 2880
+ {utils_wxFindMenuItemId, "utils", "findMenuItemId", 3}, // 2881
+ {utils_wxFindWindowAtPoint, "utils", "findWindowAtPoint", 1}, // 2882
+ {utils_wxBeginBusyCursor, "utils", "beginBusyCursor", 1}, // 2883
+ {utils_wxEndBusyCursor, "utils", "endBusyCursor", 0}, // 2884
+ {utils_wxIsBusy, "utils", "isBusy", 0}, // 2885
+ {utils_wxShutdown, "utils", "shutdown", 1}, // 2886
+ {utils_wxShell, "utils", "shell", 1}, // 2887
+ {utils_wxLaunchDefaultBrowser, "utils", "launchDefaultBrowser", 2}, // 2888
+ {utils_wxGetEmailAddress, "utils", "getEmailAddress", 0}, // 2889
+ {utils_wxGetUserId, "utils", "getUserId", 0}, // 2890
+ {utils_wxGetHomeDir, "utils", "getHomeDir", 0}, // 2891
+ {utils_wxNewId, "utils", "newId", 0}, // 2892
+ {utils_wxRegisterId, "utils", "registerId", 1}, // 2893
+ {utils_wxGetCurrentId, "utils", "getCurrentId", 0}, // 2894
+ {utils_wxGetOsDescription, "utils", "getOsDescription", 0}, // 2895
+ {utils_wxIsPlatformLittleEndian, "utils", "isPlatformLittleEndian", 0}, // 2896
+ {utils_wxIsPlatform64Bit, "utils", "isPlatform64Bit", 0}, // 2897
+ {gdicmn_wxDisplaySize, "gdicmn", "displaySize", 0}, // 2898
+ {gdicmn_wxSetCursor, "gdicmn", "setCursor", 1}, // 2899
+ {wxPrintout_new, "wxPrintout", "new", 3}, // 2900
+ {NULL, "wxPrintout", "destroy", 1}, // 2901 obj destructor wxPrintout_destruct
+ {wxPrintout_GetDC, "wxPrintout", "getDC", 1}, // 2902
+ {wxPrintout_GetPageSizeMM, "wxPrintout", "getPageSizeMM", 1}, // 2903
+ {wxPrintout_GetPageSizePixels, "wxPrintout", "getPageSizePixels", 1}, // 2904
+ {wxPrintout_GetPaperRectPixels, "wxPrintout", "getPaperRectPixels", 1}, // 2905
+ {wxPrintout_GetPPIPrinter, "wxPrintout", "getPPIPrinter", 1}, // 2906
+ {wxPrintout_GetPPIScreen, "wxPrintout", "getPPIScreen", 1}, // 2907
+ {wxPrintout_GetTitle, "wxPrintout", "getTitle", 1}, // 2908
+ {wxPrintout_IsPreview, "wxPrintout", "isPreview", 1}, // 2909
+ {wxPrintout_FitThisSizeToPaper, "wxPrintout", "fitThisSizeToPaper", 2}, // 2910
+ {wxPrintout_FitThisSizeToPage, "wxPrintout", "fitThisSizeToPage", 2}, // 2911
+ {wxPrintout_FitThisSizeToPageMargins, "wxPrintout", "fitThisSizeToPageMargins", 3}, // 2912
+ {wxPrintout_MapScreenSizeToPaper, "wxPrintout", "mapScreenSizeToPaper", 1}, // 2913
+ {wxPrintout_MapScreenSizeToPage, "wxPrintout", "mapScreenSizeToPage", 1}, // 2914
+ {wxPrintout_MapScreenSizeToPageMargins, "wxPrintout", "mapScreenSizeToPageMargins", 2}, // 2915
+ {wxPrintout_MapScreenSizeToDevice, "wxPrintout", "mapScreenSizeToDevice", 1}, // 2916
+ {wxPrintout_GetLogicalPaperRect, "wxPrintout", "getLogicalPaperRect", 1}, // 2917
+ {wxPrintout_GetLogicalPageRect, "wxPrintout", "getLogicalPageRect", 1}, // 2918
+ {wxPrintout_GetLogicalPageMarginsRect, "wxPrintout", "getLogicalPageMarginsRect", 2}, // 2919
+ {wxPrintout_SetLogicalOrigin, "wxPrintout", "setLogicalOrigin", 3}, // 2920
+ {wxPrintout_OffsetLogicalOrigin, "wxPrintout", "offsetLogicalOrigin", 3}, // 2921
+ {wxStyledTextCtrl_new_2, "wxStyledTextCtrl", "new", 2}, // 2922
+ {wxStyledTextCtrl_new_0, "wxStyledTextCtrl", "new", 0}, // 2923
+ {NULL, "wxStyledTextCtrl", "destroy", 1}, // 2924 obj destructor wxStyledTextCtrl_destruct
+ {wxStyledTextCtrl_Create, "wxStyledTextCtrl", "create", 3}, // 2925
+ {wxStyledTextCtrl_AddText, "wxStyledTextCtrl", "addText", 2}, // 2926
+ {wxStyledTextCtrl_InsertText, "wxStyledTextCtrl", "insertText", 3}, // 2927
+ {wxStyledTextCtrl_ClearAll, "wxStyledTextCtrl", "clearAll", 1}, // 2928
+ {wxStyledTextCtrl_ClearDocumentStyle, "wxStyledTextCtrl", "clearDocumentStyle", 1}, // 2929
+ {wxStyledTextCtrl_GetLength, "wxStyledTextCtrl", "getLength", 1}, // 2930
+ {wxStyledTextCtrl_GetCharAt, "wxStyledTextCtrl", "getCharAt", 2}, // 2931
+ {wxStyledTextCtrl_GetCurrentPos, "wxStyledTextCtrl", "getCurrentPos", 1}, // 2932
+ {wxStyledTextCtrl_GetAnchor, "wxStyledTextCtrl", "getAnchor", 1}, // 2933
+ {wxStyledTextCtrl_GetStyleAt, "wxStyledTextCtrl", "getStyleAt", 2}, // 2934
+ {wxStyledTextCtrl_Redo, "wxStyledTextCtrl", "redo", 1}, // 2935
+ {wxStyledTextCtrl_SetUndoCollection, "wxStyledTextCtrl", "setUndoCollection", 2}, // 2936
+ {wxStyledTextCtrl_SelectAll, "wxStyledTextCtrl", "selectAll", 1}, // 2937
+ {wxStyledTextCtrl_SetSavePoint, "wxStyledTextCtrl", "setSavePoint", 1}, // 2938
+ {wxStyledTextCtrl_CanRedo, "wxStyledTextCtrl", "canRedo", 1}, // 2939
+ {wxStyledTextCtrl_MarkerLineFromHandle, "wxStyledTextCtrl", "markerLineFromHandle", 2}, // 2940
+ {wxStyledTextCtrl_MarkerDeleteHandle, "wxStyledTextCtrl", "markerDeleteHandle", 2}, // 2941
+ {wxStyledTextCtrl_GetUndoCollection, "wxStyledTextCtrl", "getUndoCollection", 1}, // 2942
+ {wxStyledTextCtrl_GetViewWhiteSpace, "wxStyledTextCtrl", "getViewWhiteSpace", 1}, // 2943
+ {wxStyledTextCtrl_SetViewWhiteSpace, "wxStyledTextCtrl", "setViewWhiteSpace", 2}, // 2944
+ {wxStyledTextCtrl_PositionFromPoint, "wxStyledTextCtrl", "positionFromPoint", 2}, // 2945
+ {wxStyledTextCtrl_PositionFromPointClose, "wxStyledTextCtrl", "positionFromPointClose", 3}, // 2946
+ {wxStyledTextCtrl_GotoLine, "wxStyledTextCtrl", "gotoLine", 2}, // 2947
+ {wxStyledTextCtrl_GotoPos, "wxStyledTextCtrl", "gotoPos", 2}, // 2948
+ {wxStyledTextCtrl_SetAnchor, "wxStyledTextCtrl", "setAnchor", 2}, // 2949
+ {wxStyledTextCtrl_GetCurLine, "wxStyledTextCtrl", "getCurLine", 1}, // 2950
+ {wxStyledTextCtrl_GetEndStyled, "wxStyledTextCtrl", "getEndStyled", 1}, // 2951
+ {wxStyledTextCtrl_ConvertEOLs, "wxStyledTextCtrl", "convertEOLs", 2}, // 2952
+ {wxStyledTextCtrl_GetEOLMode, "wxStyledTextCtrl", "getEOLMode", 1}, // 2953
+ {wxStyledTextCtrl_SetEOLMode, "wxStyledTextCtrl", "setEOLMode", 2}, // 2954
+ {wxStyledTextCtrl_StartStyling, "wxStyledTextCtrl", "startStyling", 2}, // 2955
+ {wxStyledTextCtrl_SetStyling, "wxStyledTextCtrl", "setStyling", 3}, // 2956
+ {wxStyledTextCtrl_GetBufferedDraw, "wxStyledTextCtrl", "getBufferedDraw", 1}, // 2957
+ {wxStyledTextCtrl_SetBufferedDraw, "wxStyledTextCtrl", "setBufferedDraw", 2}, // 2958
+ {wxStyledTextCtrl_SetTabWidth, "wxStyledTextCtrl", "setTabWidth", 2}, // 2959
+ {wxStyledTextCtrl_GetTabWidth, "wxStyledTextCtrl", "getTabWidth", 1}, // 2960
+ {wxStyledTextCtrl_SetCodePage, "wxStyledTextCtrl", "setCodePage", 2}, // 2961
+ {wxStyledTextCtrl_MarkerDefine, "wxStyledTextCtrl", "markerDefine", 4}, // 2962
+ {wxStyledTextCtrl_MarkerSetForeground, "wxStyledTextCtrl", "markerSetForeground", 3}, // 2963
+ {wxStyledTextCtrl_MarkerSetBackground, "wxStyledTextCtrl", "markerSetBackground", 3}, // 2964
+ {wxStyledTextCtrl_MarkerAdd, "wxStyledTextCtrl", "markerAdd", 3}, // 2965
+ {wxStyledTextCtrl_MarkerDelete, "wxStyledTextCtrl", "markerDelete", 3}, // 2966
+ {wxStyledTextCtrl_MarkerDeleteAll, "wxStyledTextCtrl", "markerDeleteAll", 2}, // 2967
+ {wxStyledTextCtrl_MarkerGet, "wxStyledTextCtrl", "markerGet", 2}, // 2968
+ {wxStyledTextCtrl_MarkerNext, "wxStyledTextCtrl", "markerNext", 3}, // 2969
+ {wxStyledTextCtrl_MarkerPrevious, "wxStyledTextCtrl", "markerPrevious", 3}, // 2970
+ {wxStyledTextCtrl_MarkerDefineBitmap, "wxStyledTextCtrl", "markerDefineBitmap", 3}, // 2971
+ {wxStyledTextCtrl_MarkerAddSet, "wxStyledTextCtrl", "markerAddSet", 3}, // 2972
+ {wxStyledTextCtrl_MarkerSetAlpha, "wxStyledTextCtrl", "markerSetAlpha", 3}, // 2973
+ {wxStyledTextCtrl_SetMarginType, "wxStyledTextCtrl", "setMarginType", 3}, // 2974
+ {wxStyledTextCtrl_GetMarginType, "wxStyledTextCtrl", "getMarginType", 2}, // 2975
+ {wxStyledTextCtrl_SetMarginWidth, "wxStyledTextCtrl", "setMarginWidth", 3}, // 2976
+ {wxStyledTextCtrl_GetMarginWidth, "wxStyledTextCtrl", "getMarginWidth", 2}, // 2977
+ {wxStyledTextCtrl_SetMarginMask, "wxStyledTextCtrl", "setMarginMask", 3}, // 2978
+ {wxStyledTextCtrl_GetMarginMask, "wxStyledTextCtrl", "getMarginMask", 2}, // 2979
+ {wxStyledTextCtrl_SetMarginSensitive, "wxStyledTextCtrl", "setMarginSensitive", 3}, // 2980
+ {wxStyledTextCtrl_GetMarginSensitive, "wxStyledTextCtrl", "getMarginSensitive", 2}, // 2981
+ {wxStyledTextCtrl_StyleClearAll, "wxStyledTextCtrl", "styleClearAll", 1}, // 2982
+ {wxStyledTextCtrl_StyleSetForeground, "wxStyledTextCtrl", "styleSetForeground", 3}, // 2983
+ {wxStyledTextCtrl_StyleSetBackground, "wxStyledTextCtrl", "styleSetBackground", 3}, // 2984
+ {wxStyledTextCtrl_StyleSetBold, "wxStyledTextCtrl", "styleSetBold", 3}, // 2985
+ {wxStyledTextCtrl_StyleSetItalic, "wxStyledTextCtrl", "styleSetItalic", 3}, // 2986
+ {wxStyledTextCtrl_StyleSetSize, "wxStyledTextCtrl", "styleSetSize", 3}, // 2987
+ {wxStyledTextCtrl_StyleSetFaceName, "wxStyledTextCtrl", "styleSetFaceName", 3}, // 2988
+ {wxStyledTextCtrl_StyleSetEOLFilled, "wxStyledTextCtrl", "styleSetEOLFilled", 3}, // 2989
+ {wxStyledTextCtrl_StyleResetDefault, "wxStyledTextCtrl", "styleResetDefault", 1}, // 2990
+ {wxStyledTextCtrl_StyleSetUnderline, "wxStyledTextCtrl", "styleSetUnderline", 3}, // 2991
+ {wxStyledTextCtrl_StyleSetCase, "wxStyledTextCtrl", "styleSetCase", 3}, // 2992
+ {wxStyledTextCtrl_StyleSetHotSpot, "wxStyledTextCtrl", "styleSetHotSpot", 3}, // 2993
+ {wxStyledTextCtrl_SetSelForeground, "wxStyledTextCtrl", "setSelForeground", 3}, // 2994
+ {wxStyledTextCtrl_SetSelBackground, "wxStyledTextCtrl", "setSelBackground", 3}, // 2995
+ {wxStyledTextCtrl_GetSelAlpha, "wxStyledTextCtrl", "getSelAlpha", 1}, // 2996
+ {wxStyledTextCtrl_SetSelAlpha, "wxStyledTextCtrl", "setSelAlpha", 2}, // 2997
+ {wxStyledTextCtrl_SetCaretForeground, "wxStyledTextCtrl", "setCaretForeground", 2}, // 2998
+ {wxStyledTextCtrl_CmdKeyAssign, "wxStyledTextCtrl", "cmdKeyAssign", 4}, // 2999
+ {wxStyledTextCtrl_CmdKeyClear, "wxStyledTextCtrl", "cmdKeyClear", 3}, // 3000
+ {wxStyledTextCtrl_CmdKeyClearAll, "wxStyledTextCtrl", "cmdKeyClearAll", 1}, // 3001
+ {wxStyledTextCtrl_SetStyleBytes, "wxStyledTextCtrl", "setStyleBytes", 2}, // 3002
+ {wxStyledTextCtrl_StyleSetVisible, "wxStyledTextCtrl", "styleSetVisible", 3}, // 3003
+ {wxStyledTextCtrl_GetCaretPeriod, "wxStyledTextCtrl", "getCaretPeriod", 1}, // 3004
+ {wxStyledTextCtrl_SetCaretPeriod, "wxStyledTextCtrl", "setCaretPeriod", 2}, // 3005
+ {wxStyledTextCtrl_SetWordChars, "wxStyledTextCtrl", "setWordChars", 2}, // 3006
+ {wxStyledTextCtrl_BeginUndoAction, "wxStyledTextCtrl", "beginUndoAction", 1}, // 3007
+ {wxStyledTextCtrl_EndUndoAction, "wxStyledTextCtrl", "endUndoAction", 1}, // 3008
+ {wxStyledTextCtrl_IndicatorSetStyle, "wxStyledTextCtrl", "indicatorSetStyle", 3}, // 3009
+ {wxStyledTextCtrl_IndicatorGetStyle, "wxStyledTextCtrl", "indicatorGetStyle", 2}, // 3010
+ {wxStyledTextCtrl_IndicatorSetForeground, "wxStyledTextCtrl", "indicatorSetForeground", 3}, // 3011
+ {wxStyledTextCtrl_IndicatorGetForeground, "wxStyledTextCtrl", "indicatorGetForeground", 2}, // 3012
+ {wxStyledTextCtrl_SetWhitespaceForeground, "wxStyledTextCtrl", "setWhitespaceForeground", 3}, // 3013
+ {wxStyledTextCtrl_SetWhitespaceBackground, "wxStyledTextCtrl", "setWhitespaceBackground", 3}, // 3014
+ {wxStyledTextCtrl_GetStyleBits, "wxStyledTextCtrl", "getStyleBits", 1}, // 3015
+ {wxStyledTextCtrl_SetLineState, "wxStyledTextCtrl", "setLineState", 3}, // 3016
+ {wxStyledTextCtrl_GetLineState, "wxStyledTextCtrl", "getLineState", 2}, // 3017
+ {wxStyledTextCtrl_GetMaxLineState, "wxStyledTextCtrl", "getMaxLineState", 1}, // 3018
+ {wxStyledTextCtrl_GetCaretLineVisible, "wxStyledTextCtrl", "getCaretLineVisible", 1}, // 3019
+ {wxStyledTextCtrl_SetCaretLineVisible, "wxStyledTextCtrl", "setCaretLineVisible", 2}, // 3020
+ {wxStyledTextCtrl_GetCaretLineBackground, "wxStyledTextCtrl", "getCaretLineBackground", 1}, // 3021
+ {wxStyledTextCtrl_SetCaretLineBackground, "wxStyledTextCtrl", "setCaretLineBackground", 2}, // 3022
+ {wxStyledTextCtrl_AutoCompShow, "wxStyledTextCtrl", "autoCompShow", 3}, // 3023
+ {wxStyledTextCtrl_AutoCompCancel, "wxStyledTextCtrl", "autoCompCancel", 1}, // 3024
+ {wxStyledTextCtrl_AutoCompActive, "wxStyledTextCtrl", "autoCompActive", 1}, // 3025
+ {wxStyledTextCtrl_AutoCompPosStart, "wxStyledTextCtrl", "autoCompPosStart", 1}, // 3026
+ {wxStyledTextCtrl_AutoCompComplete, "wxStyledTextCtrl", "autoCompComplete", 1}, // 3027
+ {wxStyledTextCtrl_AutoCompStops, "wxStyledTextCtrl", "autoCompStops", 2}, // 3028
+ {wxStyledTextCtrl_AutoCompSetSeparator, "wxStyledTextCtrl", "autoCompSetSeparator", 2}, // 3029
+ {wxStyledTextCtrl_AutoCompGetSeparator, "wxStyledTextCtrl", "autoCompGetSeparator", 1}, // 3030
+ {wxStyledTextCtrl_AutoCompSelect, "wxStyledTextCtrl", "autoCompSelect", 2}, // 3031
+ {wxStyledTextCtrl_AutoCompSetCancelAtStart, "wxStyledTextCtrl", "autoCompSetCancelAtStart", 2}, // 3032
+ {wxStyledTextCtrl_AutoCompGetCancelAtStart, "wxStyledTextCtrl", "autoCompGetCancelAtStart", 1}, // 3033
+ {wxStyledTextCtrl_AutoCompSetFillUps, "wxStyledTextCtrl", "autoCompSetFillUps", 2}, // 3034
+ {wxStyledTextCtrl_AutoCompSetChooseSingle, "wxStyledTextCtrl", "autoCompSetChooseSingle", 2}, // 3035
+ {wxStyledTextCtrl_AutoCompGetChooseSingle, "wxStyledTextCtrl", "autoCompGetChooseSingle", 1}, // 3036
+ {wxStyledTextCtrl_AutoCompSetIgnoreCase, "wxStyledTextCtrl", "autoCompSetIgnoreCase", 2}, // 3037
+ {wxStyledTextCtrl_AutoCompGetIgnoreCase, "wxStyledTextCtrl", "autoCompGetIgnoreCase", 1}, // 3038
+ {wxStyledTextCtrl_UserListShow, "wxStyledTextCtrl", "userListShow", 3}, // 3039
+ {wxStyledTextCtrl_AutoCompSetAutoHide, "wxStyledTextCtrl", "autoCompSetAutoHide", 2}, // 3040
+ {wxStyledTextCtrl_AutoCompGetAutoHide, "wxStyledTextCtrl", "autoCompGetAutoHide", 1}, // 3041
+ {wxStyledTextCtrl_AutoCompSetDropRestOfWord, "wxStyledTextCtrl", "autoCompSetDropRestOfWord", 2}, // 3042
+ {wxStyledTextCtrl_AutoCompGetDropRestOfWord, "wxStyledTextCtrl", "autoCompGetDropRestOfWord", 1}, // 3043
+ {wxStyledTextCtrl_RegisterImage, "wxStyledTextCtrl", "registerImage", 3}, // 3044
+ {wxStyledTextCtrl_ClearRegisteredImages, "wxStyledTextCtrl", "clearRegisteredImages", 1}, // 3045
+ {wxStyledTextCtrl_AutoCompGetTypeSeparator, "wxStyledTextCtrl", "autoCompGetTypeSeparator", 1}, // 3046
+ {wxStyledTextCtrl_AutoCompSetTypeSeparator, "wxStyledTextCtrl", "autoCompSetTypeSeparator", 2}, // 3047
+ {wxStyledTextCtrl_AutoCompSetMaxWidth, "wxStyledTextCtrl", "autoCompSetMaxWidth", 2}, // 3048
+ {wxStyledTextCtrl_AutoCompGetMaxWidth, "wxStyledTextCtrl", "autoCompGetMaxWidth", 1}, // 3049
+ {wxStyledTextCtrl_AutoCompSetMaxHeight, "wxStyledTextCtrl", "autoCompSetMaxHeight", 2}, // 3050
+ {wxStyledTextCtrl_AutoCompGetMaxHeight, "wxStyledTextCtrl", "autoCompGetMaxHeight", 1}, // 3051
+ {wxStyledTextCtrl_SetIndent, "wxStyledTextCtrl", "setIndent", 2}, // 3052
+ {wxStyledTextCtrl_GetIndent, "wxStyledTextCtrl", "getIndent", 1}, // 3053
+ {wxStyledTextCtrl_SetUseTabs, "wxStyledTextCtrl", "setUseTabs", 2}, // 3054
+ {wxStyledTextCtrl_GetUseTabs, "wxStyledTextCtrl", "getUseTabs", 1}, // 3055
+ {wxStyledTextCtrl_SetLineIndentation, "wxStyledTextCtrl", "setLineIndentation", 3}, // 3056
+ {wxStyledTextCtrl_GetLineIndentation, "wxStyledTextCtrl", "getLineIndentation", 2}, // 3057
+ {wxStyledTextCtrl_GetLineIndentPosition, "wxStyledTextCtrl", "getLineIndentPosition", 2}, // 3058
+ {wxStyledTextCtrl_GetColumn, "wxStyledTextCtrl", "getColumn", 2}, // 3059
+ {wxStyledTextCtrl_SetUseHorizontalScrollBar, "wxStyledTextCtrl", "setUseHorizontalScrollBar", 2}, // 3060
+ {wxStyledTextCtrl_GetUseHorizontalScrollBar, "wxStyledTextCtrl", "getUseHorizontalScrollBar", 1}, // 3061
+ {wxStyledTextCtrl_SetIndentationGuides, "wxStyledTextCtrl", "setIndentationGuides", 2}, // 3062
+ {wxStyledTextCtrl_GetIndentationGuides, "wxStyledTextCtrl", "getIndentationGuides", 1}, // 3063
+ {wxStyledTextCtrl_SetHighlightGuide, "wxStyledTextCtrl", "setHighlightGuide", 2}, // 3064
+ {wxStyledTextCtrl_GetHighlightGuide, "wxStyledTextCtrl", "getHighlightGuide", 1}, // 3065
+ {wxStyledTextCtrl_GetLineEndPosition, "wxStyledTextCtrl", "getLineEndPosition", 2}, // 3066
+ {wxStyledTextCtrl_GetCodePage, "wxStyledTextCtrl", "getCodePage", 1}, // 3067
+ {wxStyledTextCtrl_GetCaretForeground, "wxStyledTextCtrl", "getCaretForeground", 1}, // 3068
+ {wxStyledTextCtrl_GetReadOnly, "wxStyledTextCtrl", "getReadOnly", 1}, // 3069
+ {wxStyledTextCtrl_SetCurrentPos, "wxStyledTextCtrl", "setCurrentPos", 2}, // 3070
+ {wxStyledTextCtrl_SetSelectionStart, "wxStyledTextCtrl", "setSelectionStart", 2}, // 3071
+ {wxStyledTextCtrl_GetSelectionStart, "wxStyledTextCtrl", "getSelectionStart", 1}, // 3072
+ {wxStyledTextCtrl_SetSelectionEnd, "wxStyledTextCtrl", "setSelectionEnd", 2}, // 3073
+ {wxStyledTextCtrl_GetSelectionEnd, "wxStyledTextCtrl", "getSelectionEnd", 1}, // 3074
+ {wxStyledTextCtrl_SetPrintMagnification, "wxStyledTextCtrl", "setPrintMagnification", 2}, // 3075
+ {wxStyledTextCtrl_GetPrintMagnification, "wxStyledTextCtrl", "getPrintMagnification", 1}, // 3076
+ {wxStyledTextCtrl_SetPrintColourMode, "wxStyledTextCtrl", "setPrintColourMode", 2}, // 3077
+ {wxStyledTextCtrl_GetPrintColourMode, "wxStyledTextCtrl", "getPrintColourMode", 1}, // 3078
+ {wxStyledTextCtrl_FindText, "wxStyledTextCtrl", "findText", 5}, // 3079
+ {wxStyledTextCtrl_FormatRange, "wxStyledTextCtrl", "formatRange", 8}, // 3080
+ {wxStyledTextCtrl_GetFirstVisibleLine, "wxStyledTextCtrl", "getFirstVisibleLine", 1}, // 3081
+ {wxStyledTextCtrl_GetLine, "wxStyledTextCtrl", "getLine", 2}, // 3082
+ {wxStyledTextCtrl_GetLineCount, "wxStyledTextCtrl", "getLineCount", 1}, // 3083
+ {wxStyledTextCtrl_SetMarginLeft, "wxStyledTextCtrl", "setMarginLeft", 2}, // 3084
+ {wxStyledTextCtrl_GetMarginLeft, "wxStyledTextCtrl", "getMarginLeft", 1}, // 3085
+ {wxStyledTextCtrl_SetMarginRight, "wxStyledTextCtrl", "setMarginRight", 2}, // 3086
+ {wxStyledTextCtrl_GetMarginRight, "wxStyledTextCtrl", "getMarginRight", 1}, // 3087
+ {wxStyledTextCtrl_GetModify, "wxStyledTextCtrl", "getModify", 1}, // 3088
+ {wxStyledTextCtrl_SetSelection, "wxStyledTextCtrl", "setSelection", 3}, // 3089
+ {wxStyledTextCtrl_GetSelectedText, "wxStyledTextCtrl", "getSelectedText", 1}, // 3090
+ {wxStyledTextCtrl_GetTextRange, "wxStyledTextCtrl", "getTextRange", 3}, // 3091
+ {wxStyledTextCtrl_HideSelection, "wxStyledTextCtrl", "hideSelection", 2}, // 3092
+ {wxStyledTextCtrl_LineFromPosition, "wxStyledTextCtrl", "lineFromPosition", 2}, // 3093
+ {wxStyledTextCtrl_PositionFromLine, "wxStyledTextCtrl", "positionFromLine", 2}, // 3094
+ {wxStyledTextCtrl_LineScroll, "wxStyledTextCtrl", "lineScroll", 3}, // 3095
+ {wxStyledTextCtrl_EnsureCaretVisible, "wxStyledTextCtrl", "ensureCaretVisible", 1}, // 3096
+ {wxStyledTextCtrl_ReplaceSelection, "wxStyledTextCtrl", "replaceSelection", 2}, // 3097
+ {wxStyledTextCtrl_SetReadOnly, "wxStyledTextCtrl", "setReadOnly", 2}, // 3098
+ {wxStyledTextCtrl_CanPaste, "wxStyledTextCtrl", "canPaste", 1}, // 3099
+ {wxStyledTextCtrl_CanUndo, "wxStyledTextCtrl", "canUndo", 1}, // 3100
+ {wxStyledTextCtrl_EmptyUndoBuffer, "wxStyledTextCtrl", "emptyUndoBuffer", 1}, // 3101
+ {wxStyledTextCtrl_Undo, "wxStyledTextCtrl", "undo", 1}, // 3102
+ {wxStyledTextCtrl_Cut, "wxStyledTextCtrl", "cut", 1}, // 3103
+ {wxStyledTextCtrl_Copy, "wxStyledTextCtrl", "copy", 1}, // 3104
+ {wxStyledTextCtrl_Paste, "wxStyledTextCtrl", "paste", 1}, // 3105
+ {wxStyledTextCtrl_Clear, "wxStyledTextCtrl", "clear", 1}, // 3106
+ {wxStyledTextCtrl_SetText, "wxStyledTextCtrl", "setText", 2}, // 3107
+ {wxStyledTextCtrl_GetText, "wxStyledTextCtrl", "getText", 1}, // 3108
+ {wxStyledTextCtrl_GetTextLength, "wxStyledTextCtrl", "getTextLength", 1}, // 3109
+ {wxStyledTextCtrl_GetOvertype, "wxStyledTextCtrl", "getOvertype", 1}, // 3110
+ {wxStyledTextCtrl_SetCaretWidth, "wxStyledTextCtrl", "setCaretWidth", 2}, // 3111
+ {wxStyledTextCtrl_GetCaretWidth, "wxStyledTextCtrl", "getCaretWidth", 1}, // 3112
+ {wxStyledTextCtrl_SetTargetStart, "wxStyledTextCtrl", "setTargetStart", 2}, // 3113
+ {wxStyledTextCtrl_GetTargetStart, "wxStyledTextCtrl", "getTargetStart", 1}, // 3114
+ {wxStyledTextCtrl_SetTargetEnd, "wxStyledTextCtrl", "setTargetEnd", 2}, // 3115
+ {wxStyledTextCtrl_GetTargetEnd, "wxStyledTextCtrl", "getTargetEnd", 1}, // 3116
+ {wxStyledTextCtrl_ReplaceTarget, "wxStyledTextCtrl", "replaceTarget", 2}, // 3117
+ {wxStyledTextCtrl_SearchInTarget, "wxStyledTextCtrl", "searchInTarget", 2}, // 3118
+ {wxStyledTextCtrl_SetSearchFlags, "wxStyledTextCtrl", "setSearchFlags", 2}, // 3119
+ {wxStyledTextCtrl_GetSearchFlags, "wxStyledTextCtrl", "getSearchFlags", 1}, // 3120
+ {wxStyledTextCtrl_CallTipShow, "wxStyledTextCtrl", "callTipShow", 3}, // 3121
+ {wxStyledTextCtrl_CallTipCancel, "wxStyledTextCtrl", "callTipCancel", 1}, // 3122
+ {wxStyledTextCtrl_CallTipActive, "wxStyledTextCtrl", "callTipActive", 1}, // 3123
+ {wxStyledTextCtrl_CallTipPosAtStart, "wxStyledTextCtrl", "callTipPosAtStart", 1}, // 3124
+ {wxStyledTextCtrl_CallTipSetHighlight, "wxStyledTextCtrl", "callTipSetHighlight", 3}, // 3125
+ {wxStyledTextCtrl_CallTipSetBackground, "wxStyledTextCtrl", "callTipSetBackground", 2}, // 3126
+ {wxStyledTextCtrl_CallTipSetForeground, "wxStyledTextCtrl", "callTipSetForeground", 2}, // 3127
+ {wxStyledTextCtrl_CallTipSetForegroundHighlight, "wxStyledTextCtrl", "callTipSetForegroundHighlight", 2}, // 3128
+ {wxStyledTextCtrl_CallTipUseStyle, "wxStyledTextCtrl", "callTipUseStyle", 2}, // 3129
+ {wxStyledTextCtrl_VisibleFromDocLine, "wxStyledTextCtrl", "visibleFromDocLine", 2}, // 3130
+ {wxStyledTextCtrl_DocLineFromVisible, "wxStyledTextCtrl", "docLineFromVisible", 2}, // 3131
+ {wxStyledTextCtrl_WrapCount, "wxStyledTextCtrl", "wrapCount", 2}, // 3132
+ {wxStyledTextCtrl_SetFoldLevel, "wxStyledTextCtrl", "setFoldLevel", 3}, // 3133
+ {wxStyledTextCtrl_GetFoldLevel, "wxStyledTextCtrl", "getFoldLevel", 2}, // 3134
+ {wxStyledTextCtrl_GetLastChild, "wxStyledTextCtrl", "getLastChild", 3}, // 3135
+ {wxStyledTextCtrl_GetFoldParent, "wxStyledTextCtrl", "getFoldParent", 2}, // 3136
+ {wxStyledTextCtrl_ShowLines, "wxStyledTextCtrl", "showLines", 3}, // 3137
+ {wxStyledTextCtrl_HideLines, "wxStyledTextCtrl", "hideLines", 3}, // 3138
+ {wxStyledTextCtrl_GetLineVisible, "wxStyledTextCtrl", "getLineVisible", 2}, // 3139
+ {wxStyledTextCtrl_SetFoldExpanded, "wxStyledTextCtrl", "setFoldExpanded", 3}, // 3140
+ {wxStyledTextCtrl_GetFoldExpanded, "wxStyledTextCtrl", "getFoldExpanded", 2}, // 3141
+ {wxStyledTextCtrl_ToggleFold, "wxStyledTextCtrl", "toggleFold", 2}, // 3142
+ {wxStyledTextCtrl_EnsureVisible, "wxStyledTextCtrl", "ensureVisible", 2}, // 3143
+ {wxStyledTextCtrl_SetFoldFlags, "wxStyledTextCtrl", "setFoldFlags", 2}, // 3144
+ {wxStyledTextCtrl_EnsureVisibleEnforcePolicy, "wxStyledTextCtrl", "ensureVisibleEnforcePolicy", 2}, // 3145
+ {wxStyledTextCtrl_SetTabIndents, "wxStyledTextCtrl", "setTabIndents", 2}, // 3146
+ {wxStyledTextCtrl_GetTabIndents, "wxStyledTextCtrl", "getTabIndents", 1}, // 3147
+ {wxStyledTextCtrl_SetBackSpaceUnIndents, "wxStyledTextCtrl", "setBackSpaceUnIndents", 2}, // 3148
+ {wxStyledTextCtrl_GetBackSpaceUnIndents, "wxStyledTextCtrl", "getBackSpaceUnIndents", 1}, // 3149
+ {wxStyledTextCtrl_SetMouseDwellTime, "wxStyledTextCtrl", "setMouseDwellTime", 2}, // 3150
+ {wxStyledTextCtrl_GetMouseDwellTime, "wxStyledTextCtrl", "getMouseDwellTime", 1}, // 3151
+ {wxStyledTextCtrl_WordStartPosition, "wxStyledTextCtrl", "wordStartPosition", 3}, // 3152
+ {wxStyledTextCtrl_WordEndPosition, "wxStyledTextCtrl", "wordEndPosition", 3}, // 3153
+ {wxStyledTextCtrl_SetWrapMode, "wxStyledTextCtrl", "setWrapMode", 2}, // 3154
+ {wxStyledTextCtrl_GetWrapMode, "wxStyledTextCtrl", "getWrapMode", 1}, // 3155
+ {wxStyledTextCtrl_SetWrapVisualFlags, "wxStyledTextCtrl", "setWrapVisualFlags", 2}, // 3156
+ {wxStyledTextCtrl_GetWrapVisualFlags, "wxStyledTextCtrl", "getWrapVisualFlags", 1}, // 3157
+ {wxStyledTextCtrl_SetWrapVisualFlagsLocation, "wxStyledTextCtrl", "setWrapVisualFlagsLocation", 2}, // 3158
+ {wxStyledTextCtrl_GetWrapVisualFlagsLocation, "wxStyledTextCtrl", "getWrapVisualFlagsLocation", 1}, // 3159
+ {wxStyledTextCtrl_SetWrapStartIndent, "wxStyledTextCtrl", "setWrapStartIndent", 2}, // 3160
+ {wxStyledTextCtrl_GetWrapStartIndent, "wxStyledTextCtrl", "getWrapStartIndent", 1}, // 3161
+ {wxStyledTextCtrl_SetLayoutCache, "wxStyledTextCtrl", "setLayoutCache", 2}, // 3162
+ {wxStyledTextCtrl_GetLayoutCache, "wxStyledTextCtrl", "getLayoutCache", 1}, // 3163
+ {wxStyledTextCtrl_SetScrollWidth, "wxStyledTextCtrl", "setScrollWidth", 2}, // 3164
+ {wxStyledTextCtrl_GetScrollWidth, "wxStyledTextCtrl", "getScrollWidth", 1}, // 3165
+ {wxStyledTextCtrl_TextWidth, "wxStyledTextCtrl", "textWidth", 3}, // 3166
+ {wxStyledTextCtrl_GetEndAtLastLine, "wxStyledTextCtrl", "getEndAtLastLine", 1}, // 3167
+ {wxStyledTextCtrl_TextHeight, "wxStyledTextCtrl", "textHeight", 2}, // 3168
+ {wxStyledTextCtrl_SetUseVerticalScrollBar, "wxStyledTextCtrl", "setUseVerticalScrollBar", 2}, // 3169
+ {wxStyledTextCtrl_GetUseVerticalScrollBar, "wxStyledTextCtrl", "getUseVerticalScrollBar", 1}, // 3170
+ {wxStyledTextCtrl_AppendText, "wxStyledTextCtrl", "appendText", 2}, // 3171
+ {wxStyledTextCtrl_GetTwoPhaseDraw, "wxStyledTextCtrl", "getTwoPhaseDraw", 1}, // 3172
+ {wxStyledTextCtrl_SetTwoPhaseDraw, "wxStyledTextCtrl", "setTwoPhaseDraw", 2}, // 3173
+ {wxStyledTextCtrl_TargetFromSelection, "wxStyledTextCtrl", "targetFromSelection", 1}, // 3174
+ {wxStyledTextCtrl_LinesJoin, "wxStyledTextCtrl", "linesJoin", 1}, // 3175
+ {wxStyledTextCtrl_LinesSplit, "wxStyledTextCtrl", "linesSplit", 2}, // 3176
+ {wxStyledTextCtrl_SetFoldMarginColour, "wxStyledTextCtrl", "setFoldMarginColour", 3}, // 3177
+ {wxStyledTextCtrl_SetFoldMarginHiColour, "wxStyledTextCtrl", "setFoldMarginHiColour", 3}, // 3178
+ {wxStyledTextCtrl_LineDown, "wxStyledTextCtrl", "lineDown", 1}, // 3179
+ {wxStyledTextCtrl_LineDownExtend, "wxStyledTextCtrl", "lineDownExtend", 1}, // 3180
+ {wxStyledTextCtrl_LineUp, "wxStyledTextCtrl", "lineUp", 1}, // 3181
+ {wxStyledTextCtrl_LineUpExtend, "wxStyledTextCtrl", "lineUpExtend", 1}, // 3182
+ {wxStyledTextCtrl_CharLeft, "wxStyledTextCtrl", "charLeft", 1}, // 3183
+ {wxStyledTextCtrl_CharLeftExtend, "wxStyledTextCtrl", "charLeftExtend", 1}, // 3184
+ {wxStyledTextCtrl_CharRight, "wxStyledTextCtrl", "charRight", 1}, // 3185
+ {wxStyledTextCtrl_CharRightExtend, "wxStyledTextCtrl", "charRightExtend", 1}, // 3186
+ {wxStyledTextCtrl_WordLeft, "wxStyledTextCtrl", "wordLeft", 1}, // 3187
+ {wxStyledTextCtrl_WordLeftExtend, "wxStyledTextCtrl", "wordLeftExtend", 1}, // 3188
+ {wxStyledTextCtrl_WordRight, "wxStyledTextCtrl", "wordRight", 1}, // 3189
+ {wxStyledTextCtrl_WordRightExtend, "wxStyledTextCtrl", "wordRightExtend", 1}, // 3190
+ {wxStyledTextCtrl_Home, "wxStyledTextCtrl", "home", 1}, // 3191
+ {wxStyledTextCtrl_HomeExtend, "wxStyledTextCtrl", "homeExtend", 1}, // 3192
+ {wxStyledTextCtrl_LineEnd, "wxStyledTextCtrl", "lineEnd", 1}, // 3193
+ {wxStyledTextCtrl_LineEndExtend, "wxStyledTextCtrl", "lineEndExtend", 1}, // 3194
+ {wxStyledTextCtrl_DocumentStart, "wxStyledTextCtrl", "documentStart", 1}, // 3195
+ {wxStyledTextCtrl_DocumentStartExtend, "wxStyledTextCtrl", "documentStartExtend", 1}, // 3196
+ {wxStyledTextCtrl_DocumentEnd, "wxStyledTextCtrl", "documentEnd", 1}, // 3197
+ {wxStyledTextCtrl_DocumentEndExtend, "wxStyledTextCtrl", "documentEndExtend", 1}, // 3198
+ {wxStyledTextCtrl_PageUp, "wxStyledTextCtrl", "pageUp", 1}, // 3199
+ {wxStyledTextCtrl_PageUpExtend, "wxStyledTextCtrl", "pageUpExtend", 1}, // 3200
+ {wxStyledTextCtrl_PageDown, "wxStyledTextCtrl", "pageDown", 1}, // 3201
+ {wxStyledTextCtrl_PageDownExtend, "wxStyledTextCtrl", "pageDownExtend", 1}, // 3202
+ {wxStyledTextCtrl_EditToggleOvertype, "wxStyledTextCtrl", "editToggleOvertype", 1}, // 3203
+ {wxStyledTextCtrl_Cancel, "wxStyledTextCtrl", "cancel", 1}, // 3204
+ {wxStyledTextCtrl_DeleteBack, "wxStyledTextCtrl", "deleteBack", 1}, // 3205
+ {wxStyledTextCtrl_Tab, "wxStyledTextCtrl", "tab", 1}, // 3206
+ {wxStyledTextCtrl_BackTab, "wxStyledTextCtrl", "backTab", 1}, // 3207
+ {wxStyledTextCtrl_NewLine, "wxStyledTextCtrl", "newLine", 1}, // 3208
+ {wxStyledTextCtrl_FormFeed, "wxStyledTextCtrl", "formFeed", 1}, // 3209
+ {wxStyledTextCtrl_VCHome, "wxStyledTextCtrl", "vCHome", 1}, // 3210
+ {wxStyledTextCtrl_VCHomeExtend, "wxStyledTextCtrl", "vCHomeExtend", 1}, // 3211
+ {wxStyledTextCtrl_ZoomIn, "wxStyledTextCtrl", "zoomIn", 1}, // 3212
+ {wxStyledTextCtrl_ZoomOut, "wxStyledTextCtrl", "zoomOut", 1}, // 3213
+ {wxStyledTextCtrl_DelWordLeft, "wxStyledTextCtrl", "delWordLeft", 1}, // 3214
+ {wxStyledTextCtrl_DelWordRight, "wxStyledTextCtrl", "delWordRight", 1}, // 3215
+ {wxStyledTextCtrl_LineCut, "wxStyledTextCtrl", "lineCut", 1}, // 3216
+ {wxStyledTextCtrl_LineDelete, "wxStyledTextCtrl", "lineDelete", 1}, // 3217
+ {wxStyledTextCtrl_LineTranspose, "wxStyledTextCtrl", "lineTranspose", 1}, // 3218
+ {wxStyledTextCtrl_LineDuplicate, "wxStyledTextCtrl", "lineDuplicate", 1}, // 3219
+ {wxStyledTextCtrl_LowerCase, "wxStyledTextCtrl", "lowerCase", 1}, // 3220
+ {wxStyledTextCtrl_UpperCase, "wxStyledTextCtrl", "upperCase", 1}, // 3221
+ {wxStyledTextCtrl_LineScrollDown, "wxStyledTextCtrl", "lineScrollDown", 1}, // 3222
+ {wxStyledTextCtrl_LineScrollUp, "wxStyledTextCtrl", "lineScrollUp", 1}, // 3223
+ {wxStyledTextCtrl_DeleteBackNotLine, "wxStyledTextCtrl", "deleteBackNotLine", 1}, // 3224
+ {wxStyledTextCtrl_HomeDisplay, "wxStyledTextCtrl", "homeDisplay", 1}, // 3225
+ {wxStyledTextCtrl_HomeDisplayExtend, "wxStyledTextCtrl", "homeDisplayExtend", 1}, // 3226
+ {wxStyledTextCtrl_LineEndDisplay, "wxStyledTextCtrl", "lineEndDisplay", 1}, // 3227
+ {wxStyledTextCtrl_LineEndDisplayExtend, "wxStyledTextCtrl", "lineEndDisplayExtend", 1}, // 3228
+ {wxStyledTextCtrl_HomeWrapExtend, "wxStyledTextCtrl", "homeWrapExtend", 1}, // 3229
+ {wxStyledTextCtrl_LineEndWrap, "wxStyledTextCtrl", "lineEndWrap", 1}, // 3230
+ {wxStyledTextCtrl_LineEndWrapExtend, "wxStyledTextCtrl", "lineEndWrapExtend", 1}, // 3231
+ {wxStyledTextCtrl_VCHomeWrap, "wxStyledTextCtrl", "vCHomeWrap", 1}, // 3232
+ {wxStyledTextCtrl_VCHomeWrapExtend, "wxStyledTextCtrl", "vCHomeWrapExtend", 1}, // 3233
+ {wxStyledTextCtrl_LineCopy, "wxStyledTextCtrl", "lineCopy", 1}, // 3234
+ {wxStyledTextCtrl_MoveCaretInsideView, "wxStyledTextCtrl", "moveCaretInsideView", 1}, // 3235
+ {wxStyledTextCtrl_LineLength, "wxStyledTextCtrl", "lineLength", 2}, // 3236
+ {wxStyledTextCtrl_BraceHighlight, "wxStyledTextCtrl", "braceHighlight", 3}, // 3237
+ {wxStyledTextCtrl_BraceBadLight, "wxStyledTextCtrl", "braceBadLight", 2}, // 3238
+ {wxStyledTextCtrl_BraceMatch, "wxStyledTextCtrl", "braceMatch", 2}, // 3239
+ {wxStyledTextCtrl_GetViewEOL, "wxStyledTextCtrl", "getViewEOL", 1}, // 3240
+ {wxStyledTextCtrl_SetViewEOL, "wxStyledTextCtrl", "setViewEOL", 2}, // 3241
+ {wxStyledTextCtrl_SetModEventMask, "wxStyledTextCtrl", "setModEventMask", 2}, // 3242
+ {wxStyledTextCtrl_GetEdgeColumn, "wxStyledTextCtrl", "getEdgeColumn", 1}, // 3243
+ {wxStyledTextCtrl_SetEdgeColumn, "wxStyledTextCtrl", "setEdgeColumn", 2}, // 3244
+ {wxStyledTextCtrl_SetEdgeMode, "wxStyledTextCtrl", "setEdgeMode", 2}, // 3245
+ {wxStyledTextCtrl_GetEdgeMode, "wxStyledTextCtrl", "getEdgeMode", 1}, // 3246
+ {wxStyledTextCtrl_GetEdgeColour, "wxStyledTextCtrl", "getEdgeColour", 1}, // 3247
+ {wxStyledTextCtrl_SetEdgeColour, "wxStyledTextCtrl", "setEdgeColour", 2}, // 3248
+ {wxStyledTextCtrl_SearchAnchor, "wxStyledTextCtrl", "searchAnchor", 1}, // 3249
+ {wxStyledTextCtrl_SearchNext, "wxStyledTextCtrl", "searchNext", 3}, // 3250
+ {wxStyledTextCtrl_SearchPrev, "wxStyledTextCtrl", "searchPrev", 3}, // 3251
+ {wxStyledTextCtrl_LinesOnScreen, "wxStyledTextCtrl", "linesOnScreen", 1}, // 3252
+ {wxStyledTextCtrl_UsePopUp, "wxStyledTextCtrl", "usePopUp", 2}, // 3253
+ {wxStyledTextCtrl_SelectionIsRectangle, "wxStyledTextCtrl", "selectionIsRectangle", 1}, // 3254
+ {wxStyledTextCtrl_SetZoom, "wxStyledTextCtrl", "setZoom", 2}, // 3255
+ {wxStyledTextCtrl_GetZoom, "wxStyledTextCtrl", "getZoom", 1}, // 3256
+ {wxStyledTextCtrl_GetModEventMask, "wxStyledTextCtrl", "getModEventMask", 1}, // 3257
+ {wxStyledTextCtrl_SetSTCFocus, "wxStyledTextCtrl", "setSTCFocus", 2}, // 3258
+ {wxStyledTextCtrl_GetSTCFocus, "wxStyledTextCtrl", "getSTCFocus", 1}, // 3259
+ {wxStyledTextCtrl_SetStatus, "wxStyledTextCtrl", "setStatus", 2}, // 3260
+ {wxStyledTextCtrl_GetStatus, "wxStyledTextCtrl", "getStatus", 1}, // 3261
+ {wxStyledTextCtrl_SetMouseDownCaptures, "wxStyledTextCtrl", "setMouseDownCaptures", 2}, // 3262
+ {wxStyledTextCtrl_GetMouseDownCaptures, "wxStyledTextCtrl", "getMouseDownCaptures", 1}, // 3263
+ {wxStyledTextCtrl_SetSTCCursor, "wxStyledTextCtrl", "setSTCCursor", 2}, // 3264
+ {wxStyledTextCtrl_GetSTCCursor, "wxStyledTextCtrl", "getSTCCursor", 1}, // 3265
+ {wxStyledTextCtrl_SetControlCharSymbol, "wxStyledTextCtrl", "setControlCharSymbol", 2}, // 3266
+ {wxStyledTextCtrl_GetControlCharSymbol, "wxStyledTextCtrl", "getControlCharSymbol", 1}, // 3267
+ {wxStyledTextCtrl_WordPartLeft, "wxStyledTextCtrl", "wordPartLeft", 1}, // 3268
+ {wxStyledTextCtrl_WordPartLeftExtend, "wxStyledTextCtrl", "wordPartLeftExtend", 1}, // 3269
+ {wxStyledTextCtrl_WordPartRight, "wxStyledTextCtrl", "wordPartRight", 1}, // 3270
+ {wxStyledTextCtrl_WordPartRightExtend, "wxStyledTextCtrl", "wordPartRightExtend", 1}, // 3271
+ {wxStyledTextCtrl_SetVisiblePolicy, "wxStyledTextCtrl", "setVisiblePolicy", 3}, // 3272
+ {wxStyledTextCtrl_DelLineLeft, "wxStyledTextCtrl", "delLineLeft", 1}, // 3273
+ {wxStyledTextCtrl_DelLineRight, "wxStyledTextCtrl", "delLineRight", 1}, // 3274
+ {wxStyledTextCtrl_GetXOffset, "wxStyledTextCtrl", "getXOffset", 1}, // 3275
+ {wxStyledTextCtrl_ChooseCaretX, "wxStyledTextCtrl", "chooseCaretX", 1}, // 3276
+ {wxStyledTextCtrl_SetXCaretPolicy, "wxStyledTextCtrl", "setXCaretPolicy", 3}, // 3277
+ {wxStyledTextCtrl_SetYCaretPolicy, "wxStyledTextCtrl", "setYCaretPolicy", 3}, // 3278
+ {wxStyledTextCtrl_GetPrintWrapMode, "wxStyledTextCtrl", "getPrintWrapMode", 1}, // 3279
+ {wxStyledTextCtrl_SetHotspotActiveForeground, "wxStyledTextCtrl", "setHotspotActiveForeground", 3}, // 3280
+ {wxStyledTextCtrl_SetHotspotActiveBackground, "wxStyledTextCtrl", "setHotspotActiveBackground", 3}, // 3281
+ {wxStyledTextCtrl_SetHotspotActiveUnderline, "wxStyledTextCtrl", "setHotspotActiveUnderline", 2}, // 3282
+ {wxStyledTextCtrl_SetHotspotSingleLine, "wxStyledTextCtrl", "setHotspotSingleLine", 2}, // 3283
+ {wxStyledTextCtrl_ParaDownExtend, "wxStyledTextCtrl", "paraDownExtend", 1}, // 3284
+ {wxStyledTextCtrl_ParaUp, "wxStyledTextCtrl", "paraUp", 1}, // 3285
+ {wxStyledTextCtrl_ParaUpExtend, "wxStyledTextCtrl", "paraUpExtend", 1}, // 3286
+ {wxStyledTextCtrl_PositionBefore, "wxStyledTextCtrl", "positionBefore", 2}, // 3287
+ {wxStyledTextCtrl_PositionAfter, "wxStyledTextCtrl", "positionAfter", 2}, // 3288
+ {wxStyledTextCtrl_CopyRange, "wxStyledTextCtrl", "copyRange", 3}, // 3289
+ {wxStyledTextCtrl_CopyText, "wxStyledTextCtrl", "copyText", 3}, // 3290
+ {wxStyledTextCtrl_SetSelectionMode, "wxStyledTextCtrl", "setSelectionMode", 2}, // 3291
+ {wxStyledTextCtrl_GetSelectionMode, "wxStyledTextCtrl", "getSelectionMode", 1}, // 3292
+ {wxStyledTextCtrl_LineDownRectExtend, "wxStyledTextCtrl", "lineDownRectExtend", 1}, // 3293
+ {wxStyledTextCtrl_LineUpRectExtend, "wxStyledTextCtrl", "lineUpRectExtend", 1}, // 3294
+ {wxStyledTextCtrl_CharLeftRectExtend, "wxStyledTextCtrl", "charLeftRectExtend", 1}, // 3295
+ {wxStyledTextCtrl_CharRightRectExtend, "wxStyledTextCtrl", "charRightRectExtend", 1}, // 3296
+ {wxStyledTextCtrl_HomeRectExtend, "wxStyledTextCtrl", "homeRectExtend", 1}, // 3297
+ {wxStyledTextCtrl_VCHomeRectExtend, "wxStyledTextCtrl", "vCHomeRectExtend", 1}, // 3298
+ {wxStyledTextCtrl_LineEndRectExtend, "wxStyledTextCtrl", "lineEndRectExtend", 1}, // 3299
+ {wxStyledTextCtrl_PageUpRectExtend, "wxStyledTextCtrl", "pageUpRectExtend", 1}, // 3300
+ {wxStyledTextCtrl_PageDownRectExtend, "wxStyledTextCtrl", "pageDownRectExtend", 1}, // 3301
+ {wxStyledTextCtrl_StutteredPageUp, "wxStyledTextCtrl", "stutteredPageUp", 1}, // 3302
+ {wxStyledTextCtrl_StutteredPageUpExtend, "wxStyledTextCtrl", "stutteredPageUpExtend", 1}, // 3303
+ {wxStyledTextCtrl_StutteredPageDown, "wxStyledTextCtrl", "stutteredPageDown", 1}, // 3304
+ {wxStyledTextCtrl_StutteredPageDownExtend, "wxStyledTextCtrl", "stutteredPageDownExtend", 1}, // 3305
+ {wxStyledTextCtrl_WordLeftEnd, "wxStyledTextCtrl", "wordLeftEnd", 1}, // 3306
+ {wxStyledTextCtrl_WordLeftEndExtend, "wxStyledTextCtrl", "wordLeftEndExtend", 1}, // 3307
+ {wxStyledTextCtrl_WordRightEnd, "wxStyledTextCtrl", "wordRightEnd", 1}, // 3308
+ {wxStyledTextCtrl_WordRightEndExtend, "wxStyledTextCtrl", "wordRightEndExtend", 1}, // 3309
+ {wxStyledTextCtrl_SetWhitespaceChars, "wxStyledTextCtrl", "setWhitespaceChars", 2}, // 3310
+ {wxStyledTextCtrl_SetCharsDefault, "wxStyledTextCtrl", "setCharsDefault", 1}, // 3311
+ {wxStyledTextCtrl_AutoCompGetCurrent, "wxStyledTextCtrl", "autoCompGetCurrent", 1}, // 3312
+ {wxStyledTextCtrl_Allocate, "wxStyledTextCtrl", "allocate", 2}, // 3313
+ {wxStyledTextCtrl_FindColumn, "wxStyledTextCtrl", "findColumn", 3}, // 3314
+ {wxStyledTextCtrl_GetCaretSticky, "wxStyledTextCtrl", "getCaretSticky", 1}, // 3315
+ {wxStyledTextCtrl_SetCaretSticky, "wxStyledTextCtrl", "setCaretSticky", 2}, // 3316
+ {wxStyledTextCtrl_ToggleCaretSticky, "wxStyledTextCtrl", "toggleCaretSticky", 1}, // 3317
+ {wxStyledTextCtrl_SetPasteConvertEndings, "wxStyledTextCtrl", "setPasteConvertEndings", 2}, // 3318
+ {wxStyledTextCtrl_GetPasteConvertEndings, "wxStyledTextCtrl", "getPasteConvertEndings", 1}, // 3319
+ {wxStyledTextCtrl_SelectionDuplicate, "wxStyledTextCtrl", "selectionDuplicate", 1}, // 3320
+ {wxStyledTextCtrl_SetCaretLineBackAlpha, "wxStyledTextCtrl", "setCaretLineBackAlpha", 2}, // 3321
+ {wxStyledTextCtrl_GetCaretLineBackAlpha, "wxStyledTextCtrl", "getCaretLineBackAlpha", 1}, // 3322
+ {wxStyledTextCtrl_StartRecord, "wxStyledTextCtrl", "startRecord", 1}, // 3323
+ {wxStyledTextCtrl_StopRecord, "wxStyledTextCtrl", "stopRecord", 1}, // 3324
+ {wxStyledTextCtrl_SetLexer, "wxStyledTextCtrl", "setLexer", 2}, // 3325
+ {wxStyledTextCtrl_GetLexer, "wxStyledTextCtrl", "getLexer", 1}, // 3326
+ {wxStyledTextCtrl_Colourise, "wxStyledTextCtrl", "colourise", 3}, // 3327
+ {wxStyledTextCtrl_SetProperty, "wxStyledTextCtrl", "setProperty", 3}, // 3328
+ {wxStyledTextCtrl_SetKeyWords, "wxStyledTextCtrl", "setKeyWords", 3}, // 3329
+ {wxStyledTextCtrl_SetLexerLanguage, "wxStyledTextCtrl", "setLexerLanguage", 2}, // 3330
+ {wxStyledTextCtrl_GetProperty, "wxStyledTextCtrl", "getProperty", 2}, // 3331
+ {wxStyledTextCtrl_GetStyleBitsNeeded, "wxStyledTextCtrl", "getStyleBitsNeeded", 1}, // 3332
+ {wxStyledTextCtrl_GetCurrentLine, "wxStyledTextCtrl", "getCurrentLine", 1}, // 3333
+ {wxStyledTextCtrl_StyleSetSpec, "wxStyledTextCtrl", "styleSetSpec", 3}, // 3334
+ {wxStyledTextCtrl_StyleSetFont, "wxStyledTextCtrl", "styleSetFont", 3}, // 3335
+ {wxStyledTextCtrl_StyleSetFontAttr, "wxStyledTextCtrl", "styleSetFontAttr", 8}, // 3336
+ {wxStyledTextCtrl_StyleSetCharacterSet, "wxStyledTextCtrl", "styleSetCharacterSet", 3}, // 3337
+ {wxStyledTextCtrl_StyleSetFontEncoding, "wxStyledTextCtrl", "styleSetFontEncoding", 3}, // 3338
+ {wxStyledTextCtrl_CmdKeyExecute, "wxStyledTextCtrl", "cmdKeyExecute", 2}, // 3339
+ {wxStyledTextCtrl_SetMargins, "wxStyledTextCtrl", "setMargins", 3}, // 3340
+ {wxStyledTextCtrl_GetSelection, "wxStyledTextCtrl", "getSelection", 1}, // 3341
+ {wxStyledTextCtrl_PointFromPosition, "wxStyledTextCtrl", "pointFromPosition", 2}, // 3342
+ {wxStyledTextCtrl_ScrollToLine, "wxStyledTextCtrl", "scrollToLine", 2}, // 3343
+ {wxStyledTextCtrl_ScrollToColumn, "wxStyledTextCtrl", "scrollToColumn", 2}, // 3344
+ {wxStyledTextCtrl_SetVScrollBar, "wxStyledTextCtrl", "setVScrollBar", 2}, // 3345
+ {wxStyledTextCtrl_SetHScrollBar, "wxStyledTextCtrl", "setHScrollBar", 2}, // 3346
+ {wxStyledTextCtrl_GetLastKeydownProcessed, "wxStyledTextCtrl", "getLastKeydownProcessed", 1}, // 3347
+ {wxStyledTextCtrl_SetLastKeydownProcessed, "wxStyledTextCtrl", "setLastKeydownProcessed", 2}, // 3348
+ {wxStyledTextCtrl_SaveFile, "wxStyledTextCtrl", "saveFile", 2}, // 3349
+ {wxStyledTextCtrl_LoadFile, "wxStyledTextCtrl", "loadFile", 2}, // 3350
+ {wxStyledTextCtrl_DoDragOver, "wxStyledTextCtrl", "doDragOver", 4}, // 3351
+ {wxStyledTextCtrl_DoDropText, "wxStyledTextCtrl", "doDropText", 4}, // 3352
+ {wxStyledTextCtrl_GetUseAntiAliasing, "wxStyledTextCtrl", "getUseAntiAliasing", 1}, // 3353
+ {wxStyledTextCtrl_AddTextRaw, "wxStyledTextCtrl", "addTextRaw", 3}, // 3354
+ {wxStyledTextCtrl_InsertTextRaw, "wxStyledTextCtrl", "insertTextRaw", 3}, // 3355
+ {wxStyledTextCtrl_GetCurLineRaw, "wxStyledTextCtrl", "getCurLineRaw", 1}, // 3356
+ {wxStyledTextCtrl_GetLineRaw, "wxStyledTextCtrl", "getLineRaw", 2}, // 3357
+ {wxStyledTextCtrl_GetSelectedTextRaw, "wxStyledTextCtrl", "getSelectedTextRaw", 1}, // 3358
+ {wxStyledTextCtrl_GetTextRangeRaw, "wxStyledTextCtrl", "getTextRangeRaw", 3}, // 3359
+ {wxStyledTextCtrl_SetTextRaw, "wxStyledTextCtrl", "setTextRaw", 2}, // 3360
+ {wxStyledTextCtrl_GetTextRaw, "wxStyledTextCtrl", "getTextRaw", 1}, // 3361
+ {wxStyledTextCtrl_AppendTextRaw, "wxStyledTextCtrl", "appendTextRaw", 3}, // 3362
+ {wxArtProvider_GetBitmap, "wxArtProvider", "getBitmap", 2}, // 3363
+ {wxArtProvider_GetIcon, "wxArtProvider", "getIcon", 2}, // 3364
+ {wxTreeEvent_GetKeyCode, "wxTreeEvent", "getKeyCode", 1}, // 3365
+ {wxTreeEvent_GetItem, "wxTreeEvent", "getItem", 1}, // 3366
+ {wxTreeEvent_GetKeyEvent, "wxTreeEvent", "getKeyEvent", 1}, // 3367
+ {wxTreeEvent_GetLabel, "wxTreeEvent", "getLabel", 1}, // 3368
+ {wxTreeEvent_GetOldItem, "wxTreeEvent", "getOldItem", 1}, // 3369
+ {wxTreeEvent_GetPoint, "wxTreeEvent", "getPoint", 1}, // 3370
+ {wxTreeEvent_IsEditCancelled, "wxTreeEvent", "isEditCancelled", 1}, // 3371
+ {wxTreeEvent_SetToolTip, "wxTreeEvent", "setToolTip", 2}, // 3372
+ {wxBookCtrlEvent_GetOldSelection, "wxBookCtrlEvent", "getOldSelection", 1}, // 3373
+ {wxBookCtrlEvent_GetSelection, "wxBookCtrlEvent", "getSelection", 1}, // 3374
+ {wxBookCtrlEvent_SetOldSelection, "wxBookCtrlEvent", "setOldSelection", 2}, // 3375
+ {wxBookCtrlEvent_SetSelection, "wxBookCtrlEvent", "setSelection", 2}, // 3376
+ {wxFileDataObject_new, "wxFileDataObject", "new", 0}, // 3377
+ {wxFileDataObject_AddFile, "wxFileDataObject", "addFile", 2}, // 3378
+ {wxFileDataObject_GetFilenames, "wxFileDataObject", "getFilenames", 1}, // 3379
+ {wxFileDataObject_destroy, "wxFileDataObject", "'Destroy'", 1}, // 3380
+ {wxTextDataObject_new, "wxTextDataObject", "new", 1}, // 3381
+ {wxTextDataObject_GetTextLength, "wxTextDataObject", "getTextLength", 1}, // 3382
+ {wxTextDataObject_GetText, "wxTextDataObject", "getText", 1}, // 3383
+ {wxTextDataObject_SetText, "wxTextDataObject", "setText", 2}, // 3384
+ {wxTextDataObject_destroy, "wxTextDataObject", "'Destroy'", 1}, // 3385
+ {wxBitmapDataObject_new_1_1, "wxBitmapDataObject", "new", 1}, // 3386
+ {wxBitmapDataObject_new_1_0, "wxBitmapDataObject", "new", 1}, // 3387
+ {wxBitmapDataObject_GetBitmap, "wxBitmapDataObject", "getBitmap", 1}, // 3388
+ {wxBitmapDataObject_SetBitmap, "wxBitmapDataObject", "setBitmap", 2}, // 3389
+ {wxBitmapDataObject_destroy, "wxBitmapDataObject", "'Destroy'", 1}, // 3390
+ {wxClipboard_new, "wxClipboard", "new", 0}, // 3391
+ {NULL, "wxClipboard", "destroy", 1}, // 3392 obj destructor wxClipboard_destruct
+ {wxClipboard_AddData, "wxClipboard", "addData", 2}, // 3393
+ {wxClipboard_Clear, "wxClipboard", "clear", 1}, // 3394
+ {wxClipboard_Close, "wxClipboard", "close", 1}, // 3395
+ {wxClipboard_Flush, "wxClipboard", "flush", 1}, // 3396
+ {wxClipboard_GetData, "wxClipboard", "getData", 2}, // 3397
+ {wxClipboard_IsOpened, "wxClipboard", "isOpened", 1}, // 3398
+ {wxClipboard_Open, "wxClipboard", "open", 1}, // 3399
+ {wxClipboard_SetData, "wxClipboard", "setData", 2}, // 3400
+ {wxClipboard_UsePrimarySelection, "wxClipboard", "usePrimarySelection", 2}, // 3401
+ {wxClipboard_IsSupported, "wxClipboard", "isSupported", 2}, // 3402
+ {wxClipboard_Get, "wxClipboard", "get", 0}, // 3403
+ {wxSpinEvent_GetPosition, "wxSpinEvent", "getPosition", 1}, // 3404
+ {wxSpinEvent_SetPosition, "wxSpinEvent", "setPosition", 2}, // 3405
+ {wxSplitterWindow_new_0, "wxSplitterWindow", "new", 0}, // 3406
+ {wxSplitterWindow_new_2, "wxSplitterWindow", "new", 2}, // 3407
+ {NULL, "wxSplitterWindow", "destroy", 1}, // 3408 obj destructor wxSplitterWindow_destruct
+ {wxSplitterWindow_Create, "wxSplitterWindow", "create", 3}, // 3409
+ {wxSplitterWindow_GetMinimumPaneSize, "wxSplitterWindow", "getMinimumPaneSize", 1}, // 3410
+ {wxSplitterWindow_GetSashGravity, "wxSplitterWindow", "getSashGravity", 1}, // 3411
+ {wxSplitterWindow_GetSashPosition, "wxSplitterWindow", "getSashPosition", 1}, // 3412
+ {wxSplitterWindow_GetSplitMode, "wxSplitterWindow", "getSplitMode", 1}, // 3413
+ {wxSplitterWindow_GetWindow1, "wxSplitterWindow", "getWindow1", 1}, // 3414
+ {wxSplitterWindow_GetWindow2, "wxSplitterWindow", "getWindow2", 1}, // 3415
+ {wxSplitterWindow_Initialize, "wxSplitterWindow", "initialize", 2}, // 3416
+ {wxSplitterWindow_IsSplit, "wxSplitterWindow", "isSplit", 1}, // 3417
+ {wxSplitterWindow_ReplaceWindow, "wxSplitterWindow", "replaceWindow", 3}, // 3418
+ {wxSplitterWindow_SetSashGravity, "wxSplitterWindow", "setSashGravity", 2}, // 3419
+ {wxSplitterWindow_SetSashPosition, "wxSplitterWindow", "setSashPosition", 3}, // 3420
+ {wxSplitterWindow_SetMinimumPaneSize, "wxSplitterWindow", "setMinimumPaneSize", 2}, // 3421
+ {wxSplitterWindow_SetSplitMode, "wxSplitterWindow", "setSplitMode", 2}, // 3422
+ {wxSplitterWindow_SplitHorizontally, "wxSplitterWindow", "splitHorizontally", 4}, // 3423
+ {wxSplitterWindow_SplitVertically, "wxSplitterWindow", "splitVertically", 4}, // 3424
+ {wxSplitterWindow_Unsplit, "wxSplitterWindow", "unsplit", 2}, // 3425
+ {wxSplitterWindow_UpdateSize, "wxSplitterWindow", "updateSize", 1}, // 3426
+ {wxSplitterEvent_GetSashPosition, "wxSplitterEvent", "getSashPosition", 1}, // 3427
+ {wxSplitterEvent_GetX, "wxSplitterEvent", "getX", 1}, // 3428
+ {wxSplitterEvent_GetY, "wxSplitterEvent", "getY", 1}, // 3429
+ {wxSplitterEvent_GetWindowBeingRemoved, "wxSplitterEvent", "getWindowBeingRemoved", 1}, // 3430
+ {wxSplitterEvent_SetSashPosition, "wxSplitterEvent", "setSashPosition", 2}, // 3431
+ {wxHtmlWindow_new_0, "wxHtmlWindow", "new", 0}, // 3432
+ {wxHtmlWindow_new_2, "wxHtmlWindow", "new", 2}, // 3433
+ {wxHtmlWindow_AppendToPage, "wxHtmlWindow", "appendToPage", 2}, // 3434
+ {wxHtmlWindow_GetOpenedAnchor, "wxHtmlWindow", "getOpenedAnchor", 1}, // 3435
+ {wxHtmlWindow_GetOpenedPage, "wxHtmlWindow", "getOpenedPage", 1}, // 3436
+ {wxHtmlWindow_GetOpenedPageTitle, "wxHtmlWindow", "getOpenedPageTitle", 1}, // 3437
+ {wxHtmlWindow_GetRelatedFrame, "wxHtmlWindow", "getRelatedFrame", 1}, // 3438
+ {wxHtmlWindow_HistoryBack, "wxHtmlWindow", "historyBack", 1}, // 3439
+ {wxHtmlWindow_HistoryCanBack, "wxHtmlWindow", "historyCanBack", 1}, // 3440
+ {wxHtmlWindow_HistoryCanForward, "wxHtmlWindow", "historyCanForward", 1}, // 3441
+ {wxHtmlWindow_HistoryClear, "wxHtmlWindow", "historyClear", 1}, // 3442
+ {wxHtmlWindow_HistoryForward, "wxHtmlWindow", "historyForward", 1}, // 3443
+ {wxHtmlWindow_LoadFile, "wxHtmlWindow", "loadFile", 2}, // 3444
+ {wxHtmlWindow_LoadPage, "wxHtmlWindow", "loadPage", 2}, // 3445
+ {wxHtmlWindow_SelectAll, "wxHtmlWindow", "selectAll", 1}, // 3446
+ {wxHtmlWindow_SelectionToText, "wxHtmlWindow", "selectionToText", 1}, // 3447
+ {wxHtmlWindow_SelectLine, "wxHtmlWindow", "selectLine", 2}, // 3448
+ {wxHtmlWindow_SelectWord, "wxHtmlWindow", "selectWord", 2}, // 3449
+ {wxHtmlWindow_SetBorders, "wxHtmlWindow", "setBorders", 2}, // 3450
+ {wxHtmlWindow_SetFonts, "wxHtmlWindow", "setFonts", 4}, // 3451
+ {wxHtmlWindow_SetPage, "wxHtmlWindow", "setPage", 2}, // 3452
+ {wxHtmlWindow_SetRelatedFrame, "wxHtmlWindow", "setRelatedFrame", 3}, // 3453
+ {wxHtmlWindow_SetRelatedStatusBar_1, "wxHtmlWindow", "setRelatedStatusBar", 2}, // 3454
+ {wxHtmlWindow_SetRelatedStatusBar_2, "wxHtmlWindow", "setRelatedStatusBar", 3}, // 3455
+ {wxHtmlWindow_ToText, "wxHtmlWindow", "toText", 1}, // 3456
+ {NULL, "wxHtmlWindow", "'Destroy'", 1}, // 3457 obj destructor wxHtmlWindow_destroy
+ {wxHtmlLinkEvent_GetLinkInfo, "wxHtmlLinkEvent", "getLinkInfo", 1}, // 3458
+ {wxSystemSettings_GetColour, "wxSystemSettings", "getColour", 1}, // 3459
+ {wxSystemSettings_GetFont, "wxSystemSettings", "getFont", 1}, // 3460
+ {wxSystemSettings_GetMetric, "wxSystemSettings", "getMetric", 2}, // 3461
+ {wxSystemSettings_GetScreenType, "wxSystemSettings", "getScreenType", 0}, // 3462
+ {wxSystemOptions_GetOption, "wxSystemOptions", "getOption", 1}, // 3463
+ {wxSystemOptions_GetOptionInt, "wxSystemOptions", "getOptionInt", 1}, // 3464
+ {wxSystemOptions_HasOption, "wxSystemOptions", "hasOption", 1}, // 3465
+ {wxSystemOptions_IsFalse, "wxSystemOptions", "isFalse", 1}, // 3466
+ {wxSystemOptions_SetOption_2_1, "wxSystemOptions", "setOption", 2}, // 3467
+ {wxSystemOptions_SetOption_2_0, "wxSystemOptions", "setOption", 2}, // 3468
+ {wxAuiNotebookEvent_SetSelection, "wxAuiNotebookEvent", "setSelection", 2}, // 3469
+ {wxAuiNotebookEvent_GetSelection, "wxAuiNotebookEvent", "getSelection", 1}, // 3470
+ {wxAuiNotebookEvent_SetOldSelection, "wxAuiNotebookEvent", "setOldSelection", 2}, // 3471
+ {wxAuiNotebookEvent_GetOldSelection, "wxAuiNotebookEvent", "getOldSelection", 1}, // 3472
+ {wxAuiNotebookEvent_SetDragSource, "wxAuiNotebookEvent", "setDragSource", 2}, // 3473
+ {wxAuiNotebookEvent_GetDragSource, "wxAuiNotebookEvent", "getDragSource", 1}, // 3474
+ {wxAuiManagerEvent_SetManager, "wxAuiManagerEvent", "setManager", 2}, // 3475
+ {wxAuiManagerEvent_GetManager, "wxAuiManagerEvent", "getManager", 1}, // 3476
+ {wxAuiManagerEvent_SetPane, "wxAuiManagerEvent", "setPane", 2}, // 3477
+ {wxAuiManagerEvent_GetPane, "wxAuiManagerEvent", "getPane", 1}, // 3478
+ {wxAuiManagerEvent_SetButton, "wxAuiManagerEvent", "setButton", 2}, // 3479
+ {wxAuiManagerEvent_GetButton, "wxAuiManagerEvent", "getButton", 1}, // 3480
+ {wxAuiManagerEvent_SetDC, "wxAuiManagerEvent", "setDC", 2}, // 3481
+ {wxAuiManagerEvent_GetDC, "wxAuiManagerEvent", "getDC", 1}, // 3482
+ {wxAuiManagerEvent_Veto, "wxAuiManagerEvent", "veto", 2}, // 3483
+ {wxAuiManagerEvent_GetVeto, "wxAuiManagerEvent", "getVeto", 1}, // 3484
+ {wxAuiManagerEvent_SetCanVeto, "wxAuiManagerEvent", "setCanVeto", 2}, // 3485
+ {wxAuiManagerEvent_CanVeto, "wxAuiManagerEvent", "canVeto", 1}, // 3486
+ {wxLogNull_new, "wxLogNull", "new", 0}, // 3487
+ {wxLogNull_destruct, "wxLogNull", "destroy", 1}, // 3488
+ {wxTaskBarIcon_new, "wxTaskBarIcon", "new", 1}, // 3489
+ {NULL, "wxTaskBarIcon", "destroy", 1}, // 3490 obj destructor wxTaskBarIcon_destruct
+ {wxTaskBarIcon_PopupMenu, "wxTaskBarIcon", "popupMenu", 2}, // 3491
+ {wxTaskBarIcon_RemoveIcon, "wxTaskBarIcon", "removeIcon", 1}, // 3492
+ {wxTaskBarIcon_SetIcon, "wxTaskBarIcon", "setIcon", 3}, // 3493
+ {wxLocale_new_0, "wxLocale", "new", 0}, // 3494
+ {wxLocale_new_2_0, "wxLocale", "new", 2}, // 3495
+ {wxLocale_new_2_1, "wxLocale", "new", 2}, // 3496
+ {wxLocale_destruct, "wxLocale", "destroy", 1}, // 3497
+ {wxLocale_Init_1, "wxLocale", "init", 2}, // 3498
+ {wxLocale_Init_2, "wxLocale", "init", 3}, // 3499
+ {wxLocale_AddCatalog_1, "wxLocale", "addCatalog", 2}, // 3500
+ {wxLocale_AddCatalog_2, "wxLocale", "addCatalog", 3}, // 3501
+ {wxLocale_AddCatalog_3, "wxLocale", "addCatalog", 4}, // 3502
+ {wxLocale_AddCatalogLookupPathPrefix, "wxLocale", "addCatalogLookupPathPrefix", 1}, // 3503
+ {wxLocale_GetCanonicalName, "wxLocale", "getCanonicalName", 1}, // 3504
+ {wxLocale_GetLanguage, "wxLocale", "getLanguage", 1}, // 3505
+ {wxLocale_GetLanguageName, "wxLocale", "getLanguageName", 1}, // 3506
+ {wxLocale_GetLocale, "wxLocale", "getLocale", 1}, // 3507
+ {wxLocale_GetName, "wxLocale", "getName", 1}, // 3508
+ {wxLocale_GetString_2, "wxLocale", "getString", 3}, // 3509
+ {wxLocale_GetString_4, "wxLocale", "getString", 5}, // 3510
+ {wxLocale_GetHeaderValue, "wxLocale", "getHeaderValue", 3}, // 3511
+ {wxLocale_GetSysName, "wxLocale", "getSysName", 1}, // 3512
+ {wxLocale_GetSystemEncoding, "wxLocale", "getSystemEncoding", 0}, // 3513
+ {wxLocale_GetSystemEncodingName, "wxLocale", "getSystemEncodingName", 0}, // 3514
+ {wxLocale_GetSystemLanguage, "wxLocale", "getSystemLanguage", 0}, // 3515
+ {wxLocale_IsLoaded, "wxLocale", "isLoaded", 2}, // 3516
+ {wxLocale_IsOk, "wxLocale", "isOk", 1}, // 3517
+ {wxActivateEvent_GetActive, "wxActivateEvent", "getActive", 1}, // 3518
#if wxUSE_POPUPWIN
- {wxPopupWindow_new_0, "wxPopupWindow", "new", 0}, // 3504
+ {wxPopupWindow_new_0, "wxPopupWindow", "new", 0}, // 3519
#else
- {NULL, "wxPopupWindow", "new", 0}, // 3504
+ {NULL, "wxPopupWindow", "new", 0}, // 3519
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupWindow_new_2, "wxPopupWindow", "new", 2}, // 3505
+ {wxPopupWindow_new_2, "wxPopupWindow", "new", 2}, // 3520
#else
- {NULL, "wxPopupWindow", "new", 0}, // 3505
+ {NULL, "wxPopupWindow", "new", 0}, // 3520
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupWindow_Create, "wxPopupWindow", "create", 3}, // 3506
+ {wxPopupWindow_Create, "wxPopupWindow", "create", 3}, // 3521
#else
- {NULL, "wxPopupWindow", "create", 0}, // 3506
+ {NULL, "wxPopupWindow", "create", 0}, // 3521
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupWindow_Position, "wxPopupWindow", "position", 3}, // 3507
+ {wxPopupWindow_Position, "wxPopupWindow", "position", 3}, // 3522
#else
- {NULL, "wxPopupWindow", "position", 0}, // 3507
+ {NULL, "wxPopupWindow", "position", 0}, // 3522
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {NULL, "wxPopupWindow", "'Destroy'", 1}, // 3508 obj destructor wxPopupWindow_destroy
+ {NULL, "wxPopupWindow", "'Destroy'", 1}, // 3523 obj destructor wxPopupWindow_destroy
#else
- {NULL, "wxPopupWindow", "'Destroy'", 0}, // 3508
+ {NULL, "wxPopupWindow", "'Destroy'", 0}, // 3523
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupTransientWindow_new_0, "wxPopupTransientWindow", "new", 0}, // 3509
+ {wxPopupTransientWindow_new_0, "wxPopupTransientWindow", "new", 0}, // 3524
#else
- {NULL, "wxPopupTransientWindow", "new", 0}, // 3509
+ {NULL, "wxPopupTransientWindow", "new", 0}, // 3524
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupTransientWindow_new_2, "wxPopupTransientWindow", "new", 2}, // 3510
+ {wxPopupTransientWindow_new_2, "wxPopupTransientWindow", "new", 2}, // 3525
#else
- {NULL, "wxPopupTransientWindow", "new", 0}, // 3510
+ {NULL, "wxPopupTransientWindow", "new", 0}, // 3525
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupTransientWindow_Popup, "wxPopupTransientWindow", "popup", 2}, // 3511
+ {wxPopupTransientWindow_Popup, "wxPopupTransientWindow", "popup", 2}, // 3526
#else
- {NULL, "wxPopupTransientWindow", "popup", 0}, // 3511
+ {NULL, "wxPopupTransientWindow", "popup", 0}, // 3526
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupTransientWindow_Dismiss, "wxPopupTransientWindow", "dismiss", 1}, // 3512
+ {wxPopupTransientWindow_Dismiss, "wxPopupTransientWindow", "dismiss", 1}, // 3527
#else
- {NULL, "wxPopupTransientWindow", "dismiss", 0}, // 3512
+ {NULL, "wxPopupTransientWindow", "dismiss", 0}, // 3527
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {NULL, "wxPopupTransientWindow", "'Destroy'", 1}, // 3513 obj destructor wxPopupTransientWindow_destroy
+ {NULL, "wxPopupTransientWindow", "'Destroy'", 1}, // 3528 obj destructor wxPopupTransientWindow_destroy
#else
- {NULL, "wxPopupTransientWindow", "'Destroy'", 0}, // 3513
+ {NULL, "wxPopupTransientWindow", "'Destroy'", 0}, // 3528
#endif // wxUSE_POPUPWIN
- {wxOverlay_new, "wxOverlay", "new", 0}, // 3514
- {wxOverlay_destruct, "wxOverlay", "destroy", 1}, // 3515
- {wxOverlay_Reset, "wxOverlay", "reset", 1}, // 3516
- {wxDCOverlay_new_6, "wxDCOverlay", "new", 6}, // 3517
- {wxDCOverlay_new_2, "wxDCOverlay", "new", 2}, // 3518
- {wxDCOverlay_destruct, "wxDCOverlay", "destroy", 1}, // 3519
- {wxDCOverlay_Clear, "wxDCOverlay", "clear", 1}, // 3520
- {wxDropFilesEvent_GetPosition, "wxDropFilesEvent", "getPosition", 1}, // 3521
- {wxDropFilesEvent_GetNumberOfFiles, "wxDropFilesEvent", "getNumberOfFiles", 1}, // 3522
- {wxDropFilesEvent_GetFiles, "wxDropFilesEvent", "getFiles", 1}, // 3523
+ {wxOverlay_new, "wxOverlay", "new", 0}, // 3529
+ {wxOverlay_destruct, "wxOverlay", "destroy", 1}, // 3530
+ {wxOverlay_Reset, "wxOverlay", "reset", 1}, // 3531
+ {wxDCOverlay_new_6, "wxDCOverlay", "new", 6}, // 3532
+ {wxDCOverlay_new_2, "wxDCOverlay", "new", 2}, // 3533
+ {wxDCOverlay_destruct, "wxDCOverlay", "destroy", 1}, // 3534
+ {wxDCOverlay_Clear, "wxDCOverlay", "clear", 1}, // 3535
+ {wxDropFilesEvent_GetPosition, "wxDropFilesEvent", "getPosition", 1}, // 3536
+ {wxDropFilesEvent_GetNumberOfFiles, "wxDropFilesEvent", "getNumberOfFiles", 1}, // 3537
+ {wxDropFilesEvent_GetFiles, "wxDropFilesEvent", "getFiles", 1}, // 3538
#if wxUSE_DISPLAY
- {wxDisplay_new_0, "wxDisplay", "new", 0}, // 3524
+ {wxDisplay_new_0, "wxDisplay", "new", 0}, // 3539
#else
- {NULL, "wxDisplay", "new", 0}, // 3524
+ {NULL, "wxDisplay", "new", 0}, // 3539
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_new_1_0, "wxDisplay", "new", 1}, // 3525
+ {wxDisplay_new_1_0, "wxDisplay", "new", 1}, // 3540
#else
- {NULL, "wxDisplay", "new", 0}, // 3525
+ {NULL, "wxDisplay", "new", 0}, // 3540
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY && wxCHECK_VERSION(3,1,3)
- {wxDisplay_new_1_1, "wxDisplay", "new", 1}, // 3526
+ {wxDisplay_new_1_1, "wxDisplay", "new", 1}, // 3541
#else
- {NULL, "wxDisplay", "new", 0}, // 3526
+ {NULL, "wxDisplay", "new", 0}, // 3541
#endif // wxUSE_DISPLAY && wxCHECK_VERSION(3,1,3)
#if wxUSE_DISPLAY
- {wxDisplay_destruct, "wxDisplay", "destroy", 1}, // 3527
+ {wxDisplay_destruct, "wxDisplay", "destroy", 1}, // 3542
#else
- {NULL, "wxDisplay", "destroy", 0}, // 3527
+ {NULL, "wxDisplay", "destroy", 0}, // 3542
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_IsOk, "wxDisplay", "isOk", 1}, // 3528
+ {wxDisplay_IsOk, "wxDisplay", "isOk", 1}, // 3543
#else
- {NULL, "wxDisplay", "isOk", 0}, // 3528
+ {NULL, "wxDisplay", "isOk", 0}, // 3543
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_GetClientArea, "wxDisplay", "getClientArea", 1}, // 3529
+ {wxDisplay_GetClientArea, "wxDisplay", "getClientArea", 1}, // 3544
#else
- {NULL, "wxDisplay", "getClientArea", 0}, // 3529
+ {NULL, "wxDisplay", "getClientArea", 0}, // 3544
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_GetGeometry, "wxDisplay", "getGeometry", 1}, // 3530
+ {wxDisplay_GetGeometry, "wxDisplay", "getGeometry", 1}, // 3545
#else
- {NULL, "wxDisplay", "getGeometry", 0}, // 3530
+ {NULL, "wxDisplay", "getGeometry", 0}, // 3545
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_GetName, "wxDisplay", "getName", 1}, // 3531
+ {wxDisplay_GetName, "wxDisplay", "getName", 1}, // 3546
#else
- {NULL, "wxDisplay", "getName", 0}, // 3531
+ {NULL, "wxDisplay", "getName", 0}, // 3546
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_IsPrimary, "wxDisplay", "isPrimary", 1}, // 3532
+ {wxDisplay_IsPrimary, "wxDisplay", "isPrimary", 1}, // 3547
#else
- {NULL, "wxDisplay", "isPrimary", 0}, // 3532
+ {NULL, "wxDisplay", "isPrimary", 0}, // 3547
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_GetCount, "wxDisplay", "getCount", 0}, // 3533
+ {wxDisplay_GetCount, "wxDisplay", "getCount", 0}, // 3548
#else
- {NULL, "wxDisplay", "getCount", 0}, // 3533
+ {NULL, "wxDisplay", "getCount", 0}, // 3548
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_GetFromPoint, "wxDisplay", "getFromPoint", 1}, // 3534
+ {wxDisplay_GetFromPoint, "wxDisplay", "getFromPoint", 1}, // 3549
#else
- {NULL, "wxDisplay", "getFromPoint", 0}, // 3534
+ {NULL, "wxDisplay", "getFromPoint", 0}, // 3549
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_GetFromWindow, "wxDisplay", "getFromWindow", 1}, // 3535
+ {wxDisplay_GetFromWindow, "wxDisplay", "getFromWindow", 1}, // 3550
#else
- {NULL, "wxDisplay", "getFromWindow", 0}, // 3535
+ {NULL, "wxDisplay", "getFromWindow", 0}, // 3550
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY && wxCHECK_VERSION(3,1,2)
- {wxDisplay_GetPPI, "wxDisplay", "getPPI", 1}, // 3536
+ {wxDisplay_GetPPI, "wxDisplay", "getPPI", 1}, // 3551
#else
- {NULL, "wxDisplay", "getPPI", 0}, // 3536
+ {NULL, "wxDisplay", "getPPI", 0}, // 3551
#endif // wxUSE_DISPLAY && wxCHECK_VERSION(3,1,2)
#if wxUSE_GRAPHICS_CONTEXT
- {wxGCDC_new_1, "wxGCDC", "new", 1}, // 3537
+ {wxGCDC_new_1, "wxGCDC", "new", 1}, // 3552
#else
- {NULL, "wxGCDC", "new", 0}, // 3537
+ {NULL, "wxGCDC", "new", 0}, // 3552
#endif // wxUSE_GRAPHICS_CONTEXT
- {NULL, "", "", 0}, // 3538
- {NULL, "", "", 0}, // 3539
+ {NULL, "", "", 0}, // 3553
+ {NULL, "", "", 0}, // 3554
#if wxUSE_GRAPHICS_CONTEXT
- {wxGCDC_new_0, "wxGCDC", "new", 0}, // 3540
+ {wxGCDC_new_0, "wxGCDC", "new", 0}, // 3555
#else
- {NULL, "wxGCDC", "new", 0}, // 3540
+ {NULL, "wxGCDC", "new", 0}, // 3555
#endif // wxUSE_GRAPHICS_CONTEXT
#if wxUSE_GRAPHICS_CONTEXT
- {NULL, "wxGCDC", "destroy", 1}, // 3541 obj destructor wxGCDC_destruct
+ {NULL, "wxGCDC", "destroy", 1}, // 3556 obj destructor wxGCDC_destruct
#else
- {NULL, "wxGCDC", "destroy", 0}, // 3541
+ {NULL, "wxGCDC", "destroy", 0}, // 3556
#endif // wxUSE_GRAPHICS_CONTEXT
#if wxUSE_GRAPHICS_CONTEXT
- {wxGCDC_GetGraphicsContext, "wxGCDC", "getGraphicsContext", 1}, // 3542
+ {wxGCDC_GetGraphicsContext, "wxGCDC", "getGraphicsContext", 1}, // 3557
#else
- {NULL, "wxGCDC", "getGraphicsContext", 0}, // 3542
+ {NULL, "wxGCDC", "getGraphicsContext", 0}, // 3557
#endif // wxUSE_GRAPHICS_CONTEXT
#if wxUSE_GRAPHICS_CONTEXT
- {wxGCDC_SetGraphicsContext, "wxGCDC", "setGraphicsContext", 2}, // 3543
+ {wxGCDC_SetGraphicsContext, "wxGCDC", "setGraphicsContext", 2}, // 3558
#else
- {NULL, "wxGCDC", "setGraphicsContext", 0}, // 3543
+ {NULL, "wxGCDC", "setGraphicsContext", 0}, // 3558
#endif // wxUSE_GRAPHICS_CONTEXT
- {wxNotificationMessage_new_0, "wxNotificationMessage", "new", 0}, // 3544
- {wxNotificationMessage_new_2, "wxNotificationMessage", "new", 2}, // 3545
- {NULL, "wxNotificationMessage", "destroy", 1}, // 3546 obj destructor wxNotificationMessage_destruct
+ {wxNotificationMessage_new_0, "wxNotificationMessage", "new", 0}, // 3559
+ {wxNotificationMessage_new_2, "wxNotificationMessage", "new", 2}, // 3560
+ {NULL, "wxNotificationMessage", "destroy", 1}, // 3561 obj destructor wxNotificationMessage_destruct
#if wxCHECK_VERSION(3,1,0)
- {wxNotificationMessage_AddAction, "wxNotificationMessage", "addAction", 3}, // 3547
+ {wxNotificationMessage_AddAction, "wxNotificationMessage", "addAction", 3}, // 3562
#else
- {NULL, "wxNotificationMessage", "addAction", 0}, // 3547
+ {NULL, "wxNotificationMessage", "addAction", 0}, // 3562
#endif // wxCHECK_VERSION(3,1,0)
- {wxNotificationMessage_Close, "wxNotificationMessage", "close", 1}, // 3548
- {wxNotificationMessage_SetFlags, "wxNotificationMessage", "setFlags", 2}, // 3549
+ {wxNotificationMessage_Close, "wxNotificationMessage", "close", 1}, // 3563
+ {wxNotificationMessage_SetFlags, "wxNotificationMessage", "setFlags", 2}, // 3564
#if wxCHECK_VERSION(3,1,0)
- {wxNotificationMessage_SetIcon, "wxNotificationMessage", "setIcon", 2}, // 3550
+ {wxNotificationMessage_SetIcon, "wxNotificationMessage", "setIcon", 2}, // 3565
#else
- {NULL, "wxNotificationMessage", "setIcon", 0}, // 3550
+ {NULL, "wxNotificationMessage", "setIcon", 0}, // 3565
#endif // wxCHECK_VERSION(3,1,0)
- {wxNotificationMessage_SetMessage, "wxNotificationMessage", "setMessage", 2}, // 3551
- {wxNotificationMessage_SetParent, "wxNotificationMessage", "setParent", 2}, // 3552
- {wxNotificationMessage_SetTitle, "wxNotificationMessage", "setTitle", 2}, // 3553
- {wxNotificationMessage_Show, "wxNotificationMessage", "show", 2}, // 3554
+ {wxNotificationMessage_SetMessage, "wxNotificationMessage", "setMessage", 2}, // 3566
+ {wxNotificationMessage_SetParent, "wxNotificationMessage", "setParent", 2}, // 3567
+ {wxNotificationMessage_SetTitle, "wxNotificationMessage", "setTitle", 2}, // 3568
+ {wxNotificationMessage_Show, "wxNotificationMessage", "show", 2}, // 3569
#if __WXMSW__
- {wxNotificationMessage_UseTaskBarIcon, "wxNotificationMessage", "useTaskBarIcon", 1}, // 3555
+ {wxNotificationMessage_UseTaskBarIcon, "wxNotificationMessage", "useTaskBarIcon", 1}, // 3570
#else
- {NULL, "wxNotificationMessage", "useTaskBarIcon", 0}, // 3555
+ {NULL, "wxNotificationMessage", "useTaskBarIcon", 0}, // 3570
#endif // __WXMSW__
#if __WXMSW__ && wxCHECK_VERSION(3,1,0)
- {wxNotificationMessage_MSWUseToasts, "wxNotificationMessage", "mSWUseToasts", 1}, // 3556
+ {wxNotificationMessage_MSWUseToasts, "wxNotificationMessage", "mSWUseToasts", 1}, // 3571
#else
- {NULL, "wxNotificationMessage", "mSWUseToasts", 0}, // 3556
+ {NULL, "wxNotificationMessage", "mSWUseToasts", 0}, // 3571
#endif // __WXMSW__ && wxCHECK_VERSION(3,1,0)
- {NULL, "", "", 0}, // 3557
+ {NULL, "", "", 0}, // 3572
#if WXE_WEBVIEW
- {wxWebView_New, "wxWebView", "new", 3}, // 3558
+ {wxWebView_New, "wxWebView", "new", 3}, // 3573
#else
- {NULL, "wxWebView", "new", 0}, // 3558
+ {NULL, "wxWebView", "new", 0}, // 3573
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetCurrentTitle, "wxWebView", "getCurrentTitle", 1}, // 3559
+ {wxWebView_GetCurrentTitle, "wxWebView", "getCurrentTitle", 1}, // 3574
#else
- {NULL, "wxWebView", "getCurrentTitle", 0}, // 3559
+ {NULL, "wxWebView", "getCurrentTitle", 0}, // 3574
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetCurrentURL, "wxWebView", "getCurrentURL", 1}, // 3560
+ {wxWebView_GetCurrentURL, "wxWebView", "getCurrentURL", 1}, // 3575
#else
- {NULL, "wxWebView", "getCurrentURL", 0}, // 3560
+ {NULL, "wxWebView", "getCurrentURL", 0}, // 3575
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetPageSource, "wxWebView", "getPageSource", 1}, // 3561
+ {wxWebView_GetPageSource, "wxWebView", "getPageSource", 1}, // 3576
#else
- {NULL, "wxWebView", "getPageSource", 0}, // 3561
+ {NULL, "wxWebView", "getPageSource", 0}, // 3576
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetPageText, "wxWebView", "getPageText", 1}, // 3562
+ {wxWebView_GetPageText, "wxWebView", "getPageText", 1}, // 3577
#else
- {NULL, "wxWebView", "getPageText", 0}, // 3562
+ {NULL, "wxWebView", "getPageText", 0}, // 3577
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_IsBusy, "wxWebView", "isBusy", 1}, // 3563
+ {wxWebView_IsBusy, "wxWebView", "isBusy", 1}, // 3578
#else
- {NULL, "wxWebView", "isBusy", 0}, // 3563
+ {NULL, "wxWebView", "isBusy", 0}, // 3578
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_IsEditable, "wxWebView", "isEditable", 1}, // 3564
+ {wxWebView_IsEditable, "wxWebView", "isEditable", 1}, // 3579
#else
- {NULL, "wxWebView", "isEditable", 0}, // 3564
+ {NULL, "wxWebView", "isEditable", 0}, // 3579
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_LoadURL, "wxWebView", "loadURL", 2}, // 3565
+ {wxWebView_LoadURL, "wxWebView", "loadURL", 2}, // 3580
#else
- {NULL, "wxWebView", "loadURL", 0}, // 3565
+ {NULL, "wxWebView", "loadURL", 0}, // 3580
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Print, "wxWebView", "print", 1}, // 3566
+ {wxWebView_Print, "wxWebView", "print", 1}, // 3581
#else
- {NULL, "wxWebView", "print", 0}, // 3566
+ {NULL, "wxWebView", "print", 0}, // 3581
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Reload, "wxWebView", "reload", 2}, // 3567
+ {wxWebView_Reload, "wxWebView", "reload", 2}, // 3582
#else
- {NULL, "wxWebView", "reload", 0}, // 3567
+ {NULL, "wxWebView", "reload", 0}, // 3582
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW && wxCHECK_VERSION(3,1,1)
- {wxWebView_RunScript, "wxWebView", "runScript", 2}, // 3568
+ {wxWebView_RunScript, "wxWebView", "runScript", 2}, // 3583
#else
- {NULL, "wxWebView", "runScript", 0}, // 3568
+ {NULL, "wxWebView", "runScript", 0}, // 3583
#endif // WXE_WEBVIEW && wxCHECK_VERSION(3,1,1)
#if WXE_WEBVIEW
- {wxWebView_SetEditable, "wxWebView", "setEditable", 2}, // 3569
+ {wxWebView_SetEditable, "wxWebView", "setEditable", 2}, // 3584
#else
- {NULL, "wxWebView", "setEditable", 0}, // 3569
+ {NULL, "wxWebView", "setEditable", 0}, // 3584
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_SetPage, "wxWebView", "setPage", 3}, // 3570
+ {wxWebView_SetPage, "wxWebView", "setPage", 3}, // 3585
#else
- {NULL, "wxWebView", "setPage", 0}, // 3570
+ {NULL, "wxWebView", "setPage", 0}, // 3585
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Stop, "wxWebView", "stop", 1}, // 3571
+ {wxWebView_Stop, "wxWebView", "stop", 1}, // 3586
#else
- {NULL, "wxWebView", "stop", 0}, // 3571
+ {NULL, "wxWebView", "stop", 0}, // 3586
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanCopy, "wxWebView", "canCopy", 1}, // 3572
+ {wxWebView_CanCopy, "wxWebView", "canCopy", 1}, // 3587
#else
- {NULL, "wxWebView", "canCopy", 0}, // 3572
+ {NULL, "wxWebView", "canCopy", 0}, // 3587
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanCut, "wxWebView", "canCut", 1}, // 3573
+ {wxWebView_CanCut, "wxWebView", "canCut", 1}, // 3588
#else
- {NULL, "wxWebView", "canCut", 0}, // 3573
+ {NULL, "wxWebView", "canCut", 0}, // 3588
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanPaste, "wxWebView", "canPaste", 1}, // 3574
+ {wxWebView_CanPaste, "wxWebView", "canPaste", 1}, // 3589
#else
- {NULL, "wxWebView", "canPaste", 0}, // 3574
+ {NULL, "wxWebView", "canPaste", 0}, // 3589
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Copy, "wxWebView", "copy", 1}, // 3575
+ {wxWebView_Copy, "wxWebView", "copy", 1}, // 3590
#else
- {NULL, "wxWebView", "copy", 0}, // 3575
+ {NULL, "wxWebView", "copy", 0}, // 3590
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Cut, "wxWebView", "cut", 1}, // 3576
+ {wxWebView_Cut, "wxWebView", "cut", 1}, // 3591
#else
- {NULL, "wxWebView", "cut", 0}, // 3576
+ {NULL, "wxWebView", "cut", 0}, // 3591
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Paste, "wxWebView", "paste", 1}, // 3577
+ {wxWebView_Paste, "wxWebView", "paste", 1}, // 3592
#else
- {NULL, "wxWebView", "paste", 0}, // 3577
+ {NULL, "wxWebView", "paste", 0}, // 3592
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_EnableContextMenu, "wxWebView", "enableContextMenu", 2}, // 3578
+ {wxWebView_EnableContextMenu, "wxWebView", "enableContextMenu", 2}, // 3593
#else
- {NULL, "wxWebView", "enableContextMenu", 0}, // 3578
+ {NULL, "wxWebView", "enableContextMenu", 0}, // 3593
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_IsContextMenuEnabled, "wxWebView", "isContextMenuEnabled", 1}, // 3579
+ {wxWebView_IsContextMenuEnabled, "wxWebView", "isContextMenuEnabled", 1}, // 3594
#else
- {NULL, "wxWebView", "isContextMenuEnabled", 0}, // 3579
+ {NULL, "wxWebView", "isContextMenuEnabled", 0}, // 3594
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanGoBack, "wxWebView", "canGoBack", 1}, // 3580
+ {wxWebView_CanGoBack, "wxWebView", "canGoBack", 1}, // 3595
#else
- {NULL, "wxWebView", "canGoBack", 0}, // 3580
+ {NULL, "wxWebView", "canGoBack", 0}, // 3595
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanGoForward, "wxWebView", "canGoForward", 1}, // 3581
+ {wxWebView_CanGoForward, "wxWebView", "canGoForward", 1}, // 3596
#else
- {NULL, "wxWebView", "canGoForward", 0}, // 3581
+ {NULL, "wxWebView", "canGoForward", 0}, // 3596
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_ClearHistory, "wxWebView", "clearHistory", 1}, // 3582
+ {wxWebView_ClearHistory, "wxWebView", "clearHistory", 1}, // 3597
#else
- {NULL, "wxWebView", "clearHistory", 0}, // 3582
+ {NULL, "wxWebView", "clearHistory", 0}, // 3597
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_EnableHistory, "wxWebView", "enableHistory", 2}, // 3583
+ {wxWebView_EnableHistory, "wxWebView", "enableHistory", 2}, // 3598
#else
- {NULL, "wxWebView", "enableHistory", 0}, // 3583
+ {NULL, "wxWebView", "enableHistory", 0}, // 3598
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GoBack, "wxWebView", "goBack", 1}, // 3584
+ {wxWebView_GoBack, "wxWebView", "goBack", 1}, // 3599
#else
- {NULL, "wxWebView", "goBack", 0}, // 3584
+ {NULL, "wxWebView", "goBack", 0}, // 3599
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GoForward, "wxWebView", "goForward", 1}, // 3585
+ {wxWebView_GoForward, "wxWebView", "goForward", 1}, // 3600
#else
- {NULL, "wxWebView", "goForward", 0}, // 3585
+ {NULL, "wxWebView", "goForward", 0}, // 3600
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_ClearSelection, "wxWebView", "clearSelection", 1}, // 3586
+ {wxWebView_ClearSelection, "wxWebView", "clearSelection", 1}, // 3601
#else
- {NULL, "wxWebView", "clearSelection", 0}, // 3586
+ {NULL, "wxWebView", "clearSelection", 0}, // 3601
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_DeleteSelection, "wxWebView", "deleteSelection", 1}, // 3587
+ {wxWebView_DeleteSelection, "wxWebView", "deleteSelection", 1}, // 3602
#else
- {NULL, "wxWebView", "deleteSelection", 0}, // 3587
+ {NULL, "wxWebView", "deleteSelection", 0}, // 3602
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetSelectedSource, "wxWebView", "getSelectedSource", 1}, // 3588
+ {wxWebView_GetSelectedSource, "wxWebView", "getSelectedSource", 1}, // 3603
#else
- {NULL, "wxWebView", "getSelectedSource", 0}, // 3588
+ {NULL, "wxWebView", "getSelectedSource", 0}, // 3603
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetSelectedText, "wxWebView", "getSelectedText", 1}, // 3589
+ {wxWebView_GetSelectedText, "wxWebView", "getSelectedText", 1}, // 3604
#else
- {NULL, "wxWebView", "getSelectedText", 0}, // 3589
+ {NULL, "wxWebView", "getSelectedText", 0}, // 3604
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_HasSelection, "wxWebView", "hasSelection", 1}, // 3590
+ {wxWebView_HasSelection, "wxWebView", "hasSelection", 1}, // 3605
#else
- {NULL, "wxWebView", "hasSelection", 0}, // 3590
+ {NULL, "wxWebView", "hasSelection", 0}, // 3605
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_SelectAll, "wxWebView", "selectAll", 1}, // 3591
+ {wxWebView_SelectAll, "wxWebView", "selectAll", 1}, // 3606
#else
- {NULL, "wxWebView", "selectAll", 0}, // 3591
+ {NULL, "wxWebView", "selectAll", 0}, // 3606
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanRedo, "wxWebView", "canRedo", 1}, // 3592
+ {wxWebView_CanRedo, "wxWebView", "canRedo", 1}, // 3607
#else
- {NULL, "wxWebView", "canRedo", 0}, // 3592
+ {NULL, "wxWebView", "canRedo", 0}, // 3607
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanUndo, "wxWebView", "canUndo", 1}, // 3593
+ {wxWebView_CanUndo, "wxWebView", "canUndo", 1}, // 3608
#else
- {NULL, "wxWebView", "canUndo", 0}, // 3593
+ {NULL, "wxWebView", "canUndo", 0}, // 3608
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Redo, "wxWebView", "redo", 1}, // 3594
+ {wxWebView_Redo, "wxWebView", "redo", 1}, // 3609
#else
- {NULL, "wxWebView", "redo", 0}, // 3594
+ {NULL, "wxWebView", "redo", 0}, // 3609
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Undo, "wxWebView", "undo", 1}, // 3595
+ {wxWebView_Undo, "wxWebView", "undo", 1}, // 3610
#else
- {NULL, "wxWebView", "undo", 0}, // 3595
+ {NULL, "wxWebView", "undo", 0}, // 3610
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Find, "wxWebView", "find", 3}, // 3596
+ {wxWebView_Find, "wxWebView", "find", 3}, // 3611
#else
- {NULL, "wxWebView", "find", 0}, // 3596
+ {NULL, "wxWebView", "find", 0}, // 3611
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanSetZoomType, "wxWebView", "canSetZoomType", 2}, // 3597
+ {wxWebView_CanSetZoomType, "wxWebView", "canSetZoomType", 2}, // 3612
#else
- {NULL, "wxWebView", "canSetZoomType", 0}, // 3597
+ {NULL, "wxWebView", "canSetZoomType", 0}, // 3612
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetZoom, "wxWebView", "getZoom", 1}, // 3598
+ {wxWebView_GetZoom, "wxWebView", "getZoom", 1}, // 3613
#else
- {NULL, "wxWebView", "getZoom", 0}, // 3598
+ {NULL, "wxWebView", "getZoom", 0}, // 3613
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetZoomType, "wxWebView", "getZoomType", 1}, // 3599
+ {wxWebView_GetZoomType, "wxWebView", "getZoomType", 1}, // 3614
#else
- {NULL, "wxWebView", "getZoomType", 0}, // 3599
+ {NULL, "wxWebView", "getZoomType", 0}, // 3614
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_SetZoom, "wxWebView", "setZoom", 2}, // 3600
+ {wxWebView_SetZoom, "wxWebView", "setZoom", 2}, // 3615
#else
- {NULL, "wxWebView", "setZoom", 0}, // 3600
+ {NULL, "wxWebView", "setZoom", 0}, // 3615
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_SetZoomType, "wxWebView", "setZoomType", 2}, // 3601
+ {wxWebView_SetZoomType, "wxWebView", "setZoomType", 2}, // 3616
#else
- {NULL, "wxWebView", "setZoomType", 0}, // 3601
+ {NULL, "wxWebView", "setZoomType", 0}, // 3616
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW && wxCHECK_VERSION(3,1,4)
- {wxWebView_GetZoomFactor, "wxWebView", "getZoomFactor", 1}, // 3602
+ {wxWebView_GetZoomFactor, "wxWebView", "getZoomFactor", 1}, // 3617
#else
- {NULL, "wxWebView", "getZoomFactor", 0}, // 3602
+ {NULL, "wxWebView", "getZoomFactor", 0}, // 3617
#endif // WXE_WEBVIEW && wxCHECK_VERSION(3,1,4)
#if WXE_WEBVIEW && wxCHECK_VERSION(3,1,4)
- {wxWebView_SetZoomFactor, "wxWebView", "setZoomFactor", 2}, // 3603
+ {wxWebView_SetZoomFactor, "wxWebView", "setZoomFactor", 2}, // 3618
#else
- {NULL, "wxWebView", "setZoomFactor", 0}, // 3603
+ {NULL, "wxWebView", "setZoomFactor", 0}, // 3618
#endif // WXE_WEBVIEW && wxCHECK_VERSION(3,1,4)
#if WXE_WEBVIEW && wxCHECK_VERSION(3,1,4)
- {wxWebView_IsBackendAvailable, "wxWebView", "isBackendAvailable", 1}, // 3604
+ {wxWebView_IsBackendAvailable, "wxWebView", "isBackendAvailable", 1}, // 3619
#else
- {NULL, "wxWebView", "isBackendAvailable", 0}, // 3604
+ {NULL, "wxWebView", "isBackendAvailable", 0}, // 3619
#endif // WXE_WEBVIEW && wxCHECK_VERSION(3,1,4)
#if WXE_WEBVIEW
- {wxWebViewEvent_GetString, "wxWebViewEvent", "getString", 1}, // 3605
+ {wxWebViewEvent_GetString, "wxWebViewEvent", "getString", 1}, // 3620
#else
- {NULL, "wxWebViewEvent", "getString", 0}, // 3605
+ {NULL, "wxWebViewEvent", "getString", 0}, // 3620
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebViewEvent_GetInt, "wxWebViewEvent", "getInt", 1}, // 3606
+ {wxWebViewEvent_GetInt, "wxWebViewEvent", "getInt", 1}, // 3621
#else
- {NULL, "wxWebViewEvent", "getInt", 0}, // 3606
+ {NULL, "wxWebViewEvent", "getInt", 0}, // 3621
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebViewEvent_GetTarget, "wxWebViewEvent", "getTarget", 1}, // 3607
+ {wxWebViewEvent_GetTarget, "wxWebViewEvent", "getTarget", 1}, // 3622
#else
- {NULL, "wxWebViewEvent", "getTarget", 0}, // 3607
+ {NULL, "wxWebViewEvent", "getTarget", 0}, // 3622
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebViewEvent_GetURL, "wxWebViewEvent", "getURL", 1}, // 3608
+ {wxWebViewEvent_GetURL, "wxWebViewEvent", "getURL", 1}, // 3623
#else
- {NULL, "wxWebViewEvent", "getURL", 0}, // 3608
+ {NULL, "wxWebViewEvent", "getURL", 0}, // 3623
#endif // WXE_WEBVIEW
};
diff --git a/lib/wx/c_src/gen/wxe_macros.h b/lib/wx/c_src/gen/wxe_macros.h
index 063590150c..d8e8a0f7ea 100644
--- a/lib/wx/c_src/gen/wxe_macros.h
+++ b/lib/wx/c_src/gen/wxe_macros.h
@@ -61,6 +61,7 @@
#include <wx/listbook.h>
#include <wx/treebook.h>
#include <wx/taskbar.h>
+#include <wx/textctrl.h>
#include <wx/popupwin.h>
#include <wx/html/htmlwin.h>
#include <wx/html/htmlcell.h>
diff --git a/lib/wx/c_src/gen/wxe_wrapper_4.cpp b/lib/wx/c_src/gen/wxe_wrapper_4.cpp
index cceb0e68a7..12b51199e3 100644
--- a/lib/wx/c_src/gen/wxe_wrapper_4.cpp
+++ b/lib/wx/c_src/gen/wxe_wrapper_4.cpp
@@ -3116,7 +3116,7 @@ void wxImageList_new_3(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
}
// wxImageList::Add
-void wxImageList_Add_2_1(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+void wxImageList_Add_2_0(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
{
ErlNifEnv *env = Ecmd.env;
ERL_NIF_TERM * argv = Ecmd.args;
@@ -3134,7 +3134,7 @@ void wxImageList_Add_2_1(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
}
// wxImageList::Add
-void wxImageList_Add_2_0(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+void wxImageList_Add_2_1(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
{
ErlNifEnv *env = Ecmd.env;
ERL_NIF_TERM * argv = Ecmd.args;
diff --git a/lib/wx/c_src/gen/wxe_wrapper_7.cpp b/lib/wx/c_src/gen/wxe_wrapper_7.cpp
index 48f44d3378..f4716e1228 100644
--- a/lib/wx/c_src/gen/wxe_wrapper_7.cpp
+++ b/lib/wx/c_src/gen/wxe_wrapper_7.cpp
@@ -533,6 +533,90 @@ void wxTextAttr_GetFont(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
}
+// wxTextAttr::GetFontEncoding
+void wxTextAttr_GetFontEncoding(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ if(!This) throw wxe_badarg("This");
+ int Result = This->GetFontEncoding();
+ wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
+ rt.send( rt.make_int(Result));
+
+}
+
+// wxTextAttr::GetFontFaceName
+void wxTextAttr_GetFontFaceName(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ if(!This) throw wxe_badarg("This");
+ const wxString Result = This->GetFontFaceName();
+ wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
+ rt.send( rt.make(Result));
+
+}
+
+// wxTextAttr::GetFontSize
+void wxTextAttr_GetFontSize(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ if(!This) throw wxe_badarg("This");
+ int Result = This->GetFontSize();
+ wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
+ rt.send( rt.make_int(Result));
+
+}
+
+// wxTextAttr::GetFontStyle
+void wxTextAttr_GetFontStyle(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ if(!This) throw wxe_badarg("This");
+ int Result = This->GetFontStyle();
+ wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
+ rt.send( rt.make_int(Result));
+
+}
+
+// wxTextAttr::GetFontUnderlined
+void wxTextAttr_GetFontUnderlined(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ if(!This) throw wxe_badarg("This");
+ bool Result = This->GetFontUnderlined();
+ wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
+ rt.send( rt.make_bool(Result));
+
+}
+
+// wxTextAttr::GetFontWeight
+void wxTextAttr_GetFontWeight(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ if(!This) throw wxe_badarg("This");
+ int Result = This->GetFontWeight();
+ wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
+ rt.send( rt.make_int(Result));
+
+}
+
// wxTextAttr::GetLeftIndent
void wxTextAttr_GetLeftIndent(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
{
@@ -752,6 +836,134 @@ void wxTextAttr_SetFont(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
}
+// wxTextAttr::SetFontEncoding
+void wxTextAttr_SetFontEncoding(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ wxFontEncoding encoding;
+ if(!enif_get_int(env, argv[1], (int *) &encoding)) Badarg("encoding"); // enum
+ if(!This) throw wxe_badarg("This");
+ This->SetFontEncoding(encoding);
+
+}
+
+// wxTextAttr::SetFontFaceName
+void wxTextAttr_SetFontFaceName(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ ErlNifBinary faceName_bin;
+ wxString faceName;
+ if(!enif_inspect_binary(env, argv[1], &faceName_bin)) Badarg("faceName");
+ faceName = wxString(faceName_bin.data, wxConvUTF8, faceName_bin.size);
+ if(!This) throw wxe_badarg("This");
+ This->SetFontFaceName(faceName);
+
+}
+
+// wxTextAttr::SetFontFamily
+void wxTextAttr_SetFontFamily(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ wxFontFamily family;
+ if(!enif_get_int(env, argv[1], (int *) &family)) Badarg("family"); // enum
+ if(!This) throw wxe_badarg("This");
+ This->SetFontFamily(family);
+
+}
+
+// wxTextAttr::SetFontSize
+void wxTextAttr_SetFontSize(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ int pointSize;
+ if(!enif_get_int(env, argv[1], &pointSize)) Badarg("pointSize"); // int
+ if(!This) throw wxe_badarg("This");
+ This->SetFontSize(pointSize);
+
+}
+
+// wxTextAttr::SetFontPointSize
+void wxTextAttr_SetFontPointSize(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ int pointSize;
+ if(!enif_get_int(env, argv[1], &pointSize)) Badarg("pointSize"); // int
+ if(!This) throw wxe_badarg("This");
+ This->SetFontPointSize(pointSize);
+
+}
+
+// wxTextAttr::SetFontPixelSize
+void wxTextAttr_SetFontPixelSize(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ int pixelSize;
+ if(!enif_get_int(env, argv[1], &pixelSize)) Badarg("pixelSize"); // int
+ if(!This) throw wxe_badarg("This");
+ This->SetFontPixelSize(pixelSize);
+
+}
+
+// wxTextAttr::SetFontStyle
+void wxTextAttr_SetFontStyle(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ wxFontStyle fontStyle;
+ if(!enif_get_int(env, argv[1], (int *) &fontStyle)) Badarg("fontStyle"); // enum
+ if(!This) throw wxe_badarg("This");
+ This->SetFontStyle(fontStyle);
+
+}
+
+// wxTextAttr::SetFontUnderlined
+void wxTextAttr_SetFontUnderlined(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ bool underlined;
+ underlined = enif_is_identical(argv[1], WXE_ATOM_true);
+ if(!This) throw wxe_badarg("This");
+ This->SetFontUnderlined(underlined);
+
+}
+
+// wxTextAttr::SetFontWeight
+void wxTextAttr_SetFontWeight(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxTextAttr *This;
+ This = (wxTextAttr *) memenv->getPtr(env, argv[0], "This");
+ wxFontWeight fontWeight;
+ if(!enif_get_int(env, argv[1], (int *) &fontWeight)) Badarg("fontWeight"); // enum
+ if(!This) throw wxe_badarg("This");
+ This->SetFontWeight(fontWeight);
+
+}
+
// wxTextAttr::SetLeftIndent
void wxTextAttr_SetLeftIndent(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
{
diff --git a/lib/wx/doc/src/wxImageList.xml b/lib/wx/doc/src/wxImageList.xml
index 31b4f3e3c2..d0dbf3d911 100644
--- a/lib/wx/doc/src/wxImageList.xml
+++ b/lib/wx/doc/src/wxImageList.xml
@@ -57,8 +57,8 @@
<name name="add" arity="3" clause_i="1" since=""/>
<name name="add" arity="3" clause_i="2" since=""/>
- <fsummary>Adds a new image or images using a bitmap and optional mask bitmap. </fsummary>
- <desc><p>Adds a new image or images using a bitmap and optional mask bitmap.
+ <fsummary>Adds a new image or images using a bitmap and mask colour. </fsummary>
+ <desc><p>Adds a new image or images using a bitmap and mask colour.
</p><p>Return: The new zero-based image index.
</p><p>Remark: The original bitmap or icon is not affected by the <seemfa marker="#add/3"><c>add/3</c></seemfa> operation, and can be deleted afterwards. If the bitmap is wider than the images in the list, then the bitmap will automatically be split into smaller images, each matching the dimensions of the image list. This does not apply when adding icons.
</p></desc>
diff --git a/lib/wx/doc/src/wxTextAttr.xml b/lib/wx/doc/src/wxTextAttr.xml
index 3beda6c9ec..4dc3fe562a 100644
--- a/lib/wx/doc/src/wxTextAttr.xml
+++ b/lib/wx/doc/src/wxTextAttr.xml
@@ -70,6 +70,48 @@
</func>
<func>
+ <name name="getFontEncoding" arity="1" clause_i="1" since=""/>
+ <fsummary>Returns the font encoding. </fsummary>
+ <desc><p>Returns the font encoding.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="getFontFaceName" arity="1" clause_i="1" since=""/>
+ <fsummary>Returns the font face name. </fsummary>
+ <desc><p>Returns the font face name.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="getFontSize" arity="1" clause_i="1" since=""/>
+ <fsummary>Returns the font size in points. </fsummary>
+ <desc><p>Returns the font size in points.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="getFontStyle" arity="1" clause_i="1" since=""/>
+ <fsummary>Returns the font style. </fsummary>
+ <desc><p>Returns the font style.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="getFontUnderlined" arity="1" clause_i="1" since=""/>
+ <fsummary>Returns true if the font is underlined. </fsummary>
+ <desc><p>Returns true if the font is underlined.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="getFontWeight" arity="1" clause_i="1" since=""/>
+ <fsummary>Returns the font weight. </fsummary>
+ <desc><p>Returns the font weight.
+ </p></desc>
+ </func>
+
+ <func>
<name name="getLeftIndent" arity="1" clause_i="1" since=""/>
<fsummary>Returns the left indent in tenths of a millimetre. </fsummary>
<desc><p>Returns the left indent in tenths of a millimetre.
@@ -179,6 +221,69 @@
</func>
<func>
+ <name name="setFontEncoding" arity="2" clause_i="1" since=""/>
+ <fsummary>Sets the font encoding. </fsummary>
+ <desc><p>Sets the font encoding.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="setFontFaceName" arity="2" clause_i="1" since=""/>
+ <fsummary>Sets the font face name. </fsummary>
+ <desc><p>Sets the font face name.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="setFontFamily" arity="2" clause_i="1" since=""/>
+ <fsummary>Sets the font family. </fsummary>
+ <desc><p>Sets the font family.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="setFontSize" arity="2" clause_i="1" since=""/>
+ <fsummary>Sets the font size in points. </fsummary>
+ <desc><p>Sets the font size in points.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="setFontPointSize" arity="2" clause_i="1" since=""/>
+ <fsummary>Sets the font size in points. </fsummary>
+ <desc><p>Sets the font size in points.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="setFontPixelSize" arity="2" clause_i="1" since=""/>
+ <fsummary>Sets the font size in pixels. </fsummary>
+ <desc><p>Sets the font size in pixels.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="setFontStyle" arity="2" clause_i="1" since=""/>
+ <fsummary>Sets the font style (normal, italic or slanted). </fsummary>
+ <desc><p>Sets the font style (normal, italic or slanted).
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="setFontUnderlined" arity="2" clause_i="1" since=""/>
+ <fsummary>Sets the font underlining (solid line, text colour). </fsummary>
+ <desc><p>Sets the font underlining (solid line, text colour).
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="setFontWeight" arity="2" clause_i="1" since=""/>
+ <fsummary>Sets the font weight. </fsummary>
+ <desc><p>Sets the font weight.
+ </p></desc>
+ </func>
+
+ <func>
<name name="setLeftIndent" arity="2" clause_i="1" since=""/>
<fsummary>See: <c>setLeftIndent/3</c></fsummary>
</func>
diff --git a/lib/wx/src/gen/wxAuiDockArt.erl b/lib/wx/src/gen/wxAuiDockArt.erl
index 3a30676845..ce0e6b6de9 100644
--- a/lib/wx/src/gen/wxAuiDockArt.erl
+++ b/lib/wx/src/gen/wxAuiDockArt.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -61,7 +61,7 @@ getMetric(#wx_ref{type=ThisT}=This,Id)
-spec setColour(This, Id, Colour) -> 'ok' when
This::wxAuiDockArt(), Id::integer(), Colour::wx:wx_colour().
setColour(#wx_ref{type=ThisT}=This,Id,Colour)
- when is_integer(Id),tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when is_integer(Id),?is_colordata(Colour) ->
?CLASS(ThisT,wxAuiDockArt),
wxe_util:queue_cmd(This,Id,wxe_util:color(Colour),?get_env(),?wxAuiDockArt_SetColour).
diff --git a/lib/wx/src/gen/wxAuiTabArt.erl b/lib/wx/src/gen/wxAuiTabArt.erl
index cff6905289..f156835ce5 100644
--- a/lib/wx/src/gen/wxAuiTabArt.erl
+++ b/lib/wx/src/gen/wxAuiTabArt.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -67,7 +67,7 @@ setSelectedFont(#wx_ref{type=ThisT}=This,#wx_ref{type=FontT}=Font) ->
-spec setColour(This, Colour) -> 'ok' when
This::wxAuiTabArt(), Colour::wx:wx_colour().
setColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxAuiTabArt),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxAuiTabArt_SetColour).
@@ -75,7 +75,7 @@ setColour(#wx_ref{type=ThisT}=This,Colour)
-spec setActiveColour(This, Colour) -> 'ok' when
This::wxAuiTabArt(), Colour::wx:wx_colour().
setActiveColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxAuiTabArt),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxAuiTabArt_SetActiveColour).
diff --git a/lib/wx/src/gen/wxBrush.erl b/lib/wx/src/gen/wxBrush.erl
index 7e8d9084db..cb6f88fe00 100644
--- a/lib/wx/src/gen/wxBrush.erl
+++ b/lib/wx/src/gen/wxBrush.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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,7 +49,7 @@ new() ->
Brush::wxBrush:wxBrush() | wxBitmap:wxBitmap().
new(Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
new(Colour, []);
new(#wx_ref{type=BrushT}=Brush) ->
IswxBrush = ?CLASS_T(BrushT,wxBrush),
@@ -68,7 +68,7 @@ new(#wx_ref{type=BrushT}=Brush) ->
Colour::wx:wx_colour(),
Option :: {'style', wx:wx_enum()}.
new(Colour, Options)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4,is_list(Options) ->
+ when ?is_colordata(Colour),is_list(Options) ->
MOpts = fun({style, _style} = Arg) -> Arg;
(BadOpt) -> erlang:error({badoption, BadOpt}) end,
Opts = lists:map(MOpts, Options),
@@ -120,7 +120,7 @@ isOk(#wx_ref{type=ThisT}=This) ->
-spec setColour(This, Colour) -> 'ok' when
This::wxBrush(), Colour::wx:wx_colour().
setColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxBrush),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxBrush_SetColour_1).
diff --git a/lib/wx/src/gen/wxCalendarCtrl.erl b/lib/wx/src/gen/wxCalendarCtrl.erl
index 2a4850a05f..026b74e49c 100644
--- a/lib/wx/src/gen/wxCalendarCtrl.erl
+++ b/lib/wx/src/gen/wxCalendarCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -222,7 +222,7 @@ enableHolidayDisplay(#wx_ref{type=ThisT}=This, Options)
-spec setHeaderColours(This, ColFg, ColBg) -> 'ok' when
This::wxCalendarCtrl(), ColFg::wx:wx_colour(), ColBg::wx:wx_colour().
setHeaderColours(#wx_ref{type=ThisT}=This,ColFg,ColBg)
- when tuple_size(ColFg) =:= 3; tuple_size(ColFg) =:= 4,tuple_size(ColBg) =:= 3; tuple_size(ColBg) =:= 4 ->
+ when ?is_colordata(ColFg),?is_colordata(ColBg) ->
?CLASS(ThisT,wxCalendarCtrl),
wxe_util:queue_cmd(This,wxe_util:color(ColFg),wxe_util:color(ColBg),?get_env(),?wxCalendarCtrl_SetHeaderColours).
@@ -246,7 +246,7 @@ getHeaderColourBg(#wx_ref{type=ThisT}=This) ->
-spec setHighlightColours(This, ColFg, ColBg) -> 'ok' when
This::wxCalendarCtrl(), ColFg::wx:wx_colour(), ColBg::wx:wx_colour().
setHighlightColours(#wx_ref{type=ThisT}=This,ColFg,ColBg)
- when tuple_size(ColFg) =:= 3; tuple_size(ColFg) =:= 4,tuple_size(ColBg) =:= 3; tuple_size(ColBg) =:= 4 ->
+ when ?is_colordata(ColFg),?is_colordata(ColBg) ->
?CLASS(ThisT,wxCalendarCtrl),
wxe_util:queue_cmd(This,wxe_util:color(ColFg),wxe_util:color(ColBg),?get_env(),?wxCalendarCtrl_SetHighlightColours).
@@ -270,7 +270,7 @@ getHighlightColourBg(#wx_ref{type=ThisT}=This) ->
-spec setHolidayColours(This, ColFg, ColBg) -> 'ok' when
This::wxCalendarCtrl(), ColFg::wx:wx_colour(), ColBg::wx:wx_colour().
setHolidayColours(#wx_ref{type=ThisT}=This,ColFg,ColBg)
- when tuple_size(ColFg) =:= 3; tuple_size(ColFg) =:= 4,tuple_size(ColBg) =:= 3; tuple_size(ColBg) =:= 4 ->
+ when ?is_colordata(ColFg),?is_colordata(ColBg) ->
?CLASS(ThisT,wxCalendarCtrl),
wxe_util:queue_cmd(This,wxe_util:color(ColFg),wxe_util:color(ColBg),?get_env(),?wxCalendarCtrl_SetHolidayColours).
diff --git a/lib/wx/src/gen/wxCalendarDateAttr.erl b/lib/wx/src/gen/wxCalendarDateAttr.erl
index 5737a61204..b27f2a32b6 100644
--- a/lib/wx/src/gen/wxCalendarDateAttr.erl
+++ b/lib/wx/src/gen/wxCalendarDateAttr.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -90,7 +90,7 @@ new(Border, Options)
-spec setTextColour(This, ColText) -> 'ok' when
This::wxCalendarDateAttr(), ColText::wx:wx_colour().
setTextColour(#wx_ref{type=ThisT}=This,ColText)
- when tuple_size(ColText) =:= 3; tuple_size(ColText) =:= 4 ->
+ when ?is_colordata(ColText) ->
?CLASS(ThisT,wxCalendarDateAttr),
wxe_util:queue_cmd(This,wxe_util:color(ColText),?get_env(),?wxCalendarDateAttr_SetTextColour).
@@ -98,7 +98,7 @@ setTextColour(#wx_ref{type=ThisT}=This,ColText)
-spec setBackgroundColour(This, ColBack) -> 'ok' when
This::wxCalendarDateAttr(), ColBack::wx:wx_colour().
setBackgroundColour(#wx_ref{type=ThisT}=This,ColBack)
- when tuple_size(ColBack) =:= 3; tuple_size(ColBack) =:= 4 ->
+ when ?is_colordata(ColBack) ->
?CLASS(ThisT,wxCalendarDateAttr),
wxe_util:queue_cmd(This,wxe_util:color(ColBack),?get_env(),?wxCalendarDateAttr_SetBackgroundColour).
@@ -106,7 +106,7 @@ setBackgroundColour(#wx_ref{type=ThisT}=This,ColBack)
-spec setBorderColour(This, Col) -> 'ok' when
This::wxCalendarDateAttr(), Col::wx:wx_colour().
setBorderColour(#wx_ref{type=ThisT}=This,Col)
- when tuple_size(Col) =:= 3; tuple_size(Col) =:= 4 ->
+ when ?is_colordata(Col) ->
?CLASS(ThisT,wxCalendarDateAttr),
wxe_util:queue_cmd(This,wxe_util:color(Col),?get_env(),?wxCalendarDateAttr_SetBorderColour).
diff --git a/lib/wx/src/gen/wxColourData.erl b/lib/wx/src/gen/wxColourData.erl
index 34ea2c7899..a7c7c5f300 100644
--- a/lib/wx/src/gen/wxColourData.erl
+++ b/lib/wx/src/gen/wxColourData.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -74,7 +74,7 @@ setChooseFull(#wx_ref{type=ThisT}=This,Flag)
-spec setColour(This, Colour) -> 'ok' when
This::wxColourData(), Colour::wx:wx_colour().
setColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxColourData),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxColourData_SetColour).
@@ -82,7 +82,7 @@ setColour(#wx_ref{type=ThisT}=This,Colour)
-spec setCustomColour(This, I, Colour) -> 'ok' when
This::wxColourData(), I::integer(), Colour::wx:wx_colour().
setCustomColour(#wx_ref{type=ThisT}=This,I,Colour)
- when is_integer(I),tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when is_integer(I),?is_colordata(Colour) ->
?CLASS(ThisT,wxColourData),
wxe_util:queue_cmd(This,I,wxe_util:color(Colour),?get_env(),?wxColourData_SetCustomColour).
diff --git a/lib/wx/src/gen/wxColourPickerCtrl.erl b/lib/wx/src/gen/wxColourPickerCtrl.erl
index 1d34a8b8b9..84d441d113 100644
--- a/lib/wx/src/gen/wxColourPickerCtrl.erl
+++ b/lib/wx/src/gen/wxColourPickerCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -162,7 +162,7 @@ setColour(#wx_ref{type=ThisT}=This,Colname)
Colname_UC = unicode:characters_to_binary(Colname),
wxe_util:queue_cmd(This,Colname_UC,?get_env(),?wxColourPickerCtrl_SetColour_1_0);
setColour(#wx_ref{type=ThisT}=This,Col)
- when tuple_size(Col) =:= 3; tuple_size(Col) =:= 4 ->
+ when ?is_colordata(Col) ->
?CLASS(ThisT,wxColourPickerCtrl),
wxe_util:queue_cmd(This,wxe_util:color(Col),?get_env(),?wxColourPickerCtrl_SetColour_1_1).
diff --git a/lib/wx/src/gen/wxDC.erl b/lib/wx/src/gen/wxDC.erl
index be8c6f5914..ffa7108c9a 100644
--- a/lib/wx/src/gen/wxDC.erl
+++ b/lib/wx/src/gen/wxDC.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -375,7 +375,7 @@ endPage(#wx_ref{type=ThisT}=This) ->
This::wxDC(), Pt::{X::integer(), Y::integer()}, Col::wx:wx_colour().
floodFill(This,{PtX,PtY} = Pt,Col)
- when is_record(This, wx_ref),is_integer(PtX),is_integer(PtY),tuple_size(Col) =:= 3; tuple_size(Col) =:= 4 ->
+ when is_record(This, wx_ref),is_integer(PtX),is_integer(PtY),?is_colordata(Col) ->
floodFill(This,Pt,Col, []).
%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxdc.html#wxdcfloodfill">external documentation</a>.
@@ -384,7 +384,7 @@ floodFill(This,{PtX,PtY} = Pt,Col)
This::wxDC(), Pt::{X::integer(), Y::integer()}, Col::wx:wx_colour(),
Option :: {'style', wx:wx_enum()}.
floodFill(#wx_ref{type=ThisT}=This,{PtX,PtY} = Pt,Col, Options)
- when is_integer(PtX),is_integer(PtY),tuple_size(Col) =:= 3; tuple_size(Col) =:= 4,is_list(Options) ->
+ when is_integer(PtX),is_integer(PtY),?is_colordata(Col),is_list(Options) ->
?CLASS(ThisT,wxDC),
MOpts = fun({style, _style} = Arg) -> Arg;
(BadOpt) -> erlang:error({badoption, BadOpt}) end,
@@ -606,7 +606,7 @@ getUserScale(#wx_ref{type=ThisT}=This) ->
-spec gradientFillConcentric(This, Rect, InitialColour, DestColour) -> 'ok' when
This::wxDC(), Rect::{X::integer(), Y::integer(), W::integer(), H::integer()}, InitialColour::wx:wx_colour(), DestColour::wx:wx_colour().
gradientFillConcentric(#wx_ref{type=ThisT}=This,{RectX,RectY,RectW,RectH} = Rect,InitialColour,DestColour)
- when is_integer(RectX),is_integer(RectY),is_integer(RectW),is_integer(RectH),tuple_size(InitialColour) =:= 3; tuple_size(InitialColour) =:= 4,tuple_size(DestColour) =:= 3; tuple_size(DestColour) =:= 4 ->
+ when is_integer(RectX),is_integer(RectY),is_integer(RectW),is_integer(RectH),?is_colordata(InitialColour),?is_colordata(DestColour) ->
?CLASS(ThisT,wxDC),
wxe_util:queue_cmd(This,Rect,wxe_util:color(InitialColour),wxe_util:color(DestColour),?get_env(),?wxDC_GradientFillConcentric_3).
@@ -614,7 +614,7 @@ gradientFillConcentric(#wx_ref{type=ThisT}=This,{RectX,RectY,RectW,RectH} = Rect
-spec gradientFillConcentric(This, Rect, InitialColour, DestColour, CircleCenter) -> 'ok' when
This::wxDC(), Rect::{X::integer(), Y::integer(), W::integer(), H::integer()}, InitialColour::wx:wx_colour(), DestColour::wx:wx_colour(), CircleCenter::{X::integer(), Y::integer()}.
gradientFillConcentric(#wx_ref{type=ThisT}=This,{RectX,RectY,RectW,RectH} = Rect,InitialColour,DestColour,{CircleCenterX,CircleCenterY} = CircleCenter)
- when is_integer(RectX),is_integer(RectY),is_integer(RectW),is_integer(RectH),tuple_size(InitialColour) =:= 3; tuple_size(InitialColour) =:= 4,tuple_size(DestColour) =:= 3; tuple_size(DestColour) =:= 4,is_integer(CircleCenterX),is_integer(CircleCenterY) ->
+ when is_integer(RectX),is_integer(RectY),is_integer(RectW),is_integer(RectH),?is_colordata(InitialColour),?is_colordata(DestColour),is_integer(CircleCenterX),is_integer(CircleCenterY) ->
?CLASS(ThisT,wxDC),
wxe_util:queue_cmd(This,Rect,wxe_util:color(InitialColour),wxe_util:color(DestColour),CircleCenter,?get_env(),?wxDC_GradientFillConcentric_4).
@@ -623,7 +623,7 @@ gradientFillConcentric(#wx_ref{type=ThisT}=This,{RectX,RectY,RectW,RectH} = Rect
This::wxDC(), Rect::{X::integer(), Y::integer(), W::integer(), H::integer()}, InitialColour::wx:wx_colour(), DestColour::wx:wx_colour().
gradientFillLinear(This,{RectX,RectY,RectW,RectH} = Rect,InitialColour,DestColour)
- when is_record(This, wx_ref),is_integer(RectX),is_integer(RectY),is_integer(RectW),is_integer(RectH),tuple_size(InitialColour) =:= 3; tuple_size(InitialColour) =:= 4,tuple_size(DestColour) =:= 3; tuple_size(DestColour) =:= 4 ->
+ when is_record(This, wx_ref),is_integer(RectX),is_integer(RectY),is_integer(RectW),is_integer(RectH),?is_colordata(InitialColour),?is_colordata(DestColour) ->
gradientFillLinear(This,Rect,InitialColour,DestColour, []).
%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxdc.html#wxdcgradientfilllinear">external documentation</a>.
@@ -632,7 +632,7 @@ gradientFillLinear(This,{RectX,RectY,RectW,RectH} = Rect,InitialColour,DestColou
This::wxDC(), Rect::{X::integer(), Y::integer(), W::integer(), H::integer()}, InitialColour::wx:wx_colour(), DestColour::wx:wx_colour(),
Option :: {'nDirection', wx:wx_enum()}.
gradientFillLinear(#wx_ref{type=ThisT}=This,{RectX,RectY,RectW,RectH} = Rect,InitialColour,DestColour, Options)
- when is_integer(RectX),is_integer(RectY),is_integer(RectW),is_integer(RectH),tuple_size(InitialColour) =:= 3; tuple_size(InitialColour) =:= 4,tuple_size(DestColour) =:= 3; tuple_size(DestColour) =:= 4,is_list(Options) ->
+ when is_integer(RectX),is_integer(RectY),is_integer(RectW),is_integer(RectH),?is_colordata(InitialColour),?is_colordata(DestColour),is_list(Options) ->
?CLASS(ThisT,wxDC),
MOpts = fun({nDirection, _nDirection} = Arg) -> Arg;
(BadOpt) -> erlang:error({badoption, BadOpt}) end,
@@ -833,7 +833,7 @@ setPen(#wx_ref{type=ThisT}=This,#wx_ref{type=PenT}=Pen) ->
-spec setTextBackground(This, Colour) -> 'ok' when
This::wxDC(), Colour::wx:wx_colour().
setTextBackground(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxDC),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxDC_SetTextBackground).
@@ -841,7 +841,7 @@ setTextBackground(#wx_ref{type=ThisT}=This,Colour)
-spec setTextForeground(This, Colour) -> 'ok' when
This::wxDC(), Colour::wx:wx_colour().
setTextForeground(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxDC),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxDC_SetTextForeground).
diff --git a/lib/wx/src/gen/wxFontData.erl b/lib/wx/src/gen/wxFontData.erl
index 53c3bf108b..bbb71845fe 100644
--- a/lib/wx/src/gen/wxFontData.erl
+++ b/lib/wx/src/gen/wxFontData.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -122,7 +122,7 @@ setChosenFont(#wx_ref{type=ThisT}=This,#wx_ref{type=FontT}=Font) ->
-spec setColour(This, Colour) -> 'ok' when
This::wxFontData(), Colour::wx:wx_colour().
setColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxFontData),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxFontData_SetColour).
diff --git a/lib/wx/src/gen/wxGraphicsContext.erl b/lib/wx/src/gen/wxGraphicsContext.erl
index b49fc405a6..e38aae80f8 100644
--- a/lib/wx/src/gen/wxGraphicsContext.erl
+++ b/lib/wx/src/gen/wxGraphicsContext.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -95,7 +95,7 @@ createRadialGradientBrush(#wx_ref{type=ThisT}=This,StartX,StartY,EndX,EndY,Radiu
-spec createRadialGradientBrush(This, StartX, StartY, EndX, EndY, Radius, OColor, CColor) -> wxGraphicsBrush:wxGraphicsBrush() when
This::wxGraphicsContext(), StartX::number(), StartY::number(), EndX::number(), EndY::number(), Radius::number(), OColor::wx:wx_colour(), CColor::wx:wx_colour().
createRadialGradientBrush(#wx_ref{type=ThisT}=This,StartX,StartY,EndX,EndY,Radius,OColor,CColor)
- when is_number(StartX),is_number(StartY),is_number(EndX),is_number(EndY),is_number(Radius),tuple_size(OColor) =:= 3; tuple_size(OColor) =:= 4,tuple_size(CColor) =:= 3; tuple_size(CColor) =:= 4 ->
+ when is_number(StartX),is_number(StartY),is_number(EndX),is_number(EndY),is_number(Radius),?is_colordata(OColor),?is_colordata(CColor) ->
?CLASS(ThisT,wxGraphicsContext),
wxe_util:queue_cmd(This,StartX,StartY,EndX,EndY,Radius,wxe_util:color(OColor),wxe_util:color(CColor),?get_env(),?wxGraphicsContext_CreateRadialGradientBrush_7),
wxe_util:rec(?wxGraphicsContext_CreateRadialGradientBrush_7).
@@ -114,7 +114,7 @@ createLinearGradientBrush(#wx_ref{type=ThisT}=This,X1,Y1,X2,Y2,#wx_ref{type=Stop
-spec createLinearGradientBrush(This, X1, Y1, X2, Y2, C1, C2) -> wxGraphicsBrush:wxGraphicsBrush() when
This::wxGraphicsContext(), X1::number(), Y1::number(), X2::number(), Y2::number(), C1::wx:wx_colour(), C2::wx:wx_colour().
createLinearGradientBrush(#wx_ref{type=ThisT}=This,X1,Y1,X2,Y2,C1,C2)
- when is_number(X1),is_number(Y1),is_number(X2),is_number(Y2),tuple_size(C1) =:= 3; tuple_size(C1) =:= 4,tuple_size(C2) =:= 3; tuple_size(C2) =:= 4 ->
+ when is_number(X1),is_number(Y1),is_number(X2),is_number(Y2),?is_colordata(C1),?is_colordata(C2) ->
?CLASS(ThisT,wxGraphicsContext),
wxe_util:queue_cmd(This,X1,Y1,X2,Y2,wxe_util:color(C1),wxe_util:color(C2),?get_env(),?wxGraphicsContext_CreateLinearGradientBrush_6),
wxe_util:rec(?wxGraphicsContext_CreateLinearGradientBrush_6).
@@ -480,7 +480,7 @@ setFont(#wx_ref{type=ThisT}=This,#wx_ref{type=FontT}=Font) ->
-spec setFont(This, Font, Colour) -> 'ok' when
This::wxGraphicsContext(), Font::wxFont:wxFont(), Colour::wx:wx_colour().
setFont(#wx_ref{type=ThisT}=This,#wx_ref{type=FontT}=Font,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxGraphicsContext),
?CLASS(FontT,wxFont),
wxe_util:queue_cmd(This,Font,wxe_util:color(Colour),?get_env(),?wxGraphicsContext_SetFont_2).
diff --git a/lib/wx/src/gen/wxGraphicsGradientStops.erl b/lib/wx/src/gen/wxGraphicsGradientStops.erl
index 1849df73ae..c9341f5144 100644
--- a/lib/wx/src/gen/wxGraphicsGradientStops.erl
+++ b/lib/wx/src/gen/wxGraphicsGradientStops.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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,7 +71,7 @@ getCount(#wx_ref{type=ThisT}=This) ->
-spec setStartColour(This, Col) -> 'ok' when
This::wxGraphicsGradientStops(), Col::wx:wx_colour().
setStartColour(#wx_ref{type=ThisT}=This,Col)
- when tuple_size(Col) =:= 3; tuple_size(Col) =:= 4 ->
+ when ?is_colordata(Col) ->
?CLASS(ThisT,wxGraphicsGradientStops),
wxe_util:queue_cmd(This,wxe_util:color(Col),?get_env(),?wxGraphicsGradientStops_SetStartColour).
@@ -87,7 +87,7 @@ getStartColour(#wx_ref{type=ThisT}=This) ->
-spec setEndColour(This, Col) -> 'ok' when
This::wxGraphicsGradientStops(), Col::wx:wx_colour().
setEndColour(#wx_ref{type=ThisT}=This,Col)
- when tuple_size(Col) =:= 3; tuple_size(Col) =:= 4 ->
+ when ?is_colordata(Col) ->
?CLASS(ThisT,wxGraphicsGradientStops),
wxe_util:queue_cmd(This,wxe_util:color(Col),?get_env(),?wxGraphicsGradientStops_SetEndColour).
@@ -103,7 +103,7 @@ getEndColour(#wx_ref{type=ThisT}=This) ->
-spec add(This, Col, Pos) -> 'ok' when
This::wxGraphicsGradientStops(), Col::wx:wx_colour(), Pos::number().
add(#wx_ref{type=ThisT}=This,Col,Pos)
- when tuple_size(Col) =:= 3; tuple_size(Col) =:= 4,is_number(Pos) ->
+ when ?is_colordata(Col),is_number(Pos) ->
?CLASS(ThisT,wxGraphicsGradientStops),
wxe_util:queue_cmd(This,wxe_util:color(Col),Pos,?get_env(),?wxGraphicsGradientStops_Add).
diff --git a/lib/wx/src/gen/wxGrid.erl b/lib/wx/src/gen/wxGrid.erl
index 3eb5acbb6f..f45e08c9c0 100644
--- a/lib/wx/src/gen/wxGrid.erl
+++ b/lib/wx/src/gen/wxGrid.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -1471,7 +1471,7 @@ setCellAlignment(#wx_ref{type=ThisT}=This,Row,Col,Horiz,Vert)
-spec setCellBackgroundColour(This, Row, Col, Colour) -> 'ok' when
This::wxGrid(), Row::integer(), Col::integer(), Colour::wx:wx_colour().
setCellBackgroundColour(#wx_ref{type=ThisT}=This,Row,Col,Colour)
- when is_integer(Row),is_integer(Col),tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when is_integer(Row),is_integer(Col),?is_colordata(Colour) ->
?CLASS(ThisT,wxGrid),
wxe_util:queue_cmd(This,Row,Col,wxe_util:color(Colour),?get_env(),?wxGrid_SetCellBackgroundColour).
@@ -1506,7 +1506,7 @@ setCellRenderer(#wx_ref{type=ThisT}=This,Row,Col,#wx_ref{type=RendererT}=Rendere
-spec setCellTextColour(This, Row, Col, Colour) -> 'ok' when
This::wxGrid(), Row::integer(), Col::integer(), Colour::wx:wx_colour().
setCellTextColour(#wx_ref{type=ThisT}=This,Row,Col,Colour)
- when is_integer(Row),is_integer(Col),tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when is_integer(Row),is_integer(Col),?is_colordata(Colour) ->
?CLASS(ThisT,wxGrid),
wxe_util:queue_cmd(This,Row,Col,wxe_util:color(Colour),?get_env(),?wxGrid_SetCellTextColour).
@@ -1645,7 +1645,7 @@ setDefaultCellAlignment(#wx_ref{type=ThisT}=This,Horiz,Vert)
-spec setDefaultCellBackgroundColour(This, Colour) -> 'ok' when
This::wxGrid(), Colour::wx:wx_colour().
setDefaultCellBackgroundColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxGrid),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxGrid_SetDefaultCellBackgroundColour).
@@ -1661,7 +1661,7 @@ setDefaultCellFont(#wx_ref{type=ThisT}=This,#wx_ref{type=FontT}=Font) ->
-spec setDefaultCellTextColour(This, Colour) -> 'ok' when
This::wxGrid(), Colour::wx:wx_colour().
setDefaultCellTextColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxGrid),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxGrid_SetDefaultCellTextColour).
@@ -1741,7 +1741,7 @@ setGridCursor(#wx_ref{type=ThisT}=This,Row,Col)
-spec setGridLineColour(This, Colour) -> 'ok' when
This::wxGrid(), Colour::wx:wx_colour().
setGridLineColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxGrid),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxGrid_SetGridLineColour).
@@ -1749,7 +1749,7 @@ setGridLineColour(#wx_ref{type=ThisT}=This,Colour)
-spec setLabelBackgroundColour(This, Colour) -> 'ok' when
This::wxGrid(), Colour::wx:wx_colour().
setLabelBackgroundColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxGrid),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxGrid_SetLabelBackgroundColour).
@@ -1765,7 +1765,7 @@ setLabelFont(#wx_ref{type=ThisT}=This,#wx_ref{type=FontT}=Font) ->
-spec setLabelTextColour(This, Colour) -> 'ok' when
This::wxGrid(), Colour::wx:wx_colour().
setLabelTextColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxGrid),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxGrid_SetLabelTextColour).
@@ -1875,7 +1875,7 @@ setScrollLineY(#wx_ref{type=ThisT}=This,Y)
-spec setSelectionBackground(This, C) -> 'ok' when
This::wxGrid(), C::wx:wx_colour().
setSelectionBackground(#wx_ref{type=ThisT}=This,C)
- when tuple_size(C) =:= 3; tuple_size(C) =:= 4 ->
+ when ?is_colordata(C) ->
?CLASS(ThisT,wxGrid),
wxe_util:queue_cmd(This,wxe_util:color(C),?get_env(),?wxGrid_SetSelectionBackground).
@@ -1883,7 +1883,7 @@ setSelectionBackground(#wx_ref{type=ThisT}=This,C)
-spec setSelectionForeground(This, C) -> 'ok' when
This::wxGrid(), C::wx:wx_colour().
setSelectionForeground(#wx_ref{type=ThisT}=This,C)
- when tuple_size(C) =:= 3; tuple_size(C) =:= 4 ->
+ when ?is_colordata(C) ->
?CLASS(ThisT,wxGrid),
wxe_util:queue_cmd(This,wxe_util:color(C),?get_env(),?wxGrid_SetSelectionForeground).
diff --git a/lib/wx/src/gen/wxGridCellAttr.erl b/lib/wx/src/gen/wxGridCellAttr.erl
index 97054b16f0..742ff19fee 100644
--- a/lib/wx/src/gen/wxGridCellAttr.erl
+++ b/lib/wx/src/gen/wxGridCellAttr.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -38,7 +38,7 @@ parent_class(_Class) -> erlang:error({badtype, ?MODULE}).
-spec setTextColour(This, ColText) -> 'ok' when
This::wxGridCellAttr(), ColText::wx:wx_colour().
setTextColour(#wx_ref{type=ThisT}=This,ColText)
- when tuple_size(ColText) =:= 3; tuple_size(ColText) =:= 4 ->
+ when ?is_colordata(ColText) ->
?CLASS(ThisT,wxGridCellAttr),
wxe_util:queue_cmd(This,wxe_util:color(ColText),?get_env(),?wxGridCellAttr_SetTextColour).
@@ -46,7 +46,7 @@ setTextColour(#wx_ref{type=ThisT}=This,ColText)
-spec setBackgroundColour(This, ColBack) -> 'ok' when
This::wxGridCellAttr(), ColBack::wx:wx_colour().
setBackgroundColour(#wx_ref{type=ThisT}=This,ColBack)
- when tuple_size(ColBack) =:= 3; tuple_size(ColBack) =:= 4 ->
+ when ?is_colordata(ColBack) ->
?CLASS(ThisT,wxGridCellAttr),
wxe_util:queue_cmd(This,wxe_util:color(ColBack),?get_env(),?wxGridCellAttr_SetBackgroundColour).
diff --git a/lib/wx/src/gen/wxImageList.erl b/lib/wx/src/gen/wxImageList.erl
index cd759030c2..f7db3715cb 100644
--- a/lib/wx/src/gen/wxImageList.erl
+++ b/lib/wx/src/gen/wxImageList.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -77,24 +77,24 @@ add(#wx_ref{type=ThisT}=This,#wx_ref{type=IconT}=Icon) ->
%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wximagelist.html#wximagelistadd">external documentation</a>.
%% <br /> Also:<br />
-%% add(This, Bitmap, Mask) -> integer() when<br />
-%% This::wxImageList(), Bitmap::wxBitmap:wxBitmap(), Mask::wxBitmap:wxBitmap().<br />
+%% add(This, Bitmap, MaskColour) -> integer() when<br />
+%% This::wxImageList(), Bitmap::wxBitmap:wxBitmap(), MaskColour::wx:wx_colour().<br />
%%
--spec add(This, Bitmap, MaskColour) -> integer() when
- This::wxImageList(), Bitmap::wxBitmap:wxBitmap(), MaskColour::wx:wx_colour();
- (This, Bitmap, Mask) -> integer() when
- This::wxImageList(), Bitmap::wxBitmap:wxBitmap(), Mask::wxBitmap:wxBitmap().
-add(#wx_ref{type=ThisT}=This,#wx_ref{type=BitmapT}=Bitmap,MaskColour)
- when tuple_size(MaskColour) =:= 3; tuple_size(MaskColour) =:= 4 ->
+-spec add(This, Bitmap, Mask) -> integer() when
+ This::wxImageList(), Bitmap::wxBitmap:wxBitmap(), Mask::wxBitmap:wxBitmap();
+ (This, Bitmap, MaskColour) -> integer() when
+ This::wxImageList(), Bitmap::wxBitmap:wxBitmap(), MaskColour::wx:wx_colour().
+add(#wx_ref{type=ThisT}=This,#wx_ref{type=BitmapT}=Bitmap,#wx_ref{type=MaskT}=Mask) ->
?CLASS(ThisT,wxImageList),
?CLASS(BitmapT,wxBitmap),
- wxe_util:queue_cmd(This,Bitmap,wxe_util:color(MaskColour),?get_env(),?wxImageList_Add_2_0),
+ ?CLASS(MaskT,wxBitmap),
+ wxe_util:queue_cmd(This,Bitmap,Mask,?get_env(),?wxImageList_Add_2_0),
wxe_util:rec(?wxImageList_Add_2_0);
-add(#wx_ref{type=ThisT}=This,#wx_ref{type=BitmapT}=Bitmap,#wx_ref{type=MaskT}=Mask) ->
+add(#wx_ref{type=ThisT}=This,#wx_ref{type=BitmapT}=Bitmap,MaskColour)
+ when ?is_colordata(MaskColour) ->
?CLASS(ThisT,wxImageList),
?CLASS(BitmapT,wxBitmap),
- ?CLASS(MaskT,wxBitmap),
- wxe_util:queue_cmd(This,Bitmap,Mask,?get_env(),?wxImageList_Add_2_1),
+ wxe_util:queue_cmd(This,Bitmap,wxe_util:color(MaskColour),?get_env(),?wxImageList_Add_2_1),
wxe_util:rec(?wxImageList_Add_2_1).
%% @equiv create(This,Width,Height, [])
diff --git a/lib/wx/src/gen/wxListCtrl.erl b/lib/wx/src/gen/wxListCtrl.erl
index b551671330..5a7448ade8 100644
--- a/lib/wx/src/gen/wxListCtrl.erl
+++ b/lib/wx/src/gen/wxListCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -625,7 +625,7 @@ scrollList(#wx_ref{type=ThisT}=This,Dx,Dy)
-spec setBackgroundColour(This, Col) -> boolean() when
This::wxListCtrl(), Col::wx:wx_colour().
setBackgroundColour(#wx_ref{type=ThisT}=This,Col)
- when tuple_size(Col) =:= 3; tuple_size(Col) =:= 4 ->
+ when ?is_colordata(Col) ->
?CLASS(ThisT,wxListCtrl),
wxe_util:queue_cmd(This,wxe_util:color(Col),?get_env(),?wxListCtrl_SetBackgroundColour),
wxe_util:rec(?wxListCtrl_SetBackgroundColour).
@@ -693,7 +693,7 @@ setItem(#wx_ref{type=ThisT}=This,Index,Column,Label, Options)
-spec setItemBackgroundColour(This, Item, Col) -> 'ok' when
This::wxListCtrl(), Item::integer(), Col::wx:wx_colour().
setItemBackgroundColour(#wx_ref{type=ThisT}=This,Item,Col)
- when is_integer(Item),tuple_size(Col) =:= 3; tuple_size(Col) =:= 4 ->
+ when is_integer(Item),?is_colordata(Col) ->
?CLASS(ThisT,wxListCtrl),
wxe_util:queue_cmd(This,Item,wxe_util:color(Col),?get_env(),?wxListCtrl_SetItemBackgroundColour).
@@ -784,7 +784,7 @@ setItemText(#wx_ref{type=ThisT}=This,Item,Text)
-spec setItemTextColour(This, Item, Col) -> 'ok' when
This::wxListCtrl(), Item::integer(), Col::wx:wx_colour().
setItemTextColour(#wx_ref{type=ThisT}=This,Item,Col)
- when is_integer(Item),tuple_size(Col) =:= 3; tuple_size(Col) =:= 4 ->
+ when is_integer(Item),?is_colordata(Col) ->
?CLASS(ThisT,wxListCtrl),
wxe_util:queue_cmd(This,Item,wxe_util:color(Col),?get_env(),?wxListCtrl_SetItemTextColour).
@@ -812,7 +812,7 @@ setSingleStyle(#wx_ref{type=ThisT}=This,Style, Options)
-spec setTextColour(This, Col) -> 'ok' when
This::wxListCtrl(), Col::wx:wx_colour().
setTextColour(#wx_ref{type=ThisT}=This,Col)
- when tuple_size(Col) =:= 3; tuple_size(Col) =:= 4 ->
+ when ?is_colordata(Col) ->
?CLASS(ThisT,wxListCtrl),
wxe_util:queue_cmd(This,wxe_util:color(Col),?get_env(),?wxListCtrl_SetTextColour).
diff --git a/lib/wx/src/gen/wxListItem.erl b/lib/wx/src/gen/wxListItem.erl
index 5564eee444..10f10ad662 100644
--- a/lib/wx/src/gen/wxListItem.erl
+++ b/lib/wx/src/gen/wxListItem.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -157,7 +157,7 @@ setAlign(#wx_ref{type=ThisT}=This,Align)
-spec setBackgroundColour(This, ColBack) -> 'ok' when
This::wxListItem(), ColBack::wx:wx_colour().
setBackgroundColour(#wx_ref{type=ThisT}=This,ColBack)
- when tuple_size(ColBack) =:= 3; tuple_size(ColBack) =:= 4 ->
+ when ?is_colordata(ColBack) ->
?CLASS(ThisT,wxListItem),
wxe_util:queue_cmd(This,wxe_util:color(ColBack),?get_env(),?wxListItem_SetBackgroundColour).
@@ -230,7 +230,7 @@ setText(#wx_ref{type=ThisT}=This,Text)
-spec setTextColour(This, ColText) -> 'ok' when
This::wxListItem(), ColText::wx:wx_colour().
setTextColour(#wx_ref{type=ThisT}=This,ColText)
- when tuple_size(ColText) =:= 3; tuple_size(ColText) =:= 4 ->
+ when ?is_colordata(ColText) ->
?CLASS(ThisT,wxListItem),
wxe_util:queue_cmd(This,wxe_util:color(ColText),?get_env(),?wxListItem_SetTextColour).
diff --git a/lib/wx/src/gen/wxListItemAttr.erl b/lib/wx/src/gen/wxListItemAttr.erl
index eefd9ce136..8cd04e5894 100644
--- a/lib/wx/src/gen/wxListItemAttr.erl
+++ b/lib/wx/src/gen/wxListItemAttr.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -42,7 +42,7 @@ new() ->
-spec new(ColText, ColBack, Font) -> wxListItemAttr() when
ColText::wx:wx_colour(), ColBack::wx:wx_colour(), Font::wxFont:wxFont().
new(ColText,ColBack,#wx_ref{type=FontT}=Font)
- when tuple_size(ColText) =:= 3; tuple_size(ColText) =:= 4,tuple_size(ColBack) =:= 3; tuple_size(ColBack) =:= 4 ->
+ when ?is_colordata(ColText),?is_colordata(ColBack) ->
?CLASS(FontT,wxFont),
wxe_util:queue_cmd(wxe_util:color(ColText),wxe_util:color(ColBack),Font,?get_env(),?wxListItemAttr_new_3),
wxe_util:rec(?wxListItemAttr_new_3).
@@ -99,7 +99,7 @@ hasTextColour(#wx_ref{type=ThisT}=This) ->
-spec setBackgroundColour(This, ColBack) -> 'ok' when
This::wxListItemAttr(), ColBack::wx:wx_colour().
setBackgroundColour(#wx_ref{type=ThisT}=This,ColBack)
- when tuple_size(ColBack) =:= 3; tuple_size(ColBack) =:= 4 ->
+ when ?is_colordata(ColBack) ->
?CLASS(ThisT,wxListItemAttr),
wxe_util:queue_cmd(This,wxe_util:color(ColBack),?get_env(),?wxListItemAttr_SetBackgroundColour).
@@ -115,7 +115,7 @@ setFont(#wx_ref{type=ThisT}=This,#wx_ref{type=FontT}=Font) ->
-spec setTextColour(This, ColText) -> 'ok' when
This::wxListItemAttr(), ColText::wx:wx_colour().
setTextColour(#wx_ref{type=ThisT}=This,ColText)
- when tuple_size(ColText) =:= 3; tuple_size(ColText) =:= 4 ->
+ when ?is_colordata(ColText) ->
?CLASS(ThisT,wxListItemAttr),
wxe_util:queue_cmd(This,wxe_util:color(ColText),?get_env(),?wxListItemAttr_SetTextColour).
diff --git a/lib/wx/src/gen/wxMask.erl b/lib/wx/src/gen/wxMask.erl
index 74bfd9226f..d5ce06529c 100644
--- a/lib/wx/src/gen/wxMask.erl
+++ b/lib/wx/src/gen/wxMask.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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,7 +59,7 @@ new(#wx_ref{type=BitmapT}=Bitmap,Index)
wxe_util:queue_cmd(Bitmap,Index,?get_env(),?wxMask_new_2_0),
wxe_util:rec(?wxMask_new_2_0);
new(#wx_ref{type=BitmapT}=Bitmap,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(BitmapT,wxBitmap),
wxe_util:queue_cmd(Bitmap,wxe_util:color(Colour),?get_env(),?wxMask_new_2_1),
wxe_util:rec(?wxMask_new_2_1).
@@ -89,7 +89,7 @@ create(#wx_ref{type=ThisT}=This,#wx_ref{type=BitmapT}=Bitmap,Index)
wxe_util:queue_cmd(This,Bitmap,Index,?get_env(),?wxMask_Create_2_0),
wxe_util:rec(?wxMask_Create_2_0);
create(#wx_ref{type=ThisT}=This,#wx_ref{type=BitmapT}=Bitmap,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxMask),
?CLASS(BitmapT,wxBitmap),
wxe_util:queue_cmd(This,Bitmap,wxe_util:color(Colour),?get_env(),?wxMask_Create_2_1),
diff --git a/lib/wx/src/gen/wxPen.erl b/lib/wx/src/gen/wxPen.erl
index 93d99566da..afd85c8a88 100644
--- a/lib/wx/src/gen/wxPen.erl
+++ b/lib/wx/src/gen/wxPen.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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,7 +50,7 @@ new() ->
Pen::wxPen().
new(Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
new(Colour, []);
new(#wx_ref{type=PenT}=Pen) ->
?CLASS(PenT,wxPen),
@@ -64,7 +64,7 @@ new(#wx_ref{type=PenT}=Pen) ->
Option :: {'width', integer()}
| {'style', wx:wx_enum()}.
new(Colour, Options)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4,is_list(Options) ->
+ when ?is_colordata(Colour),is_list(Options) ->
MOpts = fun({width, _width} = Arg) -> Arg;
({style, _style} = Arg) -> Arg;
(BadOpt) -> erlang:error({badoption, BadOpt}) end,
@@ -136,7 +136,7 @@ setCap(#wx_ref{type=ThisT}=This,CapStyle)
-spec setColour(This, Colour) -> 'ok' when
This::wxPen(), Colour::wx:wx_colour().
setColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxPen),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxPen_SetColour_1).
diff --git a/lib/wx/src/gen/wxRegion.erl b/lib/wx/src/gen/wxRegion.erl
index abc9d1abab..451891ac71 100644
--- a/lib/wx/src/gen/wxRegion.erl
+++ b/lib/wx/src/gen/wxRegion.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -242,7 +242,7 @@ union(#wx_ref{type=ThisT}=This,{RectX,RectY,RectW,RectH} = Rect)
This::wxRegion(), Bmp::wxBitmap:wxBitmap(), TransColour::wx:wx_colour().
union(This,Bmp,TransColour)
- when is_record(This, wx_ref),is_record(Bmp, wx_ref),tuple_size(TransColour) =:= 3; tuple_size(TransColour) =:= 4 ->
+ when is_record(This, wx_ref),is_record(Bmp, wx_ref),?is_colordata(TransColour) ->
union(This,Bmp,TransColour, []).
%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxregion.html#wxregionunion">external documentation</a>.
@@ -250,7 +250,7 @@ union(This,Bmp,TransColour)
This::wxRegion(), Bmp::wxBitmap:wxBitmap(), TransColour::wx:wx_colour(),
Option :: {'tolerance', integer()}.
union(#wx_ref{type=ThisT}=This,#wx_ref{type=BmpT}=Bmp,TransColour, Options)
- when tuple_size(TransColour) =:= 3; tuple_size(TransColour) =:= 4,is_list(Options) ->
+ when ?is_colordata(TransColour),is_list(Options) ->
?CLASS(ThisT,wxRegion),
?CLASS(BmpT,wxBitmap),
MOpts = fun({tolerance, _tolerance} = Arg) -> Arg;
diff --git a/lib/wx/src/gen/wxStyledTextCtrl.erl b/lib/wx/src/gen/wxStyledTextCtrl.erl
index bcc8f171e2..d84b37869b 100644
--- a/lib/wx/src/gen/wxStyledTextCtrl.erl
+++ b/lib/wx/src/gen/wxStyledTextCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -550,7 +550,7 @@ markerDefine(#wx_ref{type=ThisT}=This,MarkerNumber,MarkerSymbol, Options)
-spec markerSetForeground(This, MarkerNumber, Fore) -> 'ok' when
This::wxStyledTextCtrl(), MarkerNumber::integer(), Fore::wx:wx_colour().
markerSetForeground(#wx_ref{type=ThisT}=This,MarkerNumber,Fore)
- when is_integer(MarkerNumber),tuple_size(Fore) =:= 3; tuple_size(Fore) =:= 4 ->
+ when is_integer(MarkerNumber),?is_colordata(Fore) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,MarkerNumber,wxe_util:color(Fore),?get_env(),?wxStyledTextCtrl_MarkerSetForeground).
@@ -558,7 +558,7 @@ markerSetForeground(#wx_ref{type=ThisT}=This,MarkerNumber,Fore)
-spec markerSetBackground(This, MarkerNumber, Back) -> 'ok' when
This::wxStyledTextCtrl(), MarkerNumber::integer(), Back::wx:wx_colour().
markerSetBackground(#wx_ref{type=ThisT}=This,MarkerNumber,Back)
- when is_integer(MarkerNumber),tuple_size(Back) =:= 3; tuple_size(Back) =:= 4 ->
+ when is_integer(MarkerNumber),?is_colordata(Back) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,MarkerNumber,wxe_util:color(Back),?get_env(),?wxStyledTextCtrl_MarkerSetBackground).
@@ -718,7 +718,7 @@ styleClearAll(#wx_ref{type=ThisT}=This) ->
-spec styleSetForeground(This, Style, Fore) -> 'ok' when
This::wxStyledTextCtrl(), Style::integer(), Fore::wx:wx_colour().
styleSetForeground(#wx_ref{type=ThisT}=This,Style,Fore)
- when is_integer(Style),tuple_size(Fore) =:= 3; tuple_size(Fore) =:= 4 ->
+ when is_integer(Style),?is_colordata(Fore) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,Style,wxe_util:color(Fore),?get_env(),?wxStyledTextCtrl_StyleSetForeground).
@@ -726,7 +726,7 @@ styleSetForeground(#wx_ref{type=ThisT}=This,Style,Fore)
-spec styleSetBackground(This, Style, Back) -> 'ok' when
This::wxStyledTextCtrl(), Style::integer(), Back::wx:wx_colour().
styleSetBackground(#wx_ref{type=ThisT}=This,Style,Back)
- when is_integer(Style),tuple_size(Back) =:= 3; tuple_size(Back) =:= 4 ->
+ when is_integer(Style),?is_colordata(Back) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,Style,wxe_util:color(Back),?get_env(),?wxStyledTextCtrl_StyleSetBackground).
@@ -806,7 +806,7 @@ styleSetHotSpot(#wx_ref{type=ThisT}=This,Style,Hotspot)
-spec setSelForeground(This, UseSetting, Fore) -> 'ok' when
This::wxStyledTextCtrl(), UseSetting::boolean(), Fore::wx:wx_colour().
setSelForeground(#wx_ref{type=ThisT}=This,UseSetting,Fore)
- when is_boolean(UseSetting),tuple_size(Fore) =:= 3; tuple_size(Fore) =:= 4 ->
+ when is_boolean(UseSetting),?is_colordata(Fore) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,UseSetting,wxe_util:color(Fore),?get_env(),?wxStyledTextCtrl_SetSelForeground).
@@ -814,7 +814,7 @@ setSelForeground(#wx_ref{type=ThisT}=This,UseSetting,Fore)
-spec setSelBackground(This, UseSetting, Back) -> 'ok' when
This::wxStyledTextCtrl(), UseSetting::boolean(), Back::wx:wx_colour().
setSelBackground(#wx_ref{type=ThisT}=This,UseSetting,Back)
- when is_boolean(UseSetting),tuple_size(Back) =:= 3; tuple_size(Back) =:= 4 ->
+ when is_boolean(UseSetting),?is_colordata(Back) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,UseSetting,wxe_util:color(Back),?get_env(),?wxStyledTextCtrl_SetSelBackground).
@@ -838,7 +838,7 @@ setSelAlpha(#wx_ref{type=ThisT}=This,Alpha)
-spec setCaretForeground(This, Fore) -> 'ok' when
This::wxStyledTextCtrl(), Fore::wx:wx_colour().
setCaretForeground(#wx_ref{type=ThisT}=This,Fore)
- when tuple_size(Fore) =:= 3; tuple_size(Fore) =:= 4 ->
+ when ?is_colordata(Fore) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,wxe_util:color(Fore),?get_env(),?wxStyledTextCtrl_SetCaretForeground).
@@ -942,7 +942,7 @@ indicatorGetStyle(#wx_ref{type=ThisT}=This,Indicator)
-spec indicatorSetForeground(This, Indicator, Fore) -> 'ok' when
This::wxStyledTextCtrl(), Indicator::integer(), Fore::wx:wx_colour().
indicatorSetForeground(#wx_ref{type=ThisT}=This,Indicator,Fore)
- when is_integer(Indicator),tuple_size(Fore) =:= 3; tuple_size(Fore) =:= 4 ->
+ when is_integer(Indicator),?is_colordata(Fore) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,Indicator,wxe_util:color(Fore),?get_env(),?wxStyledTextCtrl_IndicatorSetForeground).
@@ -959,7 +959,7 @@ indicatorGetForeground(#wx_ref{type=ThisT}=This,Indicator)
-spec setWhitespaceForeground(This, UseSetting, Fore) -> 'ok' when
This::wxStyledTextCtrl(), UseSetting::boolean(), Fore::wx:wx_colour().
setWhitespaceForeground(#wx_ref{type=ThisT}=This,UseSetting,Fore)
- when is_boolean(UseSetting),tuple_size(Fore) =:= 3; tuple_size(Fore) =:= 4 ->
+ when is_boolean(UseSetting),?is_colordata(Fore) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,UseSetting,wxe_util:color(Fore),?get_env(),?wxStyledTextCtrl_SetWhitespaceForeground).
@@ -967,7 +967,7 @@ setWhitespaceForeground(#wx_ref{type=ThisT}=This,UseSetting,Fore)
-spec setWhitespaceBackground(This, UseSetting, Back) -> 'ok' when
This::wxStyledTextCtrl(), UseSetting::boolean(), Back::wx:wx_colour().
setWhitespaceBackground(#wx_ref{type=ThisT}=This,UseSetting,Back)
- when is_boolean(UseSetting),tuple_size(Back) =:= 3; tuple_size(Back) =:= 4 ->
+ when is_boolean(UseSetting),?is_colordata(Back) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,UseSetting,wxe_util:color(Back),?get_env(),?wxStyledTextCtrl_SetWhitespaceBackground).
@@ -1032,7 +1032,7 @@ getCaretLineBackground(#wx_ref{type=ThisT}=This) ->
-spec setCaretLineBackground(This, Back) -> 'ok' when
This::wxStyledTextCtrl(), Back::wx:wx_colour().
setCaretLineBackground(#wx_ref{type=ThisT}=This,Back)
- when tuple_size(Back) =:= 3; tuple_size(Back) =:= 4 ->
+ when ?is_colordata(Back) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,wxe_util:color(Back),?get_env(),?wxStyledTextCtrl_SetCaretLineBackground).
@@ -1891,7 +1891,7 @@ callTipSetHighlight(#wx_ref{type=ThisT}=This,HighlightStart,HighlightEnd)
-spec callTipSetBackground(This, Back) -> 'ok' when
This::wxStyledTextCtrl(), Back::wx:wx_colour().
callTipSetBackground(#wx_ref{type=ThisT}=This,Back)
- when tuple_size(Back) =:= 3; tuple_size(Back) =:= 4 ->
+ when ?is_colordata(Back) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,wxe_util:color(Back),?get_env(),?wxStyledTextCtrl_CallTipSetBackground).
@@ -1899,7 +1899,7 @@ callTipSetBackground(#wx_ref{type=ThisT}=This,Back)
-spec callTipSetForeground(This, Fore) -> 'ok' when
This::wxStyledTextCtrl(), Fore::wx:wx_colour().
callTipSetForeground(#wx_ref{type=ThisT}=This,Fore)
- when tuple_size(Fore) =:= 3; tuple_size(Fore) =:= 4 ->
+ when ?is_colordata(Fore) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,wxe_util:color(Fore),?get_env(),?wxStyledTextCtrl_CallTipSetForeground).
@@ -1907,7 +1907,7 @@ callTipSetForeground(#wx_ref{type=ThisT}=This,Fore)
-spec callTipSetForegroundHighlight(This, Fore) -> 'ok' when
This::wxStyledTextCtrl(), Fore::wx:wx_colour().
callTipSetForegroundHighlight(#wx_ref{type=ThisT}=This,Fore)
- when tuple_size(Fore) =:= 3; tuple_size(Fore) =:= 4 ->
+ when ?is_colordata(Fore) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,wxe_util:color(Fore),?get_env(),?wxStyledTextCtrl_CallTipSetForegroundHighlight).
@@ -2311,7 +2311,7 @@ linesSplit(#wx_ref{type=ThisT}=This,PixelWidth)
-spec setFoldMarginColour(This, UseSetting, Back) -> 'ok' when
This::wxStyledTextCtrl(), UseSetting::boolean(), Back::wx:wx_colour().
setFoldMarginColour(#wx_ref{type=ThisT}=This,UseSetting,Back)
- when is_boolean(UseSetting),tuple_size(Back) =:= 3; tuple_size(Back) =:= 4 ->
+ when is_boolean(UseSetting),?is_colordata(Back) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,UseSetting,wxe_util:color(Back),?get_env(),?wxStyledTextCtrl_SetFoldMarginColour).
@@ -2319,7 +2319,7 @@ setFoldMarginColour(#wx_ref{type=ThisT}=This,UseSetting,Back)
-spec setFoldMarginHiColour(This, UseSetting, Fore) -> 'ok' when
This::wxStyledTextCtrl(), UseSetting::boolean(), Fore::wx:wx_colour().
setFoldMarginHiColour(#wx_ref{type=ThisT}=This,UseSetting,Fore)
- when is_boolean(UseSetting),tuple_size(Fore) =:= 3; tuple_size(Fore) =:= 4 ->
+ when is_boolean(UseSetting),?is_colordata(Fore) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,UseSetting,wxe_util:color(Fore),?get_env(),?wxStyledTextCtrl_SetFoldMarginHiColour).
@@ -2824,7 +2824,7 @@ getEdgeColour(#wx_ref{type=ThisT}=This) ->
-spec setEdgeColour(This, EdgeColour) -> 'ok' when
This::wxStyledTextCtrl(), EdgeColour::wx:wx_colour().
setEdgeColour(#wx_ref{type=ThisT}=This,EdgeColour)
- when tuple_size(EdgeColour) =:= 3; tuple_size(EdgeColour) =:= 4 ->
+ when ?is_colordata(EdgeColour) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,wxe_util:color(EdgeColour),?get_env(),?wxStyledTextCtrl_SetEdgeColour).
@@ -3076,7 +3076,7 @@ getPrintWrapMode(#wx_ref{type=ThisT}=This) ->
-spec setHotspotActiveForeground(This, UseSetting, Fore) -> 'ok' when
This::wxStyledTextCtrl(), UseSetting::boolean(), Fore::wx:wx_colour().
setHotspotActiveForeground(#wx_ref{type=ThisT}=This,UseSetting,Fore)
- when is_boolean(UseSetting),tuple_size(Fore) =:= 3; tuple_size(Fore) =:= 4 ->
+ when is_boolean(UseSetting),?is_colordata(Fore) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,UseSetting,wxe_util:color(Fore),?get_env(),?wxStyledTextCtrl_SetHotspotActiveForeground).
@@ -3084,7 +3084,7 @@ setHotspotActiveForeground(#wx_ref{type=ThisT}=This,UseSetting,Fore)
-spec setHotspotActiveBackground(This, UseSetting, Back) -> 'ok' when
This::wxStyledTextCtrl(), UseSetting::boolean(), Back::wx:wx_colour().
setHotspotActiveBackground(#wx_ref{type=ThisT}=This,UseSetting,Back)
- when is_boolean(UseSetting),tuple_size(Back) =:= 3; tuple_size(Back) =:= 4 ->
+ when is_boolean(UseSetting),?is_colordata(Back) ->
?CLASS(ThisT,wxStyledTextCtrl),
wxe_util:queue_cmd(This,UseSetting,wxe_util:color(Back),?get_env(),?wxStyledTextCtrl_SetHotspotActiveBackground).
diff --git a/lib/wx/src/gen/wxTextAttr.erl b/lib/wx/src/gen/wxTextAttr.erl
index 77860e6b30..f1002a0b2c 100644
--- a/lib/wx/src/gen/wxTextAttr.erl
+++ b/lib/wx/src/gen/wxTextAttr.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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,14 @@
-module(wxTextAttr).
-include("wxe.hrl").
-export([destroy/1,getAlignment/1,getBackgroundColour/1,getFlags/1,getFont/1,
- getLeftIndent/1,getLeftSubIndent/1,getRightIndent/1,getTabs/1,getTextColour/1,
- hasBackgroundColour/1,hasFont/1,hasTextColour/1,isDefault/1,new/0,
- new/1,new/2,setAlignment/2,setBackgroundColour/2,setFlags/2,setFont/2,
- setFont/3,setLeftIndent/2,setLeftIndent/3,setRightIndent/2,setTabs/2,
- setTextColour/2]).
+ getFontEncoding/1,getFontFaceName/1,getFontSize/1,getFontStyle/1,
+ getFontUnderlined/1,getFontWeight/1,getLeftIndent/1,getLeftSubIndent/1,
+ getRightIndent/1,getTabs/1,getTextColour/1,hasBackgroundColour/1,
+ hasFont/1,hasTextColour/1,isDefault/1,new/0,new/1,new/2,setAlignment/2,
+ setBackgroundColour/2,setFlags/2,setFont/2,setFont/3,setFontEncoding/2,
+ setFontFaceName/2,setFontFamily/2,setFontPixelSize/2,setFontPointSize/2,
+ setFontSize/2,setFontStyle/2,setFontUnderlined/2,setFontWeight/2,
+ setLeftIndent/2,setLeftIndent/3,setRightIndent/2,setTabs/2,setTextColour/2]).
%% inherited exports
-export([parent_class/1]).
@@ -53,7 +56,7 @@ new() ->
Attr::wxTextAttr().
new(ColText)
- when tuple_size(ColText) =:= 3; tuple_size(ColText) =:= 4 ->
+ when ?is_colordata(ColText) ->
new(ColText, []);
new(#wx_ref{type=AttrT}=Attr) ->
?CLASS(AttrT,wxTextAttr),
@@ -68,7 +71,7 @@ new(#wx_ref{type=AttrT}=Attr) ->
| {'font', wxFont:wxFont()}
| {'alignment', wx:wx_enum()}.
new(ColText, Options)
- when tuple_size(ColText) =:= 3; tuple_size(ColText) =:= 4,is_list(Options) ->
+ when ?is_colordata(ColText),is_list(Options) ->
MOpts = fun({colBack, ColBack}) -> {colBack,wxe_util:color(ColBack)};
({font, #wx_ref{type=FontT}} = Arg) -> ?CLASS(FontT,wxFont),Arg;
({alignment, _alignment} = Arg) -> Arg;
@@ -102,6 +105,57 @@ getFont(#wx_ref{type=ThisT}=This) ->
wxe_util:queue_cmd(This,?get_env(),?wxTextAttr_GetFont),
wxe_util:rec(?wxTextAttr_GetFont).
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrgetfontencoding">external documentation</a>.
+%%<br /> Res = ?wxFONTENCODING_SYSTEM | ?wxFONTENCODING_DEFAULT | ?wxFONTENCODING_ISO8859_1 | ?wxFONTENCODING_ISO8859_2 | ?wxFONTENCODING_ISO8859_3 | ?wxFONTENCODING_ISO8859_4 | ?wxFONTENCODING_ISO8859_5 | ?wxFONTENCODING_ISO8859_6 | ?wxFONTENCODING_ISO8859_7 | ?wxFONTENCODING_ISO8859_8 | ?wxFONTENCODING_ISO8859_9 | ?wxFONTENCODING_ISO8859_10 | ?wxFONTENCODING_ISO8859_11 | ?wxFONTENCODING_ISO8859_12 | ?wxFONTENCODING_ISO8859_13 | ?wxFONTENCODING_ISO8859_14 | ?wxFONTENCODING_ISO8859_15 | ?wxFONTENCODING_ISO8859_MAX | ?wxFONTENCODING_KOI8 | ?wxFONTENCODING_KOI8_U | ?wxFONTENCODING_ALTERNATIVE | ?wxFONTENCODING_BULGARIAN | ?wxFONTENCODING_CP437 | ?wxFONTENCODING_CP850 | ?wxFONTENCODING_CP852 | ?wxFONTENCODING_CP855 | ?wxFONTENCODING_CP866 | ?wxFONTENCODING_CP874 | ?wxFONTENCODING_CP932 | ?wxFONTENCODING_CP936 | ?wxFONTENCODING_CP949 | ?wxFONTENCODING_CP950 | ?wxFONTENCODING_CP1250 | ?wxFONTENCODING_CP1251 | ?wxFONTENCODING_CP1252 | ?wxFONTENCODING_CP1253 | ?wxFONTENCODING_CP1254 | ?wxFONTENCODING_CP1255 | ?wxFONTENCODING_CP1256 | ?wxFONTENCODING_CP1257 | ?wxFONTENCODING_CP1258 | ?wxFONTENCODING_CP1361 | ?wxFONTENCODING_CP12_MAX | ?wxFONTENCODING_UTF7 | ?wxFONTENCODING_UTF8 | ?wxFONTENCODING_EUC_JP | ?wxFONTENCODING_UTF16BE | ?wxFONTENCODING_UTF16LE | ?wxFONTENCODING_UTF32BE | ?wxFONTENCODING_UTF32LE | ?wxFONTENCODING_MACROMAN | ?wxFONTENCODING_MACJAPANESE | ?wxFONTENCODING_MACCHINESETRAD | ?wxFONTENCODING_MACKOREAN | ?wxFONTENCODING_MACARABIC | ?wxFONTENCODING_MACHEBREW | ?wxFONTENCODING_MACGREEK | ?wxFONTENCODING_MACCYRILLIC | ?wxFONTENCODING_MACDEVANAGARI | ?wxFONTENCODING_MACGURMUKHI | ?wxFONTENCODING_MACGUJARATI | ?wxFONTENCODING_MACORIYA | ?wxFONTENCODING_MACBENGALI | ?wxFONTENCODING_MACTAMIL | ?wxFONTENCODING_MACTELUGU | ?wxFONTENCODING_MACKANNADA | ?wxFONTENCODING_MACMALAJALAM | ?wxFONTENCODING_MACSINHALESE | ?wxFONTENCODING_MACBURMESE | ?wxFONTENCODING_MACKHMER | ?wxFONTENCODING_MACTHAI | ?wxFONTENCODING_MACLAOTIAN | ?wxFONTENCODING_MACGEORGIAN | ?wxFONTENCODING_MACARMENIAN | ?wxFONTENCODING_MACCHINESESIMP | ?wxFONTENCODING_MACTIBETAN | ?wxFONTENCODING_MACMONGOLIAN | ?wxFONTENCODING_MACETHIOPIC | ?wxFONTENCODING_MACCENTRALEUR | ?wxFONTENCODING_MACVIATNAMESE | ?wxFONTENCODING_MACARABICEXT | ?wxFONTENCODING_MACSYMBOL | ?wxFONTENCODING_MACDINGBATS | ?wxFONTENCODING_MACTURKISH | ?wxFONTENCODING_MACCROATIAN | ?wxFONTENCODING_MACICELANDIC | ?wxFONTENCODING_MACROMANIAN | ?wxFONTENCODING_MACCELTIC | ?wxFONTENCODING_MACGAELIC | ?wxFONTENCODING_MACKEYBOARD | ?wxFONTENCODING_ISO2022_JP | ?wxFONTENCODING_MAX | ?wxFONTENCODING_MACMIN | ?wxFONTENCODING_MACMAX | ?wxFONTENCODING_UTF16 | ?wxFONTENCODING_UTF32 | ?wxFONTENCODING_UNICODE | ?wxFONTENCODING_GB2312 | ?wxFONTENCODING_BIG5 | ?wxFONTENCODING_SHIFT_JIS | ?wxFONTENCODING_EUC_KR | ?wxFONTENCODING_JOHAB | ?wxFONTENCODING_VIETNAMESE
+-spec getFontEncoding(This) -> wx:wx_enum() when
+ This::wxTextAttr().
+getFontEncoding(#wx_ref{type=ThisT}=This) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,?get_env(),?wxTextAttr_GetFontEncoding),
+ wxe_util:rec(?wxTextAttr_GetFontEncoding).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrgetfontfacename">external documentation</a>.
+-spec getFontFaceName(This) -> unicode:charlist() when
+ This::wxTextAttr().
+getFontFaceName(#wx_ref{type=ThisT}=This) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,?get_env(),?wxTextAttr_GetFontFaceName),
+ wxe_util:rec(?wxTextAttr_GetFontFaceName).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrgetfontsize">external documentation</a>.
+-spec getFontSize(This) -> integer() when
+ This::wxTextAttr().
+getFontSize(#wx_ref{type=ThisT}=This) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,?get_env(),?wxTextAttr_GetFontSize),
+ wxe_util:rec(?wxTextAttr_GetFontSize).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrgetfontstyle">external documentation</a>.
+%%<br /> Res = ?wxFONTSTYLE_NORMAL | ?wxFONTSTYLE_ITALIC | ?wxFONTSTYLE_SLANT | ?wxFONTSTYLE_MAX
+-spec getFontStyle(This) -> wx:wx_enum() when
+ This::wxTextAttr().
+getFontStyle(#wx_ref{type=ThisT}=This) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,?get_env(),?wxTextAttr_GetFontStyle),
+ wxe_util:rec(?wxTextAttr_GetFontStyle).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrgetfontunderlined">external documentation</a>.
+-spec getFontUnderlined(This) -> boolean() when
+ This::wxTextAttr().
+getFontUnderlined(#wx_ref{type=ThisT}=This) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,?get_env(),?wxTextAttr_GetFontUnderlined),
+ wxe_util:rec(?wxTextAttr_GetFontUnderlined).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrgetfontweight">external documentation</a>.
+%%<br /> Res = ?wxFONTWEIGHT_INVALID | ?wxFONTWEIGHT_THIN | ?wxFONTWEIGHT_EXTRALIGHT | ?wxFONTWEIGHT_LIGHT | ?wxFONTWEIGHT_NORMAL | ?wxFONTWEIGHT_MEDIUM | ?wxFONTWEIGHT_SEMIBOLD | ?wxFONTWEIGHT_BOLD | ?wxFONTWEIGHT_EXTRABOLD | ?wxFONTWEIGHT_HEAVY | ?wxFONTWEIGHT_EXTRAHEAVY | ?wxFONTWEIGHT_MAX
+-spec getFontWeight(This) -> wx:wx_enum() when
+ This::wxTextAttr().
+getFontWeight(#wx_ref{type=ThisT}=This) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,?get_env(),?wxTextAttr_GetFontWeight),
+ wxe_util:rec(?wxTextAttr_GetFontWeight).
+
%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrgetleftindent">external documentation</a>.
-spec getLeftIndent(This) -> integer() when
This::wxTextAttr().
@@ -195,7 +249,7 @@ setAlignment(#wx_ref{type=ThisT}=This,Alignment)
-spec setBackgroundColour(This, ColBack) -> 'ok' when
This::wxTextAttr(), ColBack::wx:wx_colour().
setBackgroundColour(#wx_ref{type=ThisT}=This,ColBack)
- when tuple_size(ColBack) =:= 3; tuple_size(ColBack) =:= 4 ->
+ when ?is_colordata(ColBack) ->
?CLASS(ThisT,wxTextAttr),
wxe_util:queue_cmd(This,wxe_util:color(ColBack),?get_env(),?wxTextAttr_SetBackgroundColour).
@@ -228,6 +282,83 @@ setFont(#wx_ref{type=ThisT}=This,#wx_ref{type=FontT}=Font, Options)
Opts = lists:map(MOpts, Options),
wxe_util:queue_cmd(This,Font, Opts,?get_env(),?wxTextAttr_SetFont).
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrsetfontencoding">external documentation</a>.
+%%<br /> Encoding = ?wxFONTENCODING_SYSTEM | ?wxFONTENCODING_DEFAULT | ?wxFONTENCODING_ISO8859_1 | ?wxFONTENCODING_ISO8859_2 | ?wxFONTENCODING_ISO8859_3 | ?wxFONTENCODING_ISO8859_4 | ?wxFONTENCODING_ISO8859_5 | ?wxFONTENCODING_ISO8859_6 | ?wxFONTENCODING_ISO8859_7 | ?wxFONTENCODING_ISO8859_8 | ?wxFONTENCODING_ISO8859_9 | ?wxFONTENCODING_ISO8859_10 | ?wxFONTENCODING_ISO8859_11 | ?wxFONTENCODING_ISO8859_12 | ?wxFONTENCODING_ISO8859_13 | ?wxFONTENCODING_ISO8859_14 | ?wxFONTENCODING_ISO8859_15 | ?wxFONTENCODING_ISO8859_MAX | ?wxFONTENCODING_KOI8 | ?wxFONTENCODING_KOI8_U | ?wxFONTENCODING_ALTERNATIVE | ?wxFONTENCODING_BULGARIAN | ?wxFONTENCODING_CP437 | ?wxFONTENCODING_CP850 | ?wxFONTENCODING_CP852 | ?wxFONTENCODING_CP855 | ?wxFONTENCODING_CP866 | ?wxFONTENCODING_CP874 | ?wxFONTENCODING_CP932 | ?wxFONTENCODING_CP936 | ?wxFONTENCODING_CP949 | ?wxFONTENCODING_CP950 | ?wxFONTENCODING_CP1250 | ?wxFONTENCODING_CP1251 | ?wxFONTENCODING_CP1252 | ?wxFONTENCODING_CP1253 | ?wxFONTENCODING_CP1254 | ?wxFONTENCODING_CP1255 | ?wxFONTENCODING_CP1256 | ?wxFONTENCODING_CP1257 | ?wxFONTENCODING_CP1258 | ?wxFONTENCODING_CP1361 | ?wxFONTENCODING_CP12_MAX | ?wxFONTENCODING_UTF7 | ?wxFONTENCODING_UTF8 | ?wxFONTENCODING_EUC_JP | ?wxFONTENCODING_UTF16BE | ?wxFONTENCODING_UTF16LE | ?wxFONTENCODING_UTF32BE | ?wxFONTENCODING_UTF32LE | ?wxFONTENCODING_MACROMAN | ?wxFONTENCODING_MACJAPANESE | ?wxFONTENCODING_MACCHINESETRAD | ?wxFONTENCODING_MACKOREAN | ?wxFONTENCODING_MACARABIC | ?wxFONTENCODING_MACHEBREW | ?wxFONTENCODING_MACGREEK | ?wxFONTENCODING_MACCYRILLIC | ?wxFONTENCODING_MACDEVANAGARI | ?wxFONTENCODING_MACGURMUKHI | ?wxFONTENCODING_MACGUJARATI | ?wxFONTENCODING_MACORIYA | ?wxFONTENCODING_MACBENGALI | ?wxFONTENCODING_MACTAMIL | ?wxFONTENCODING_MACTELUGU | ?wxFONTENCODING_MACKANNADA | ?wxFONTENCODING_MACMALAJALAM | ?wxFONTENCODING_MACSINHALESE | ?wxFONTENCODING_MACBURMESE | ?wxFONTENCODING_MACKHMER | ?wxFONTENCODING_MACTHAI | ?wxFONTENCODING_MACLAOTIAN | ?wxFONTENCODING_MACGEORGIAN | ?wxFONTENCODING_MACARMENIAN | ?wxFONTENCODING_MACCHINESESIMP | ?wxFONTENCODING_MACTIBETAN | ?wxFONTENCODING_MACMONGOLIAN | ?wxFONTENCODING_MACETHIOPIC | ?wxFONTENCODING_MACCENTRALEUR | ?wxFONTENCODING_MACVIATNAMESE | ?wxFONTENCODING_MACARABICEXT | ?wxFONTENCODING_MACSYMBOL | ?wxFONTENCODING_MACDINGBATS | ?wxFONTENCODING_MACTURKISH | ?wxFONTENCODING_MACCROATIAN | ?wxFONTENCODING_MACICELANDIC | ?wxFONTENCODING_MACROMANIAN | ?wxFONTENCODING_MACCELTIC | ?wxFONTENCODING_MACGAELIC | ?wxFONTENCODING_MACKEYBOARD | ?wxFONTENCODING_ISO2022_JP | ?wxFONTENCODING_MAX | ?wxFONTENCODING_MACMIN | ?wxFONTENCODING_MACMAX | ?wxFONTENCODING_UTF16 | ?wxFONTENCODING_UTF32 | ?wxFONTENCODING_UNICODE | ?wxFONTENCODING_GB2312 | ?wxFONTENCODING_BIG5 | ?wxFONTENCODING_SHIFT_JIS | ?wxFONTENCODING_EUC_KR | ?wxFONTENCODING_JOHAB | ?wxFONTENCODING_VIETNAMESE
+-spec setFontEncoding(This, Encoding) -> 'ok' when
+ This::wxTextAttr(), Encoding::wx:wx_enum().
+setFontEncoding(#wx_ref{type=ThisT}=This,Encoding)
+ when is_integer(Encoding) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,Encoding,?get_env(),?wxTextAttr_SetFontEncoding).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrsetfontfacename">external documentation</a>.
+-spec setFontFaceName(This, FaceName) -> 'ok' when
+ This::wxTextAttr(), FaceName::unicode:chardata().
+setFontFaceName(#wx_ref{type=ThisT}=This,FaceName)
+ when ?is_chardata(FaceName) ->
+ ?CLASS(ThisT,wxTextAttr),
+ FaceName_UC = unicode:characters_to_binary(FaceName),
+ wxe_util:queue_cmd(This,FaceName_UC,?get_env(),?wxTextAttr_SetFontFaceName).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrsetfontfamily">external documentation</a>.
+%%<br /> Family = ?wxFONTFAMILY_DEFAULT | ?wxFONTFAMILY_DECORATIVE | ?wxFONTFAMILY_ROMAN | ?wxFONTFAMILY_SCRIPT | ?wxFONTFAMILY_SWISS | ?wxFONTFAMILY_MODERN | ?wxFONTFAMILY_TELETYPE | ?wxFONTFAMILY_MAX | ?wxFONTFAMILY_UNKNOWN
+-spec setFontFamily(This, Family) -> 'ok' when
+ This::wxTextAttr(), Family::wx:wx_enum().
+setFontFamily(#wx_ref{type=ThisT}=This,Family)
+ when is_integer(Family) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,Family,?get_env(),?wxTextAttr_SetFontFamily).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrsetfontsize">external documentation</a>.
+-spec setFontSize(This, PointSize) -> 'ok' when
+ This::wxTextAttr(), PointSize::integer().
+setFontSize(#wx_ref{type=ThisT}=This,PointSize)
+ when is_integer(PointSize) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,PointSize,?get_env(),?wxTextAttr_SetFontSize).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrsetfontpointsize">external documentation</a>.
+-spec setFontPointSize(This, PointSize) -> 'ok' when
+ This::wxTextAttr(), PointSize::integer().
+setFontPointSize(#wx_ref{type=ThisT}=This,PointSize)
+ when is_integer(PointSize) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,PointSize,?get_env(),?wxTextAttr_SetFontPointSize).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrsetfontpixelsize">external documentation</a>.
+-spec setFontPixelSize(This, PixelSize) -> 'ok' when
+ This::wxTextAttr(), PixelSize::integer().
+setFontPixelSize(#wx_ref{type=ThisT}=This,PixelSize)
+ when is_integer(PixelSize) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,PixelSize,?get_env(),?wxTextAttr_SetFontPixelSize).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrsetfontstyle">external documentation</a>.
+%%<br /> FontStyle = ?wxFONTSTYLE_NORMAL | ?wxFONTSTYLE_ITALIC | ?wxFONTSTYLE_SLANT | ?wxFONTSTYLE_MAX
+-spec setFontStyle(This, FontStyle) -> 'ok' when
+ This::wxTextAttr(), FontStyle::wx:wx_enum().
+setFontStyle(#wx_ref{type=ThisT}=This,FontStyle)
+ when is_integer(FontStyle) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,FontStyle,?get_env(),?wxTextAttr_SetFontStyle).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrsetfontunderlined">external documentation</a>.
+-spec setFontUnderlined(This, Underlined) -> 'ok' when
+ This::wxTextAttr(), Underlined::boolean().
+setFontUnderlined(#wx_ref{type=ThisT}=This,Underlined)
+ when is_boolean(Underlined) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,Underlined,?get_env(),?wxTextAttr_SetFontUnderlined).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxtextattr.html#wxtextattrsetfontweight">external documentation</a>.
+%%<br /> FontWeight = ?wxFONTWEIGHT_INVALID | ?wxFONTWEIGHT_THIN | ?wxFONTWEIGHT_EXTRALIGHT | ?wxFONTWEIGHT_LIGHT | ?wxFONTWEIGHT_NORMAL | ?wxFONTWEIGHT_MEDIUM | ?wxFONTWEIGHT_SEMIBOLD | ?wxFONTWEIGHT_BOLD | ?wxFONTWEIGHT_EXTRABOLD | ?wxFONTWEIGHT_HEAVY | ?wxFONTWEIGHT_EXTRAHEAVY | ?wxFONTWEIGHT_MAX
+-spec setFontWeight(This, FontWeight) -> 'ok' when
+ This::wxTextAttr(), FontWeight::wx:wx_enum().
+setFontWeight(#wx_ref{type=ThisT}=This,FontWeight)
+ when is_integer(FontWeight) ->
+ ?CLASS(ThisT,wxTextAttr),
+ wxe_util:queue_cmd(This,FontWeight,?get_env(),?wxTextAttr_SetFontWeight).
+
%% @equiv setLeftIndent(This,Indent, [])
-spec setLeftIndent(This, Indent) -> 'ok' when
This::wxTextAttr(), Indent::integer().
@@ -268,7 +399,7 @@ setTabs(#wx_ref{type=ThisT}=This,Tabs)
-spec setTextColour(This, ColText) -> 'ok' when
This::wxTextAttr(), ColText::wx:wx_colour().
setTextColour(#wx_ref{type=ThisT}=This,ColText)
- when tuple_size(ColText) =:= 3; tuple_size(ColText) =:= 4 ->
+ when ?is_colordata(ColText) ->
?CLASS(ThisT,wxTextAttr),
wxe_util:queue_cmd(This,wxe_util:color(ColText),?get_env(),?wxTextAttr_SetTextColour).
diff --git a/lib/wx/src/gen/wxTreeCtrl.erl b/lib/wx/src/gen/wxTreeCtrl.erl
index 36b6850b61..85fbde2609 100644
--- a/lib/wx/src/gen/wxTreeCtrl.erl
+++ b/lib/wx/src/gen/wxTreeCtrl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -708,7 +708,7 @@ setImageList(#wx_ref{type=ThisT}=This,#wx_ref{type=ImageListT}=ImageList) ->
-spec setItemBackgroundColour(This, Item, Col) -> 'ok' when
This::wxTreeCtrl(), Item::integer(), Col::wx:wx_colour().
setItemBackgroundColour(#wx_ref{type=ThisT}=This,Item,Col)
- when is_integer(Item),tuple_size(Col) =:= 3; tuple_size(Col) =:= 4 ->
+ when is_integer(Item),?is_colordata(Col) ->
?CLASS(ThisT,wxTreeCtrl),
wxe_util:queue_cmd(This,Item,wxe_util:color(Col),?get_env(),?wxTreeCtrl_SetItemBackgroundColour).
@@ -823,7 +823,7 @@ setItemText(#wx_ref{type=ThisT}=This,Item,Text)
-spec setItemTextColour(This, Item, Col) -> 'ok' when
This::wxTreeCtrl(), Item::integer(), Col::wx:wx_colour().
setItemTextColour(#wx_ref{type=ThisT}=This,Item,Col)
- when is_integer(Item),tuple_size(Col) =:= 3; tuple_size(Col) =:= 4 ->
+ when is_integer(Item),?is_colordata(Col) ->
?CLASS(ThisT,wxTreeCtrl),
wxe_util:queue_cmd(This,Item,wxe_util:color(Col),?get_env(),?wxTreeCtrl_SetItemTextColour).
diff --git a/lib/wx/src/gen/wxWindow.erl b/lib/wx/src/gen/wxWindow.erl
index 7d3b3331f7..2b07c3254b 100644
--- a/lib/wx/src/gen/wxWindow.erl
+++ b/lib/wx/src/gen/wxWindow.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. 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.
@@ -1244,7 +1244,7 @@ setAutoLayout(#wx_ref{type=ThisT}=This,AutoLayout)
-spec setBackgroundColour(This, Colour) -> boolean() when
This::wxWindow(), Colour::wx:wx_colour().
setBackgroundColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxWindow),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxWindow_SetBackgroundColour),
wxe_util:rec(?wxWindow_SetBackgroundColour).
@@ -1330,7 +1330,7 @@ setMinSize(#wx_ref{type=ThisT}=This,{SizeW,SizeH} = Size)
-spec setOwnBackgroundColour(This, Colour) -> 'ok' when
This::wxWindow(), Colour::wx:wx_colour().
setOwnBackgroundColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxWindow),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxWindow_SetOwnBackgroundColour).
@@ -1346,7 +1346,7 @@ setOwnFont(#wx_ref{type=ThisT}=This,#wx_ref{type=FontT}=Font) ->
-spec setOwnForegroundColour(This, Colour) -> 'ok' when
This::wxWindow(), Colour::wx:wx_colour().
setOwnForegroundColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxWindow),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxWindow_SetOwnForegroundColour).
@@ -1393,7 +1393,7 @@ setFont(#wx_ref{type=ThisT}=This,#wx_ref{type=FontT}=Font) ->
-spec setForegroundColour(This, Colour) -> boolean() when
This::wxWindow(), Colour::wx:wx_colour().
setForegroundColour(#wx_ref{type=ThisT}=This,Colour)
- when tuple_size(Colour) =:= 3; tuple_size(Colour) =:= 4 ->
+ when ?is_colordata(Colour) ->
?CLASS(ThisT,wxWindow),
wxe_util:queue_cmd(This,wxe_util:color(Colour),?get_env(),?wxWindow_SetForegroundColour),
wxe_util:rec(?wxWindow_SetForegroundColour).
diff --git a/lib/wx/src/gen/wxe_funcs.hrl b/lib/wx/src/gen/wxe_funcs.hrl
index 184610f8ae..b6c61aedd5 100644
--- a/lib/wx/src/gen/wxe_funcs.hrl
+++ b/lib/wx/src/gen/wxe_funcs.hrl
@@ -1606,8 +1606,8 @@
-define(wxListItemAttr_destroy, 1764).
-define(wxImageList_new_0, 1765).
-define(wxImageList_new_3, 1766).
--define(wxImageList_Add_2_1, 1767).
--define(wxImageList_Add_2_0, 1769).
+-define(wxImageList_Add_2_0, 1767).
+-define(wxImageList_Add_2_1, 1769).
-define(wxImageList_Add_1, 1770).
-define(wxImageList_Create, 1771).
-define(wxImageList_Draw, 1772).
@@ -1626,1808 +1626,1823 @@
-define(wxTextAttr_GetAlignment, 1787).
-define(wxTextAttr_GetBackgroundColour, 1788).
-define(wxTextAttr_GetFont, 1789).
--define(wxTextAttr_GetLeftIndent, 1790).
--define(wxTextAttr_GetLeftSubIndent, 1791).
--define(wxTextAttr_GetRightIndent, 1792).
--define(wxTextAttr_GetTabs, 1793).
--define(wxTextAttr_GetTextColour, 1794).
--define(wxTextAttr_HasBackgroundColour, 1795).
--define(wxTextAttr_HasFont, 1796).
--define(wxTextAttr_HasTextColour, 1797).
--define(wxTextAttr_GetFlags, 1798).
--define(wxTextAttr_IsDefault, 1799).
--define(wxTextAttr_SetAlignment, 1800).
--define(wxTextAttr_SetBackgroundColour, 1801).
--define(wxTextAttr_SetFlags, 1802).
--define(wxTextAttr_SetFont, 1803).
--define(wxTextAttr_SetLeftIndent, 1804).
--define(wxTextAttr_SetRightIndent, 1805).
--define(wxTextAttr_SetTabs, 1806).
--define(wxTextAttr_SetTextColour, 1807).
--define(wxTextAttr_destroy, 1808).
--define(wxTextCtrl_new_0, 1809).
--define(wxTextCtrl_new_3, 1810).
--define(wxTextCtrl_destruct, 1811).
--define(wxTextCtrl_AppendText, 1812).
--define(wxTextCtrl_CanCopy, 1813).
--define(wxTextCtrl_CanCut, 1814).
--define(wxTextCtrl_CanPaste, 1815).
--define(wxTextCtrl_CanRedo, 1816).
--define(wxTextCtrl_CanUndo, 1817).
--define(wxTextCtrl_Clear, 1818).
--define(wxTextCtrl_Copy, 1819).
--define(wxTextCtrl_Create, 1820).
--define(wxTextCtrl_Cut, 1821).
--define(wxTextCtrl_DiscardEdits, 1822).
--define(wxTextCtrl_ChangeValue, 1823).
--define(wxTextCtrl_EmulateKeyPress, 1824).
--define(wxTextCtrl_GetDefaultStyle, 1825).
--define(wxTextCtrl_GetInsertionPoint, 1826).
--define(wxTextCtrl_GetLastPosition, 1827).
--define(wxTextCtrl_GetLineLength, 1828).
--define(wxTextCtrl_GetLineText, 1829).
--define(wxTextCtrl_GetNumberOfLines, 1830).
--define(wxTextCtrl_GetRange, 1831).
--define(wxTextCtrl_GetSelection, 1832).
--define(wxTextCtrl_GetStringSelection, 1833).
--define(wxTextCtrl_GetStyle, 1834).
--define(wxTextCtrl_GetValue, 1835).
--define(wxTextCtrl_IsEditable, 1836).
--define(wxTextCtrl_IsModified, 1837).
--define(wxTextCtrl_IsMultiLine, 1838).
--define(wxTextCtrl_IsSingleLine, 1839).
--define(wxTextCtrl_LoadFile, 1840).
--define(wxTextCtrl_MarkDirty, 1841).
--define(wxTextCtrl_Paste, 1842).
--define(wxTextCtrl_PositionToXY, 1843).
--define(wxTextCtrl_Redo, 1844).
--define(wxTextCtrl_Remove, 1845).
--define(wxTextCtrl_Replace, 1846).
--define(wxTextCtrl_SaveFile, 1847).
--define(wxTextCtrl_SetDefaultStyle, 1848).
--define(wxTextCtrl_SetEditable, 1849).
--define(wxTextCtrl_SetInsertionPoint, 1850).
--define(wxTextCtrl_SetInsertionPointEnd, 1851).
--define(wxTextCtrl_SetMaxLength, 1852).
--define(wxTextCtrl_SetSelection, 1853).
--define(wxTextCtrl_SetStyle, 1854).
--define(wxTextCtrl_SetValue, 1855).
--define(wxTextCtrl_ShowPosition, 1856).
--define(wxTextCtrl_Undo, 1857).
--define(wxTextCtrl_WriteText, 1858).
--define(wxTextCtrl_XYToPosition, 1859).
--define(wxBookCtrlBase_AddPage, 1860).
--define(wxBookCtrlBase_InsertPage, 1861).
--define(wxBookCtrlBase_DeletePage, 1862).
--define(wxBookCtrlBase_RemovePage, 1863).
--define(wxBookCtrlBase_DeleteAllPages, 1864).
--define(wxBookCtrlBase_GetPage, 1865).
--define(wxBookCtrlBase_GetPageCount, 1866).
--define(wxBookCtrlBase_GetCurrentPage, 1867).
--define(wxBookCtrlBase_AdvanceSelection, 1868).
--define(wxBookCtrlBase_SetSelection, 1869).
--define(wxBookCtrlBase_GetSelection, 1870).
--define(wxBookCtrlBase_ChangeSelection, 1871).
--define(wxBookCtrlBase_HitTest, 1872).
--define(wxBookCtrlBase_GetPageText, 1873).
--define(wxBookCtrlBase_SetPageText, 1874).
--define(wxNotebook_new_0, 1875).
--define(wxNotebook_new_3, 1876).
--define(wxNotebook_destruct, 1877).
--define(wxNotebook_AssignImageList, 1878).
--define(wxNotebook_Create, 1879).
--define(wxNotebook_GetImageList, 1880).
--define(wxNotebook_GetPageImage, 1881).
--define(wxNotebook_GetRowCount, 1882).
--define(wxNotebook_GetThemeBackgroundColour, 1883).
--define(wxNotebook_SetImageList, 1884).
--define(wxNotebook_SetPadding, 1885).
--define(wxNotebook_SetPageSize, 1886).
--define(wxNotebook_SetPageImage, 1887).
--define(wxChoicebook_new_0, 1888).
--define(wxChoicebook_new_3, 1889).
--define(wxChoicebook_AddPage, 1890).
--define(wxChoicebook_AdvanceSelection, 1891).
--define(wxChoicebook_AssignImageList, 1892).
--define(wxChoicebook_Create, 1893).
--define(wxChoicebook_DeleteAllPages, 1894).
--define(wxChoicebook_GetCurrentPage, 1895).
--define(wxChoicebook_GetImageList, 1896).
--define(wxChoicebook_GetPage, 1897).
--define(wxChoicebook_GetPageCount, 1898).
--define(wxChoicebook_GetPageImage, 1899).
--define(wxChoicebook_GetPageText, 1900).
--define(wxChoicebook_GetSelection, 1901).
--define(wxChoicebook_HitTest, 1902).
--define(wxChoicebook_InsertPage, 1903).
--define(wxChoicebook_SetImageList, 1904).
--define(wxChoicebook_SetPageSize, 1905).
--define(wxChoicebook_SetPageImage, 1906).
--define(wxChoicebook_SetPageText, 1907).
--define(wxChoicebook_SetSelection, 1908).
--define(wxChoicebook_ChangeSelection, 1909).
--define(wxChoicebook_destroy, 1910).
--define(wxToolbook_new_0, 1911).
--define(wxToolbook_new_3, 1912).
--define(wxToolbook_AddPage, 1913).
--define(wxToolbook_AdvanceSelection, 1914).
--define(wxToolbook_AssignImageList, 1915).
--define(wxToolbook_Create, 1916).
--define(wxToolbook_DeleteAllPages, 1917).
--define(wxToolbook_GetCurrentPage, 1918).
--define(wxToolbook_GetImageList, 1919).
--define(wxToolbook_GetPage, 1920).
--define(wxToolbook_GetPageCount, 1921).
--define(wxToolbook_GetPageImage, 1922).
--define(wxToolbook_GetPageText, 1923).
--define(wxToolbook_GetSelection, 1924).
--define(wxToolbook_HitTest, 1925).
--define(wxToolbook_InsertPage, 1926).
--define(wxToolbook_SetImageList, 1927).
--define(wxToolbook_SetPageSize, 1928).
--define(wxToolbook_SetPageImage, 1929).
--define(wxToolbook_SetPageText, 1930).
--define(wxToolbook_SetSelection, 1931).
--define(wxToolbook_ChangeSelection, 1932).
--define(wxToolbook_destroy, 1933).
--define(wxListbook_new_0, 1934).
--define(wxListbook_new_3, 1935).
--define(wxListbook_AddPage, 1936).
--define(wxListbook_AdvanceSelection, 1937).
--define(wxListbook_AssignImageList, 1938).
--define(wxListbook_Create, 1939).
--define(wxListbook_DeleteAllPages, 1940).
--define(wxListbook_GetCurrentPage, 1941).
--define(wxListbook_GetImageList, 1942).
--define(wxListbook_GetPage, 1943).
--define(wxListbook_GetPageCount, 1944).
--define(wxListbook_GetPageImage, 1945).
--define(wxListbook_GetPageText, 1946).
--define(wxListbook_GetSelection, 1947).
--define(wxListbook_HitTest, 1948).
--define(wxListbook_InsertPage, 1949).
--define(wxListbook_SetImageList, 1950).
--define(wxListbook_SetPageSize, 1951).
--define(wxListbook_SetPageImage, 1952).
--define(wxListbook_SetPageText, 1953).
--define(wxListbook_SetSelection, 1954).
--define(wxListbook_ChangeSelection, 1955).
--define(wxListbook_destroy, 1956).
--define(wxTreebook_new_0, 1957).
--define(wxTreebook_new_3, 1958).
--define(wxTreebook_destruct, 1959).
--define(wxTreebook_AddPage, 1960).
--define(wxTreebook_AdvanceSelection, 1961).
--define(wxTreebook_AssignImageList, 1962).
--define(wxTreebook_Create, 1963).
--define(wxTreebook_DeleteAllPages, 1964).
--define(wxTreebook_GetCurrentPage, 1965).
--define(wxTreebook_GetImageList, 1966).
--define(wxTreebook_GetPage, 1967).
--define(wxTreebook_GetPageCount, 1968).
--define(wxTreebook_GetPageImage, 1969).
--define(wxTreebook_GetPageText, 1970).
--define(wxTreebook_GetSelection, 1971).
--define(wxTreebook_ExpandNode, 1972).
--define(wxTreebook_IsNodeExpanded, 1973).
--define(wxTreebook_HitTest, 1974).
--define(wxTreebook_InsertPage, 1975).
--define(wxTreebook_InsertSubPage, 1976).
--define(wxTreebook_SetImageList, 1977).
--define(wxTreebook_SetPageSize, 1978).
--define(wxTreebook_SetPageImage, 1979).
--define(wxTreebook_SetPageText, 1980).
--define(wxTreebook_SetSelection, 1981).
--define(wxTreebook_ChangeSelection, 1982).
--define(wxTreeCtrl_new_0, 1983).
--define(wxTreeCtrl_new_2, 1984).
--define(wxTreeCtrl_destruct, 1985).
--define(wxTreeCtrl_AddRoot, 1986).
--define(wxTreeCtrl_AppendItem, 1987).
--define(wxTreeCtrl_AssignImageList, 1988).
--define(wxTreeCtrl_AssignStateImageList, 1989).
--define(wxTreeCtrl_Collapse, 1990).
--define(wxTreeCtrl_CollapseAndReset, 1991).
--define(wxTreeCtrl_Create, 1992).
--define(wxTreeCtrl_Delete, 1993).
--define(wxTreeCtrl_DeleteAllItems, 1994).
--define(wxTreeCtrl_DeleteChildren, 1995).
--define(wxTreeCtrl_EditLabel, 1996).
--define(wxTreeCtrl_EnsureVisible, 1997).
--define(wxTreeCtrl_Expand, 1998).
--define(wxTreeCtrl_GetBoundingRect, 1999).
--define(wxTreeCtrl_GetChildrenCount, 2000).
--define(wxTreeCtrl_GetCount, 2001).
--define(wxTreeCtrl_GetEditControl, 2002).
--define(wxTreeCtrl_GetFirstChild, 2003).
--define(wxTreeCtrl_GetNextChild, 2004).
--define(wxTreeCtrl_GetFirstVisibleItem, 2005).
--define(wxTreeCtrl_GetImageList, 2006).
--define(wxTreeCtrl_GetIndent, 2007).
--define(wxTreeCtrl_GetItemBackgroundColour, 2008).
--define(wxTreeCtrl_GetItemData, 2009).
--define(wxTreeCtrl_GetItemFont, 2010).
--define(wxTreeCtrl_GetItemImage, 2011).
--define(wxTreeCtrl_GetItemText, 2012).
--define(wxTreeCtrl_GetItemTextColour, 2013).
--define(wxTreeCtrl_GetLastChild, 2014).
--define(wxTreeCtrl_GetNextSibling, 2015).
--define(wxTreeCtrl_GetNextVisible, 2016).
--define(wxTreeCtrl_GetItemParent, 2017).
--define(wxTreeCtrl_GetPrevSibling, 2018).
--define(wxTreeCtrl_GetPrevVisible, 2019).
--define(wxTreeCtrl_GetRootItem, 2020).
--define(wxTreeCtrl_GetSelection, 2021).
--define(wxTreeCtrl_GetSelections, 2022).
--define(wxTreeCtrl_GetStateImageList, 2023).
--define(wxTreeCtrl_HitTest, 2024).
--define(wxTreeCtrl_InsertItem, 2025).
--define(wxTreeCtrl_IsBold, 2027).
--define(wxTreeCtrl_IsExpanded, 2028).
--define(wxTreeCtrl_IsSelected, 2029).
--define(wxTreeCtrl_IsVisible, 2030).
--define(wxTreeCtrl_ItemHasChildren, 2031).
--define(wxTreeCtrl_IsTreeItemIdOk, 2032).
--define(wxTreeCtrl_PrependItem, 2033).
--define(wxTreeCtrl_ScrollTo, 2034).
--define(wxTreeCtrl_SelectItem, 2035).
--define(wxTreeCtrl_SetIndent, 2036).
--define(wxTreeCtrl_SetImageList, 2037).
--define(wxTreeCtrl_SetItemBackgroundColour, 2038).
--define(wxTreeCtrl_SetItemBold, 2039).
--define(wxTreeCtrl_SetItemData, 2040).
--define(wxTreeCtrl_SetItemDropHighlight, 2041).
--define(wxTreeCtrl_SetItemFont, 2042).
--define(wxTreeCtrl_SetItemHasChildren, 2043).
--define(wxTreeCtrl_SetItemImage, 2044).
--define(wxTreeCtrl_SetItemText, 2045).
--define(wxTreeCtrl_SetItemTextColour, 2046).
--define(wxTreeCtrl_SetStateImageList, 2047).
--define(wxTreeCtrl_SetWindowStyle, 2048).
--define(wxTreeCtrl_SortChildren, 2049).
--define(wxTreeCtrl_Toggle, 2050).
--define(wxTreeCtrl_ToggleItemSelection, 2051).
--define(wxTreeCtrl_Unselect, 2052).
--define(wxTreeCtrl_UnselectAll, 2053).
--define(wxTreeCtrl_UnselectItem, 2054).
--define(wxScrollBar_new_0, 2055).
--define(wxScrollBar_new_3, 2056).
--define(wxScrollBar_destruct, 2057).
--define(wxScrollBar_Create, 2058).
--define(wxScrollBar_GetRange, 2059).
--define(wxScrollBar_GetPageSize, 2060).
--define(wxScrollBar_GetThumbPosition, 2061).
--define(wxScrollBar_GetThumbSize, 2062).
--define(wxScrollBar_SetThumbPosition, 2063).
--define(wxScrollBar_SetScrollbar, 2064).
--define(wxSpinButton_new_0, 2065).
--define(wxSpinButton_new_2, 2066).
--define(wxSpinButton_destruct, 2067).
--define(wxSpinButton_Create, 2068).
--define(wxSpinButton_GetMax, 2069).
--define(wxSpinButton_GetMin, 2070).
--define(wxSpinButton_GetValue, 2071).
--define(wxSpinButton_SetRange, 2072).
--define(wxSpinButton_SetValue, 2073).
--define(wxSpinCtrl_new_0, 2074).
--define(wxSpinCtrl_new_2, 2075).
--define(wxSpinCtrl_Create, 2076).
--define(wxSpinCtrl_SetValue_1_1, 2077).
--define(wxSpinCtrl_SetValue_1_0, 2078).
--define(wxSpinCtrl_GetValue, 2079).
--define(wxSpinCtrl_SetRange, 2080).
--define(wxSpinCtrl_SetSelection, 2081).
--define(wxSpinCtrl_GetMin, 2082).
--define(wxSpinCtrl_GetMax, 2083).
--define(wxSpinCtrl_destroy, 2084).
--define(wxStaticText_new_0, 2085).
--define(wxStaticText_new_4, 2086).
--define(wxStaticText_Create, 2087).
--define(wxStaticText_GetLabel, 2088).
--define(wxStaticText_SetLabel, 2089).
--define(wxStaticText_Wrap, 2090).
--define(wxStaticText_destroy, 2091).
--define(wxStaticBitmap_new_0, 2092).
--define(wxStaticBitmap_new_4, 2093).
--define(wxStaticBitmap_Create, 2094).
--define(wxStaticBitmap_GetBitmap, 2095).
--define(wxStaticBitmap_SetBitmap, 2096).
--define(wxStaticBitmap_destroy, 2097).
--define(wxRadioBox_new, 2098).
--define(wxRadioBox_destruct, 2099).
--define(wxRadioBox_Create, 2100).
--define(wxRadioBox_Enable_1, 2101).
--define(wxRadioBox_Enable_2, 2102).
--define(wxRadioBox_GetSelection, 2103).
--define(wxRadioBox_GetString, 2104).
--define(wxRadioBox_SetSelection, 2105).
--define(wxRadioBox_Show, 2106).
--define(wxRadioBox_GetColumnCount, 2107).
--define(wxRadioBox_GetItemHelpText, 2108).
--define(wxRadioBox_GetItemToolTip, 2109).
--define(wxRadioBox_GetItemFromPoint, 2110).
--define(wxRadioBox_GetRowCount, 2111).
--define(wxRadioBox_IsItemEnabled, 2112).
--define(wxRadioBox_IsItemShown, 2113).
--define(wxRadioBox_SetItemHelpText, 2114).
--define(wxRadioBox_SetItemToolTip, 2115).
--define(wxRadioButton_new_0, 2116).
--define(wxRadioButton_new_4, 2117).
--define(wxRadioButton_destruct, 2118).
--define(wxRadioButton_Create, 2119).
--define(wxRadioButton_GetValue, 2120).
--define(wxRadioButton_SetValue, 2121).
--define(wxSlider_new_0, 2122).
--define(wxSlider_new_6, 2123).
--define(wxSlider_destruct, 2124).
--define(wxSlider_Create, 2125).
--define(wxSlider_GetLineSize, 2126).
--define(wxSlider_GetMax, 2127).
--define(wxSlider_GetMin, 2128).
--define(wxSlider_GetPageSize, 2129).
--define(wxSlider_GetThumbLength, 2130).
--define(wxSlider_GetValue, 2131).
--define(wxSlider_SetLineSize, 2132).
--define(wxSlider_SetPageSize, 2133).
--define(wxSlider_SetRange, 2134).
--define(wxSlider_SetThumbLength, 2135).
--define(wxSlider_SetValue, 2136).
--define(wxDialog_new_0, 2137).
--define(wxDialog_new_4, 2138).
--define(wxDialog_destruct, 2139).
--define(wxDialog_Create, 2140).
--define(wxDialog_CreateButtonSizer, 2141).
--define(wxDialog_CreateStdDialogButtonSizer, 2142).
--define(wxDialog_EndModal, 2143).
--define(wxDialog_GetAffirmativeId, 2144).
--define(wxDialog_GetReturnCode, 2145).
--define(wxDialog_IsModal, 2146).
--define(wxDialog_SetAffirmativeId, 2147).
--define(wxDialog_SetReturnCode, 2148).
--define(wxDialog_Show, 2149).
--define(wxDialog_ShowModal, 2150).
--define(wxColourDialog_new_0, 2151).
--define(wxColourDialog_new_2, 2152).
--define(wxColourDialog_destruct, 2153).
--define(wxColourDialog_Create, 2154).
--define(wxColourDialog_GetColourData, 2155).
--define(wxColourData_new, 2156).
--define(wxColourData_destruct, 2157).
--define(wxColourData_GetChooseFull, 2158).
--define(wxColourData_GetColour, 2159).
--define(wxColourData_GetCustomColour, 2160).
--define(wxColourData_SetChooseFull, 2161).
--define(wxColourData_SetColour, 2162).
--define(wxColourData_SetCustomColour, 2163).
--define(wxPalette_new_0, 2164).
--define(wxPalette_new_1, 2165).
--define(wxPalette_new_4, 2166).
--define(wxPalette_destruct, 2167).
--define(wxPalette_Create, 2168).
--define(wxPalette_GetColoursCount, 2169).
--define(wxPalette_GetPixel, 2170).
--define(wxPalette_GetRGB, 2171).
--define(wxPalette_IsOk, 2172).
--define(wxDirDialog_new, 2173).
--define(wxDirDialog_destruct, 2174).
--define(wxDirDialog_GetPath, 2175).
--define(wxDirDialog_GetMessage, 2176).
--define(wxDirDialog_SetMessage, 2177).
--define(wxDirDialog_SetPath, 2178).
--define(wxFileDialog_new, 2179).
--define(wxFileDialog_destruct, 2180).
--define(wxFileDialog_GetDirectory, 2181).
--define(wxFileDialog_GetFilename, 2182).
--define(wxFileDialog_GetFilenames, 2183).
--define(wxFileDialog_GetFilterIndex, 2184).
--define(wxFileDialog_GetMessage, 2185).
--define(wxFileDialog_GetPath, 2186).
--define(wxFileDialog_GetPaths, 2187).
--define(wxFileDialog_GetWildcard, 2188).
--define(wxFileDialog_SetDirectory, 2189).
--define(wxFileDialog_SetFilename, 2190).
--define(wxFileDialog_SetFilterIndex, 2191).
--define(wxFileDialog_SetMessage, 2192).
--define(wxFileDialog_SetPath, 2193).
--define(wxFileDialog_SetWildcard, 2194).
--define(wxPickerBase_SetInternalMargin, 2195).
--define(wxPickerBase_GetInternalMargin, 2196).
--define(wxPickerBase_SetTextCtrlProportion, 2197).
--define(wxPickerBase_SetPickerCtrlProportion, 2198).
--define(wxPickerBase_GetTextCtrlProportion, 2199).
--define(wxPickerBase_GetPickerCtrlProportion, 2200).
--define(wxPickerBase_HasTextCtrl, 2201).
--define(wxPickerBase_GetTextCtrl, 2202).
--define(wxPickerBase_IsTextCtrlGrowable, 2203).
--define(wxPickerBase_SetPickerCtrlGrowable, 2204).
--define(wxPickerBase_SetTextCtrlGrowable, 2205).
--define(wxPickerBase_IsPickerCtrlGrowable, 2206).
--define(wxFilePickerCtrl_new_0, 2207).
--define(wxFilePickerCtrl_new_3, 2208).
--define(wxFilePickerCtrl_Create, 2209).
--define(wxFilePickerCtrl_GetPath, 2210).
--define(wxFilePickerCtrl_SetPath, 2211).
--define(wxFilePickerCtrl_destroy, 2212).
--define(wxDirPickerCtrl_new_0, 2213).
--define(wxDirPickerCtrl_new_3, 2214).
--define(wxDirPickerCtrl_Create, 2215).
--define(wxDirPickerCtrl_GetPath, 2216).
--define(wxDirPickerCtrl_SetPath, 2217).
--define(wxDirPickerCtrl_destroy, 2218).
--define(wxColourPickerCtrl_new_0, 2219).
--define(wxColourPickerCtrl_new_3, 2220).
--define(wxColourPickerCtrl_Create, 2221).
--define(wxColourPickerCtrl_GetColour, 2222).
--define(wxColourPickerCtrl_SetColour_1_1, 2223).
--define(wxColourPickerCtrl_SetColour_1_0, 2224).
--define(wxColourPickerCtrl_destroy, 2225).
--define(wxDatePickerCtrl_new_0, 2226).
--define(wxDatePickerCtrl_new_3, 2227).
--define(wxDatePickerCtrl_GetRange, 2228).
--define(wxDatePickerCtrl_GetValue, 2229).
--define(wxDatePickerCtrl_SetRange, 2230).
--define(wxDatePickerCtrl_SetValue, 2231).
--define(wxDatePickerCtrl_destroy, 2232).
--define(wxFontPickerCtrl_new_0, 2233).
--define(wxFontPickerCtrl_new_3, 2234).
--define(wxFontPickerCtrl_Create, 2235).
--define(wxFontPickerCtrl_GetSelectedFont, 2236).
--define(wxFontPickerCtrl_SetSelectedFont, 2237).
--define(wxFontPickerCtrl_GetMaxPointSize, 2238).
--define(wxFontPickerCtrl_SetMaxPointSize, 2239).
--define(wxFontPickerCtrl_destroy, 2240).
--define(wxFindReplaceDialog_new_0, 2241).
--define(wxFindReplaceDialog_new_4, 2242).
--define(wxFindReplaceDialog_destruct, 2243).
--define(wxFindReplaceDialog_Create, 2244).
--define(wxFindReplaceDialog_GetData, 2245).
--define(wxFindReplaceData_new, 2246).
--define(wxFindReplaceData_GetFindString, 2247).
--define(wxFindReplaceData_GetReplaceString, 2248).
--define(wxFindReplaceData_GetFlags, 2249).
--define(wxFindReplaceData_SetFlags, 2250).
--define(wxFindReplaceData_SetFindString, 2251).
--define(wxFindReplaceData_SetReplaceString, 2252).
--define(wxFindReplaceData_destroy, 2253).
--define(wxMultiChoiceDialog_new, 2255).
--define(wxMultiChoiceDialog_GetSelections, 2256).
--define(wxMultiChoiceDialog_SetSelections, 2257).
--define(wxMultiChoiceDialog_destroy, 2258).
--define(wxSingleChoiceDialog_new, 2260).
--define(wxSingleChoiceDialog_GetSelection, 2261).
--define(wxSingleChoiceDialog_GetStringSelection, 2262).
--define(wxSingleChoiceDialog_SetSelection, 2263).
--define(wxSingleChoiceDialog_destroy, 2264).
--define(wxTextEntryDialog_new_0, 2265).
--define(wxTextEntryDialog_new_3, 2266).
--define(wxTextEntryDialog_destruct, 2267).
--define(wxTextEntryDialog_GetValue, 2268).
--define(wxTextEntryDialog_SetValue, 2269).
--define(wxPasswordEntryDialog_new, 2270).
--define(wxPasswordEntryDialog_destroy, 2271).
--define(wxFontData_new_0, 2272).
--define(wxFontData_new_1, 2273).
--define(wxFontData_EnableEffects, 2274).
--define(wxFontData_GetAllowSymbols, 2275).
--define(wxFontData_GetColour, 2276).
--define(wxFontData_GetChosenFont, 2277).
--define(wxFontData_GetEnableEffects, 2278).
--define(wxFontData_GetInitialFont, 2279).
--define(wxFontData_GetShowHelp, 2280).
--define(wxFontData_SetAllowSymbols, 2281).
--define(wxFontData_SetChosenFont, 2282).
--define(wxFontData_SetColour, 2283).
--define(wxFontData_SetInitialFont, 2284).
--define(wxFontData_SetRange, 2285).
--define(wxFontData_SetShowHelp, 2286).
--define(wxFontData_destroy, 2287).
--define(wxFontDialog_new_0, 2288).
--define(wxFontDialog_new_2, 2290).
--define(wxFontDialog_Create, 2292).
--define(wxFontDialog_GetFontData, 2293).
--define(wxFontDialog_destroy, 2295).
--define(wxProgressDialog_new, 2296).
--define(wxProgressDialog_Resume, 2297).
--define(wxProgressDialog_Update, 2298).
--define(wxProgressDialog_destroy, 2299).
--define(wxMessageDialog_new, 2300).
--define(wxMessageDialog_destroy, 2301).
--define(wxPageSetupDialog_new, 2302).
--define(wxPageSetupDialog_destruct, 2303).
--define(wxPageSetupDialog_GetPageSetupData, 2304).
--define(wxPageSetupDialog_ShowModal, 2305).
--define(wxPageSetupDialogData_new_0, 2306).
--define(wxPageSetupDialogData_new_1, 2308).
--define(wxPageSetupDialogData_destruct, 2309).
--define(wxPageSetupDialogData_EnableHelp, 2310).
--define(wxPageSetupDialogData_EnableMargins, 2311).
--define(wxPageSetupDialogData_EnableOrientation, 2312).
--define(wxPageSetupDialogData_EnablePaper, 2313).
--define(wxPageSetupDialogData_EnablePrinter, 2314).
--define(wxPageSetupDialogData_GetDefaultMinMargins, 2315).
--define(wxPageSetupDialogData_GetEnableMargins, 2316).
--define(wxPageSetupDialogData_GetEnableOrientation, 2317).
--define(wxPageSetupDialogData_GetEnablePaper, 2318).
--define(wxPageSetupDialogData_GetEnablePrinter, 2319).
--define(wxPageSetupDialogData_GetEnableHelp, 2320).
--define(wxPageSetupDialogData_GetDefaultInfo, 2321).
--define(wxPageSetupDialogData_GetMarginTopLeft, 2322).
--define(wxPageSetupDialogData_GetMarginBottomRight, 2323).
--define(wxPageSetupDialogData_GetMinMarginTopLeft, 2324).
--define(wxPageSetupDialogData_GetMinMarginBottomRight, 2325).
--define(wxPageSetupDialogData_GetPaperId, 2326).
--define(wxPageSetupDialogData_GetPaperSize, 2327).
--define(wxPageSetupDialogData_GetPrintData, 2329).
--define(wxPageSetupDialogData_IsOk, 2330).
--define(wxPageSetupDialogData_SetDefaultInfo, 2331).
--define(wxPageSetupDialogData_SetDefaultMinMargins, 2332).
--define(wxPageSetupDialogData_SetMarginTopLeft, 2333).
--define(wxPageSetupDialogData_SetMarginBottomRight, 2334).
--define(wxPageSetupDialogData_SetMinMarginTopLeft, 2335).
--define(wxPageSetupDialogData_SetMinMarginBottomRight, 2336).
--define(wxPageSetupDialogData_SetPaperId, 2337).
--define(wxPageSetupDialogData_SetPaperSize, 2338).
--define(wxPageSetupDialogData_SetPrintData, 2339).
--define(wxPrintDialog_new_2_0, 2340).
--define(wxPrintDialog_new_2_1, 2341).
--define(wxPrintDialog_destruct, 2342).
--define(wxPrintDialog_GetPrintDialogData, 2343).
--define(wxPrintDialog_GetPrintDC, 2344).
--define(wxPrintDialogData_new_0, 2345).
--define(wxPrintDialogData_new_1, 2346).
--define(wxPrintDialogData_destruct, 2348).
--define(wxPrintDialogData_EnableHelp, 2349).
--define(wxPrintDialogData_EnablePageNumbers, 2350).
--define(wxPrintDialogData_EnablePrintToFile, 2351).
--define(wxPrintDialogData_EnableSelection, 2352).
--define(wxPrintDialogData_GetAllPages, 2353).
--define(wxPrintDialogData_GetCollate, 2354).
--define(wxPrintDialogData_GetFromPage, 2355).
--define(wxPrintDialogData_GetMaxPage, 2356).
--define(wxPrintDialogData_GetMinPage, 2357).
--define(wxPrintDialogData_GetNoCopies, 2358).
--define(wxPrintDialogData_GetPrintData, 2359).
--define(wxPrintDialogData_GetPrintToFile, 2360).
--define(wxPrintDialogData_GetSelection, 2361).
--define(wxPrintDialogData_GetToPage, 2362).
--define(wxPrintDialogData_IsOk, 2363).
--define(wxPrintDialogData_SetCollate, 2364).
--define(wxPrintDialogData_SetFromPage, 2365).
--define(wxPrintDialogData_SetMaxPage, 2366).
--define(wxPrintDialogData_SetMinPage, 2367).
--define(wxPrintDialogData_SetNoCopies, 2368).
--define(wxPrintDialogData_SetPrintData, 2369).
--define(wxPrintDialogData_SetPrintToFile, 2370).
--define(wxPrintDialogData_SetSelection, 2371).
--define(wxPrintDialogData_SetToPage, 2372).
--define(wxPrintData_new_0, 2373).
--define(wxPrintData_new_1, 2374).
--define(wxPrintData_destruct, 2375).
--define(wxPrintData_GetCollate, 2376).
--define(wxPrintData_GetBin, 2377).
--define(wxPrintData_GetColour, 2378).
--define(wxPrintData_GetDuplex, 2379).
--define(wxPrintData_GetNoCopies, 2380).
--define(wxPrintData_GetOrientation, 2381).
--define(wxPrintData_GetPaperId, 2382).
--define(wxPrintData_GetPrinterName, 2383).
--define(wxPrintData_GetQuality, 2384).
--define(wxPrintData_IsOk, 2385).
--define(wxPrintData_SetBin, 2386).
--define(wxPrintData_SetCollate, 2387).
--define(wxPrintData_SetColour, 2388).
--define(wxPrintData_SetDuplex, 2389).
--define(wxPrintData_SetNoCopies, 2390).
--define(wxPrintData_SetOrientation, 2391).
--define(wxPrintData_SetPaperId, 2392).
--define(wxPrintData_SetPrinterName, 2393).
--define(wxPrintData_SetQuality, 2394).
--define(wxPrintPreview_new_2, 2395).
--define(wxPrintPreview_new_3, 2396).
--define(wxPrintPreview_destruct, 2397).
--define(wxPrintPreview_GetCanvas, 2398).
--define(wxPrintPreview_GetCurrentPage, 2399).
--define(wxPrintPreview_GetFrame, 2400).
--define(wxPrintPreview_GetMaxPage, 2401).
--define(wxPrintPreview_GetMinPage, 2402).
--define(wxPrintPreview_GetPrintout, 2403).
--define(wxPrintPreview_GetPrintoutForPrinting, 2404).
--define(wxPrintPreview_IsOk, 2405).
--define(wxPrintPreview_PaintPage, 2406).
--define(wxPrintPreview_Print, 2407).
--define(wxPrintPreview_RenderPage, 2408).
--define(wxPrintPreview_SetCanvas, 2409).
--define(wxPrintPreview_SetCurrentPage, 2410).
--define(wxPrintPreview_SetFrame, 2411).
--define(wxPrintPreview_SetPrintout, 2412).
--define(wxPrintPreview_SetZoom, 2413).
--define(wxPreviewFrame_new, 2414).
--define(wxPreviewFrame_destruct, 2415).
--define(wxPreviewFrame_CreateControlBar, 2416).
--define(wxPreviewFrame_CreateCanvas, 2417).
--define(wxPreviewFrame_Initialize, 2418).
--define(wxPreviewFrame_OnCloseWindow, 2419).
--define(wxPreviewControlBar_new, 2420).
--define(wxPreviewControlBar_destruct, 2421).
--define(wxPreviewControlBar_CreateButtons, 2422).
--define(wxPreviewControlBar_GetPrintPreview, 2423).
--define(wxPreviewControlBar_GetZoomControl, 2424).
--define(wxPreviewControlBar_SetZoomControl, 2425).
--define(wxPrinter_new, 2426).
--define(wxPrinter_CreateAbortWindow, 2427).
--define(wxPrinter_GetAbort, 2428).
--define(wxPrinter_GetLastError, 2429).
--define(wxPrinter_GetPrintDialogData, 2430).
--define(wxPrinter_Print, 2431).
--define(wxPrinter_PrintDialog, 2432).
--define(wxPrinter_ReportError, 2433).
--define(wxPrinter_Setup, 2434).
--define(wxPrinter_destroy, 2435).
--define(wxXmlResource_new_2, 2436).
--define(wxXmlResource_new_1, 2437).
--define(wxXmlResource_destruct, 2438).
--define(wxXmlResource_AttachUnknownControl, 2439).
--define(wxXmlResource_ClearHandlers, 2440).
--define(wxXmlResource_CompareVersion, 2441).
--define(wxXmlResource_Get, 2442).
--define(wxXmlResource_GetFlags, 2443).
--define(wxXmlResource_GetVersion, 2444).
--define(wxXmlResource_GetXRCID, 2445).
--define(wxXmlResource_InitAllHandlers, 2446).
--define(wxXmlResource_Load, 2447).
--define(wxXmlResource_LoadBitmap, 2448).
--define(wxXmlResource_LoadDialog_2, 2449).
--define(wxXmlResource_LoadDialog_3, 2450).
--define(wxXmlResource_LoadFrame_2, 2451).
--define(wxXmlResource_LoadFrame_3, 2452).
--define(wxXmlResource_LoadIcon, 2453).
--define(wxXmlResource_LoadMenu, 2454).
--define(wxXmlResource_LoadMenuBar_2, 2455).
--define(wxXmlResource_LoadMenuBar_1, 2456).
--define(wxXmlResource_LoadPanel_2, 2457).
--define(wxXmlResource_LoadPanel_3, 2458).
--define(wxXmlResource_LoadToolBar, 2459).
--define(wxXmlResource_Set, 2460).
--define(wxXmlResource_SetFlags, 2461).
--define(wxXmlResource_Unload, 2462).
--define(wxXmlResource_xrcctrl, 2463).
--define(wxHtmlEasyPrinting_new, 2464).
--define(wxHtmlEasyPrinting_GetPrintData, 2465).
--define(wxHtmlEasyPrinting_GetPageSetupData, 2466).
--define(wxHtmlEasyPrinting_PreviewFile, 2467).
--define(wxHtmlEasyPrinting_PreviewText, 2468).
--define(wxHtmlEasyPrinting_PrintFile, 2469).
--define(wxHtmlEasyPrinting_PrintText, 2470).
--define(wxHtmlEasyPrinting_PageSetup, 2471).
--define(wxHtmlEasyPrinting_SetFonts, 2472).
--define(wxHtmlEasyPrinting_SetHeader, 2473).
--define(wxHtmlEasyPrinting_SetFooter, 2474).
--define(wxHtmlEasyPrinting_destroy, 2475).
--define(wxGLCanvas_new, 2476).
--define(wxGLCanvas_SetCurrent, 2477).
--define(wxGLCanvas_SwapBuffers, 2478).
--define(wxGLCanvas_destroy, 2479).
--define(wxGLContext_new, 2480).
--define(wxGLContext_SetCurrent, 2481).
--define(wxGLContext_destroy, 2482).
--define(wxAuiManager_new, 2483).
--define(wxAuiManager_destruct, 2484).
--define(wxAuiManager_AddPane_2_1, 2485).
--define(wxAuiManager_AddPane_2_0, 2486).
--define(wxAuiManager_AddPane_3, 2487).
--define(wxAuiManager_DetachPane, 2488).
--define(wxAuiManager_GetAllPanes, 2489).
--define(wxAuiManager_GetArtProvider, 2490).
--define(wxAuiManager_GetDockSizeConstraint, 2491).
--define(wxAuiManager_GetFlags, 2492).
--define(wxAuiManager_GetManagedWindow, 2493).
--define(wxAuiManager_GetManager, 2494).
--define(wxAuiManager_GetPane_1_1, 2495).
--define(wxAuiManager_GetPane_1_0, 2496).
--define(wxAuiManager_HideHint, 2497).
--define(wxAuiManager_InsertPane, 2498).
--define(wxAuiManager_LoadPaneInfo, 2499).
--define(wxAuiManager_LoadPerspective, 2500).
--define(wxAuiManager_SavePaneInfo, 2501).
--define(wxAuiManager_SavePerspective, 2502).
--define(wxAuiManager_SetArtProvider, 2503).
--define(wxAuiManager_SetDockSizeConstraint, 2504).
--define(wxAuiManager_SetFlags, 2505).
--define(wxAuiManager_SetManagedWindow, 2506).
--define(wxAuiManager_ShowHint, 2507).
--define(wxAuiManager_UnInit, 2508).
--define(wxAuiManager_Update, 2509).
--define(wxAuiPaneInfo_new_0, 2510).
--define(wxAuiPaneInfo_new_1, 2511).
--define(wxAuiPaneInfo_BestSize_1, 2512).
--define(wxAuiPaneInfo_BestSize_2, 2513).
--define(wxAuiPaneInfo_Bottom, 2514).
--define(wxAuiPaneInfo_BottomDockable, 2515).
--define(wxAuiPaneInfo_Caption, 2516).
--define(wxAuiPaneInfo_CaptionVisible, 2517).
--define(wxAuiPaneInfo_Centre, 2518).
--define(wxAuiPaneInfo_CentrePane, 2519).
--define(wxAuiPaneInfo_CloseButton, 2520).
--define(wxAuiPaneInfo_DefaultPane, 2521).
--define(wxAuiPaneInfo_DestroyOnClose, 2522).
--define(wxAuiPaneInfo_Direction, 2523).
--define(wxAuiPaneInfo_Dock, 2524).
--define(wxAuiPaneInfo_Dockable, 2525).
--define(wxAuiPaneInfo_Fixed, 2526).
--define(wxAuiPaneInfo_Float, 2527).
--define(wxAuiPaneInfo_Floatable, 2528).
--define(wxAuiPaneInfo_FloatingPosition_1, 2529).
--define(wxAuiPaneInfo_FloatingPosition_2, 2530).
--define(wxAuiPaneInfo_FloatingSize_1, 2531).
--define(wxAuiPaneInfo_FloatingSize_2, 2532).
--define(wxAuiPaneInfo_Gripper, 2533).
--define(wxAuiPaneInfo_GripperTop, 2534).
--define(wxAuiPaneInfo_HasBorder, 2535).
--define(wxAuiPaneInfo_HasCaption, 2536).
--define(wxAuiPaneInfo_HasCloseButton, 2537).
--define(wxAuiPaneInfo_HasFlag, 2538).
--define(wxAuiPaneInfo_HasGripper, 2539).
--define(wxAuiPaneInfo_HasGripperTop, 2540).
--define(wxAuiPaneInfo_HasMaximizeButton, 2541).
--define(wxAuiPaneInfo_HasMinimizeButton, 2542).
--define(wxAuiPaneInfo_HasPinButton, 2543).
--define(wxAuiPaneInfo_Hide, 2544).
--define(wxAuiPaneInfo_IsBottomDockable, 2545).
--define(wxAuiPaneInfo_IsDocked, 2546).
--define(wxAuiPaneInfo_IsFixed, 2547).
--define(wxAuiPaneInfo_IsFloatable, 2548).
--define(wxAuiPaneInfo_IsFloating, 2549).
--define(wxAuiPaneInfo_IsLeftDockable, 2550).
--define(wxAuiPaneInfo_IsMovable, 2551).
--define(wxAuiPaneInfo_IsOk, 2552).
--define(wxAuiPaneInfo_IsResizable, 2553).
--define(wxAuiPaneInfo_IsRightDockable, 2554).
--define(wxAuiPaneInfo_IsShown, 2555).
--define(wxAuiPaneInfo_IsToolbar, 2556).
--define(wxAuiPaneInfo_IsTopDockable, 2557).
--define(wxAuiPaneInfo_Layer, 2558).
--define(wxAuiPaneInfo_Left, 2559).
--define(wxAuiPaneInfo_LeftDockable, 2560).
--define(wxAuiPaneInfo_MaxSize_1, 2561).
--define(wxAuiPaneInfo_MaxSize_2, 2562).
--define(wxAuiPaneInfo_MaximizeButton, 2563).
--define(wxAuiPaneInfo_MinSize_1, 2564).
--define(wxAuiPaneInfo_MinSize_2, 2565).
--define(wxAuiPaneInfo_MinimizeButton, 2566).
--define(wxAuiPaneInfo_Movable, 2567).
--define(wxAuiPaneInfo_Name, 2568).
--define(wxAuiPaneInfo_PaneBorder, 2569).
--define(wxAuiPaneInfo_PinButton, 2570).
--define(wxAuiPaneInfo_Position, 2571).
--define(wxAuiPaneInfo_Resizable, 2572).
--define(wxAuiPaneInfo_Right, 2573).
--define(wxAuiPaneInfo_RightDockable, 2574).
--define(wxAuiPaneInfo_Row, 2575).
--define(wxAuiPaneInfo_SafeSet, 2576).
--define(wxAuiPaneInfo_SetFlag, 2577).
--define(wxAuiPaneInfo_Show, 2578).
--define(wxAuiPaneInfo_ToolbarPane, 2579).
--define(wxAuiPaneInfo_Top, 2580).
--define(wxAuiPaneInfo_TopDockable, 2581).
--define(wxAuiPaneInfo_Window, 2582).
--define(wxAuiPaneInfo_GetWindow, 2583).
--define(wxAuiPaneInfo_GetFrame, 2584).
--define(wxAuiPaneInfo_GetDirection, 2585).
--define(wxAuiPaneInfo_GetLayer, 2586).
--define(wxAuiPaneInfo_GetRow, 2587).
--define(wxAuiPaneInfo_GetPosition, 2588).
--define(wxAuiPaneInfo_GetFloatingPosition, 2589).
--define(wxAuiPaneInfo_GetFloatingSize, 2590).
--define(wxAuiPaneInfo_destroy, 2591).
--define(wxAuiNotebook_new_0, 2592).
--define(wxAuiNotebook_new_2, 2593).
--define(wxAuiNotebook_AddPage_3, 2594).
--define(wxAuiNotebook_AddPage_4, 2595).
--define(wxAuiNotebook_Create_2, 2596).
--define(wxAuiNotebook_Create_3, 2597).
--define(wxAuiNotebook_DeletePage, 2598).
--define(wxAuiNotebook_GetArtProvider, 2599).
--define(wxAuiNotebook_GetPage, 2600).
--define(wxAuiNotebook_GetPageBitmap, 2601).
--define(wxAuiNotebook_GetPageCount, 2602).
--define(wxAuiNotebook_GetPageIndex, 2603).
--define(wxAuiNotebook_GetPageText, 2604).
--define(wxAuiNotebook_GetSelection, 2605).
--define(wxAuiNotebook_InsertPage_4, 2606).
--define(wxAuiNotebook_InsertPage_5, 2607).
--define(wxAuiNotebook_RemovePage, 2608).
--define(wxAuiNotebook_SetArtProvider, 2609).
--define(wxAuiNotebook_SetFont, 2610).
--define(wxAuiNotebook_SetPageBitmap, 2611).
--define(wxAuiNotebook_SetPageText, 2612).
--define(wxAuiNotebook_SetSelection, 2613).
--define(wxAuiNotebook_SetTabCtrlHeight, 2614).
--define(wxAuiNotebook_SetUniformBitmapSize, 2615).
--define(wxAuiNotebook_destroy, 2616).
--define(wxAuiTabArt_SetFlags, 2617).
--define(wxAuiTabArt_SetMeasuringFont, 2618).
--define(wxAuiTabArt_SetNormalFont, 2619).
--define(wxAuiTabArt_SetSelectedFont, 2620).
--define(wxAuiTabArt_SetColour, 2621).
--define(wxAuiTabArt_SetActiveColour, 2622).
--define(wxAuiDockArt_GetColour, 2623).
--define(wxAuiDockArt_GetFont, 2624).
--define(wxAuiDockArt_GetMetric, 2625).
--define(wxAuiDockArt_SetColour, 2626).
--define(wxAuiDockArt_SetFont, 2627).
--define(wxAuiDockArt_SetMetric, 2628).
--define(wxAuiSimpleTabArt_new, 2629).
--define(wxAuiSimpleTabArt_destroy, 2630).
--define(wxMDIParentFrame_new_0, 2631).
--define(wxMDIParentFrame_new_4, 2632).
--define(wxMDIParentFrame_destruct, 2633).
--define(wxMDIParentFrame_ActivateNext, 2634).
--define(wxMDIParentFrame_ActivatePrevious, 2635).
--define(wxMDIParentFrame_ArrangeIcons, 2636).
--define(wxMDIParentFrame_Cascade, 2637).
--define(wxMDIParentFrame_Create, 2638).
--define(wxMDIParentFrame_GetActiveChild, 2639).
--define(wxMDIParentFrame_GetClientWindow, 2640).
--define(wxMDIParentFrame_Tile, 2641).
--define(wxMDIChildFrame_new_0, 2642).
--define(wxMDIChildFrame_new_4, 2643).
--define(wxMDIChildFrame_destruct, 2644).
--define(wxMDIChildFrame_Activate, 2645).
--define(wxMDIChildFrame_Create, 2646).
--define(wxMDIChildFrame_Maximize, 2647).
--define(wxMDIChildFrame_Restore, 2648).
--define(wxMDIClientWindow_new, 2649).
--define(wxMDIClientWindow_CreateClient, 2650).
--define(wxMDIClientWindow_destroy, 2651).
--define(wxLayoutAlgorithm_new, 2652).
--define(wxLayoutAlgorithm_destruct, 2653).
--define(wxLayoutAlgorithm_LayoutFrame, 2654).
--define(wxLayoutAlgorithm_LayoutMDIFrame, 2655).
--define(wxLayoutAlgorithm_LayoutWindow, 2656).
--define(wxEvent_GetId, 2657).
--define(wxEvent_GetSkipped, 2658).
--define(wxEvent_GetTimestamp, 2659).
--define(wxEvent_IsCommandEvent, 2660).
--define(wxEvent_ResumePropagation, 2661).
--define(wxEvent_ShouldPropagate, 2662).
--define(wxEvent_Skip, 2663).
--define(wxEvent_StopPropagation, 2664).
--define(wxCommandEvent_getClientData, 2665).
--define(wxCommandEvent_GetExtraLong, 2666).
--define(wxCommandEvent_GetInt, 2667).
--define(wxCommandEvent_GetSelection, 2668).
--define(wxCommandEvent_GetString, 2669).
--define(wxCommandEvent_IsChecked, 2670).
--define(wxCommandEvent_IsSelection, 2671).
--define(wxCommandEvent_SetInt, 2672).
--define(wxCommandEvent_SetString, 2673).
--define(wxScrollEvent_GetOrientation, 2674).
--define(wxScrollEvent_GetPosition, 2675).
--define(wxScrollWinEvent_GetOrientation, 2676).
--define(wxScrollWinEvent_GetPosition, 2677).
--define(wxMouseEvent_AltDown, 2678).
--define(wxMouseEvent_Button, 2679).
--define(wxMouseEvent_ButtonDClick, 2680).
--define(wxMouseEvent_ButtonDown, 2681).
--define(wxMouseEvent_ButtonUp, 2682).
--define(wxMouseEvent_CmdDown, 2683).
--define(wxMouseEvent_ControlDown, 2684).
--define(wxMouseEvent_Dragging, 2685).
--define(wxMouseEvent_Entering, 2686).
--define(wxMouseEvent_GetButton, 2687).
--define(wxMouseEvent_GetPosition, 2688).
--define(wxMouseEvent_GetLogicalPosition, 2690).
--define(wxMouseEvent_GetLinesPerAction, 2691).
--define(wxMouseEvent_GetWheelRotation, 2692).
--define(wxMouseEvent_GetWheelDelta, 2693).
--define(wxMouseEvent_GetX, 2694).
--define(wxMouseEvent_GetY, 2695).
--define(wxMouseEvent_IsButton, 2696).
--define(wxMouseEvent_IsPageScroll, 2697).
--define(wxMouseEvent_Leaving, 2698).
--define(wxMouseEvent_LeftDClick, 2699).
--define(wxMouseEvent_LeftDown, 2700).
--define(wxMouseEvent_LeftIsDown, 2701).
--define(wxMouseEvent_LeftUp, 2702).
--define(wxMouseEvent_MetaDown, 2703).
--define(wxMouseEvent_MiddleDClick, 2704).
--define(wxMouseEvent_MiddleDown, 2705).
--define(wxMouseEvent_MiddleIsDown, 2706).
--define(wxMouseEvent_MiddleUp, 2707).
--define(wxMouseEvent_Moving, 2708).
--define(wxMouseEvent_RightDClick, 2709).
--define(wxMouseEvent_RightDown, 2710).
--define(wxMouseEvent_RightIsDown, 2711).
--define(wxMouseEvent_RightUp, 2712).
--define(wxMouseEvent_ShiftDown, 2713).
--define(wxMouseEvent_GetWheelAxis, 2714).
--define(wxSetCursorEvent_GetCursor, 2715).
--define(wxSetCursorEvent_GetX, 2716).
--define(wxSetCursorEvent_GetY, 2717).
--define(wxSetCursorEvent_HasCursor, 2718).
--define(wxSetCursorEvent_SetCursor, 2719).
--define(wxKeyEvent_AltDown, 2720).
--define(wxKeyEvent_CmdDown, 2721).
--define(wxKeyEvent_ControlDown, 2722).
--define(wxKeyEvent_GetKeyCode, 2723).
--define(wxKeyEvent_GetModifiers, 2724).
--define(wxKeyEvent_GetPosition, 2725).
--define(wxKeyEvent_GetRawKeyCode, 2727).
--define(wxKeyEvent_GetRawKeyFlags, 2728).
--define(wxKeyEvent_GetUnicodeKey, 2729).
--define(wxKeyEvent_GetX, 2730).
--define(wxKeyEvent_GetY, 2731).
--define(wxKeyEvent_HasModifiers, 2732).
--define(wxKeyEvent_MetaDown, 2733).
--define(wxKeyEvent_ShiftDown, 2734).
--define(wxSizeEvent_GetSize, 2735).
--define(wxSizeEvent_GetRect, 2736).
--define(wxMoveEvent_GetPosition, 2737).
--define(wxMoveEvent_GetRect, 2738).
--define(wxEraseEvent_GetDC, 2739).
--define(wxFocusEvent_GetWindow, 2740).
--define(wxChildFocusEvent_GetWindow, 2741).
--define(wxMenuEvent_GetMenu, 2742).
--define(wxMenuEvent_GetMenuId, 2743).
--define(wxMenuEvent_IsPopup, 2744).
--define(wxCloseEvent_CanVeto, 2745).
--define(wxCloseEvent_GetLoggingOff, 2746).
--define(wxCloseEvent_SetCanVeto, 2747).
--define(wxCloseEvent_SetLoggingOff, 2748).
--define(wxCloseEvent_Veto, 2749).
--define(wxShowEvent_SetShow, 2750).
--define(wxShowEvent_IsShown, 2751).
--define(wxIconizeEvent_IsIconized, 2752).
--define(wxJoystickEvent_ButtonDown, 2753).
--define(wxJoystickEvent_ButtonIsDown, 2754).
--define(wxJoystickEvent_ButtonUp, 2755).
--define(wxJoystickEvent_GetButtonChange, 2756).
--define(wxJoystickEvent_GetButtonState, 2757).
--define(wxJoystickEvent_GetJoystick, 2758).
--define(wxJoystickEvent_GetPosition, 2759).
--define(wxJoystickEvent_GetZPosition, 2760).
--define(wxJoystickEvent_IsButton, 2761).
--define(wxJoystickEvent_IsMove, 2762).
--define(wxJoystickEvent_IsZMove, 2763).
--define(wxUpdateUIEvent_CanUpdate, 2764).
--define(wxUpdateUIEvent_Check, 2765).
--define(wxUpdateUIEvent_Enable, 2766).
--define(wxUpdateUIEvent_Show, 2767).
--define(wxUpdateUIEvent_GetChecked, 2768).
--define(wxUpdateUIEvent_GetEnabled, 2769).
--define(wxUpdateUIEvent_GetShown, 2770).
--define(wxUpdateUIEvent_GetSetChecked, 2771).
--define(wxUpdateUIEvent_GetSetEnabled, 2772).
--define(wxUpdateUIEvent_GetSetShown, 2773).
--define(wxUpdateUIEvent_GetSetText, 2774).
--define(wxUpdateUIEvent_GetText, 2775).
--define(wxUpdateUIEvent_GetMode, 2776).
--define(wxUpdateUIEvent_GetUpdateInterval, 2777).
--define(wxUpdateUIEvent_ResetUpdateTime, 2778).
--define(wxUpdateUIEvent_SetMode, 2779).
--define(wxUpdateUIEvent_SetText, 2780).
--define(wxUpdateUIEvent_SetUpdateInterval, 2781).
--define(wxMouseCaptureChangedEvent_GetCapturedWindow, 2782).
--define(wxPaletteChangedEvent_SetChangedWindow, 2783).
--define(wxPaletteChangedEvent_GetChangedWindow, 2784).
--define(wxQueryNewPaletteEvent_SetPaletteRealized, 2785).
--define(wxQueryNewPaletteEvent_GetPaletteRealized, 2786).
--define(wxNavigationKeyEvent_GetDirection, 2787).
--define(wxNavigationKeyEvent_SetDirection, 2788).
--define(wxNavigationKeyEvent_IsWindowChange, 2789).
--define(wxNavigationKeyEvent_SetWindowChange, 2790).
--define(wxNavigationKeyEvent_IsFromTab, 2791).
--define(wxNavigationKeyEvent_SetFromTab, 2792).
--define(wxNavigationKeyEvent_GetCurrentFocus, 2793).
--define(wxNavigationKeyEvent_SetCurrentFocus, 2794).
--define(wxHelpEvent_GetOrigin, 2795).
--define(wxHelpEvent_GetPosition, 2796).
--define(wxHelpEvent_SetOrigin, 2797).
--define(wxHelpEvent_SetPosition, 2798).
--define(wxContextMenuEvent_GetPosition, 2799).
--define(wxContextMenuEvent_SetPosition, 2800).
--define(wxIdleEvent_GetMode, 2801).
--define(wxIdleEvent_RequestMore, 2802).
--define(wxIdleEvent_MoreRequested, 2803).
--define(wxIdleEvent_SetMode, 2804).
--define(wxGridEvent_AltDown, 2805).
--define(wxGridEvent_ControlDown, 2806).
--define(wxGridEvent_GetCol, 2807).
--define(wxGridEvent_GetPosition, 2808).
--define(wxGridEvent_GetRow, 2809).
--define(wxGridEvent_MetaDown, 2810).
--define(wxGridEvent_Selecting, 2811).
--define(wxGridEvent_ShiftDown, 2812).
--define(wxNotifyEvent_Allow, 2813).
--define(wxNotifyEvent_IsAllowed, 2814).
--define(wxNotifyEvent_Veto, 2815).
--define(wxSashEvent_GetEdge, 2816).
--define(wxSashEvent_GetDragRect, 2817).
--define(wxSashEvent_GetDragStatus, 2818).
--define(wxListEvent_GetCacheFrom, 2819).
--define(wxListEvent_GetCacheTo, 2820).
--define(wxListEvent_GetKeyCode, 2821).
--define(wxListEvent_GetIndex, 2822).
--define(wxListEvent_GetColumn, 2823).
--define(wxListEvent_GetPoint, 2824).
--define(wxListEvent_GetLabel, 2825).
--define(wxListEvent_GetText, 2826).
--define(wxListEvent_GetImage, 2827).
--define(wxListEvent_GetData, 2828).
--define(wxListEvent_GetMask, 2829).
--define(wxListEvent_GetItem, 2830).
--define(wxListEvent_IsEditCancelled, 2831).
--define(wxDateEvent_GetDate, 2832).
--define(wxCalendarEvent_GetWeekDay, 2833).
--define(wxCalendarEvent_GetDate, 2834).
--define(wxFileDirPickerEvent_GetPath, 2835).
--define(wxColourPickerEvent_GetColour, 2836).
--define(wxFontPickerEvent_GetFont, 2837).
--define(wxStyledTextEvent_GetPosition, 2838).
--define(wxStyledTextEvent_GetKey, 2839).
--define(wxStyledTextEvent_GetModifiers, 2840).
--define(wxStyledTextEvent_GetModificationType, 2841).
--define(wxStyledTextEvent_GetText, 2842).
--define(wxStyledTextEvent_GetLength, 2843).
--define(wxStyledTextEvent_GetLinesAdded, 2844).
--define(wxStyledTextEvent_GetLine, 2845).
--define(wxStyledTextEvent_GetFoldLevelNow, 2846).
--define(wxStyledTextEvent_GetFoldLevelPrev, 2847).
--define(wxStyledTextEvent_GetMargin, 2848).
--define(wxStyledTextEvent_GetMessage, 2849).
--define(wxStyledTextEvent_GetWParam, 2850).
--define(wxStyledTextEvent_GetLParam, 2851).
--define(wxStyledTextEvent_GetListType, 2852).
--define(wxStyledTextEvent_GetX, 2853).
--define(wxStyledTextEvent_GetY, 2854).
--define(wxStyledTextEvent_GetDragText, 2855).
--define(wxStyledTextEvent_GetDragAllowMove, 2856).
--define(wxStyledTextEvent_GetDragResult, 2857).
--define(wxStyledTextEvent_GetShift, 2858).
--define(wxStyledTextEvent_GetControl, 2859).
--define(wxStyledTextEvent_GetAlt, 2860).
--define(utils_wxGetKeyState, 2861).
--define(utils_wxGetMousePosition, 2862).
--define(utils_wxGetMouseState, 2863).
--define(utils_wxSetDetectableAutoRepeat, 2864).
--define(utils_wxBell, 2865).
--define(utils_wxFindMenuItemId, 2866).
--define(utils_wxFindWindowAtPoint, 2867).
--define(utils_wxBeginBusyCursor, 2868).
--define(utils_wxEndBusyCursor, 2869).
--define(utils_wxIsBusy, 2870).
--define(utils_wxShutdown, 2871).
--define(utils_wxShell, 2872).
--define(utils_wxLaunchDefaultBrowser, 2873).
--define(utils_wxGetEmailAddress, 2874).
--define(utils_wxGetUserId, 2875).
--define(utils_wxGetHomeDir, 2876).
--define(utils_wxNewId, 2877).
--define(utils_wxRegisterId, 2878).
--define(utils_wxGetCurrentId, 2879).
--define(utils_wxGetOsDescription, 2880).
--define(utils_wxIsPlatformLittleEndian, 2881).
--define(utils_wxIsPlatform64Bit, 2882).
--define(gdicmn_wxDisplaySize, 2883).
--define(gdicmn_wxSetCursor, 2884).
--define(wxPrintout_new, 2885).
--define(wxPrintout_destruct, 2886).
--define(wxPrintout_GetDC, 2887).
--define(wxPrintout_GetPageSizeMM, 2888).
--define(wxPrintout_GetPageSizePixels, 2889).
--define(wxPrintout_GetPaperRectPixels, 2890).
--define(wxPrintout_GetPPIPrinter, 2891).
--define(wxPrintout_GetPPIScreen, 2892).
--define(wxPrintout_GetTitle, 2893).
--define(wxPrintout_IsPreview, 2894).
--define(wxPrintout_FitThisSizeToPaper, 2895).
--define(wxPrintout_FitThisSizeToPage, 2896).
--define(wxPrintout_FitThisSizeToPageMargins, 2897).
--define(wxPrintout_MapScreenSizeToPaper, 2898).
--define(wxPrintout_MapScreenSizeToPage, 2899).
--define(wxPrintout_MapScreenSizeToPageMargins, 2900).
--define(wxPrintout_MapScreenSizeToDevice, 2901).
--define(wxPrintout_GetLogicalPaperRect, 2902).
--define(wxPrintout_GetLogicalPageRect, 2903).
--define(wxPrintout_GetLogicalPageMarginsRect, 2904).
--define(wxPrintout_SetLogicalOrigin, 2905).
--define(wxPrintout_OffsetLogicalOrigin, 2906).
--define(wxStyledTextCtrl_new_2, 2907).
--define(wxStyledTextCtrl_new_0, 2908).
--define(wxStyledTextCtrl_destruct, 2909).
--define(wxStyledTextCtrl_Create, 2910).
--define(wxStyledTextCtrl_AddText, 2911).
--define(wxStyledTextCtrl_InsertText, 2912).
--define(wxStyledTextCtrl_ClearAll, 2913).
--define(wxStyledTextCtrl_ClearDocumentStyle, 2914).
--define(wxStyledTextCtrl_GetLength, 2915).
--define(wxStyledTextCtrl_GetCharAt, 2916).
--define(wxStyledTextCtrl_GetCurrentPos, 2917).
--define(wxStyledTextCtrl_GetAnchor, 2918).
--define(wxStyledTextCtrl_GetStyleAt, 2919).
--define(wxStyledTextCtrl_Redo, 2920).
--define(wxStyledTextCtrl_SetUndoCollection, 2921).
--define(wxStyledTextCtrl_SelectAll, 2922).
--define(wxStyledTextCtrl_SetSavePoint, 2923).
--define(wxStyledTextCtrl_CanRedo, 2924).
--define(wxStyledTextCtrl_MarkerLineFromHandle, 2925).
--define(wxStyledTextCtrl_MarkerDeleteHandle, 2926).
--define(wxStyledTextCtrl_GetUndoCollection, 2927).
--define(wxStyledTextCtrl_GetViewWhiteSpace, 2928).
--define(wxStyledTextCtrl_SetViewWhiteSpace, 2929).
--define(wxStyledTextCtrl_PositionFromPoint, 2930).
--define(wxStyledTextCtrl_PositionFromPointClose, 2931).
--define(wxStyledTextCtrl_GotoLine, 2932).
--define(wxStyledTextCtrl_GotoPos, 2933).
--define(wxStyledTextCtrl_SetAnchor, 2934).
--define(wxStyledTextCtrl_GetCurLine, 2935).
--define(wxStyledTextCtrl_GetEndStyled, 2936).
--define(wxStyledTextCtrl_ConvertEOLs, 2937).
--define(wxStyledTextCtrl_GetEOLMode, 2938).
--define(wxStyledTextCtrl_SetEOLMode, 2939).
--define(wxStyledTextCtrl_StartStyling, 2940).
--define(wxStyledTextCtrl_SetStyling, 2941).
--define(wxStyledTextCtrl_GetBufferedDraw, 2942).
--define(wxStyledTextCtrl_SetBufferedDraw, 2943).
--define(wxStyledTextCtrl_SetTabWidth, 2944).
--define(wxStyledTextCtrl_GetTabWidth, 2945).
--define(wxStyledTextCtrl_SetCodePage, 2946).
--define(wxStyledTextCtrl_MarkerDefine, 2947).
--define(wxStyledTextCtrl_MarkerSetForeground, 2948).
--define(wxStyledTextCtrl_MarkerSetBackground, 2949).
--define(wxStyledTextCtrl_MarkerAdd, 2950).
--define(wxStyledTextCtrl_MarkerDelete, 2951).
--define(wxStyledTextCtrl_MarkerDeleteAll, 2952).
--define(wxStyledTextCtrl_MarkerGet, 2953).
--define(wxStyledTextCtrl_MarkerNext, 2954).
--define(wxStyledTextCtrl_MarkerPrevious, 2955).
--define(wxStyledTextCtrl_MarkerDefineBitmap, 2956).
--define(wxStyledTextCtrl_MarkerAddSet, 2957).
--define(wxStyledTextCtrl_MarkerSetAlpha, 2958).
--define(wxStyledTextCtrl_SetMarginType, 2959).
--define(wxStyledTextCtrl_GetMarginType, 2960).
--define(wxStyledTextCtrl_SetMarginWidth, 2961).
--define(wxStyledTextCtrl_GetMarginWidth, 2962).
--define(wxStyledTextCtrl_SetMarginMask, 2963).
--define(wxStyledTextCtrl_GetMarginMask, 2964).
--define(wxStyledTextCtrl_SetMarginSensitive, 2965).
--define(wxStyledTextCtrl_GetMarginSensitive, 2966).
--define(wxStyledTextCtrl_StyleClearAll, 2967).
--define(wxStyledTextCtrl_StyleSetForeground, 2968).
--define(wxStyledTextCtrl_StyleSetBackground, 2969).
--define(wxStyledTextCtrl_StyleSetBold, 2970).
--define(wxStyledTextCtrl_StyleSetItalic, 2971).
--define(wxStyledTextCtrl_StyleSetSize, 2972).
--define(wxStyledTextCtrl_StyleSetFaceName, 2973).
--define(wxStyledTextCtrl_StyleSetEOLFilled, 2974).
--define(wxStyledTextCtrl_StyleResetDefault, 2975).
--define(wxStyledTextCtrl_StyleSetUnderline, 2976).
--define(wxStyledTextCtrl_StyleSetCase, 2977).
--define(wxStyledTextCtrl_StyleSetHotSpot, 2978).
--define(wxStyledTextCtrl_SetSelForeground, 2979).
--define(wxStyledTextCtrl_SetSelBackground, 2980).
--define(wxStyledTextCtrl_GetSelAlpha, 2981).
--define(wxStyledTextCtrl_SetSelAlpha, 2982).
--define(wxStyledTextCtrl_SetCaretForeground, 2983).
--define(wxStyledTextCtrl_CmdKeyAssign, 2984).
--define(wxStyledTextCtrl_CmdKeyClear, 2985).
--define(wxStyledTextCtrl_CmdKeyClearAll, 2986).
--define(wxStyledTextCtrl_SetStyleBytes, 2987).
--define(wxStyledTextCtrl_StyleSetVisible, 2988).
--define(wxStyledTextCtrl_GetCaretPeriod, 2989).
--define(wxStyledTextCtrl_SetCaretPeriod, 2990).
--define(wxStyledTextCtrl_SetWordChars, 2991).
--define(wxStyledTextCtrl_BeginUndoAction, 2992).
--define(wxStyledTextCtrl_EndUndoAction, 2993).
--define(wxStyledTextCtrl_IndicatorSetStyle, 2994).
--define(wxStyledTextCtrl_IndicatorGetStyle, 2995).
--define(wxStyledTextCtrl_IndicatorSetForeground, 2996).
--define(wxStyledTextCtrl_IndicatorGetForeground, 2997).
--define(wxStyledTextCtrl_SetWhitespaceForeground, 2998).
--define(wxStyledTextCtrl_SetWhitespaceBackground, 2999).
--define(wxStyledTextCtrl_GetStyleBits, 3000).
--define(wxStyledTextCtrl_SetLineState, 3001).
--define(wxStyledTextCtrl_GetLineState, 3002).
--define(wxStyledTextCtrl_GetMaxLineState, 3003).
--define(wxStyledTextCtrl_GetCaretLineVisible, 3004).
--define(wxStyledTextCtrl_SetCaretLineVisible, 3005).
--define(wxStyledTextCtrl_GetCaretLineBackground, 3006).
--define(wxStyledTextCtrl_SetCaretLineBackground, 3007).
--define(wxStyledTextCtrl_AutoCompShow, 3008).
--define(wxStyledTextCtrl_AutoCompCancel, 3009).
--define(wxStyledTextCtrl_AutoCompActive, 3010).
--define(wxStyledTextCtrl_AutoCompPosStart, 3011).
--define(wxStyledTextCtrl_AutoCompComplete, 3012).
--define(wxStyledTextCtrl_AutoCompStops, 3013).
--define(wxStyledTextCtrl_AutoCompSetSeparator, 3014).
--define(wxStyledTextCtrl_AutoCompGetSeparator, 3015).
--define(wxStyledTextCtrl_AutoCompSelect, 3016).
--define(wxStyledTextCtrl_AutoCompSetCancelAtStart, 3017).
--define(wxStyledTextCtrl_AutoCompGetCancelAtStart, 3018).
--define(wxStyledTextCtrl_AutoCompSetFillUps, 3019).
--define(wxStyledTextCtrl_AutoCompSetChooseSingle, 3020).
--define(wxStyledTextCtrl_AutoCompGetChooseSingle, 3021).
--define(wxStyledTextCtrl_AutoCompSetIgnoreCase, 3022).
--define(wxStyledTextCtrl_AutoCompGetIgnoreCase, 3023).
--define(wxStyledTextCtrl_UserListShow, 3024).
--define(wxStyledTextCtrl_AutoCompSetAutoHide, 3025).
--define(wxStyledTextCtrl_AutoCompGetAutoHide, 3026).
--define(wxStyledTextCtrl_AutoCompSetDropRestOfWord, 3027).
--define(wxStyledTextCtrl_AutoCompGetDropRestOfWord, 3028).
--define(wxStyledTextCtrl_RegisterImage, 3029).
--define(wxStyledTextCtrl_ClearRegisteredImages, 3030).
--define(wxStyledTextCtrl_AutoCompGetTypeSeparator, 3031).
--define(wxStyledTextCtrl_AutoCompSetTypeSeparator, 3032).
--define(wxStyledTextCtrl_AutoCompSetMaxWidth, 3033).
--define(wxStyledTextCtrl_AutoCompGetMaxWidth, 3034).
--define(wxStyledTextCtrl_AutoCompSetMaxHeight, 3035).
--define(wxStyledTextCtrl_AutoCompGetMaxHeight, 3036).
--define(wxStyledTextCtrl_SetIndent, 3037).
--define(wxStyledTextCtrl_GetIndent, 3038).
--define(wxStyledTextCtrl_SetUseTabs, 3039).
--define(wxStyledTextCtrl_GetUseTabs, 3040).
--define(wxStyledTextCtrl_SetLineIndentation, 3041).
--define(wxStyledTextCtrl_GetLineIndentation, 3042).
--define(wxStyledTextCtrl_GetLineIndentPosition, 3043).
--define(wxStyledTextCtrl_GetColumn, 3044).
--define(wxStyledTextCtrl_SetUseHorizontalScrollBar, 3045).
--define(wxStyledTextCtrl_GetUseHorizontalScrollBar, 3046).
--define(wxStyledTextCtrl_SetIndentationGuides, 3047).
--define(wxStyledTextCtrl_GetIndentationGuides, 3048).
--define(wxStyledTextCtrl_SetHighlightGuide, 3049).
--define(wxStyledTextCtrl_GetHighlightGuide, 3050).
--define(wxStyledTextCtrl_GetLineEndPosition, 3051).
--define(wxStyledTextCtrl_GetCodePage, 3052).
--define(wxStyledTextCtrl_GetCaretForeground, 3053).
--define(wxStyledTextCtrl_GetReadOnly, 3054).
--define(wxStyledTextCtrl_SetCurrentPos, 3055).
--define(wxStyledTextCtrl_SetSelectionStart, 3056).
--define(wxStyledTextCtrl_GetSelectionStart, 3057).
--define(wxStyledTextCtrl_SetSelectionEnd, 3058).
--define(wxStyledTextCtrl_GetSelectionEnd, 3059).
--define(wxStyledTextCtrl_SetPrintMagnification, 3060).
--define(wxStyledTextCtrl_GetPrintMagnification, 3061).
--define(wxStyledTextCtrl_SetPrintColourMode, 3062).
--define(wxStyledTextCtrl_GetPrintColourMode, 3063).
--define(wxStyledTextCtrl_FindText, 3064).
--define(wxStyledTextCtrl_FormatRange, 3065).
--define(wxStyledTextCtrl_GetFirstVisibleLine, 3066).
--define(wxStyledTextCtrl_GetLine, 3067).
--define(wxStyledTextCtrl_GetLineCount, 3068).
--define(wxStyledTextCtrl_SetMarginLeft, 3069).
--define(wxStyledTextCtrl_GetMarginLeft, 3070).
--define(wxStyledTextCtrl_SetMarginRight, 3071).
--define(wxStyledTextCtrl_GetMarginRight, 3072).
--define(wxStyledTextCtrl_GetModify, 3073).
--define(wxStyledTextCtrl_SetSelection, 3074).
--define(wxStyledTextCtrl_GetSelectedText, 3075).
--define(wxStyledTextCtrl_GetTextRange, 3076).
--define(wxStyledTextCtrl_HideSelection, 3077).
--define(wxStyledTextCtrl_LineFromPosition, 3078).
--define(wxStyledTextCtrl_PositionFromLine, 3079).
--define(wxStyledTextCtrl_LineScroll, 3080).
--define(wxStyledTextCtrl_EnsureCaretVisible, 3081).
--define(wxStyledTextCtrl_ReplaceSelection, 3082).
--define(wxStyledTextCtrl_SetReadOnly, 3083).
--define(wxStyledTextCtrl_CanPaste, 3084).
--define(wxStyledTextCtrl_CanUndo, 3085).
--define(wxStyledTextCtrl_EmptyUndoBuffer, 3086).
--define(wxStyledTextCtrl_Undo, 3087).
--define(wxStyledTextCtrl_Cut, 3088).
--define(wxStyledTextCtrl_Copy, 3089).
--define(wxStyledTextCtrl_Paste, 3090).
--define(wxStyledTextCtrl_Clear, 3091).
--define(wxStyledTextCtrl_SetText, 3092).
--define(wxStyledTextCtrl_GetText, 3093).
--define(wxStyledTextCtrl_GetTextLength, 3094).
--define(wxStyledTextCtrl_GetOvertype, 3095).
--define(wxStyledTextCtrl_SetCaretWidth, 3096).
--define(wxStyledTextCtrl_GetCaretWidth, 3097).
--define(wxStyledTextCtrl_SetTargetStart, 3098).
--define(wxStyledTextCtrl_GetTargetStart, 3099).
--define(wxStyledTextCtrl_SetTargetEnd, 3100).
--define(wxStyledTextCtrl_GetTargetEnd, 3101).
--define(wxStyledTextCtrl_ReplaceTarget, 3102).
--define(wxStyledTextCtrl_SearchInTarget, 3103).
--define(wxStyledTextCtrl_SetSearchFlags, 3104).
--define(wxStyledTextCtrl_GetSearchFlags, 3105).
--define(wxStyledTextCtrl_CallTipShow, 3106).
--define(wxStyledTextCtrl_CallTipCancel, 3107).
--define(wxStyledTextCtrl_CallTipActive, 3108).
--define(wxStyledTextCtrl_CallTipPosAtStart, 3109).
--define(wxStyledTextCtrl_CallTipSetHighlight, 3110).
--define(wxStyledTextCtrl_CallTipSetBackground, 3111).
--define(wxStyledTextCtrl_CallTipSetForeground, 3112).
--define(wxStyledTextCtrl_CallTipSetForegroundHighlight, 3113).
--define(wxStyledTextCtrl_CallTipUseStyle, 3114).
--define(wxStyledTextCtrl_VisibleFromDocLine, 3115).
--define(wxStyledTextCtrl_DocLineFromVisible, 3116).
--define(wxStyledTextCtrl_WrapCount, 3117).
--define(wxStyledTextCtrl_SetFoldLevel, 3118).
--define(wxStyledTextCtrl_GetFoldLevel, 3119).
--define(wxStyledTextCtrl_GetLastChild, 3120).
--define(wxStyledTextCtrl_GetFoldParent, 3121).
--define(wxStyledTextCtrl_ShowLines, 3122).
--define(wxStyledTextCtrl_HideLines, 3123).
--define(wxStyledTextCtrl_GetLineVisible, 3124).
--define(wxStyledTextCtrl_SetFoldExpanded, 3125).
--define(wxStyledTextCtrl_GetFoldExpanded, 3126).
--define(wxStyledTextCtrl_ToggleFold, 3127).
--define(wxStyledTextCtrl_EnsureVisible, 3128).
--define(wxStyledTextCtrl_SetFoldFlags, 3129).
--define(wxStyledTextCtrl_EnsureVisibleEnforcePolicy, 3130).
--define(wxStyledTextCtrl_SetTabIndents, 3131).
--define(wxStyledTextCtrl_GetTabIndents, 3132).
--define(wxStyledTextCtrl_SetBackSpaceUnIndents, 3133).
--define(wxStyledTextCtrl_GetBackSpaceUnIndents, 3134).
--define(wxStyledTextCtrl_SetMouseDwellTime, 3135).
--define(wxStyledTextCtrl_GetMouseDwellTime, 3136).
--define(wxStyledTextCtrl_WordStartPosition, 3137).
--define(wxStyledTextCtrl_WordEndPosition, 3138).
--define(wxStyledTextCtrl_SetWrapMode, 3139).
--define(wxStyledTextCtrl_GetWrapMode, 3140).
--define(wxStyledTextCtrl_SetWrapVisualFlags, 3141).
--define(wxStyledTextCtrl_GetWrapVisualFlags, 3142).
--define(wxStyledTextCtrl_SetWrapVisualFlagsLocation, 3143).
--define(wxStyledTextCtrl_GetWrapVisualFlagsLocation, 3144).
--define(wxStyledTextCtrl_SetWrapStartIndent, 3145).
--define(wxStyledTextCtrl_GetWrapStartIndent, 3146).
--define(wxStyledTextCtrl_SetLayoutCache, 3147).
--define(wxStyledTextCtrl_GetLayoutCache, 3148).
--define(wxStyledTextCtrl_SetScrollWidth, 3149).
--define(wxStyledTextCtrl_GetScrollWidth, 3150).
--define(wxStyledTextCtrl_TextWidth, 3151).
--define(wxStyledTextCtrl_GetEndAtLastLine, 3152).
--define(wxStyledTextCtrl_TextHeight, 3153).
--define(wxStyledTextCtrl_SetUseVerticalScrollBar, 3154).
--define(wxStyledTextCtrl_GetUseVerticalScrollBar, 3155).
--define(wxStyledTextCtrl_AppendText, 3156).
--define(wxStyledTextCtrl_GetTwoPhaseDraw, 3157).
--define(wxStyledTextCtrl_SetTwoPhaseDraw, 3158).
--define(wxStyledTextCtrl_TargetFromSelection, 3159).
--define(wxStyledTextCtrl_LinesJoin, 3160).
--define(wxStyledTextCtrl_LinesSplit, 3161).
--define(wxStyledTextCtrl_SetFoldMarginColour, 3162).
--define(wxStyledTextCtrl_SetFoldMarginHiColour, 3163).
--define(wxStyledTextCtrl_LineDown, 3164).
--define(wxStyledTextCtrl_LineDownExtend, 3165).
--define(wxStyledTextCtrl_LineUp, 3166).
--define(wxStyledTextCtrl_LineUpExtend, 3167).
--define(wxStyledTextCtrl_CharLeft, 3168).
--define(wxStyledTextCtrl_CharLeftExtend, 3169).
--define(wxStyledTextCtrl_CharRight, 3170).
--define(wxStyledTextCtrl_CharRightExtend, 3171).
--define(wxStyledTextCtrl_WordLeft, 3172).
--define(wxStyledTextCtrl_WordLeftExtend, 3173).
--define(wxStyledTextCtrl_WordRight, 3174).
--define(wxStyledTextCtrl_WordRightExtend, 3175).
--define(wxStyledTextCtrl_Home, 3176).
--define(wxStyledTextCtrl_HomeExtend, 3177).
--define(wxStyledTextCtrl_LineEnd, 3178).
--define(wxStyledTextCtrl_LineEndExtend, 3179).
--define(wxStyledTextCtrl_DocumentStart, 3180).
--define(wxStyledTextCtrl_DocumentStartExtend, 3181).
--define(wxStyledTextCtrl_DocumentEnd, 3182).
--define(wxStyledTextCtrl_DocumentEndExtend, 3183).
--define(wxStyledTextCtrl_PageUp, 3184).
--define(wxStyledTextCtrl_PageUpExtend, 3185).
--define(wxStyledTextCtrl_PageDown, 3186).
--define(wxStyledTextCtrl_PageDownExtend, 3187).
--define(wxStyledTextCtrl_EditToggleOvertype, 3188).
--define(wxStyledTextCtrl_Cancel, 3189).
--define(wxStyledTextCtrl_DeleteBack, 3190).
--define(wxStyledTextCtrl_Tab, 3191).
--define(wxStyledTextCtrl_BackTab, 3192).
--define(wxStyledTextCtrl_NewLine, 3193).
--define(wxStyledTextCtrl_FormFeed, 3194).
--define(wxStyledTextCtrl_VCHome, 3195).
--define(wxStyledTextCtrl_VCHomeExtend, 3196).
--define(wxStyledTextCtrl_ZoomIn, 3197).
--define(wxStyledTextCtrl_ZoomOut, 3198).
--define(wxStyledTextCtrl_DelWordLeft, 3199).
--define(wxStyledTextCtrl_DelWordRight, 3200).
--define(wxStyledTextCtrl_LineCut, 3201).
--define(wxStyledTextCtrl_LineDelete, 3202).
--define(wxStyledTextCtrl_LineTranspose, 3203).
--define(wxStyledTextCtrl_LineDuplicate, 3204).
--define(wxStyledTextCtrl_LowerCase, 3205).
--define(wxStyledTextCtrl_UpperCase, 3206).
--define(wxStyledTextCtrl_LineScrollDown, 3207).
--define(wxStyledTextCtrl_LineScrollUp, 3208).
--define(wxStyledTextCtrl_DeleteBackNotLine, 3209).
--define(wxStyledTextCtrl_HomeDisplay, 3210).
--define(wxStyledTextCtrl_HomeDisplayExtend, 3211).
--define(wxStyledTextCtrl_LineEndDisplay, 3212).
--define(wxStyledTextCtrl_LineEndDisplayExtend, 3213).
--define(wxStyledTextCtrl_HomeWrapExtend, 3214).
--define(wxStyledTextCtrl_LineEndWrap, 3215).
--define(wxStyledTextCtrl_LineEndWrapExtend, 3216).
--define(wxStyledTextCtrl_VCHomeWrap, 3217).
--define(wxStyledTextCtrl_VCHomeWrapExtend, 3218).
--define(wxStyledTextCtrl_LineCopy, 3219).
--define(wxStyledTextCtrl_MoveCaretInsideView, 3220).
--define(wxStyledTextCtrl_LineLength, 3221).
--define(wxStyledTextCtrl_BraceHighlight, 3222).
--define(wxStyledTextCtrl_BraceBadLight, 3223).
--define(wxStyledTextCtrl_BraceMatch, 3224).
--define(wxStyledTextCtrl_GetViewEOL, 3225).
--define(wxStyledTextCtrl_SetViewEOL, 3226).
--define(wxStyledTextCtrl_SetModEventMask, 3227).
--define(wxStyledTextCtrl_GetEdgeColumn, 3228).
--define(wxStyledTextCtrl_SetEdgeColumn, 3229).
--define(wxStyledTextCtrl_SetEdgeMode, 3230).
--define(wxStyledTextCtrl_GetEdgeMode, 3231).
--define(wxStyledTextCtrl_GetEdgeColour, 3232).
--define(wxStyledTextCtrl_SetEdgeColour, 3233).
--define(wxStyledTextCtrl_SearchAnchor, 3234).
--define(wxStyledTextCtrl_SearchNext, 3235).
--define(wxStyledTextCtrl_SearchPrev, 3236).
--define(wxStyledTextCtrl_LinesOnScreen, 3237).
--define(wxStyledTextCtrl_UsePopUp, 3238).
--define(wxStyledTextCtrl_SelectionIsRectangle, 3239).
--define(wxStyledTextCtrl_SetZoom, 3240).
--define(wxStyledTextCtrl_GetZoom, 3241).
--define(wxStyledTextCtrl_GetModEventMask, 3242).
--define(wxStyledTextCtrl_SetSTCFocus, 3243).
--define(wxStyledTextCtrl_GetSTCFocus, 3244).
--define(wxStyledTextCtrl_SetStatus, 3245).
--define(wxStyledTextCtrl_GetStatus, 3246).
--define(wxStyledTextCtrl_SetMouseDownCaptures, 3247).
--define(wxStyledTextCtrl_GetMouseDownCaptures, 3248).
--define(wxStyledTextCtrl_SetSTCCursor, 3249).
--define(wxStyledTextCtrl_GetSTCCursor, 3250).
--define(wxStyledTextCtrl_SetControlCharSymbol, 3251).
--define(wxStyledTextCtrl_GetControlCharSymbol, 3252).
--define(wxStyledTextCtrl_WordPartLeft, 3253).
--define(wxStyledTextCtrl_WordPartLeftExtend, 3254).
--define(wxStyledTextCtrl_WordPartRight, 3255).
--define(wxStyledTextCtrl_WordPartRightExtend, 3256).
--define(wxStyledTextCtrl_SetVisiblePolicy, 3257).
--define(wxStyledTextCtrl_DelLineLeft, 3258).
--define(wxStyledTextCtrl_DelLineRight, 3259).
--define(wxStyledTextCtrl_GetXOffset, 3260).
--define(wxStyledTextCtrl_ChooseCaretX, 3261).
--define(wxStyledTextCtrl_SetXCaretPolicy, 3262).
--define(wxStyledTextCtrl_SetYCaretPolicy, 3263).
--define(wxStyledTextCtrl_GetPrintWrapMode, 3264).
--define(wxStyledTextCtrl_SetHotspotActiveForeground, 3265).
--define(wxStyledTextCtrl_SetHotspotActiveBackground, 3266).
--define(wxStyledTextCtrl_SetHotspotActiveUnderline, 3267).
--define(wxStyledTextCtrl_SetHotspotSingleLine, 3268).
--define(wxStyledTextCtrl_ParaDownExtend, 3269).
--define(wxStyledTextCtrl_ParaUp, 3270).
--define(wxStyledTextCtrl_ParaUpExtend, 3271).
--define(wxStyledTextCtrl_PositionBefore, 3272).
--define(wxStyledTextCtrl_PositionAfter, 3273).
--define(wxStyledTextCtrl_CopyRange, 3274).
--define(wxStyledTextCtrl_CopyText, 3275).
--define(wxStyledTextCtrl_SetSelectionMode, 3276).
--define(wxStyledTextCtrl_GetSelectionMode, 3277).
--define(wxStyledTextCtrl_LineDownRectExtend, 3278).
--define(wxStyledTextCtrl_LineUpRectExtend, 3279).
--define(wxStyledTextCtrl_CharLeftRectExtend, 3280).
--define(wxStyledTextCtrl_CharRightRectExtend, 3281).
--define(wxStyledTextCtrl_HomeRectExtend, 3282).
--define(wxStyledTextCtrl_VCHomeRectExtend, 3283).
--define(wxStyledTextCtrl_LineEndRectExtend, 3284).
--define(wxStyledTextCtrl_PageUpRectExtend, 3285).
--define(wxStyledTextCtrl_PageDownRectExtend, 3286).
--define(wxStyledTextCtrl_StutteredPageUp, 3287).
--define(wxStyledTextCtrl_StutteredPageUpExtend, 3288).
--define(wxStyledTextCtrl_StutteredPageDown, 3289).
--define(wxStyledTextCtrl_StutteredPageDownExtend, 3290).
--define(wxStyledTextCtrl_WordLeftEnd, 3291).
--define(wxStyledTextCtrl_WordLeftEndExtend, 3292).
--define(wxStyledTextCtrl_WordRightEnd, 3293).
--define(wxStyledTextCtrl_WordRightEndExtend, 3294).
--define(wxStyledTextCtrl_SetWhitespaceChars, 3295).
--define(wxStyledTextCtrl_SetCharsDefault, 3296).
--define(wxStyledTextCtrl_AutoCompGetCurrent, 3297).
--define(wxStyledTextCtrl_Allocate, 3298).
--define(wxStyledTextCtrl_FindColumn, 3299).
--define(wxStyledTextCtrl_GetCaretSticky, 3300).
--define(wxStyledTextCtrl_SetCaretSticky, 3301).
--define(wxStyledTextCtrl_ToggleCaretSticky, 3302).
--define(wxStyledTextCtrl_SetPasteConvertEndings, 3303).
--define(wxStyledTextCtrl_GetPasteConvertEndings, 3304).
--define(wxStyledTextCtrl_SelectionDuplicate, 3305).
--define(wxStyledTextCtrl_SetCaretLineBackAlpha, 3306).
--define(wxStyledTextCtrl_GetCaretLineBackAlpha, 3307).
--define(wxStyledTextCtrl_StartRecord, 3308).
--define(wxStyledTextCtrl_StopRecord, 3309).
--define(wxStyledTextCtrl_SetLexer, 3310).
--define(wxStyledTextCtrl_GetLexer, 3311).
--define(wxStyledTextCtrl_Colourise, 3312).
--define(wxStyledTextCtrl_SetProperty, 3313).
--define(wxStyledTextCtrl_SetKeyWords, 3314).
--define(wxStyledTextCtrl_SetLexerLanguage, 3315).
--define(wxStyledTextCtrl_GetProperty, 3316).
--define(wxStyledTextCtrl_GetStyleBitsNeeded, 3317).
--define(wxStyledTextCtrl_GetCurrentLine, 3318).
--define(wxStyledTextCtrl_StyleSetSpec, 3319).
--define(wxStyledTextCtrl_StyleSetFont, 3320).
--define(wxStyledTextCtrl_StyleSetFontAttr, 3321).
--define(wxStyledTextCtrl_StyleSetCharacterSet, 3322).
--define(wxStyledTextCtrl_StyleSetFontEncoding, 3323).
--define(wxStyledTextCtrl_CmdKeyExecute, 3324).
--define(wxStyledTextCtrl_SetMargins, 3325).
--define(wxStyledTextCtrl_GetSelection, 3326).
--define(wxStyledTextCtrl_PointFromPosition, 3327).
--define(wxStyledTextCtrl_ScrollToLine, 3328).
--define(wxStyledTextCtrl_ScrollToColumn, 3329).
--define(wxStyledTextCtrl_SetVScrollBar, 3330).
--define(wxStyledTextCtrl_SetHScrollBar, 3331).
--define(wxStyledTextCtrl_GetLastKeydownProcessed, 3332).
--define(wxStyledTextCtrl_SetLastKeydownProcessed, 3333).
--define(wxStyledTextCtrl_SaveFile, 3334).
--define(wxStyledTextCtrl_LoadFile, 3335).
--define(wxStyledTextCtrl_DoDragOver, 3336).
--define(wxStyledTextCtrl_DoDropText, 3337).
--define(wxStyledTextCtrl_GetUseAntiAliasing, 3338).
--define(wxStyledTextCtrl_AddTextRaw, 3339).
--define(wxStyledTextCtrl_InsertTextRaw, 3340).
--define(wxStyledTextCtrl_GetCurLineRaw, 3341).
--define(wxStyledTextCtrl_GetLineRaw, 3342).
--define(wxStyledTextCtrl_GetSelectedTextRaw, 3343).
--define(wxStyledTextCtrl_GetTextRangeRaw, 3344).
--define(wxStyledTextCtrl_SetTextRaw, 3345).
--define(wxStyledTextCtrl_GetTextRaw, 3346).
--define(wxStyledTextCtrl_AppendTextRaw, 3347).
--define(wxArtProvider_GetBitmap, 3348).
--define(wxArtProvider_GetIcon, 3349).
--define(wxTreeEvent_GetKeyCode, 3350).
--define(wxTreeEvent_GetItem, 3351).
--define(wxTreeEvent_GetKeyEvent, 3352).
--define(wxTreeEvent_GetLabel, 3353).
--define(wxTreeEvent_GetOldItem, 3354).
--define(wxTreeEvent_GetPoint, 3355).
--define(wxTreeEvent_IsEditCancelled, 3356).
--define(wxTreeEvent_SetToolTip, 3357).
--define(wxBookCtrlEvent_GetOldSelection, 3358).
--define(wxBookCtrlEvent_GetSelection, 3359).
--define(wxBookCtrlEvent_SetOldSelection, 3360).
--define(wxBookCtrlEvent_SetSelection, 3361).
--define(wxFileDataObject_new, 3362).
--define(wxFileDataObject_AddFile, 3363).
--define(wxFileDataObject_GetFilenames, 3364).
--define(wxFileDataObject_destroy, 3365).
--define(wxTextDataObject_new, 3366).
--define(wxTextDataObject_GetTextLength, 3367).
--define(wxTextDataObject_GetText, 3368).
--define(wxTextDataObject_SetText, 3369).
--define(wxTextDataObject_destroy, 3370).
--define(wxBitmapDataObject_new_1_1, 3371).
--define(wxBitmapDataObject_new_1_0, 3372).
--define(wxBitmapDataObject_GetBitmap, 3373).
--define(wxBitmapDataObject_SetBitmap, 3374).
--define(wxBitmapDataObject_destroy, 3375).
--define(wxClipboard_new, 3376).
--define(wxClipboard_destruct, 3377).
--define(wxClipboard_AddData, 3378).
--define(wxClipboard_Clear, 3379).
--define(wxClipboard_Close, 3380).
--define(wxClipboard_Flush, 3381).
--define(wxClipboard_GetData, 3382).
--define(wxClipboard_IsOpened, 3383).
--define(wxClipboard_Open, 3384).
--define(wxClipboard_SetData, 3385).
--define(wxClipboard_UsePrimarySelection, 3386).
--define(wxClipboard_IsSupported, 3387).
--define(wxClipboard_Get, 3388).
--define(wxSpinEvent_GetPosition, 3389).
--define(wxSpinEvent_SetPosition, 3390).
--define(wxSplitterWindow_new_0, 3391).
--define(wxSplitterWindow_new_2, 3392).
--define(wxSplitterWindow_destruct, 3393).
--define(wxSplitterWindow_Create, 3394).
--define(wxSplitterWindow_GetMinimumPaneSize, 3395).
--define(wxSplitterWindow_GetSashGravity, 3396).
--define(wxSplitterWindow_GetSashPosition, 3397).
--define(wxSplitterWindow_GetSplitMode, 3398).
--define(wxSplitterWindow_GetWindow1, 3399).
--define(wxSplitterWindow_GetWindow2, 3400).
--define(wxSplitterWindow_Initialize, 3401).
--define(wxSplitterWindow_IsSplit, 3402).
--define(wxSplitterWindow_ReplaceWindow, 3403).
--define(wxSplitterWindow_SetSashGravity, 3404).
--define(wxSplitterWindow_SetSashPosition, 3405).
--define(wxSplitterWindow_SetMinimumPaneSize, 3406).
--define(wxSplitterWindow_SetSplitMode, 3407).
--define(wxSplitterWindow_SplitHorizontally, 3408).
--define(wxSplitterWindow_SplitVertically, 3409).
--define(wxSplitterWindow_Unsplit, 3410).
--define(wxSplitterWindow_UpdateSize, 3411).
--define(wxSplitterEvent_GetSashPosition, 3412).
--define(wxSplitterEvent_GetX, 3413).
--define(wxSplitterEvent_GetY, 3414).
--define(wxSplitterEvent_GetWindowBeingRemoved, 3415).
--define(wxSplitterEvent_SetSashPosition, 3416).
--define(wxHtmlWindow_new_0, 3417).
--define(wxHtmlWindow_new_2, 3418).
--define(wxHtmlWindow_AppendToPage, 3419).
--define(wxHtmlWindow_GetOpenedAnchor, 3420).
--define(wxHtmlWindow_GetOpenedPage, 3421).
--define(wxHtmlWindow_GetOpenedPageTitle, 3422).
--define(wxHtmlWindow_GetRelatedFrame, 3423).
--define(wxHtmlWindow_HistoryBack, 3424).
--define(wxHtmlWindow_HistoryCanBack, 3425).
--define(wxHtmlWindow_HistoryCanForward, 3426).
--define(wxHtmlWindow_HistoryClear, 3427).
--define(wxHtmlWindow_HistoryForward, 3428).
--define(wxHtmlWindow_LoadFile, 3429).
--define(wxHtmlWindow_LoadPage, 3430).
--define(wxHtmlWindow_SelectAll, 3431).
--define(wxHtmlWindow_SelectionToText, 3432).
--define(wxHtmlWindow_SelectLine, 3433).
--define(wxHtmlWindow_SelectWord, 3434).
--define(wxHtmlWindow_SetBorders, 3435).
--define(wxHtmlWindow_SetFonts, 3436).
--define(wxHtmlWindow_SetPage, 3437).
--define(wxHtmlWindow_SetRelatedFrame, 3438).
--define(wxHtmlWindow_SetRelatedStatusBar_1, 3439).
--define(wxHtmlWindow_SetRelatedStatusBar_2, 3440).
--define(wxHtmlWindow_ToText, 3441).
--define(wxHtmlWindow_destroy, 3442).
--define(wxHtmlLinkEvent_GetLinkInfo, 3443).
--define(wxSystemSettings_GetColour, 3444).
--define(wxSystemSettings_GetFont, 3445).
--define(wxSystemSettings_GetMetric, 3446).
--define(wxSystemSettings_GetScreenType, 3447).
--define(wxSystemOptions_GetOption, 3448).
--define(wxSystemOptions_GetOptionInt, 3449).
--define(wxSystemOptions_HasOption, 3450).
--define(wxSystemOptions_IsFalse, 3451).
--define(wxSystemOptions_SetOption_2_1, 3452).
--define(wxSystemOptions_SetOption_2_0, 3453).
--define(wxAuiNotebookEvent_SetSelection, 3454).
--define(wxAuiNotebookEvent_GetSelection, 3455).
--define(wxAuiNotebookEvent_SetOldSelection, 3456).
--define(wxAuiNotebookEvent_GetOldSelection, 3457).
--define(wxAuiNotebookEvent_SetDragSource, 3458).
--define(wxAuiNotebookEvent_GetDragSource, 3459).
--define(wxAuiManagerEvent_SetManager, 3460).
--define(wxAuiManagerEvent_GetManager, 3461).
--define(wxAuiManagerEvent_SetPane, 3462).
--define(wxAuiManagerEvent_GetPane, 3463).
--define(wxAuiManagerEvent_SetButton, 3464).
--define(wxAuiManagerEvent_GetButton, 3465).
--define(wxAuiManagerEvent_SetDC, 3466).
--define(wxAuiManagerEvent_GetDC, 3467).
--define(wxAuiManagerEvent_Veto, 3468).
--define(wxAuiManagerEvent_GetVeto, 3469).
--define(wxAuiManagerEvent_SetCanVeto, 3470).
--define(wxAuiManagerEvent_CanVeto, 3471).
--define(wxLogNull_new, 3472).
--define(wxLogNull_destruct, 3473).
--define(wxTaskBarIcon_new, 3474).
--define(wxTaskBarIcon_destruct, 3475).
--define(wxTaskBarIcon_PopupMenu, 3476).
--define(wxTaskBarIcon_RemoveIcon, 3477).
--define(wxTaskBarIcon_SetIcon, 3478).
--define(wxLocale_new_0, 3479).
--define(wxLocale_new_2_0, 3480).
--define(wxLocale_new_2_1, 3481).
--define(wxLocale_destruct, 3482).
--define(wxLocale_Init_1, 3483).
--define(wxLocale_Init_2, 3484).
--define(wxLocale_AddCatalog_1, 3485).
--define(wxLocale_AddCatalog_2, 3486).
--define(wxLocale_AddCatalog_3, 3487).
--define(wxLocale_AddCatalogLookupPathPrefix, 3488).
--define(wxLocale_GetCanonicalName, 3489).
--define(wxLocale_GetLanguage, 3490).
--define(wxLocale_GetLanguageName, 3491).
--define(wxLocale_GetLocale, 3492).
--define(wxLocale_GetName, 3493).
--define(wxLocale_GetString_2, 3494).
--define(wxLocale_GetString_4, 3495).
--define(wxLocale_GetHeaderValue, 3496).
--define(wxLocale_GetSysName, 3497).
--define(wxLocale_GetSystemEncoding, 3498).
--define(wxLocale_GetSystemEncodingName, 3499).
--define(wxLocale_GetSystemLanguage, 3500).
--define(wxLocale_IsLoaded, 3501).
--define(wxLocale_IsOk, 3502).
--define(wxActivateEvent_GetActive, 3503).
--define(wxPopupWindow_new_0, 3504).
--define(wxPopupWindow_new_2, 3505).
--define(wxPopupWindow_Create, 3506).
--define(wxPopupWindow_Position, 3507).
--define(wxPopupWindow_destroy, 3508).
--define(wxPopupTransientWindow_new_0, 3509).
--define(wxPopupTransientWindow_new_2, 3510).
--define(wxPopupTransientWindow_Popup, 3511).
--define(wxPopupTransientWindow_Dismiss, 3512).
--define(wxPopupTransientWindow_destroy, 3513).
--define(wxOverlay_new, 3514).
--define(wxOverlay_destruct, 3515).
--define(wxOverlay_Reset, 3516).
--define(wxDCOverlay_new_6, 3517).
--define(wxDCOverlay_new_2, 3518).
--define(wxDCOverlay_destruct, 3519).
--define(wxDCOverlay_Clear, 3520).
--define(wxDropFilesEvent_GetPosition, 3521).
--define(wxDropFilesEvent_GetNumberOfFiles, 3522).
--define(wxDropFilesEvent_GetFiles, 3523).
--define(wxDisplay_new_0, 3524).
--define(wxDisplay_new_1_0, 3525).
--define(wxDisplay_new_1_1, 3526).
--define(wxDisplay_destruct, 3527).
--define(wxDisplay_IsOk, 3528).
--define(wxDisplay_GetClientArea, 3529).
--define(wxDisplay_GetGeometry, 3530).
--define(wxDisplay_GetName, 3531).
--define(wxDisplay_IsPrimary, 3532).
--define(wxDisplay_GetCount, 3533).
--define(wxDisplay_GetFromPoint, 3534).
--define(wxDisplay_GetFromWindow, 3535).
--define(wxDisplay_GetPPI, 3536).
--define(wxGCDC_new_1, 3537).
--define(wxGCDC_new_0, 3540).
--define(wxGCDC_destruct, 3541).
--define(wxGCDC_GetGraphicsContext, 3542).
--define(wxGCDC_SetGraphicsContext, 3543).
--define(wxNotificationMessage_new_0, 3544).
--define(wxNotificationMessage_new_2, 3545).
--define(wxNotificationMessage_destruct, 3546).
--define(wxNotificationMessage_AddAction, 3547).
--define(wxNotificationMessage_Close, 3548).
--define(wxNotificationMessage_SetFlags, 3549).
--define(wxNotificationMessage_SetIcon, 3550).
--define(wxNotificationMessage_SetMessage, 3551).
--define(wxNotificationMessage_SetParent, 3552).
--define(wxNotificationMessage_SetTitle, 3553).
--define(wxNotificationMessage_Show, 3554).
--define(wxNotificationMessage_UseTaskBarIcon, 3555).
--define(wxNotificationMessage_MSWUseToasts, 3556).
--define(wxWebView_New, 3558).
--define(wxWebView_GetCurrentTitle, 3559).
--define(wxWebView_GetCurrentURL, 3560).
--define(wxWebView_GetPageSource, 3561).
--define(wxWebView_GetPageText, 3562).
--define(wxWebView_IsBusy, 3563).
--define(wxWebView_IsEditable, 3564).
--define(wxWebView_LoadURL, 3565).
--define(wxWebView_Print, 3566).
--define(wxWebView_Reload, 3567).
--define(wxWebView_RunScript, 3568).
--define(wxWebView_SetEditable, 3569).
--define(wxWebView_SetPage, 3570).
--define(wxWebView_Stop, 3571).
--define(wxWebView_CanCopy, 3572).
--define(wxWebView_CanCut, 3573).
--define(wxWebView_CanPaste, 3574).
--define(wxWebView_Copy, 3575).
--define(wxWebView_Cut, 3576).
--define(wxWebView_Paste, 3577).
--define(wxWebView_EnableContextMenu, 3578).
--define(wxWebView_IsContextMenuEnabled, 3579).
--define(wxWebView_CanGoBack, 3580).
--define(wxWebView_CanGoForward, 3581).
--define(wxWebView_ClearHistory, 3582).
--define(wxWebView_EnableHistory, 3583).
--define(wxWebView_GoBack, 3584).
--define(wxWebView_GoForward, 3585).
--define(wxWebView_ClearSelection, 3586).
--define(wxWebView_DeleteSelection, 3587).
--define(wxWebView_GetSelectedSource, 3588).
--define(wxWebView_GetSelectedText, 3589).
--define(wxWebView_HasSelection, 3590).
--define(wxWebView_SelectAll, 3591).
--define(wxWebView_CanRedo, 3592).
--define(wxWebView_CanUndo, 3593).
--define(wxWebView_Redo, 3594).
--define(wxWebView_Undo, 3595).
--define(wxWebView_Find, 3596).
--define(wxWebView_CanSetZoomType, 3597).
--define(wxWebView_GetZoom, 3598).
--define(wxWebView_GetZoomType, 3599).
--define(wxWebView_SetZoom, 3600).
--define(wxWebView_SetZoomType, 3601).
--define(wxWebView_GetZoomFactor, 3602).
--define(wxWebView_SetZoomFactor, 3603).
--define(wxWebView_IsBackendAvailable, 3604).
--define(wxWebViewEvent_GetString, 3605).
--define(wxWebViewEvent_GetInt, 3606).
--define(wxWebViewEvent_GetTarget, 3607).
--define(wxWebViewEvent_GetURL, 3608).
+-define(wxTextAttr_GetFontEncoding, 1790).
+-define(wxTextAttr_GetFontFaceName, 1791).
+-define(wxTextAttr_GetFontSize, 1792).
+-define(wxTextAttr_GetFontStyle, 1793).
+-define(wxTextAttr_GetFontUnderlined, 1794).
+-define(wxTextAttr_GetFontWeight, 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_SetFontEncoding, 1810).
+-define(wxTextAttr_SetFontFaceName, 1811).
+-define(wxTextAttr_SetFontFamily, 1812).
+-define(wxTextAttr_SetFontSize, 1813).
+-define(wxTextAttr_SetFontPointSize, 1814).
+-define(wxTextAttr_SetFontPixelSize, 1815).
+-define(wxTextAttr_SetFontStyle, 1816).
+-define(wxTextAttr_SetFontUnderlined, 1817).
+-define(wxTextAttr_SetFontWeight, 1818).
+-define(wxTextAttr_SetLeftIndent, 1819).
+-define(wxTextAttr_SetRightIndent, 1820).
+-define(wxTextAttr_SetTabs, 1821).
+-define(wxTextAttr_SetTextColour, 1822).
+-define(wxTextAttr_destroy, 1823).
+-define(wxTextCtrl_new_0, 1824).
+-define(wxTextCtrl_new_3, 1825).
+-define(wxTextCtrl_destruct, 1826).
+-define(wxTextCtrl_AppendText, 1827).
+-define(wxTextCtrl_CanCopy, 1828).
+-define(wxTextCtrl_CanCut, 1829).
+-define(wxTextCtrl_CanPaste, 1830).
+-define(wxTextCtrl_CanRedo, 1831).
+-define(wxTextCtrl_CanUndo, 1832).
+-define(wxTextCtrl_Clear, 1833).
+-define(wxTextCtrl_Copy, 1834).
+-define(wxTextCtrl_Create, 1835).
+-define(wxTextCtrl_Cut, 1836).
+-define(wxTextCtrl_DiscardEdits, 1837).
+-define(wxTextCtrl_ChangeValue, 1838).
+-define(wxTextCtrl_EmulateKeyPress, 1839).
+-define(wxTextCtrl_GetDefaultStyle, 1840).
+-define(wxTextCtrl_GetInsertionPoint, 1841).
+-define(wxTextCtrl_GetLastPosition, 1842).
+-define(wxTextCtrl_GetLineLength, 1843).
+-define(wxTextCtrl_GetLineText, 1844).
+-define(wxTextCtrl_GetNumberOfLines, 1845).
+-define(wxTextCtrl_GetRange, 1846).
+-define(wxTextCtrl_GetSelection, 1847).
+-define(wxTextCtrl_GetStringSelection, 1848).
+-define(wxTextCtrl_GetStyle, 1849).
+-define(wxTextCtrl_GetValue, 1850).
+-define(wxTextCtrl_IsEditable, 1851).
+-define(wxTextCtrl_IsModified, 1852).
+-define(wxTextCtrl_IsMultiLine, 1853).
+-define(wxTextCtrl_IsSingleLine, 1854).
+-define(wxTextCtrl_LoadFile, 1855).
+-define(wxTextCtrl_MarkDirty, 1856).
+-define(wxTextCtrl_Paste, 1857).
+-define(wxTextCtrl_PositionToXY, 1858).
+-define(wxTextCtrl_Redo, 1859).
+-define(wxTextCtrl_Remove, 1860).
+-define(wxTextCtrl_Replace, 1861).
+-define(wxTextCtrl_SaveFile, 1862).
+-define(wxTextCtrl_SetDefaultStyle, 1863).
+-define(wxTextCtrl_SetEditable, 1864).
+-define(wxTextCtrl_SetInsertionPoint, 1865).
+-define(wxTextCtrl_SetInsertionPointEnd, 1866).
+-define(wxTextCtrl_SetMaxLength, 1867).
+-define(wxTextCtrl_SetSelection, 1868).
+-define(wxTextCtrl_SetStyle, 1869).
+-define(wxTextCtrl_SetValue, 1870).
+-define(wxTextCtrl_ShowPosition, 1871).
+-define(wxTextCtrl_Undo, 1872).
+-define(wxTextCtrl_WriteText, 1873).
+-define(wxTextCtrl_XYToPosition, 1874).
+-define(wxBookCtrlBase_AddPage, 1875).
+-define(wxBookCtrlBase_InsertPage, 1876).
+-define(wxBookCtrlBase_DeletePage, 1877).
+-define(wxBookCtrlBase_RemovePage, 1878).
+-define(wxBookCtrlBase_DeleteAllPages, 1879).
+-define(wxBookCtrlBase_GetPage, 1880).
+-define(wxBookCtrlBase_GetPageCount, 1881).
+-define(wxBookCtrlBase_GetCurrentPage, 1882).
+-define(wxBookCtrlBase_AdvanceSelection, 1883).
+-define(wxBookCtrlBase_SetSelection, 1884).
+-define(wxBookCtrlBase_GetSelection, 1885).
+-define(wxBookCtrlBase_ChangeSelection, 1886).
+-define(wxBookCtrlBase_HitTest, 1887).
+-define(wxBookCtrlBase_GetPageText, 1888).
+-define(wxBookCtrlBase_SetPageText, 1889).
+-define(wxNotebook_new_0, 1890).
+-define(wxNotebook_new_3, 1891).
+-define(wxNotebook_destruct, 1892).
+-define(wxNotebook_AssignImageList, 1893).
+-define(wxNotebook_Create, 1894).
+-define(wxNotebook_GetImageList, 1895).
+-define(wxNotebook_GetPageImage, 1896).
+-define(wxNotebook_GetRowCount, 1897).
+-define(wxNotebook_GetThemeBackgroundColour, 1898).
+-define(wxNotebook_SetImageList, 1899).
+-define(wxNotebook_SetPadding, 1900).
+-define(wxNotebook_SetPageSize, 1901).
+-define(wxNotebook_SetPageImage, 1902).
+-define(wxChoicebook_new_0, 1903).
+-define(wxChoicebook_new_3, 1904).
+-define(wxChoicebook_AddPage, 1905).
+-define(wxChoicebook_AdvanceSelection, 1906).
+-define(wxChoicebook_AssignImageList, 1907).
+-define(wxChoicebook_Create, 1908).
+-define(wxChoicebook_DeleteAllPages, 1909).
+-define(wxChoicebook_GetCurrentPage, 1910).
+-define(wxChoicebook_GetImageList, 1911).
+-define(wxChoicebook_GetPage, 1912).
+-define(wxChoicebook_GetPageCount, 1913).
+-define(wxChoicebook_GetPageImage, 1914).
+-define(wxChoicebook_GetPageText, 1915).
+-define(wxChoicebook_GetSelection, 1916).
+-define(wxChoicebook_HitTest, 1917).
+-define(wxChoicebook_InsertPage, 1918).
+-define(wxChoicebook_SetImageList, 1919).
+-define(wxChoicebook_SetPageSize, 1920).
+-define(wxChoicebook_SetPageImage, 1921).
+-define(wxChoicebook_SetPageText, 1922).
+-define(wxChoicebook_SetSelection, 1923).
+-define(wxChoicebook_ChangeSelection, 1924).
+-define(wxChoicebook_destroy, 1925).
+-define(wxToolbook_new_0, 1926).
+-define(wxToolbook_new_3, 1927).
+-define(wxToolbook_AddPage, 1928).
+-define(wxToolbook_AdvanceSelection, 1929).
+-define(wxToolbook_AssignImageList, 1930).
+-define(wxToolbook_Create, 1931).
+-define(wxToolbook_DeleteAllPages, 1932).
+-define(wxToolbook_GetCurrentPage, 1933).
+-define(wxToolbook_GetImageList, 1934).
+-define(wxToolbook_GetPage, 1935).
+-define(wxToolbook_GetPageCount, 1936).
+-define(wxToolbook_GetPageImage, 1937).
+-define(wxToolbook_GetPageText, 1938).
+-define(wxToolbook_GetSelection, 1939).
+-define(wxToolbook_HitTest, 1940).
+-define(wxToolbook_InsertPage, 1941).
+-define(wxToolbook_SetImageList, 1942).
+-define(wxToolbook_SetPageSize, 1943).
+-define(wxToolbook_SetPageImage, 1944).
+-define(wxToolbook_SetPageText, 1945).
+-define(wxToolbook_SetSelection, 1946).
+-define(wxToolbook_ChangeSelection, 1947).
+-define(wxToolbook_destroy, 1948).
+-define(wxListbook_new_0, 1949).
+-define(wxListbook_new_3, 1950).
+-define(wxListbook_AddPage, 1951).
+-define(wxListbook_AdvanceSelection, 1952).
+-define(wxListbook_AssignImageList, 1953).
+-define(wxListbook_Create, 1954).
+-define(wxListbook_DeleteAllPages, 1955).
+-define(wxListbook_GetCurrentPage, 1956).
+-define(wxListbook_GetImageList, 1957).
+-define(wxListbook_GetPage, 1958).
+-define(wxListbook_GetPageCount, 1959).
+-define(wxListbook_GetPageImage, 1960).
+-define(wxListbook_GetPageText, 1961).
+-define(wxListbook_GetSelection, 1962).
+-define(wxListbook_HitTest, 1963).
+-define(wxListbook_InsertPage, 1964).
+-define(wxListbook_SetImageList, 1965).
+-define(wxListbook_SetPageSize, 1966).
+-define(wxListbook_SetPageImage, 1967).
+-define(wxListbook_SetPageText, 1968).
+-define(wxListbook_SetSelection, 1969).
+-define(wxListbook_ChangeSelection, 1970).
+-define(wxListbook_destroy, 1971).
+-define(wxTreebook_new_0, 1972).
+-define(wxTreebook_new_3, 1973).
+-define(wxTreebook_destruct, 1974).
+-define(wxTreebook_AddPage, 1975).
+-define(wxTreebook_AdvanceSelection, 1976).
+-define(wxTreebook_AssignImageList, 1977).
+-define(wxTreebook_Create, 1978).
+-define(wxTreebook_DeleteAllPages, 1979).
+-define(wxTreebook_GetCurrentPage, 1980).
+-define(wxTreebook_GetImageList, 1981).
+-define(wxTreebook_GetPage, 1982).
+-define(wxTreebook_GetPageCount, 1983).
+-define(wxTreebook_GetPageImage, 1984).
+-define(wxTreebook_GetPageText, 1985).
+-define(wxTreebook_GetSelection, 1986).
+-define(wxTreebook_ExpandNode, 1987).
+-define(wxTreebook_IsNodeExpanded, 1988).
+-define(wxTreebook_HitTest, 1989).
+-define(wxTreebook_InsertPage, 1990).
+-define(wxTreebook_InsertSubPage, 1991).
+-define(wxTreebook_SetImageList, 1992).
+-define(wxTreebook_SetPageSize, 1993).
+-define(wxTreebook_SetPageImage, 1994).
+-define(wxTreebook_SetPageText, 1995).
+-define(wxTreebook_SetSelection, 1996).
+-define(wxTreebook_ChangeSelection, 1997).
+-define(wxTreeCtrl_new_0, 1998).
+-define(wxTreeCtrl_new_2, 1999).
+-define(wxTreeCtrl_destruct, 2000).
+-define(wxTreeCtrl_AddRoot, 2001).
+-define(wxTreeCtrl_AppendItem, 2002).
+-define(wxTreeCtrl_AssignImageList, 2003).
+-define(wxTreeCtrl_AssignStateImageList, 2004).
+-define(wxTreeCtrl_Collapse, 2005).
+-define(wxTreeCtrl_CollapseAndReset, 2006).
+-define(wxTreeCtrl_Create, 2007).
+-define(wxTreeCtrl_Delete, 2008).
+-define(wxTreeCtrl_DeleteAllItems, 2009).
+-define(wxTreeCtrl_DeleteChildren, 2010).
+-define(wxTreeCtrl_EditLabel, 2011).
+-define(wxTreeCtrl_EnsureVisible, 2012).
+-define(wxTreeCtrl_Expand, 2013).
+-define(wxTreeCtrl_GetBoundingRect, 2014).
+-define(wxTreeCtrl_GetChildrenCount, 2015).
+-define(wxTreeCtrl_GetCount, 2016).
+-define(wxTreeCtrl_GetEditControl, 2017).
+-define(wxTreeCtrl_GetFirstChild, 2018).
+-define(wxTreeCtrl_GetNextChild, 2019).
+-define(wxTreeCtrl_GetFirstVisibleItem, 2020).
+-define(wxTreeCtrl_GetImageList, 2021).
+-define(wxTreeCtrl_GetIndent, 2022).
+-define(wxTreeCtrl_GetItemBackgroundColour, 2023).
+-define(wxTreeCtrl_GetItemData, 2024).
+-define(wxTreeCtrl_GetItemFont, 2025).
+-define(wxTreeCtrl_GetItemImage, 2026).
+-define(wxTreeCtrl_GetItemText, 2027).
+-define(wxTreeCtrl_GetItemTextColour, 2028).
+-define(wxTreeCtrl_GetLastChild, 2029).
+-define(wxTreeCtrl_GetNextSibling, 2030).
+-define(wxTreeCtrl_GetNextVisible, 2031).
+-define(wxTreeCtrl_GetItemParent, 2032).
+-define(wxTreeCtrl_GetPrevSibling, 2033).
+-define(wxTreeCtrl_GetPrevVisible, 2034).
+-define(wxTreeCtrl_GetRootItem, 2035).
+-define(wxTreeCtrl_GetSelection, 2036).
+-define(wxTreeCtrl_GetSelections, 2037).
+-define(wxTreeCtrl_GetStateImageList, 2038).
+-define(wxTreeCtrl_HitTest, 2039).
+-define(wxTreeCtrl_InsertItem, 2040).
+-define(wxTreeCtrl_IsBold, 2042).
+-define(wxTreeCtrl_IsExpanded, 2043).
+-define(wxTreeCtrl_IsSelected, 2044).
+-define(wxTreeCtrl_IsVisible, 2045).
+-define(wxTreeCtrl_ItemHasChildren, 2046).
+-define(wxTreeCtrl_IsTreeItemIdOk, 2047).
+-define(wxTreeCtrl_PrependItem, 2048).
+-define(wxTreeCtrl_ScrollTo, 2049).
+-define(wxTreeCtrl_SelectItem, 2050).
+-define(wxTreeCtrl_SetIndent, 2051).
+-define(wxTreeCtrl_SetImageList, 2052).
+-define(wxTreeCtrl_SetItemBackgroundColour, 2053).
+-define(wxTreeCtrl_SetItemBold, 2054).
+-define(wxTreeCtrl_SetItemData, 2055).
+-define(wxTreeCtrl_SetItemDropHighlight, 2056).
+-define(wxTreeCtrl_SetItemFont, 2057).
+-define(wxTreeCtrl_SetItemHasChildren, 2058).
+-define(wxTreeCtrl_SetItemImage, 2059).
+-define(wxTreeCtrl_SetItemText, 2060).
+-define(wxTreeCtrl_SetItemTextColour, 2061).
+-define(wxTreeCtrl_SetStateImageList, 2062).
+-define(wxTreeCtrl_SetWindowStyle, 2063).
+-define(wxTreeCtrl_SortChildren, 2064).
+-define(wxTreeCtrl_Toggle, 2065).
+-define(wxTreeCtrl_ToggleItemSelection, 2066).
+-define(wxTreeCtrl_Unselect, 2067).
+-define(wxTreeCtrl_UnselectAll, 2068).
+-define(wxTreeCtrl_UnselectItem, 2069).
+-define(wxScrollBar_new_0, 2070).
+-define(wxScrollBar_new_3, 2071).
+-define(wxScrollBar_destruct, 2072).
+-define(wxScrollBar_Create, 2073).
+-define(wxScrollBar_GetRange, 2074).
+-define(wxScrollBar_GetPageSize, 2075).
+-define(wxScrollBar_GetThumbPosition, 2076).
+-define(wxScrollBar_GetThumbSize, 2077).
+-define(wxScrollBar_SetThumbPosition, 2078).
+-define(wxScrollBar_SetScrollbar, 2079).
+-define(wxSpinButton_new_0, 2080).
+-define(wxSpinButton_new_2, 2081).
+-define(wxSpinButton_destruct, 2082).
+-define(wxSpinButton_Create, 2083).
+-define(wxSpinButton_GetMax, 2084).
+-define(wxSpinButton_GetMin, 2085).
+-define(wxSpinButton_GetValue, 2086).
+-define(wxSpinButton_SetRange, 2087).
+-define(wxSpinButton_SetValue, 2088).
+-define(wxSpinCtrl_new_0, 2089).
+-define(wxSpinCtrl_new_2, 2090).
+-define(wxSpinCtrl_Create, 2091).
+-define(wxSpinCtrl_SetValue_1_1, 2092).
+-define(wxSpinCtrl_SetValue_1_0, 2093).
+-define(wxSpinCtrl_GetValue, 2094).
+-define(wxSpinCtrl_SetRange, 2095).
+-define(wxSpinCtrl_SetSelection, 2096).
+-define(wxSpinCtrl_GetMin, 2097).
+-define(wxSpinCtrl_GetMax, 2098).
+-define(wxSpinCtrl_destroy, 2099).
+-define(wxStaticText_new_0, 2100).
+-define(wxStaticText_new_4, 2101).
+-define(wxStaticText_Create, 2102).
+-define(wxStaticText_GetLabel, 2103).
+-define(wxStaticText_SetLabel, 2104).
+-define(wxStaticText_Wrap, 2105).
+-define(wxStaticText_destroy, 2106).
+-define(wxStaticBitmap_new_0, 2107).
+-define(wxStaticBitmap_new_4, 2108).
+-define(wxStaticBitmap_Create, 2109).
+-define(wxStaticBitmap_GetBitmap, 2110).
+-define(wxStaticBitmap_SetBitmap, 2111).
+-define(wxStaticBitmap_destroy, 2112).
+-define(wxRadioBox_new, 2113).
+-define(wxRadioBox_destruct, 2114).
+-define(wxRadioBox_Create, 2115).
+-define(wxRadioBox_Enable_1, 2116).
+-define(wxRadioBox_Enable_2, 2117).
+-define(wxRadioBox_GetSelection, 2118).
+-define(wxRadioBox_GetString, 2119).
+-define(wxRadioBox_SetSelection, 2120).
+-define(wxRadioBox_Show, 2121).
+-define(wxRadioBox_GetColumnCount, 2122).
+-define(wxRadioBox_GetItemHelpText, 2123).
+-define(wxRadioBox_GetItemToolTip, 2124).
+-define(wxRadioBox_GetItemFromPoint, 2125).
+-define(wxRadioBox_GetRowCount, 2126).
+-define(wxRadioBox_IsItemEnabled, 2127).
+-define(wxRadioBox_IsItemShown, 2128).
+-define(wxRadioBox_SetItemHelpText, 2129).
+-define(wxRadioBox_SetItemToolTip, 2130).
+-define(wxRadioButton_new_0, 2131).
+-define(wxRadioButton_new_4, 2132).
+-define(wxRadioButton_destruct, 2133).
+-define(wxRadioButton_Create, 2134).
+-define(wxRadioButton_GetValue, 2135).
+-define(wxRadioButton_SetValue, 2136).
+-define(wxSlider_new_0, 2137).
+-define(wxSlider_new_6, 2138).
+-define(wxSlider_destruct, 2139).
+-define(wxSlider_Create, 2140).
+-define(wxSlider_GetLineSize, 2141).
+-define(wxSlider_GetMax, 2142).
+-define(wxSlider_GetMin, 2143).
+-define(wxSlider_GetPageSize, 2144).
+-define(wxSlider_GetThumbLength, 2145).
+-define(wxSlider_GetValue, 2146).
+-define(wxSlider_SetLineSize, 2147).
+-define(wxSlider_SetPageSize, 2148).
+-define(wxSlider_SetRange, 2149).
+-define(wxSlider_SetThumbLength, 2150).
+-define(wxSlider_SetValue, 2151).
+-define(wxDialog_new_0, 2152).
+-define(wxDialog_new_4, 2153).
+-define(wxDialog_destruct, 2154).
+-define(wxDialog_Create, 2155).
+-define(wxDialog_CreateButtonSizer, 2156).
+-define(wxDialog_CreateStdDialogButtonSizer, 2157).
+-define(wxDialog_EndModal, 2158).
+-define(wxDialog_GetAffirmativeId, 2159).
+-define(wxDialog_GetReturnCode, 2160).
+-define(wxDialog_IsModal, 2161).
+-define(wxDialog_SetAffirmativeId, 2162).
+-define(wxDialog_SetReturnCode, 2163).
+-define(wxDialog_Show, 2164).
+-define(wxDialog_ShowModal, 2165).
+-define(wxColourDialog_new_0, 2166).
+-define(wxColourDialog_new_2, 2167).
+-define(wxColourDialog_destruct, 2168).
+-define(wxColourDialog_Create, 2169).
+-define(wxColourDialog_GetColourData, 2170).
+-define(wxColourData_new, 2171).
+-define(wxColourData_destruct, 2172).
+-define(wxColourData_GetChooseFull, 2173).
+-define(wxColourData_GetColour, 2174).
+-define(wxColourData_GetCustomColour, 2175).
+-define(wxColourData_SetChooseFull, 2176).
+-define(wxColourData_SetColour, 2177).
+-define(wxColourData_SetCustomColour, 2178).
+-define(wxPalette_new_0, 2179).
+-define(wxPalette_new_1, 2180).
+-define(wxPalette_new_4, 2181).
+-define(wxPalette_destruct, 2182).
+-define(wxPalette_Create, 2183).
+-define(wxPalette_GetColoursCount, 2184).
+-define(wxPalette_GetPixel, 2185).
+-define(wxPalette_GetRGB, 2186).
+-define(wxPalette_IsOk, 2187).
+-define(wxDirDialog_new, 2188).
+-define(wxDirDialog_destruct, 2189).
+-define(wxDirDialog_GetPath, 2190).
+-define(wxDirDialog_GetMessage, 2191).
+-define(wxDirDialog_SetMessage, 2192).
+-define(wxDirDialog_SetPath, 2193).
+-define(wxFileDialog_new, 2194).
+-define(wxFileDialog_destruct, 2195).
+-define(wxFileDialog_GetDirectory, 2196).
+-define(wxFileDialog_GetFilename, 2197).
+-define(wxFileDialog_GetFilenames, 2198).
+-define(wxFileDialog_GetFilterIndex, 2199).
+-define(wxFileDialog_GetMessage, 2200).
+-define(wxFileDialog_GetPath, 2201).
+-define(wxFileDialog_GetPaths, 2202).
+-define(wxFileDialog_GetWildcard, 2203).
+-define(wxFileDialog_SetDirectory, 2204).
+-define(wxFileDialog_SetFilename, 2205).
+-define(wxFileDialog_SetFilterIndex, 2206).
+-define(wxFileDialog_SetMessage, 2207).
+-define(wxFileDialog_SetPath, 2208).
+-define(wxFileDialog_SetWildcard, 2209).
+-define(wxPickerBase_SetInternalMargin, 2210).
+-define(wxPickerBase_GetInternalMargin, 2211).
+-define(wxPickerBase_SetTextCtrlProportion, 2212).
+-define(wxPickerBase_SetPickerCtrlProportion, 2213).
+-define(wxPickerBase_GetTextCtrlProportion, 2214).
+-define(wxPickerBase_GetPickerCtrlProportion, 2215).
+-define(wxPickerBase_HasTextCtrl, 2216).
+-define(wxPickerBase_GetTextCtrl, 2217).
+-define(wxPickerBase_IsTextCtrlGrowable, 2218).
+-define(wxPickerBase_SetPickerCtrlGrowable, 2219).
+-define(wxPickerBase_SetTextCtrlGrowable, 2220).
+-define(wxPickerBase_IsPickerCtrlGrowable, 2221).
+-define(wxFilePickerCtrl_new_0, 2222).
+-define(wxFilePickerCtrl_new_3, 2223).
+-define(wxFilePickerCtrl_Create, 2224).
+-define(wxFilePickerCtrl_GetPath, 2225).
+-define(wxFilePickerCtrl_SetPath, 2226).
+-define(wxFilePickerCtrl_destroy, 2227).
+-define(wxDirPickerCtrl_new_0, 2228).
+-define(wxDirPickerCtrl_new_3, 2229).
+-define(wxDirPickerCtrl_Create, 2230).
+-define(wxDirPickerCtrl_GetPath, 2231).
+-define(wxDirPickerCtrl_SetPath, 2232).
+-define(wxDirPickerCtrl_destroy, 2233).
+-define(wxColourPickerCtrl_new_0, 2234).
+-define(wxColourPickerCtrl_new_3, 2235).
+-define(wxColourPickerCtrl_Create, 2236).
+-define(wxColourPickerCtrl_GetColour, 2237).
+-define(wxColourPickerCtrl_SetColour_1_1, 2238).
+-define(wxColourPickerCtrl_SetColour_1_0, 2239).
+-define(wxColourPickerCtrl_destroy, 2240).
+-define(wxDatePickerCtrl_new_0, 2241).
+-define(wxDatePickerCtrl_new_3, 2242).
+-define(wxDatePickerCtrl_GetRange, 2243).
+-define(wxDatePickerCtrl_GetValue, 2244).
+-define(wxDatePickerCtrl_SetRange, 2245).
+-define(wxDatePickerCtrl_SetValue, 2246).
+-define(wxDatePickerCtrl_destroy, 2247).
+-define(wxFontPickerCtrl_new_0, 2248).
+-define(wxFontPickerCtrl_new_3, 2249).
+-define(wxFontPickerCtrl_Create, 2250).
+-define(wxFontPickerCtrl_GetSelectedFont, 2251).
+-define(wxFontPickerCtrl_SetSelectedFont, 2252).
+-define(wxFontPickerCtrl_GetMaxPointSize, 2253).
+-define(wxFontPickerCtrl_SetMaxPointSize, 2254).
+-define(wxFontPickerCtrl_destroy, 2255).
+-define(wxFindReplaceDialog_new_0, 2256).
+-define(wxFindReplaceDialog_new_4, 2257).
+-define(wxFindReplaceDialog_destruct, 2258).
+-define(wxFindReplaceDialog_Create, 2259).
+-define(wxFindReplaceDialog_GetData, 2260).
+-define(wxFindReplaceData_new, 2261).
+-define(wxFindReplaceData_GetFindString, 2262).
+-define(wxFindReplaceData_GetReplaceString, 2263).
+-define(wxFindReplaceData_GetFlags, 2264).
+-define(wxFindReplaceData_SetFlags, 2265).
+-define(wxFindReplaceData_SetFindString, 2266).
+-define(wxFindReplaceData_SetReplaceString, 2267).
+-define(wxFindReplaceData_destroy, 2268).
+-define(wxMultiChoiceDialog_new, 2270).
+-define(wxMultiChoiceDialog_GetSelections, 2271).
+-define(wxMultiChoiceDialog_SetSelections, 2272).
+-define(wxMultiChoiceDialog_destroy, 2273).
+-define(wxSingleChoiceDialog_new, 2275).
+-define(wxSingleChoiceDialog_GetSelection, 2276).
+-define(wxSingleChoiceDialog_GetStringSelection, 2277).
+-define(wxSingleChoiceDialog_SetSelection, 2278).
+-define(wxSingleChoiceDialog_destroy, 2279).
+-define(wxTextEntryDialog_new_0, 2280).
+-define(wxTextEntryDialog_new_3, 2281).
+-define(wxTextEntryDialog_destruct, 2282).
+-define(wxTextEntryDialog_GetValue, 2283).
+-define(wxTextEntryDialog_SetValue, 2284).
+-define(wxPasswordEntryDialog_new, 2285).
+-define(wxPasswordEntryDialog_destroy, 2286).
+-define(wxFontData_new_0, 2287).
+-define(wxFontData_new_1, 2288).
+-define(wxFontData_EnableEffects, 2289).
+-define(wxFontData_GetAllowSymbols, 2290).
+-define(wxFontData_GetColour, 2291).
+-define(wxFontData_GetChosenFont, 2292).
+-define(wxFontData_GetEnableEffects, 2293).
+-define(wxFontData_GetInitialFont, 2294).
+-define(wxFontData_GetShowHelp, 2295).
+-define(wxFontData_SetAllowSymbols, 2296).
+-define(wxFontData_SetChosenFont, 2297).
+-define(wxFontData_SetColour, 2298).
+-define(wxFontData_SetInitialFont, 2299).
+-define(wxFontData_SetRange, 2300).
+-define(wxFontData_SetShowHelp, 2301).
+-define(wxFontData_destroy, 2302).
+-define(wxFontDialog_new_0, 2303).
+-define(wxFontDialog_new_2, 2305).
+-define(wxFontDialog_Create, 2307).
+-define(wxFontDialog_GetFontData, 2308).
+-define(wxFontDialog_destroy, 2310).
+-define(wxProgressDialog_new, 2311).
+-define(wxProgressDialog_Resume, 2312).
+-define(wxProgressDialog_Update, 2313).
+-define(wxProgressDialog_destroy, 2314).
+-define(wxMessageDialog_new, 2315).
+-define(wxMessageDialog_destroy, 2316).
+-define(wxPageSetupDialog_new, 2317).
+-define(wxPageSetupDialog_destruct, 2318).
+-define(wxPageSetupDialog_GetPageSetupData, 2319).
+-define(wxPageSetupDialog_ShowModal, 2320).
+-define(wxPageSetupDialogData_new_0, 2321).
+-define(wxPageSetupDialogData_new_1, 2323).
+-define(wxPageSetupDialogData_destruct, 2324).
+-define(wxPageSetupDialogData_EnableHelp, 2325).
+-define(wxPageSetupDialogData_EnableMargins, 2326).
+-define(wxPageSetupDialogData_EnableOrientation, 2327).
+-define(wxPageSetupDialogData_EnablePaper, 2328).
+-define(wxPageSetupDialogData_EnablePrinter, 2329).
+-define(wxPageSetupDialogData_GetDefaultMinMargins, 2330).
+-define(wxPageSetupDialogData_GetEnableMargins, 2331).
+-define(wxPageSetupDialogData_GetEnableOrientation, 2332).
+-define(wxPageSetupDialogData_GetEnablePaper, 2333).
+-define(wxPageSetupDialogData_GetEnablePrinter, 2334).
+-define(wxPageSetupDialogData_GetEnableHelp, 2335).
+-define(wxPageSetupDialogData_GetDefaultInfo, 2336).
+-define(wxPageSetupDialogData_GetMarginTopLeft, 2337).
+-define(wxPageSetupDialogData_GetMarginBottomRight, 2338).
+-define(wxPageSetupDialogData_GetMinMarginTopLeft, 2339).
+-define(wxPageSetupDialogData_GetMinMarginBottomRight, 2340).
+-define(wxPageSetupDialogData_GetPaperId, 2341).
+-define(wxPageSetupDialogData_GetPaperSize, 2342).
+-define(wxPageSetupDialogData_GetPrintData, 2344).
+-define(wxPageSetupDialogData_IsOk, 2345).
+-define(wxPageSetupDialogData_SetDefaultInfo, 2346).
+-define(wxPageSetupDialogData_SetDefaultMinMargins, 2347).
+-define(wxPageSetupDialogData_SetMarginTopLeft, 2348).
+-define(wxPageSetupDialogData_SetMarginBottomRight, 2349).
+-define(wxPageSetupDialogData_SetMinMarginTopLeft, 2350).
+-define(wxPageSetupDialogData_SetMinMarginBottomRight, 2351).
+-define(wxPageSetupDialogData_SetPaperId, 2352).
+-define(wxPageSetupDialogData_SetPaperSize, 2353).
+-define(wxPageSetupDialogData_SetPrintData, 2354).
+-define(wxPrintDialog_new_2_0, 2355).
+-define(wxPrintDialog_new_2_1, 2356).
+-define(wxPrintDialog_destruct, 2357).
+-define(wxPrintDialog_GetPrintDialogData, 2358).
+-define(wxPrintDialog_GetPrintDC, 2359).
+-define(wxPrintDialogData_new_0, 2360).
+-define(wxPrintDialogData_new_1, 2361).
+-define(wxPrintDialogData_destruct, 2363).
+-define(wxPrintDialogData_EnableHelp, 2364).
+-define(wxPrintDialogData_EnablePageNumbers, 2365).
+-define(wxPrintDialogData_EnablePrintToFile, 2366).
+-define(wxPrintDialogData_EnableSelection, 2367).
+-define(wxPrintDialogData_GetAllPages, 2368).
+-define(wxPrintDialogData_GetCollate, 2369).
+-define(wxPrintDialogData_GetFromPage, 2370).
+-define(wxPrintDialogData_GetMaxPage, 2371).
+-define(wxPrintDialogData_GetMinPage, 2372).
+-define(wxPrintDialogData_GetNoCopies, 2373).
+-define(wxPrintDialogData_GetPrintData, 2374).
+-define(wxPrintDialogData_GetPrintToFile, 2375).
+-define(wxPrintDialogData_GetSelection, 2376).
+-define(wxPrintDialogData_GetToPage, 2377).
+-define(wxPrintDialogData_IsOk, 2378).
+-define(wxPrintDialogData_SetCollate, 2379).
+-define(wxPrintDialogData_SetFromPage, 2380).
+-define(wxPrintDialogData_SetMaxPage, 2381).
+-define(wxPrintDialogData_SetMinPage, 2382).
+-define(wxPrintDialogData_SetNoCopies, 2383).
+-define(wxPrintDialogData_SetPrintData, 2384).
+-define(wxPrintDialogData_SetPrintToFile, 2385).
+-define(wxPrintDialogData_SetSelection, 2386).
+-define(wxPrintDialogData_SetToPage, 2387).
+-define(wxPrintData_new_0, 2388).
+-define(wxPrintData_new_1, 2389).
+-define(wxPrintData_destruct, 2390).
+-define(wxPrintData_GetCollate, 2391).
+-define(wxPrintData_GetBin, 2392).
+-define(wxPrintData_GetColour, 2393).
+-define(wxPrintData_GetDuplex, 2394).
+-define(wxPrintData_GetNoCopies, 2395).
+-define(wxPrintData_GetOrientation, 2396).
+-define(wxPrintData_GetPaperId, 2397).
+-define(wxPrintData_GetPrinterName, 2398).
+-define(wxPrintData_GetQuality, 2399).
+-define(wxPrintData_IsOk, 2400).
+-define(wxPrintData_SetBin, 2401).
+-define(wxPrintData_SetCollate, 2402).
+-define(wxPrintData_SetColour, 2403).
+-define(wxPrintData_SetDuplex, 2404).
+-define(wxPrintData_SetNoCopies, 2405).
+-define(wxPrintData_SetOrientation, 2406).
+-define(wxPrintData_SetPaperId, 2407).
+-define(wxPrintData_SetPrinterName, 2408).
+-define(wxPrintData_SetQuality, 2409).
+-define(wxPrintPreview_new_2, 2410).
+-define(wxPrintPreview_new_3, 2411).
+-define(wxPrintPreview_destruct, 2412).
+-define(wxPrintPreview_GetCanvas, 2413).
+-define(wxPrintPreview_GetCurrentPage, 2414).
+-define(wxPrintPreview_GetFrame, 2415).
+-define(wxPrintPreview_GetMaxPage, 2416).
+-define(wxPrintPreview_GetMinPage, 2417).
+-define(wxPrintPreview_GetPrintout, 2418).
+-define(wxPrintPreview_GetPrintoutForPrinting, 2419).
+-define(wxPrintPreview_IsOk, 2420).
+-define(wxPrintPreview_PaintPage, 2421).
+-define(wxPrintPreview_Print, 2422).
+-define(wxPrintPreview_RenderPage, 2423).
+-define(wxPrintPreview_SetCanvas, 2424).
+-define(wxPrintPreview_SetCurrentPage, 2425).
+-define(wxPrintPreview_SetFrame, 2426).
+-define(wxPrintPreview_SetPrintout, 2427).
+-define(wxPrintPreview_SetZoom, 2428).
+-define(wxPreviewFrame_new, 2429).
+-define(wxPreviewFrame_destruct, 2430).
+-define(wxPreviewFrame_CreateControlBar, 2431).
+-define(wxPreviewFrame_CreateCanvas, 2432).
+-define(wxPreviewFrame_Initialize, 2433).
+-define(wxPreviewFrame_OnCloseWindow, 2434).
+-define(wxPreviewControlBar_new, 2435).
+-define(wxPreviewControlBar_destruct, 2436).
+-define(wxPreviewControlBar_CreateButtons, 2437).
+-define(wxPreviewControlBar_GetPrintPreview, 2438).
+-define(wxPreviewControlBar_GetZoomControl, 2439).
+-define(wxPreviewControlBar_SetZoomControl, 2440).
+-define(wxPrinter_new, 2441).
+-define(wxPrinter_CreateAbortWindow, 2442).
+-define(wxPrinter_GetAbort, 2443).
+-define(wxPrinter_GetLastError, 2444).
+-define(wxPrinter_GetPrintDialogData, 2445).
+-define(wxPrinter_Print, 2446).
+-define(wxPrinter_PrintDialog, 2447).
+-define(wxPrinter_ReportError, 2448).
+-define(wxPrinter_Setup, 2449).
+-define(wxPrinter_destroy, 2450).
+-define(wxXmlResource_new_2, 2451).
+-define(wxXmlResource_new_1, 2452).
+-define(wxXmlResource_destruct, 2453).
+-define(wxXmlResource_AttachUnknownControl, 2454).
+-define(wxXmlResource_ClearHandlers, 2455).
+-define(wxXmlResource_CompareVersion, 2456).
+-define(wxXmlResource_Get, 2457).
+-define(wxXmlResource_GetFlags, 2458).
+-define(wxXmlResource_GetVersion, 2459).
+-define(wxXmlResource_GetXRCID, 2460).
+-define(wxXmlResource_InitAllHandlers, 2461).
+-define(wxXmlResource_Load, 2462).
+-define(wxXmlResource_LoadBitmap, 2463).
+-define(wxXmlResource_LoadDialog_2, 2464).
+-define(wxXmlResource_LoadDialog_3, 2465).
+-define(wxXmlResource_LoadFrame_2, 2466).
+-define(wxXmlResource_LoadFrame_3, 2467).
+-define(wxXmlResource_LoadIcon, 2468).
+-define(wxXmlResource_LoadMenu, 2469).
+-define(wxXmlResource_LoadMenuBar_2, 2470).
+-define(wxXmlResource_LoadMenuBar_1, 2471).
+-define(wxXmlResource_LoadPanel_2, 2472).
+-define(wxXmlResource_LoadPanel_3, 2473).
+-define(wxXmlResource_LoadToolBar, 2474).
+-define(wxXmlResource_Set, 2475).
+-define(wxXmlResource_SetFlags, 2476).
+-define(wxXmlResource_Unload, 2477).
+-define(wxXmlResource_xrcctrl, 2478).
+-define(wxHtmlEasyPrinting_new, 2479).
+-define(wxHtmlEasyPrinting_GetPrintData, 2480).
+-define(wxHtmlEasyPrinting_GetPageSetupData, 2481).
+-define(wxHtmlEasyPrinting_PreviewFile, 2482).
+-define(wxHtmlEasyPrinting_PreviewText, 2483).
+-define(wxHtmlEasyPrinting_PrintFile, 2484).
+-define(wxHtmlEasyPrinting_PrintText, 2485).
+-define(wxHtmlEasyPrinting_PageSetup, 2486).
+-define(wxHtmlEasyPrinting_SetFonts, 2487).
+-define(wxHtmlEasyPrinting_SetHeader, 2488).
+-define(wxHtmlEasyPrinting_SetFooter, 2489).
+-define(wxHtmlEasyPrinting_destroy, 2490).
+-define(wxGLCanvas_new, 2491).
+-define(wxGLCanvas_SetCurrent, 2492).
+-define(wxGLCanvas_SwapBuffers, 2493).
+-define(wxGLCanvas_destroy, 2494).
+-define(wxGLContext_new, 2495).
+-define(wxGLContext_SetCurrent, 2496).
+-define(wxGLContext_destroy, 2497).
+-define(wxAuiManager_new, 2498).
+-define(wxAuiManager_destruct, 2499).
+-define(wxAuiManager_AddPane_2_1, 2500).
+-define(wxAuiManager_AddPane_2_0, 2501).
+-define(wxAuiManager_AddPane_3, 2502).
+-define(wxAuiManager_DetachPane, 2503).
+-define(wxAuiManager_GetAllPanes, 2504).
+-define(wxAuiManager_GetArtProvider, 2505).
+-define(wxAuiManager_GetDockSizeConstraint, 2506).
+-define(wxAuiManager_GetFlags, 2507).
+-define(wxAuiManager_GetManagedWindow, 2508).
+-define(wxAuiManager_GetManager, 2509).
+-define(wxAuiManager_GetPane_1_1, 2510).
+-define(wxAuiManager_GetPane_1_0, 2511).
+-define(wxAuiManager_HideHint, 2512).
+-define(wxAuiManager_InsertPane, 2513).
+-define(wxAuiManager_LoadPaneInfo, 2514).
+-define(wxAuiManager_LoadPerspective, 2515).
+-define(wxAuiManager_SavePaneInfo, 2516).
+-define(wxAuiManager_SavePerspective, 2517).
+-define(wxAuiManager_SetArtProvider, 2518).
+-define(wxAuiManager_SetDockSizeConstraint, 2519).
+-define(wxAuiManager_SetFlags, 2520).
+-define(wxAuiManager_SetManagedWindow, 2521).
+-define(wxAuiManager_ShowHint, 2522).
+-define(wxAuiManager_UnInit, 2523).
+-define(wxAuiManager_Update, 2524).
+-define(wxAuiPaneInfo_new_0, 2525).
+-define(wxAuiPaneInfo_new_1, 2526).
+-define(wxAuiPaneInfo_BestSize_1, 2527).
+-define(wxAuiPaneInfo_BestSize_2, 2528).
+-define(wxAuiPaneInfo_Bottom, 2529).
+-define(wxAuiPaneInfo_BottomDockable, 2530).
+-define(wxAuiPaneInfo_Caption, 2531).
+-define(wxAuiPaneInfo_CaptionVisible, 2532).
+-define(wxAuiPaneInfo_Centre, 2533).
+-define(wxAuiPaneInfo_CentrePane, 2534).
+-define(wxAuiPaneInfo_CloseButton, 2535).
+-define(wxAuiPaneInfo_DefaultPane, 2536).
+-define(wxAuiPaneInfo_DestroyOnClose, 2537).
+-define(wxAuiPaneInfo_Direction, 2538).
+-define(wxAuiPaneInfo_Dock, 2539).
+-define(wxAuiPaneInfo_Dockable, 2540).
+-define(wxAuiPaneInfo_Fixed, 2541).
+-define(wxAuiPaneInfo_Float, 2542).
+-define(wxAuiPaneInfo_Floatable, 2543).
+-define(wxAuiPaneInfo_FloatingPosition_1, 2544).
+-define(wxAuiPaneInfo_FloatingPosition_2, 2545).
+-define(wxAuiPaneInfo_FloatingSize_1, 2546).
+-define(wxAuiPaneInfo_FloatingSize_2, 2547).
+-define(wxAuiPaneInfo_Gripper, 2548).
+-define(wxAuiPaneInfo_GripperTop, 2549).
+-define(wxAuiPaneInfo_HasBorder, 2550).
+-define(wxAuiPaneInfo_HasCaption, 2551).
+-define(wxAuiPaneInfo_HasCloseButton, 2552).
+-define(wxAuiPaneInfo_HasFlag, 2553).
+-define(wxAuiPaneInfo_HasGripper, 2554).
+-define(wxAuiPaneInfo_HasGripperTop, 2555).
+-define(wxAuiPaneInfo_HasMaximizeButton, 2556).
+-define(wxAuiPaneInfo_HasMinimizeButton, 2557).
+-define(wxAuiPaneInfo_HasPinButton, 2558).
+-define(wxAuiPaneInfo_Hide, 2559).
+-define(wxAuiPaneInfo_IsBottomDockable, 2560).
+-define(wxAuiPaneInfo_IsDocked, 2561).
+-define(wxAuiPaneInfo_IsFixed, 2562).
+-define(wxAuiPaneInfo_IsFloatable, 2563).
+-define(wxAuiPaneInfo_IsFloating, 2564).
+-define(wxAuiPaneInfo_IsLeftDockable, 2565).
+-define(wxAuiPaneInfo_IsMovable, 2566).
+-define(wxAuiPaneInfo_IsOk, 2567).
+-define(wxAuiPaneInfo_IsResizable, 2568).
+-define(wxAuiPaneInfo_IsRightDockable, 2569).
+-define(wxAuiPaneInfo_IsShown, 2570).
+-define(wxAuiPaneInfo_IsToolbar, 2571).
+-define(wxAuiPaneInfo_IsTopDockable, 2572).
+-define(wxAuiPaneInfo_Layer, 2573).
+-define(wxAuiPaneInfo_Left, 2574).
+-define(wxAuiPaneInfo_LeftDockable, 2575).
+-define(wxAuiPaneInfo_MaxSize_1, 2576).
+-define(wxAuiPaneInfo_MaxSize_2, 2577).
+-define(wxAuiPaneInfo_MaximizeButton, 2578).
+-define(wxAuiPaneInfo_MinSize_1, 2579).
+-define(wxAuiPaneInfo_MinSize_2, 2580).
+-define(wxAuiPaneInfo_MinimizeButton, 2581).
+-define(wxAuiPaneInfo_Movable, 2582).
+-define(wxAuiPaneInfo_Name, 2583).
+-define(wxAuiPaneInfo_PaneBorder, 2584).
+-define(wxAuiPaneInfo_PinButton, 2585).
+-define(wxAuiPaneInfo_Position, 2586).
+-define(wxAuiPaneInfo_Resizable, 2587).
+-define(wxAuiPaneInfo_Right, 2588).
+-define(wxAuiPaneInfo_RightDockable, 2589).
+-define(wxAuiPaneInfo_Row, 2590).
+-define(wxAuiPaneInfo_SafeSet, 2591).
+-define(wxAuiPaneInfo_SetFlag, 2592).
+-define(wxAuiPaneInfo_Show, 2593).
+-define(wxAuiPaneInfo_ToolbarPane, 2594).
+-define(wxAuiPaneInfo_Top, 2595).
+-define(wxAuiPaneInfo_TopDockable, 2596).
+-define(wxAuiPaneInfo_Window, 2597).
+-define(wxAuiPaneInfo_GetWindow, 2598).
+-define(wxAuiPaneInfo_GetFrame, 2599).
+-define(wxAuiPaneInfo_GetDirection, 2600).
+-define(wxAuiPaneInfo_GetLayer, 2601).
+-define(wxAuiPaneInfo_GetRow, 2602).
+-define(wxAuiPaneInfo_GetPosition, 2603).
+-define(wxAuiPaneInfo_GetFloatingPosition, 2604).
+-define(wxAuiPaneInfo_GetFloatingSize, 2605).
+-define(wxAuiPaneInfo_destroy, 2606).
+-define(wxAuiNotebook_new_0, 2607).
+-define(wxAuiNotebook_new_2, 2608).
+-define(wxAuiNotebook_AddPage_3, 2609).
+-define(wxAuiNotebook_AddPage_4, 2610).
+-define(wxAuiNotebook_Create_2, 2611).
+-define(wxAuiNotebook_Create_3, 2612).
+-define(wxAuiNotebook_DeletePage, 2613).
+-define(wxAuiNotebook_GetArtProvider, 2614).
+-define(wxAuiNotebook_GetPage, 2615).
+-define(wxAuiNotebook_GetPageBitmap, 2616).
+-define(wxAuiNotebook_GetPageCount, 2617).
+-define(wxAuiNotebook_GetPageIndex, 2618).
+-define(wxAuiNotebook_GetPageText, 2619).
+-define(wxAuiNotebook_GetSelection, 2620).
+-define(wxAuiNotebook_InsertPage_4, 2621).
+-define(wxAuiNotebook_InsertPage_5, 2622).
+-define(wxAuiNotebook_RemovePage, 2623).
+-define(wxAuiNotebook_SetArtProvider, 2624).
+-define(wxAuiNotebook_SetFont, 2625).
+-define(wxAuiNotebook_SetPageBitmap, 2626).
+-define(wxAuiNotebook_SetPageText, 2627).
+-define(wxAuiNotebook_SetSelection, 2628).
+-define(wxAuiNotebook_SetTabCtrlHeight, 2629).
+-define(wxAuiNotebook_SetUniformBitmapSize, 2630).
+-define(wxAuiNotebook_destroy, 2631).
+-define(wxAuiTabArt_SetFlags, 2632).
+-define(wxAuiTabArt_SetMeasuringFont, 2633).
+-define(wxAuiTabArt_SetNormalFont, 2634).
+-define(wxAuiTabArt_SetSelectedFont, 2635).
+-define(wxAuiTabArt_SetColour, 2636).
+-define(wxAuiTabArt_SetActiveColour, 2637).
+-define(wxAuiDockArt_GetColour, 2638).
+-define(wxAuiDockArt_GetFont, 2639).
+-define(wxAuiDockArt_GetMetric, 2640).
+-define(wxAuiDockArt_SetColour, 2641).
+-define(wxAuiDockArt_SetFont, 2642).
+-define(wxAuiDockArt_SetMetric, 2643).
+-define(wxAuiSimpleTabArt_new, 2644).
+-define(wxAuiSimpleTabArt_destroy, 2645).
+-define(wxMDIParentFrame_new_0, 2646).
+-define(wxMDIParentFrame_new_4, 2647).
+-define(wxMDIParentFrame_destruct, 2648).
+-define(wxMDIParentFrame_ActivateNext, 2649).
+-define(wxMDIParentFrame_ActivatePrevious, 2650).
+-define(wxMDIParentFrame_ArrangeIcons, 2651).
+-define(wxMDIParentFrame_Cascade, 2652).
+-define(wxMDIParentFrame_Create, 2653).
+-define(wxMDIParentFrame_GetActiveChild, 2654).
+-define(wxMDIParentFrame_GetClientWindow, 2655).
+-define(wxMDIParentFrame_Tile, 2656).
+-define(wxMDIChildFrame_new_0, 2657).
+-define(wxMDIChildFrame_new_4, 2658).
+-define(wxMDIChildFrame_destruct, 2659).
+-define(wxMDIChildFrame_Activate, 2660).
+-define(wxMDIChildFrame_Create, 2661).
+-define(wxMDIChildFrame_Maximize, 2662).
+-define(wxMDIChildFrame_Restore, 2663).
+-define(wxMDIClientWindow_new, 2664).
+-define(wxMDIClientWindow_CreateClient, 2665).
+-define(wxMDIClientWindow_destroy, 2666).
+-define(wxLayoutAlgorithm_new, 2667).
+-define(wxLayoutAlgorithm_destruct, 2668).
+-define(wxLayoutAlgorithm_LayoutFrame, 2669).
+-define(wxLayoutAlgorithm_LayoutMDIFrame, 2670).
+-define(wxLayoutAlgorithm_LayoutWindow, 2671).
+-define(wxEvent_GetId, 2672).
+-define(wxEvent_GetSkipped, 2673).
+-define(wxEvent_GetTimestamp, 2674).
+-define(wxEvent_IsCommandEvent, 2675).
+-define(wxEvent_ResumePropagation, 2676).
+-define(wxEvent_ShouldPropagate, 2677).
+-define(wxEvent_Skip, 2678).
+-define(wxEvent_StopPropagation, 2679).
+-define(wxCommandEvent_getClientData, 2680).
+-define(wxCommandEvent_GetExtraLong, 2681).
+-define(wxCommandEvent_GetInt, 2682).
+-define(wxCommandEvent_GetSelection, 2683).
+-define(wxCommandEvent_GetString, 2684).
+-define(wxCommandEvent_IsChecked, 2685).
+-define(wxCommandEvent_IsSelection, 2686).
+-define(wxCommandEvent_SetInt, 2687).
+-define(wxCommandEvent_SetString, 2688).
+-define(wxScrollEvent_GetOrientation, 2689).
+-define(wxScrollEvent_GetPosition, 2690).
+-define(wxScrollWinEvent_GetOrientation, 2691).
+-define(wxScrollWinEvent_GetPosition, 2692).
+-define(wxMouseEvent_AltDown, 2693).
+-define(wxMouseEvent_Button, 2694).
+-define(wxMouseEvent_ButtonDClick, 2695).
+-define(wxMouseEvent_ButtonDown, 2696).
+-define(wxMouseEvent_ButtonUp, 2697).
+-define(wxMouseEvent_CmdDown, 2698).
+-define(wxMouseEvent_ControlDown, 2699).
+-define(wxMouseEvent_Dragging, 2700).
+-define(wxMouseEvent_Entering, 2701).
+-define(wxMouseEvent_GetButton, 2702).
+-define(wxMouseEvent_GetPosition, 2703).
+-define(wxMouseEvent_GetLogicalPosition, 2705).
+-define(wxMouseEvent_GetLinesPerAction, 2706).
+-define(wxMouseEvent_GetWheelRotation, 2707).
+-define(wxMouseEvent_GetWheelDelta, 2708).
+-define(wxMouseEvent_GetX, 2709).
+-define(wxMouseEvent_GetY, 2710).
+-define(wxMouseEvent_IsButton, 2711).
+-define(wxMouseEvent_IsPageScroll, 2712).
+-define(wxMouseEvent_Leaving, 2713).
+-define(wxMouseEvent_LeftDClick, 2714).
+-define(wxMouseEvent_LeftDown, 2715).
+-define(wxMouseEvent_LeftIsDown, 2716).
+-define(wxMouseEvent_LeftUp, 2717).
+-define(wxMouseEvent_MetaDown, 2718).
+-define(wxMouseEvent_MiddleDClick, 2719).
+-define(wxMouseEvent_MiddleDown, 2720).
+-define(wxMouseEvent_MiddleIsDown, 2721).
+-define(wxMouseEvent_MiddleUp, 2722).
+-define(wxMouseEvent_Moving, 2723).
+-define(wxMouseEvent_RightDClick, 2724).
+-define(wxMouseEvent_RightDown, 2725).
+-define(wxMouseEvent_RightIsDown, 2726).
+-define(wxMouseEvent_RightUp, 2727).
+-define(wxMouseEvent_ShiftDown, 2728).
+-define(wxMouseEvent_GetWheelAxis, 2729).
+-define(wxSetCursorEvent_GetCursor, 2730).
+-define(wxSetCursorEvent_GetX, 2731).
+-define(wxSetCursorEvent_GetY, 2732).
+-define(wxSetCursorEvent_HasCursor, 2733).
+-define(wxSetCursorEvent_SetCursor, 2734).
+-define(wxKeyEvent_AltDown, 2735).
+-define(wxKeyEvent_CmdDown, 2736).
+-define(wxKeyEvent_ControlDown, 2737).
+-define(wxKeyEvent_GetKeyCode, 2738).
+-define(wxKeyEvent_GetModifiers, 2739).
+-define(wxKeyEvent_GetPosition, 2740).
+-define(wxKeyEvent_GetRawKeyCode, 2742).
+-define(wxKeyEvent_GetRawKeyFlags, 2743).
+-define(wxKeyEvent_GetUnicodeKey, 2744).
+-define(wxKeyEvent_GetX, 2745).
+-define(wxKeyEvent_GetY, 2746).
+-define(wxKeyEvent_HasModifiers, 2747).
+-define(wxKeyEvent_MetaDown, 2748).
+-define(wxKeyEvent_ShiftDown, 2749).
+-define(wxSizeEvent_GetSize, 2750).
+-define(wxSizeEvent_GetRect, 2751).
+-define(wxMoveEvent_GetPosition, 2752).
+-define(wxMoveEvent_GetRect, 2753).
+-define(wxEraseEvent_GetDC, 2754).
+-define(wxFocusEvent_GetWindow, 2755).
+-define(wxChildFocusEvent_GetWindow, 2756).
+-define(wxMenuEvent_GetMenu, 2757).
+-define(wxMenuEvent_GetMenuId, 2758).
+-define(wxMenuEvent_IsPopup, 2759).
+-define(wxCloseEvent_CanVeto, 2760).
+-define(wxCloseEvent_GetLoggingOff, 2761).
+-define(wxCloseEvent_SetCanVeto, 2762).
+-define(wxCloseEvent_SetLoggingOff, 2763).
+-define(wxCloseEvent_Veto, 2764).
+-define(wxShowEvent_SetShow, 2765).
+-define(wxShowEvent_IsShown, 2766).
+-define(wxIconizeEvent_IsIconized, 2767).
+-define(wxJoystickEvent_ButtonDown, 2768).
+-define(wxJoystickEvent_ButtonIsDown, 2769).
+-define(wxJoystickEvent_ButtonUp, 2770).
+-define(wxJoystickEvent_GetButtonChange, 2771).
+-define(wxJoystickEvent_GetButtonState, 2772).
+-define(wxJoystickEvent_GetJoystick, 2773).
+-define(wxJoystickEvent_GetPosition, 2774).
+-define(wxJoystickEvent_GetZPosition, 2775).
+-define(wxJoystickEvent_IsButton, 2776).
+-define(wxJoystickEvent_IsMove, 2777).
+-define(wxJoystickEvent_IsZMove, 2778).
+-define(wxUpdateUIEvent_CanUpdate, 2779).
+-define(wxUpdateUIEvent_Check, 2780).
+-define(wxUpdateUIEvent_Enable, 2781).
+-define(wxUpdateUIEvent_Show, 2782).
+-define(wxUpdateUIEvent_GetChecked, 2783).
+-define(wxUpdateUIEvent_GetEnabled, 2784).
+-define(wxUpdateUIEvent_GetShown, 2785).
+-define(wxUpdateUIEvent_GetSetChecked, 2786).
+-define(wxUpdateUIEvent_GetSetEnabled, 2787).
+-define(wxUpdateUIEvent_GetSetShown, 2788).
+-define(wxUpdateUIEvent_GetSetText, 2789).
+-define(wxUpdateUIEvent_GetText, 2790).
+-define(wxUpdateUIEvent_GetMode, 2791).
+-define(wxUpdateUIEvent_GetUpdateInterval, 2792).
+-define(wxUpdateUIEvent_ResetUpdateTime, 2793).
+-define(wxUpdateUIEvent_SetMode, 2794).
+-define(wxUpdateUIEvent_SetText, 2795).
+-define(wxUpdateUIEvent_SetUpdateInterval, 2796).
+-define(wxMouseCaptureChangedEvent_GetCapturedWindow, 2797).
+-define(wxPaletteChangedEvent_SetChangedWindow, 2798).
+-define(wxPaletteChangedEvent_GetChangedWindow, 2799).
+-define(wxQueryNewPaletteEvent_SetPaletteRealized, 2800).
+-define(wxQueryNewPaletteEvent_GetPaletteRealized, 2801).
+-define(wxNavigationKeyEvent_GetDirection, 2802).
+-define(wxNavigationKeyEvent_SetDirection, 2803).
+-define(wxNavigationKeyEvent_IsWindowChange, 2804).
+-define(wxNavigationKeyEvent_SetWindowChange, 2805).
+-define(wxNavigationKeyEvent_IsFromTab, 2806).
+-define(wxNavigationKeyEvent_SetFromTab, 2807).
+-define(wxNavigationKeyEvent_GetCurrentFocus, 2808).
+-define(wxNavigationKeyEvent_SetCurrentFocus, 2809).
+-define(wxHelpEvent_GetOrigin, 2810).
+-define(wxHelpEvent_GetPosition, 2811).
+-define(wxHelpEvent_SetOrigin, 2812).
+-define(wxHelpEvent_SetPosition, 2813).
+-define(wxContextMenuEvent_GetPosition, 2814).
+-define(wxContextMenuEvent_SetPosition, 2815).
+-define(wxIdleEvent_GetMode, 2816).
+-define(wxIdleEvent_RequestMore, 2817).
+-define(wxIdleEvent_MoreRequested, 2818).
+-define(wxIdleEvent_SetMode, 2819).
+-define(wxGridEvent_AltDown, 2820).
+-define(wxGridEvent_ControlDown, 2821).
+-define(wxGridEvent_GetCol, 2822).
+-define(wxGridEvent_GetPosition, 2823).
+-define(wxGridEvent_GetRow, 2824).
+-define(wxGridEvent_MetaDown, 2825).
+-define(wxGridEvent_Selecting, 2826).
+-define(wxGridEvent_ShiftDown, 2827).
+-define(wxNotifyEvent_Allow, 2828).
+-define(wxNotifyEvent_IsAllowed, 2829).
+-define(wxNotifyEvent_Veto, 2830).
+-define(wxSashEvent_GetEdge, 2831).
+-define(wxSashEvent_GetDragRect, 2832).
+-define(wxSashEvent_GetDragStatus, 2833).
+-define(wxListEvent_GetCacheFrom, 2834).
+-define(wxListEvent_GetCacheTo, 2835).
+-define(wxListEvent_GetKeyCode, 2836).
+-define(wxListEvent_GetIndex, 2837).
+-define(wxListEvent_GetColumn, 2838).
+-define(wxListEvent_GetPoint, 2839).
+-define(wxListEvent_GetLabel, 2840).
+-define(wxListEvent_GetText, 2841).
+-define(wxListEvent_GetImage, 2842).
+-define(wxListEvent_GetData, 2843).
+-define(wxListEvent_GetMask, 2844).
+-define(wxListEvent_GetItem, 2845).
+-define(wxListEvent_IsEditCancelled, 2846).
+-define(wxDateEvent_GetDate, 2847).
+-define(wxCalendarEvent_GetWeekDay, 2848).
+-define(wxCalendarEvent_GetDate, 2849).
+-define(wxFileDirPickerEvent_GetPath, 2850).
+-define(wxColourPickerEvent_GetColour, 2851).
+-define(wxFontPickerEvent_GetFont, 2852).
+-define(wxStyledTextEvent_GetPosition, 2853).
+-define(wxStyledTextEvent_GetKey, 2854).
+-define(wxStyledTextEvent_GetModifiers, 2855).
+-define(wxStyledTextEvent_GetModificationType, 2856).
+-define(wxStyledTextEvent_GetText, 2857).
+-define(wxStyledTextEvent_GetLength, 2858).
+-define(wxStyledTextEvent_GetLinesAdded, 2859).
+-define(wxStyledTextEvent_GetLine, 2860).
+-define(wxStyledTextEvent_GetFoldLevelNow, 2861).
+-define(wxStyledTextEvent_GetFoldLevelPrev, 2862).
+-define(wxStyledTextEvent_GetMargin, 2863).
+-define(wxStyledTextEvent_GetMessage, 2864).
+-define(wxStyledTextEvent_GetWParam, 2865).
+-define(wxStyledTextEvent_GetLParam, 2866).
+-define(wxStyledTextEvent_GetListType, 2867).
+-define(wxStyledTextEvent_GetX, 2868).
+-define(wxStyledTextEvent_GetY, 2869).
+-define(wxStyledTextEvent_GetDragText, 2870).
+-define(wxStyledTextEvent_GetDragAllowMove, 2871).
+-define(wxStyledTextEvent_GetDragResult, 2872).
+-define(wxStyledTextEvent_GetShift, 2873).
+-define(wxStyledTextEvent_GetControl, 2874).
+-define(wxStyledTextEvent_GetAlt, 2875).
+-define(utils_wxGetKeyState, 2876).
+-define(utils_wxGetMousePosition, 2877).
+-define(utils_wxGetMouseState, 2878).
+-define(utils_wxSetDetectableAutoRepeat, 2879).
+-define(utils_wxBell, 2880).
+-define(utils_wxFindMenuItemId, 2881).
+-define(utils_wxFindWindowAtPoint, 2882).
+-define(utils_wxBeginBusyCursor, 2883).
+-define(utils_wxEndBusyCursor, 2884).
+-define(utils_wxIsBusy, 2885).
+-define(utils_wxShutdown, 2886).
+-define(utils_wxShell, 2887).
+-define(utils_wxLaunchDefaultBrowser, 2888).
+-define(utils_wxGetEmailAddress, 2889).
+-define(utils_wxGetUserId, 2890).
+-define(utils_wxGetHomeDir, 2891).
+-define(utils_wxNewId, 2892).
+-define(utils_wxRegisterId, 2893).
+-define(utils_wxGetCurrentId, 2894).
+-define(utils_wxGetOsDescription, 2895).
+-define(utils_wxIsPlatformLittleEndian, 2896).
+-define(utils_wxIsPlatform64Bit, 2897).
+-define(gdicmn_wxDisplaySize, 2898).
+-define(gdicmn_wxSetCursor, 2899).
+-define(wxPrintout_new, 2900).
+-define(wxPrintout_destruct, 2901).
+-define(wxPrintout_GetDC, 2902).
+-define(wxPrintout_GetPageSizeMM, 2903).
+-define(wxPrintout_GetPageSizePixels, 2904).
+-define(wxPrintout_GetPaperRectPixels, 2905).
+-define(wxPrintout_GetPPIPrinter, 2906).
+-define(wxPrintout_GetPPIScreen, 2907).
+-define(wxPrintout_GetTitle, 2908).
+-define(wxPrintout_IsPreview, 2909).
+-define(wxPrintout_FitThisSizeToPaper, 2910).
+-define(wxPrintout_FitThisSizeToPage, 2911).
+-define(wxPrintout_FitThisSizeToPageMargins, 2912).
+-define(wxPrintout_MapScreenSizeToPaper, 2913).
+-define(wxPrintout_MapScreenSizeToPage, 2914).
+-define(wxPrintout_MapScreenSizeToPageMargins, 2915).
+-define(wxPrintout_MapScreenSizeToDevice, 2916).
+-define(wxPrintout_GetLogicalPaperRect, 2917).
+-define(wxPrintout_GetLogicalPageRect, 2918).
+-define(wxPrintout_GetLogicalPageMarginsRect, 2919).
+-define(wxPrintout_SetLogicalOrigin, 2920).
+-define(wxPrintout_OffsetLogicalOrigin, 2921).
+-define(wxStyledTextCtrl_new_2, 2922).
+-define(wxStyledTextCtrl_new_0, 2923).
+-define(wxStyledTextCtrl_destruct, 2924).
+-define(wxStyledTextCtrl_Create, 2925).
+-define(wxStyledTextCtrl_AddText, 2926).
+-define(wxStyledTextCtrl_InsertText, 2927).
+-define(wxStyledTextCtrl_ClearAll, 2928).
+-define(wxStyledTextCtrl_ClearDocumentStyle, 2929).
+-define(wxStyledTextCtrl_GetLength, 2930).
+-define(wxStyledTextCtrl_GetCharAt, 2931).
+-define(wxStyledTextCtrl_GetCurrentPos, 2932).
+-define(wxStyledTextCtrl_GetAnchor, 2933).
+-define(wxStyledTextCtrl_GetStyleAt, 2934).
+-define(wxStyledTextCtrl_Redo, 2935).
+-define(wxStyledTextCtrl_SetUndoCollection, 2936).
+-define(wxStyledTextCtrl_SelectAll, 2937).
+-define(wxStyledTextCtrl_SetSavePoint, 2938).
+-define(wxStyledTextCtrl_CanRedo, 2939).
+-define(wxStyledTextCtrl_MarkerLineFromHandle, 2940).
+-define(wxStyledTextCtrl_MarkerDeleteHandle, 2941).
+-define(wxStyledTextCtrl_GetUndoCollection, 2942).
+-define(wxStyledTextCtrl_GetViewWhiteSpace, 2943).
+-define(wxStyledTextCtrl_SetViewWhiteSpace, 2944).
+-define(wxStyledTextCtrl_PositionFromPoint, 2945).
+-define(wxStyledTextCtrl_PositionFromPointClose, 2946).
+-define(wxStyledTextCtrl_GotoLine, 2947).
+-define(wxStyledTextCtrl_GotoPos, 2948).
+-define(wxStyledTextCtrl_SetAnchor, 2949).
+-define(wxStyledTextCtrl_GetCurLine, 2950).
+-define(wxStyledTextCtrl_GetEndStyled, 2951).
+-define(wxStyledTextCtrl_ConvertEOLs, 2952).
+-define(wxStyledTextCtrl_GetEOLMode, 2953).
+-define(wxStyledTextCtrl_SetEOLMode, 2954).
+-define(wxStyledTextCtrl_StartStyling, 2955).
+-define(wxStyledTextCtrl_SetStyling, 2956).
+-define(wxStyledTextCtrl_GetBufferedDraw, 2957).
+-define(wxStyledTextCtrl_SetBufferedDraw, 2958).
+-define(wxStyledTextCtrl_SetTabWidth, 2959).
+-define(wxStyledTextCtrl_GetTabWidth, 2960).
+-define(wxStyledTextCtrl_SetCodePage, 2961).
+-define(wxStyledTextCtrl_MarkerDefine, 2962).
+-define(wxStyledTextCtrl_MarkerSetForeground, 2963).
+-define(wxStyledTextCtrl_MarkerSetBackground, 2964).
+-define(wxStyledTextCtrl_MarkerAdd, 2965).
+-define(wxStyledTextCtrl_MarkerDelete, 2966).
+-define(wxStyledTextCtrl_MarkerDeleteAll, 2967).
+-define(wxStyledTextCtrl_MarkerGet, 2968).
+-define(wxStyledTextCtrl_MarkerNext, 2969).
+-define(wxStyledTextCtrl_MarkerPrevious, 2970).
+-define(wxStyledTextCtrl_MarkerDefineBitmap, 2971).
+-define(wxStyledTextCtrl_MarkerAddSet, 2972).
+-define(wxStyledTextCtrl_MarkerSetAlpha, 2973).
+-define(wxStyledTextCtrl_SetMarginType, 2974).
+-define(wxStyledTextCtrl_GetMarginType, 2975).
+-define(wxStyledTextCtrl_SetMarginWidth, 2976).
+-define(wxStyledTextCtrl_GetMarginWidth, 2977).
+-define(wxStyledTextCtrl_SetMarginMask, 2978).
+-define(wxStyledTextCtrl_GetMarginMask, 2979).
+-define(wxStyledTextCtrl_SetMarginSensitive, 2980).
+-define(wxStyledTextCtrl_GetMarginSensitive, 2981).
+-define(wxStyledTextCtrl_StyleClearAll, 2982).
+-define(wxStyledTextCtrl_StyleSetForeground, 2983).
+-define(wxStyledTextCtrl_StyleSetBackground, 2984).
+-define(wxStyledTextCtrl_StyleSetBold, 2985).
+-define(wxStyledTextCtrl_StyleSetItalic, 2986).
+-define(wxStyledTextCtrl_StyleSetSize, 2987).
+-define(wxStyledTextCtrl_StyleSetFaceName, 2988).
+-define(wxStyledTextCtrl_StyleSetEOLFilled, 2989).
+-define(wxStyledTextCtrl_StyleResetDefault, 2990).
+-define(wxStyledTextCtrl_StyleSetUnderline, 2991).
+-define(wxStyledTextCtrl_StyleSetCase, 2992).
+-define(wxStyledTextCtrl_StyleSetHotSpot, 2993).
+-define(wxStyledTextCtrl_SetSelForeground, 2994).
+-define(wxStyledTextCtrl_SetSelBackground, 2995).
+-define(wxStyledTextCtrl_GetSelAlpha, 2996).
+-define(wxStyledTextCtrl_SetSelAlpha, 2997).
+-define(wxStyledTextCtrl_SetCaretForeground, 2998).
+-define(wxStyledTextCtrl_CmdKeyAssign, 2999).
+-define(wxStyledTextCtrl_CmdKeyClear, 3000).
+-define(wxStyledTextCtrl_CmdKeyClearAll, 3001).
+-define(wxStyledTextCtrl_SetStyleBytes, 3002).
+-define(wxStyledTextCtrl_StyleSetVisible, 3003).
+-define(wxStyledTextCtrl_GetCaretPeriod, 3004).
+-define(wxStyledTextCtrl_SetCaretPeriod, 3005).
+-define(wxStyledTextCtrl_SetWordChars, 3006).
+-define(wxStyledTextCtrl_BeginUndoAction, 3007).
+-define(wxStyledTextCtrl_EndUndoAction, 3008).
+-define(wxStyledTextCtrl_IndicatorSetStyle, 3009).
+-define(wxStyledTextCtrl_IndicatorGetStyle, 3010).
+-define(wxStyledTextCtrl_IndicatorSetForeground, 3011).
+-define(wxStyledTextCtrl_IndicatorGetForeground, 3012).
+-define(wxStyledTextCtrl_SetWhitespaceForeground, 3013).
+-define(wxStyledTextCtrl_SetWhitespaceBackground, 3014).
+-define(wxStyledTextCtrl_GetStyleBits, 3015).
+-define(wxStyledTextCtrl_SetLineState, 3016).
+-define(wxStyledTextCtrl_GetLineState, 3017).
+-define(wxStyledTextCtrl_GetMaxLineState, 3018).
+-define(wxStyledTextCtrl_GetCaretLineVisible, 3019).
+-define(wxStyledTextCtrl_SetCaretLineVisible, 3020).
+-define(wxStyledTextCtrl_GetCaretLineBackground, 3021).
+-define(wxStyledTextCtrl_SetCaretLineBackground, 3022).
+-define(wxStyledTextCtrl_AutoCompShow, 3023).
+-define(wxStyledTextCtrl_AutoCompCancel, 3024).
+-define(wxStyledTextCtrl_AutoCompActive, 3025).
+-define(wxStyledTextCtrl_AutoCompPosStart, 3026).
+-define(wxStyledTextCtrl_AutoCompComplete, 3027).
+-define(wxStyledTextCtrl_AutoCompStops, 3028).
+-define(wxStyledTextCtrl_AutoCompSetSeparator, 3029).
+-define(wxStyledTextCtrl_AutoCompGetSeparator, 3030).
+-define(wxStyledTextCtrl_AutoCompSelect, 3031).
+-define(wxStyledTextCtrl_AutoCompSetCancelAtStart, 3032).
+-define(wxStyledTextCtrl_AutoCompGetCancelAtStart, 3033).
+-define(wxStyledTextCtrl_AutoCompSetFillUps, 3034).
+-define(wxStyledTextCtrl_AutoCompSetChooseSingle, 3035).
+-define(wxStyledTextCtrl_AutoCompGetChooseSingle, 3036).
+-define(wxStyledTextCtrl_AutoCompSetIgnoreCase, 3037).
+-define(wxStyledTextCtrl_AutoCompGetIgnoreCase, 3038).
+-define(wxStyledTextCtrl_UserListShow, 3039).
+-define(wxStyledTextCtrl_AutoCompSetAutoHide, 3040).
+-define(wxStyledTextCtrl_AutoCompGetAutoHide, 3041).
+-define(wxStyledTextCtrl_AutoCompSetDropRestOfWord, 3042).
+-define(wxStyledTextCtrl_AutoCompGetDropRestOfWord, 3043).
+-define(wxStyledTextCtrl_RegisterImage, 3044).
+-define(wxStyledTextCtrl_ClearRegisteredImages, 3045).
+-define(wxStyledTextCtrl_AutoCompGetTypeSeparator, 3046).
+-define(wxStyledTextCtrl_AutoCompSetTypeSeparator, 3047).
+-define(wxStyledTextCtrl_AutoCompSetMaxWidth, 3048).
+-define(wxStyledTextCtrl_AutoCompGetMaxWidth, 3049).
+-define(wxStyledTextCtrl_AutoCompSetMaxHeight, 3050).
+-define(wxStyledTextCtrl_AutoCompGetMaxHeight, 3051).
+-define(wxStyledTextCtrl_SetIndent, 3052).
+-define(wxStyledTextCtrl_GetIndent, 3053).
+-define(wxStyledTextCtrl_SetUseTabs, 3054).
+-define(wxStyledTextCtrl_GetUseTabs, 3055).
+-define(wxStyledTextCtrl_SetLineIndentation, 3056).
+-define(wxStyledTextCtrl_GetLineIndentation, 3057).
+-define(wxStyledTextCtrl_GetLineIndentPosition, 3058).
+-define(wxStyledTextCtrl_GetColumn, 3059).
+-define(wxStyledTextCtrl_SetUseHorizontalScrollBar, 3060).
+-define(wxStyledTextCtrl_GetUseHorizontalScrollBar, 3061).
+-define(wxStyledTextCtrl_SetIndentationGuides, 3062).
+-define(wxStyledTextCtrl_GetIndentationGuides, 3063).
+-define(wxStyledTextCtrl_SetHighlightGuide, 3064).
+-define(wxStyledTextCtrl_GetHighlightGuide, 3065).
+-define(wxStyledTextCtrl_GetLineEndPosition, 3066).
+-define(wxStyledTextCtrl_GetCodePage, 3067).
+-define(wxStyledTextCtrl_GetCaretForeground, 3068).
+-define(wxStyledTextCtrl_GetReadOnly, 3069).
+-define(wxStyledTextCtrl_SetCurrentPos, 3070).
+-define(wxStyledTextCtrl_SetSelectionStart, 3071).
+-define(wxStyledTextCtrl_GetSelectionStart, 3072).
+-define(wxStyledTextCtrl_SetSelectionEnd, 3073).
+-define(wxStyledTextCtrl_GetSelectionEnd, 3074).
+-define(wxStyledTextCtrl_SetPrintMagnification, 3075).
+-define(wxStyledTextCtrl_GetPrintMagnification, 3076).
+-define(wxStyledTextCtrl_SetPrintColourMode, 3077).
+-define(wxStyledTextCtrl_GetPrintColourMode, 3078).
+-define(wxStyledTextCtrl_FindText, 3079).
+-define(wxStyledTextCtrl_FormatRange, 3080).
+-define(wxStyledTextCtrl_GetFirstVisibleLine, 3081).
+-define(wxStyledTextCtrl_GetLine, 3082).
+-define(wxStyledTextCtrl_GetLineCount, 3083).
+-define(wxStyledTextCtrl_SetMarginLeft, 3084).
+-define(wxStyledTextCtrl_GetMarginLeft, 3085).
+-define(wxStyledTextCtrl_SetMarginRight, 3086).
+-define(wxStyledTextCtrl_GetMarginRight, 3087).
+-define(wxStyledTextCtrl_GetModify, 3088).
+-define(wxStyledTextCtrl_SetSelection, 3089).
+-define(wxStyledTextCtrl_GetSelectedText, 3090).
+-define(wxStyledTextCtrl_GetTextRange, 3091).
+-define(wxStyledTextCtrl_HideSelection, 3092).
+-define(wxStyledTextCtrl_LineFromPosition, 3093).
+-define(wxStyledTextCtrl_PositionFromLine, 3094).
+-define(wxStyledTextCtrl_LineScroll, 3095).
+-define(wxStyledTextCtrl_EnsureCaretVisible, 3096).
+-define(wxStyledTextCtrl_ReplaceSelection, 3097).
+-define(wxStyledTextCtrl_SetReadOnly, 3098).
+-define(wxStyledTextCtrl_CanPaste, 3099).
+-define(wxStyledTextCtrl_CanUndo, 3100).
+-define(wxStyledTextCtrl_EmptyUndoBuffer, 3101).
+-define(wxStyledTextCtrl_Undo, 3102).
+-define(wxStyledTextCtrl_Cut, 3103).
+-define(wxStyledTextCtrl_Copy, 3104).
+-define(wxStyledTextCtrl_Paste, 3105).
+-define(wxStyledTextCtrl_Clear, 3106).
+-define(wxStyledTextCtrl_SetText, 3107).
+-define(wxStyledTextCtrl_GetText, 3108).
+-define(wxStyledTextCtrl_GetTextLength, 3109).
+-define(wxStyledTextCtrl_GetOvertype, 3110).
+-define(wxStyledTextCtrl_SetCaretWidth, 3111).
+-define(wxStyledTextCtrl_GetCaretWidth, 3112).
+-define(wxStyledTextCtrl_SetTargetStart, 3113).
+-define(wxStyledTextCtrl_GetTargetStart, 3114).
+-define(wxStyledTextCtrl_SetTargetEnd, 3115).
+-define(wxStyledTextCtrl_GetTargetEnd, 3116).
+-define(wxStyledTextCtrl_ReplaceTarget, 3117).
+-define(wxStyledTextCtrl_SearchInTarget, 3118).
+-define(wxStyledTextCtrl_SetSearchFlags, 3119).
+-define(wxStyledTextCtrl_GetSearchFlags, 3120).
+-define(wxStyledTextCtrl_CallTipShow, 3121).
+-define(wxStyledTextCtrl_CallTipCancel, 3122).
+-define(wxStyledTextCtrl_CallTipActive, 3123).
+-define(wxStyledTextCtrl_CallTipPosAtStart, 3124).
+-define(wxStyledTextCtrl_CallTipSetHighlight, 3125).
+-define(wxStyledTextCtrl_CallTipSetBackground, 3126).
+-define(wxStyledTextCtrl_CallTipSetForeground, 3127).
+-define(wxStyledTextCtrl_CallTipSetForegroundHighlight, 3128).
+-define(wxStyledTextCtrl_CallTipUseStyle, 3129).
+-define(wxStyledTextCtrl_VisibleFromDocLine, 3130).
+-define(wxStyledTextCtrl_DocLineFromVisible, 3131).
+-define(wxStyledTextCtrl_WrapCount, 3132).
+-define(wxStyledTextCtrl_SetFoldLevel, 3133).
+-define(wxStyledTextCtrl_GetFoldLevel, 3134).
+-define(wxStyledTextCtrl_GetLastChild, 3135).
+-define(wxStyledTextCtrl_GetFoldParent, 3136).
+-define(wxStyledTextCtrl_ShowLines, 3137).
+-define(wxStyledTextCtrl_HideLines, 3138).
+-define(wxStyledTextCtrl_GetLineVisible, 3139).
+-define(wxStyledTextCtrl_SetFoldExpanded, 3140).
+-define(wxStyledTextCtrl_GetFoldExpanded, 3141).
+-define(wxStyledTextCtrl_ToggleFold, 3142).
+-define(wxStyledTextCtrl_EnsureVisible, 3143).
+-define(wxStyledTextCtrl_SetFoldFlags, 3144).
+-define(wxStyledTextCtrl_EnsureVisibleEnforcePolicy, 3145).
+-define(wxStyledTextCtrl_SetTabIndents, 3146).
+-define(wxStyledTextCtrl_GetTabIndents, 3147).
+-define(wxStyledTextCtrl_SetBackSpaceUnIndents, 3148).
+-define(wxStyledTextCtrl_GetBackSpaceUnIndents, 3149).
+-define(wxStyledTextCtrl_SetMouseDwellTime, 3150).
+-define(wxStyledTextCtrl_GetMouseDwellTime, 3151).
+-define(wxStyledTextCtrl_WordStartPosition, 3152).
+-define(wxStyledTextCtrl_WordEndPosition, 3153).
+-define(wxStyledTextCtrl_SetWrapMode, 3154).
+-define(wxStyledTextCtrl_GetWrapMode, 3155).
+-define(wxStyledTextCtrl_SetWrapVisualFlags, 3156).
+-define(wxStyledTextCtrl_GetWrapVisualFlags, 3157).
+-define(wxStyledTextCtrl_SetWrapVisualFlagsLocation, 3158).
+-define(wxStyledTextCtrl_GetWrapVisualFlagsLocation, 3159).
+-define(wxStyledTextCtrl_SetWrapStartIndent, 3160).
+-define(wxStyledTextCtrl_GetWrapStartIndent, 3161).
+-define(wxStyledTextCtrl_SetLayoutCache, 3162).
+-define(wxStyledTextCtrl_GetLayoutCache, 3163).
+-define(wxStyledTextCtrl_SetScrollWidth, 3164).
+-define(wxStyledTextCtrl_GetScrollWidth, 3165).
+-define(wxStyledTextCtrl_TextWidth, 3166).
+-define(wxStyledTextCtrl_GetEndAtLastLine, 3167).
+-define(wxStyledTextCtrl_TextHeight, 3168).
+-define(wxStyledTextCtrl_SetUseVerticalScrollBar, 3169).
+-define(wxStyledTextCtrl_GetUseVerticalScrollBar, 3170).
+-define(wxStyledTextCtrl_AppendText, 3171).
+-define(wxStyledTextCtrl_GetTwoPhaseDraw, 3172).
+-define(wxStyledTextCtrl_SetTwoPhaseDraw, 3173).
+-define(wxStyledTextCtrl_TargetFromSelection, 3174).
+-define(wxStyledTextCtrl_LinesJoin, 3175).
+-define(wxStyledTextCtrl_LinesSplit, 3176).
+-define(wxStyledTextCtrl_SetFoldMarginColour, 3177).
+-define(wxStyledTextCtrl_SetFoldMarginHiColour, 3178).
+-define(wxStyledTextCtrl_LineDown, 3179).
+-define(wxStyledTextCtrl_LineDownExtend, 3180).
+-define(wxStyledTextCtrl_LineUp, 3181).
+-define(wxStyledTextCtrl_LineUpExtend, 3182).
+-define(wxStyledTextCtrl_CharLeft, 3183).
+-define(wxStyledTextCtrl_CharLeftExtend, 3184).
+-define(wxStyledTextCtrl_CharRight, 3185).
+-define(wxStyledTextCtrl_CharRightExtend, 3186).
+-define(wxStyledTextCtrl_WordLeft, 3187).
+-define(wxStyledTextCtrl_WordLeftExtend, 3188).
+-define(wxStyledTextCtrl_WordRight, 3189).
+-define(wxStyledTextCtrl_WordRightExtend, 3190).
+-define(wxStyledTextCtrl_Home, 3191).
+-define(wxStyledTextCtrl_HomeExtend, 3192).
+-define(wxStyledTextCtrl_LineEnd, 3193).
+-define(wxStyledTextCtrl_LineEndExtend, 3194).
+-define(wxStyledTextCtrl_DocumentStart, 3195).
+-define(wxStyledTextCtrl_DocumentStartExtend, 3196).
+-define(wxStyledTextCtrl_DocumentEnd, 3197).
+-define(wxStyledTextCtrl_DocumentEndExtend, 3198).
+-define(wxStyledTextCtrl_PageUp, 3199).
+-define(wxStyledTextCtrl_PageUpExtend, 3200).
+-define(wxStyledTextCtrl_PageDown, 3201).
+-define(wxStyledTextCtrl_PageDownExtend, 3202).
+-define(wxStyledTextCtrl_EditToggleOvertype, 3203).
+-define(wxStyledTextCtrl_Cancel, 3204).
+-define(wxStyledTextCtrl_DeleteBack, 3205).
+-define(wxStyledTextCtrl_Tab, 3206).
+-define(wxStyledTextCtrl_BackTab, 3207).
+-define(wxStyledTextCtrl_NewLine, 3208).
+-define(wxStyledTextCtrl_FormFeed, 3209).
+-define(wxStyledTextCtrl_VCHome, 3210).
+-define(wxStyledTextCtrl_VCHomeExtend, 3211).
+-define(wxStyledTextCtrl_ZoomIn, 3212).
+-define(wxStyledTextCtrl_ZoomOut, 3213).
+-define(wxStyledTextCtrl_DelWordLeft, 3214).
+-define(wxStyledTextCtrl_DelWordRight, 3215).
+-define(wxStyledTextCtrl_LineCut, 3216).
+-define(wxStyledTextCtrl_LineDelete, 3217).
+-define(wxStyledTextCtrl_LineTranspose, 3218).
+-define(wxStyledTextCtrl_LineDuplicate, 3219).
+-define(wxStyledTextCtrl_LowerCase, 3220).
+-define(wxStyledTextCtrl_UpperCase, 3221).
+-define(wxStyledTextCtrl_LineScrollDown, 3222).
+-define(wxStyledTextCtrl_LineScrollUp, 3223).
+-define(wxStyledTextCtrl_DeleteBackNotLine, 3224).
+-define(wxStyledTextCtrl_HomeDisplay, 3225).
+-define(wxStyledTextCtrl_HomeDisplayExtend, 3226).
+-define(wxStyledTextCtrl_LineEndDisplay, 3227).
+-define(wxStyledTextCtrl_LineEndDisplayExtend, 3228).
+-define(wxStyledTextCtrl_HomeWrapExtend, 3229).
+-define(wxStyledTextCtrl_LineEndWrap, 3230).
+-define(wxStyledTextCtrl_LineEndWrapExtend, 3231).
+-define(wxStyledTextCtrl_VCHomeWrap, 3232).
+-define(wxStyledTextCtrl_VCHomeWrapExtend, 3233).
+-define(wxStyledTextCtrl_LineCopy, 3234).
+-define(wxStyledTextCtrl_MoveCaretInsideView, 3235).
+-define(wxStyledTextCtrl_LineLength, 3236).
+-define(wxStyledTextCtrl_BraceHighlight, 3237).
+-define(wxStyledTextCtrl_BraceBadLight, 3238).
+-define(wxStyledTextCtrl_BraceMatch, 3239).
+-define(wxStyledTextCtrl_GetViewEOL, 3240).
+-define(wxStyledTextCtrl_SetViewEOL, 3241).
+-define(wxStyledTextCtrl_SetModEventMask, 3242).
+-define(wxStyledTextCtrl_GetEdgeColumn, 3243).
+-define(wxStyledTextCtrl_SetEdgeColumn, 3244).
+-define(wxStyledTextCtrl_SetEdgeMode, 3245).
+-define(wxStyledTextCtrl_GetEdgeMode, 3246).
+-define(wxStyledTextCtrl_GetEdgeColour, 3247).
+-define(wxStyledTextCtrl_SetEdgeColour, 3248).
+-define(wxStyledTextCtrl_SearchAnchor, 3249).
+-define(wxStyledTextCtrl_SearchNext, 3250).
+-define(wxStyledTextCtrl_SearchPrev, 3251).
+-define(wxStyledTextCtrl_LinesOnScreen, 3252).
+-define(wxStyledTextCtrl_UsePopUp, 3253).
+-define(wxStyledTextCtrl_SelectionIsRectangle, 3254).
+-define(wxStyledTextCtrl_SetZoom, 3255).
+-define(wxStyledTextCtrl_GetZoom, 3256).
+-define(wxStyledTextCtrl_GetModEventMask, 3257).
+-define(wxStyledTextCtrl_SetSTCFocus, 3258).
+-define(wxStyledTextCtrl_GetSTCFocus, 3259).
+-define(wxStyledTextCtrl_SetStatus, 3260).
+-define(wxStyledTextCtrl_GetStatus, 3261).
+-define(wxStyledTextCtrl_SetMouseDownCaptures, 3262).
+-define(wxStyledTextCtrl_GetMouseDownCaptures, 3263).
+-define(wxStyledTextCtrl_SetSTCCursor, 3264).
+-define(wxStyledTextCtrl_GetSTCCursor, 3265).
+-define(wxStyledTextCtrl_SetControlCharSymbol, 3266).
+-define(wxStyledTextCtrl_GetControlCharSymbol, 3267).
+-define(wxStyledTextCtrl_WordPartLeft, 3268).
+-define(wxStyledTextCtrl_WordPartLeftExtend, 3269).
+-define(wxStyledTextCtrl_WordPartRight, 3270).
+-define(wxStyledTextCtrl_WordPartRightExtend, 3271).
+-define(wxStyledTextCtrl_SetVisiblePolicy, 3272).
+-define(wxStyledTextCtrl_DelLineLeft, 3273).
+-define(wxStyledTextCtrl_DelLineRight, 3274).
+-define(wxStyledTextCtrl_GetXOffset, 3275).
+-define(wxStyledTextCtrl_ChooseCaretX, 3276).
+-define(wxStyledTextCtrl_SetXCaretPolicy, 3277).
+-define(wxStyledTextCtrl_SetYCaretPolicy, 3278).
+-define(wxStyledTextCtrl_GetPrintWrapMode, 3279).
+-define(wxStyledTextCtrl_SetHotspotActiveForeground, 3280).
+-define(wxStyledTextCtrl_SetHotspotActiveBackground, 3281).
+-define(wxStyledTextCtrl_SetHotspotActiveUnderline, 3282).
+-define(wxStyledTextCtrl_SetHotspotSingleLine, 3283).
+-define(wxStyledTextCtrl_ParaDownExtend, 3284).
+-define(wxStyledTextCtrl_ParaUp, 3285).
+-define(wxStyledTextCtrl_ParaUpExtend, 3286).
+-define(wxStyledTextCtrl_PositionBefore, 3287).
+-define(wxStyledTextCtrl_PositionAfter, 3288).
+-define(wxStyledTextCtrl_CopyRange, 3289).
+-define(wxStyledTextCtrl_CopyText, 3290).
+-define(wxStyledTextCtrl_SetSelectionMode, 3291).
+-define(wxStyledTextCtrl_GetSelectionMode, 3292).
+-define(wxStyledTextCtrl_LineDownRectExtend, 3293).
+-define(wxStyledTextCtrl_LineUpRectExtend, 3294).
+-define(wxStyledTextCtrl_CharLeftRectExtend, 3295).
+-define(wxStyledTextCtrl_CharRightRectExtend, 3296).
+-define(wxStyledTextCtrl_HomeRectExtend, 3297).
+-define(wxStyledTextCtrl_VCHomeRectExtend, 3298).
+-define(wxStyledTextCtrl_LineEndRectExtend, 3299).
+-define(wxStyledTextCtrl_PageUpRectExtend, 3300).
+-define(wxStyledTextCtrl_PageDownRectExtend, 3301).
+-define(wxStyledTextCtrl_StutteredPageUp, 3302).
+-define(wxStyledTextCtrl_StutteredPageUpExtend, 3303).
+-define(wxStyledTextCtrl_StutteredPageDown, 3304).
+-define(wxStyledTextCtrl_StutteredPageDownExtend, 3305).
+-define(wxStyledTextCtrl_WordLeftEnd, 3306).
+-define(wxStyledTextCtrl_WordLeftEndExtend, 3307).
+-define(wxStyledTextCtrl_WordRightEnd, 3308).
+-define(wxStyledTextCtrl_WordRightEndExtend, 3309).
+-define(wxStyledTextCtrl_SetWhitespaceChars, 3310).
+-define(wxStyledTextCtrl_SetCharsDefault, 3311).
+-define(wxStyledTextCtrl_AutoCompGetCurrent, 3312).
+-define(wxStyledTextCtrl_Allocate, 3313).
+-define(wxStyledTextCtrl_FindColumn, 3314).
+-define(wxStyledTextCtrl_GetCaretSticky, 3315).
+-define(wxStyledTextCtrl_SetCaretSticky, 3316).
+-define(wxStyledTextCtrl_ToggleCaretSticky, 3317).
+-define(wxStyledTextCtrl_SetPasteConvertEndings, 3318).
+-define(wxStyledTextCtrl_GetPasteConvertEndings, 3319).
+-define(wxStyledTextCtrl_SelectionDuplicate, 3320).
+-define(wxStyledTextCtrl_SetCaretLineBackAlpha, 3321).
+-define(wxStyledTextCtrl_GetCaretLineBackAlpha, 3322).
+-define(wxStyledTextCtrl_StartRecord, 3323).
+-define(wxStyledTextCtrl_StopRecord, 3324).
+-define(wxStyledTextCtrl_SetLexer, 3325).
+-define(wxStyledTextCtrl_GetLexer, 3326).
+-define(wxStyledTextCtrl_Colourise, 3327).
+-define(wxStyledTextCtrl_SetProperty, 3328).
+-define(wxStyledTextCtrl_SetKeyWords, 3329).
+-define(wxStyledTextCtrl_SetLexerLanguage, 3330).
+-define(wxStyledTextCtrl_GetProperty, 3331).
+-define(wxStyledTextCtrl_GetStyleBitsNeeded, 3332).
+-define(wxStyledTextCtrl_GetCurrentLine, 3333).
+-define(wxStyledTextCtrl_StyleSetSpec, 3334).
+-define(wxStyledTextCtrl_StyleSetFont, 3335).
+-define(wxStyledTextCtrl_StyleSetFontAttr, 3336).
+-define(wxStyledTextCtrl_StyleSetCharacterSet, 3337).
+-define(wxStyledTextCtrl_StyleSetFontEncoding, 3338).
+-define(wxStyledTextCtrl_CmdKeyExecute, 3339).
+-define(wxStyledTextCtrl_SetMargins, 3340).
+-define(wxStyledTextCtrl_GetSelection, 3341).
+-define(wxStyledTextCtrl_PointFromPosition, 3342).
+-define(wxStyledTextCtrl_ScrollToLine, 3343).
+-define(wxStyledTextCtrl_ScrollToColumn, 3344).
+-define(wxStyledTextCtrl_SetVScrollBar, 3345).
+-define(wxStyledTextCtrl_SetHScrollBar, 3346).
+-define(wxStyledTextCtrl_GetLastKeydownProcessed, 3347).
+-define(wxStyledTextCtrl_SetLastKeydownProcessed, 3348).
+-define(wxStyledTextCtrl_SaveFile, 3349).
+-define(wxStyledTextCtrl_LoadFile, 3350).
+-define(wxStyledTextCtrl_DoDragOver, 3351).
+-define(wxStyledTextCtrl_DoDropText, 3352).
+-define(wxStyledTextCtrl_GetUseAntiAliasing, 3353).
+-define(wxStyledTextCtrl_AddTextRaw, 3354).
+-define(wxStyledTextCtrl_InsertTextRaw, 3355).
+-define(wxStyledTextCtrl_GetCurLineRaw, 3356).
+-define(wxStyledTextCtrl_GetLineRaw, 3357).
+-define(wxStyledTextCtrl_GetSelectedTextRaw, 3358).
+-define(wxStyledTextCtrl_GetTextRangeRaw, 3359).
+-define(wxStyledTextCtrl_SetTextRaw, 3360).
+-define(wxStyledTextCtrl_GetTextRaw, 3361).
+-define(wxStyledTextCtrl_AppendTextRaw, 3362).
+-define(wxArtProvider_GetBitmap, 3363).
+-define(wxArtProvider_GetIcon, 3364).
+-define(wxTreeEvent_GetKeyCode, 3365).
+-define(wxTreeEvent_GetItem, 3366).
+-define(wxTreeEvent_GetKeyEvent, 3367).
+-define(wxTreeEvent_GetLabel, 3368).
+-define(wxTreeEvent_GetOldItem, 3369).
+-define(wxTreeEvent_GetPoint, 3370).
+-define(wxTreeEvent_IsEditCancelled, 3371).
+-define(wxTreeEvent_SetToolTip, 3372).
+-define(wxBookCtrlEvent_GetOldSelection, 3373).
+-define(wxBookCtrlEvent_GetSelection, 3374).
+-define(wxBookCtrlEvent_SetOldSelection, 3375).
+-define(wxBookCtrlEvent_SetSelection, 3376).
+-define(wxFileDataObject_new, 3377).
+-define(wxFileDataObject_AddFile, 3378).
+-define(wxFileDataObject_GetFilenames, 3379).
+-define(wxFileDataObject_destroy, 3380).
+-define(wxTextDataObject_new, 3381).
+-define(wxTextDataObject_GetTextLength, 3382).
+-define(wxTextDataObject_GetText, 3383).
+-define(wxTextDataObject_SetText, 3384).
+-define(wxTextDataObject_destroy, 3385).
+-define(wxBitmapDataObject_new_1_1, 3386).
+-define(wxBitmapDataObject_new_1_0, 3387).
+-define(wxBitmapDataObject_GetBitmap, 3388).
+-define(wxBitmapDataObject_SetBitmap, 3389).
+-define(wxBitmapDataObject_destroy, 3390).
+-define(wxClipboard_new, 3391).
+-define(wxClipboard_destruct, 3392).
+-define(wxClipboard_AddData, 3393).
+-define(wxClipboard_Clear, 3394).
+-define(wxClipboard_Close, 3395).
+-define(wxClipboard_Flush, 3396).
+-define(wxClipboard_GetData, 3397).
+-define(wxClipboard_IsOpened, 3398).
+-define(wxClipboard_Open, 3399).
+-define(wxClipboard_SetData, 3400).
+-define(wxClipboard_UsePrimarySelection, 3401).
+-define(wxClipboard_IsSupported, 3402).
+-define(wxClipboard_Get, 3403).
+-define(wxSpinEvent_GetPosition, 3404).
+-define(wxSpinEvent_SetPosition, 3405).
+-define(wxSplitterWindow_new_0, 3406).
+-define(wxSplitterWindow_new_2, 3407).
+-define(wxSplitterWindow_destruct, 3408).
+-define(wxSplitterWindow_Create, 3409).
+-define(wxSplitterWindow_GetMinimumPaneSize, 3410).
+-define(wxSplitterWindow_GetSashGravity, 3411).
+-define(wxSplitterWindow_GetSashPosition, 3412).
+-define(wxSplitterWindow_GetSplitMode, 3413).
+-define(wxSplitterWindow_GetWindow1, 3414).
+-define(wxSplitterWindow_GetWindow2, 3415).
+-define(wxSplitterWindow_Initialize, 3416).
+-define(wxSplitterWindow_IsSplit, 3417).
+-define(wxSplitterWindow_ReplaceWindow, 3418).
+-define(wxSplitterWindow_SetSashGravity, 3419).
+-define(wxSplitterWindow_SetSashPosition, 3420).
+-define(wxSplitterWindow_SetMinimumPaneSize, 3421).
+-define(wxSplitterWindow_SetSplitMode, 3422).
+-define(wxSplitterWindow_SplitHorizontally, 3423).
+-define(wxSplitterWindow_SplitVertically, 3424).
+-define(wxSplitterWindow_Unsplit, 3425).
+-define(wxSplitterWindow_UpdateSize, 3426).
+-define(wxSplitterEvent_GetSashPosition, 3427).
+-define(wxSplitterEvent_GetX, 3428).
+-define(wxSplitterEvent_GetY, 3429).
+-define(wxSplitterEvent_GetWindowBeingRemoved, 3430).
+-define(wxSplitterEvent_SetSashPosition, 3431).
+-define(wxHtmlWindow_new_0, 3432).
+-define(wxHtmlWindow_new_2, 3433).
+-define(wxHtmlWindow_AppendToPage, 3434).
+-define(wxHtmlWindow_GetOpenedAnchor, 3435).
+-define(wxHtmlWindow_GetOpenedPage, 3436).
+-define(wxHtmlWindow_GetOpenedPageTitle, 3437).
+-define(wxHtmlWindow_GetRelatedFrame, 3438).
+-define(wxHtmlWindow_HistoryBack, 3439).
+-define(wxHtmlWindow_HistoryCanBack, 3440).
+-define(wxHtmlWindow_HistoryCanForward, 3441).
+-define(wxHtmlWindow_HistoryClear, 3442).
+-define(wxHtmlWindow_HistoryForward, 3443).
+-define(wxHtmlWindow_LoadFile, 3444).
+-define(wxHtmlWindow_LoadPage, 3445).
+-define(wxHtmlWindow_SelectAll, 3446).
+-define(wxHtmlWindow_SelectionToText, 3447).
+-define(wxHtmlWindow_SelectLine, 3448).
+-define(wxHtmlWindow_SelectWord, 3449).
+-define(wxHtmlWindow_SetBorders, 3450).
+-define(wxHtmlWindow_SetFonts, 3451).
+-define(wxHtmlWindow_SetPage, 3452).
+-define(wxHtmlWindow_SetRelatedFrame, 3453).
+-define(wxHtmlWindow_SetRelatedStatusBar_1, 3454).
+-define(wxHtmlWindow_SetRelatedStatusBar_2, 3455).
+-define(wxHtmlWindow_ToText, 3456).
+-define(wxHtmlWindow_destroy, 3457).
+-define(wxHtmlLinkEvent_GetLinkInfo, 3458).
+-define(wxSystemSettings_GetColour, 3459).
+-define(wxSystemSettings_GetFont, 3460).
+-define(wxSystemSettings_GetMetric, 3461).
+-define(wxSystemSettings_GetScreenType, 3462).
+-define(wxSystemOptions_GetOption, 3463).
+-define(wxSystemOptions_GetOptionInt, 3464).
+-define(wxSystemOptions_HasOption, 3465).
+-define(wxSystemOptions_IsFalse, 3466).
+-define(wxSystemOptions_SetOption_2_1, 3467).
+-define(wxSystemOptions_SetOption_2_0, 3468).
+-define(wxAuiNotebookEvent_SetSelection, 3469).
+-define(wxAuiNotebookEvent_GetSelection, 3470).
+-define(wxAuiNotebookEvent_SetOldSelection, 3471).
+-define(wxAuiNotebookEvent_GetOldSelection, 3472).
+-define(wxAuiNotebookEvent_SetDragSource, 3473).
+-define(wxAuiNotebookEvent_GetDragSource, 3474).
+-define(wxAuiManagerEvent_SetManager, 3475).
+-define(wxAuiManagerEvent_GetManager, 3476).
+-define(wxAuiManagerEvent_SetPane, 3477).
+-define(wxAuiManagerEvent_GetPane, 3478).
+-define(wxAuiManagerEvent_SetButton, 3479).
+-define(wxAuiManagerEvent_GetButton, 3480).
+-define(wxAuiManagerEvent_SetDC, 3481).
+-define(wxAuiManagerEvent_GetDC, 3482).
+-define(wxAuiManagerEvent_Veto, 3483).
+-define(wxAuiManagerEvent_GetVeto, 3484).
+-define(wxAuiManagerEvent_SetCanVeto, 3485).
+-define(wxAuiManagerEvent_CanVeto, 3486).
+-define(wxLogNull_new, 3487).
+-define(wxLogNull_destruct, 3488).
+-define(wxTaskBarIcon_new, 3489).
+-define(wxTaskBarIcon_destruct, 3490).
+-define(wxTaskBarIcon_PopupMenu, 3491).
+-define(wxTaskBarIcon_RemoveIcon, 3492).
+-define(wxTaskBarIcon_SetIcon, 3493).
+-define(wxLocale_new_0, 3494).
+-define(wxLocale_new_2_0, 3495).
+-define(wxLocale_new_2_1, 3496).
+-define(wxLocale_destruct, 3497).
+-define(wxLocale_Init_1, 3498).
+-define(wxLocale_Init_2, 3499).
+-define(wxLocale_AddCatalog_1, 3500).
+-define(wxLocale_AddCatalog_2, 3501).
+-define(wxLocale_AddCatalog_3, 3502).
+-define(wxLocale_AddCatalogLookupPathPrefix, 3503).
+-define(wxLocale_GetCanonicalName, 3504).
+-define(wxLocale_GetLanguage, 3505).
+-define(wxLocale_GetLanguageName, 3506).
+-define(wxLocale_GetLocale, 3507).
+-define(wxLocale_GetName, 3508).
+-define(wxLocale_GetString_2, 3509).
+-define(wxLocale_GetString_4, 3510).
+-define(wxLocale_GetHeaderValue, 3511).
+-define(wxLocale_GetSysName, 3512).
+-define(wxLocale_GetSystemEncoding, 3513).
+-define(wxLocale_GetSystemEncodingName, 3514).
+-define(wxLocale_GetSystemLanguage, 3515).
+-define(wxLocale_IsLoaded, 3516).
+-define(wxLocale_IsOk, 3517).
+-define(wxActivateEvent_GetActive, 3518).
+-define(wxPopupWindow_new_0, 3519).
+-define(wxPopupWindow_new_2, 3520).
+-define(wxPopupWindow_Create, 3521).
+-define(wxPopupWindow_Position, 3522).
+-define(wxPopupWindow_destroy, 3523).
+-define(wxPopupTransientWindow_new_0, 3524).
+-define(wxPopupTransientWindow_new_2, 3525).
+-define(wxPopupTransientWindow_Popup, 3526).
+-define(wxPopupTransientWindow_Dismiss, 3527).
+-define(wxPopupTransientWindow_destroy, 3528).
+-define(wxOverlay_new, 3529).
+-define(wxOverlay_destruct, 3530).
+-define(wxOverlay_Reset, 3531).
+-define(wxDCOverlay_new_6, 3532).
+-define(wxDCOverlay_new_2, 3533).
+-define(wxDCOverlay_destruct, 3534).
+-define(wxDCOverlay_Clear, 3535).
+-define(wxDropFilesEvent_GetPosition, 3536).
+-define(wxDropFilesEvent_GetNumberOfFiles, 3537).
+-define(wxDropFilesEvent_GetFiles, 3538).
+-define(wxDisplay_new_0, 3539).
+-define(wxDisplay_new_1_0, 3540).
+-define(wxDisplay_new_1_1, 3541).
+-define(wxDisplay_destruct, 3542).
+-define(wxDisplay_IsOk, 3543).
+-define(wxDisplay_GetClientArea, 3544).
+-define(wxDisplay_GetGeometry, 3545).
+-define(wxDisplay_GetName, 3546).
+-define(wxDisplay_IsPrimary, 3547).
+-define(wxDisplay_GetCount, 3548).
+-define(wxDisplay_GetFromPoint, 3549).
+-define(wxDisplay_GetFromWindow, 3550).
+-define(wxDisplay_GetPPI, 3551).
+-define(wxGCDC_new_1, 3552).
+-define(wxGCDC_new_0, 3555).
+-define(wxGCDC_destruct, 3556).
+-define(wxGCDC_GetGraphicsContext, 3557).
+-define(wxGCDC_SetGraphicsContext, 3558).
+-define(wxNotificationMessage_new_0, 3559).
+-define(wxNotificationMessage_new_2, 3560).
+-define(wxNotificationMessage_destruct, 3561).
+-define(wxNotificationMessage_AddAction, 3562).
+-define(wxNotificationMessage_Close, 3563).
+-define(wxNotificationMessage_SetFlags, 3564).
+-define(wxNotificationMessage_SetIcon, 3565).
+-define(wxNotificationMessage_SetMessage, 3566).
+-define(wxNotificationMessage_SetParent, 3567).
+-define(wxNotificationMessage_SetTitle, 3568).
+-define(wxNotificationMessage_Show, 3569).
+-define(wxNotificationMessage_UseTaskBarIcon, 3570).
+-define(wxNotificationMessage_MSWUseToasts, 3571).
+-define(wxWebView_New, 3573).
+-define(wxWebView_GetCurrentTitle, 3574).
+-define(wxWebView_GetCurrentURL, 3575).
+-define(wxWebView_GetPageSource, 3576).
+-define(wxWebView_GetPageText, 3577).
+-define(wxWebView_IsBusy, 3578).
+-define(wxWebView_IsEditable, 3579).
+-define(wxWebView_LoadURL, 3580).
+-define(wxWebView_Print, 3581).
+-define(wxWebView_Reload, 3582).
+-define(wxWebView_RunScript, 3583).
+-define(wxWebView_SetEditable, 3584).
+-define(wxWebView_SetPage, 3585).
+-define(wxWebView_Stop, 3586).
+-define(wxWebView_CanCopy, 3587).
+-define(wxWebView_CanCut, 3588).
+-define(wxWebView_CanPaste, 3589).
+-define(wxWebView_Copy, 3590).
+-define(wxWebView_Cut, 3591).
+-define(wxWebView_Paste, 3592).
+-define(wxWebView_EnableContextMenu, 3593).
+-define(wxWebView_IsContextMenuEnabled, 3594).
+-define(wxWebView_CanGoBack, 3595).
+-define(wxWebView_CanGoForward, 3596).
+-define(wxWebView_ClearHistory, 3597).
+-define(wxWebView_EnableHistory, 3598).
+-define(wxWebView_GoBack, 3599).
+-define(wxWebView_GoForward, 3600).
+-define(wxWebView_ClearSelection, 3601).
+-define(wxWebView_DeleteSelection, 3602).
+-define(wxWebView_GetSelectedSource, 3603).
+-define(wxWebView_GetSelectedText, 3604).
+-define(wxWebView_HasSelection, 3605).
+-define(wxWebView_SelectAll, 3606).
+-define(wxWebView_CanRedo, 3607).
+-define(wxWebView_CanUndo, 3608).
+-define(wxWebView_Redo, 3609).
+-define(wxWebView_Undo, 3610).
+-define(wxWebView_Find, 3611).
+-define(wxWebView_CanSetZoomType, 3612).
+-define(wxWebView_GetZoom, 3613).
+-define(wxWebView_GetZoomType, 3614).
+-define(wxWebView_SetZoom, 3615).
+-define(wxWebView_SetZoomType, 3616).
+-define(wxWebView_GetZoomFactor, 3617).
+-define(wxWebView_SetZoomFactor, 3618).
+-define(wxWebView_IsBackendAvailable, 3619).
+-define(wxWebViewEvent_GetString, 3620).
+-define(wxWebViewEvent_GetInt, 3621).
+-define(wxWebViewEvent_GetTarget, 3622).
+-define(wxWebViewEvent_GetURL, 3623).
diff --git a/lib/wx/src/wxe.hrl b/lib/wx/src/wxe.hrl
index 85de9e8f9a..d45210da3a 100644
--- a/lib/wx/src/wxe.hrl
+++ b/lib/wx/src/wxe.hrl
@@ -53,6 +53,8 @@
-define(F, float-native).
-define(is_chardata(String), (is_list(String) orelse is_binary(String))).
+-define(is_colordata(Col), ( (tuple_size(Col) =:= 3 orelse tuple_size(Col) =:= 4)
+ andalso is_integer(element(1, Col)) ) ).
-define(BATCH_BEGIN, 5).
-define(BATCH_END, 6).
diff --git a/system/doc/design_principles/events.xml b/system/doc/design_principles/events.xml
index c2196c6758..3b13c6a0cd 100644
--- a/system/doc/design_principles/events.xml
+++ b/system/doc/design_principles/events.xml
@@ -224,7 +224,7 @@ ok</pre>
<title>Handling Other Messages</title>
<p>If the <c>gen_event</c> is to be able to receive other messages
than events, the callback function
- <c>handle_info(Info, StateName, StateData)</c>
+ <c>handle_info(Info, State)</c>
must be implemented to handle them. Examples of other
messages are exit messages, if the <c>gen_event</c> is linked to
other processes (than the supervisor) and trapping exit signals.</p>