diff options
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> |