Filename | /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/idtglobal.pm |
Statements | Executed 2673947550 statements in 6494s |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
58752 | 3 | 2 | 3373s | 4070s | get_language_block_from_language_file | installer::windows::idtglobal::
105730 | 3 | 1 | 2196s | 2196s | get_next_free_number | installer::windows::idtglobal::
485110314 | 7 | 1 | 385s | 385s | CORE:regcomp (opcode) | installer::windows::idtglobal::
492176334 | 23 | 1 | 321s | 321s | CORE:match (opcode) | installer::windows::idtglobal::
4360 | 1 | 1 | 115s | 115s | set_custom_action | installer::windows::idtglobal::
109 | 1 | 1 | 29.1s | 65.0s | setencoding | installer::windows::idtglobal::
58752 | 3 | 2 | 24.0s | 29.1s | get_language_string_from_language_block | installer::windows::idtglobal::
3706 | 1 | 1 | 12.5s | 12.8s | add_custom_action_to_install_table | installer::windows::idtglobal::
375961 | 6 | 4 | 10.7s | 13.5s | shorten_feature_gid | installer::windows::idtglobal::
9988397 | 43 | 1 | 7.65s | 7.65s | CORE:subst (opcode) | installer::windows::idtglobal::
14217 | 6 | 1 | 6.78s | 6.78s | get_next_free_number_with_hash | installer::windows::idtglobal::
872 | 1 | 1 | 5.04s | 4106s | translate_idtfile | installer::windows::idtglobal::
202522 | 4 | 2 | 4.44s | 2201s | make_eight_three_conform | installer::windows::idtglobal::
2943 | 1 | 1 | 1.02s | 1.34s | get_customaction_position | installer::windows::idtglobal::
15888 | 1 | 1 | 610ms | 7.57s | make_eight_three_conform_with_hash | installer::windows::idtglobal::
4251 | 4 | 1 | 461ms | 716ms | fill_assignment_hash | installer::windows::idtglobal::
109 | 1 | 1 | 447ms | 132s | addcustomactions | installer::windows::idtglobal::
327 | 3 | 1 | 423ms | 2.04s | set_positions_in_table | installer::windows::idtglobal::
109 | 1 | 1 | 164ms | 358ms | set_multilanguageonly_condition | installer::windows::idtglobal::
327 | 1 | 1 | 129ms | 170ms | get_last_position_in_sequencetable | installer::windows::idtglobal::
4251 | 1 | 1 | 121ms | 923ms | create_customaction_assignment_hash | installer::windows::idtglobal::
109 | 1 | 1 | 31.7ms | 26.6s | prepare_language_idt_directory | installer::windows::idtglobal::
218 | 2 | 1 | 27.0ms | 27.0ms | CORE:ftdir (opcode) | installer::windows::idtglobal::
4 | 1 | 1 | 25.8ms | 43.9ms | setbidiattributes | installer::windows::idtglobal::
872 | 1 | 1 | 16.7ms | 22.6ms | get_languagefilename | installer::windows::idtglobal::
449 | 17 | 14 | 12.4ms | 12.4ms | write_idt_header | installer::windows::idtglobal::
545 | 1 | 1 | 10.5ms | 20.3ms | connect_custom_action_to_control | installer::windows::idtglobal::
218 | 2 | 1 | 9.35ms | 9.35ms | CORE:sort (opcode) | installer::windows::idtglobal::
1 | 1 | 1 | 417µs | 516µs | BEGIN@30 | installer::windows::idtglobal::
1 | 1 | 1 | 19µs | 21µs | BEGIN@34 | installer::windows::idtglobal::
1 | 1 | 1 | 18µs | 20µs | BEGIN@37 | installer::windows::idtglobal::
1 | 1 | 1 | 17µs | 20µs | BEGIN@31 | installer::windows::idtglobal::
1 | 1 | 1 | 17µs | 19µs | BEGIN@36 | installer::windows::idtglobal::
1 | 1 | 1 | 17µs | 19µs | BEGIN@39 | installer::windows::idtglobal::
1 | 1 | 1 | 15µs | 18µs | BEGIN@35 | installer::windows::idtglobal::
1 | 1 | 1 | 15µs | 17µs | BEGIN@38 | installer::windows::idtglobal::
1 | 1 | 1 | 14µs | 16µs | BEGIN@32 | installer::windows::idtglobal::
1 | 1 | 1 | 13µs | 15µs | BEGIN@33 | installer::windows::idtglobal::
0 | 0 | 0 | 0s | 0s | add_licensefile_to_database | installer::windows::idtglobal::
0 | 0 | 0 | 0s | 0s | connect_condition_to_control | installer::windows::idtglobal::
0 | 0 | 0 | 0s | 0s | get_code_from_code_block | installer::windows::idtglobal::
0 | 0 | 0 | 0s | 0s | get_free_number_in_uisequence_table | installer::windows::idtglobal::
0 | 0 | 0 | 0s | 0s | get_position_in_sequencetable | installer::windows::idtglobal::
0 | 0 | 0 | 0s | 0s | get_rtflicensefilesource | installer::windows::idtglobal::
0 | 0 | 0 | 0s | 0s | include_subdir_into_componenttable | installer::windows::idtglobal::
0 | 0 | 0 | 0s | 0s | include_subdirname_into_directory_table | installer::windows::idtglobal::
0 | 0 | 0 | 0s | 0s | make_string_licensetext | installer::windows::idtglobal::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | #************************************************************************* | ||||
2 | # | ||||
3 | # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | ||||
4 | # | ||||
5 | # Copyright 2000, 2010 Oracle and/or its affiliates. | ||||
6 | # | ||||
7 | # OpenOffice.org - a multi-platform office productivity suite | ||||
8 | # | ||||
9 | # This file is part of OpenOffice.org. | ||||
10 | # | ||||
11 | # OpenOffice.org is free software: you can redistribute it and/or modify | ||||
12 | # it under the terms of the GNU Lesser General Public License version 3 | ||||
13 | # only, as published by the Free Software Foundation. | ||||
14 | # | ||||
15 | # OpenOffice.org is distributed in the hope that it will be useful, | ||||
16 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
17 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
18 | # GNU Lesser General Public License version 3 for more details | ||||
19 | # (a copy is included in the LICENSE file that accompanied this code). | ||||
20 | # | ||||
21 | # You should have received a copy of the GNU Lesser General Public License | ||||
22 | # version 3 along with OpenOffice.org. If not, see | ||||
23 | # <http://www.openoffice.org/license.html> | ||||
24 | # for a copy of the LGPLv3 License. | ||||
25 | # | ||||
26 | #************************************************************************* | ||||
27 | |||||
28 | package installer::windows::idtglobal; | ||||
29 | |||||
30 | 2 | 64µs | 2 | 615µs | # spent 516µs (417+99) within installer::windows::idtglobal::BEGIN@30 which was called:
# once (417µs+99µs) by installer::windows::assembly::BEGIN@33 at line 30 # spent 516µs making 1 call to installer::windows::idtglobal::BEGIN@30
# spent 99µs making 1 call to Exporter::import |
31 | 2 | 56µs | 2 | 23µs | # spent 20µs (17+3) within installer::windows::idtglobal::BEGIN@31 which was called:
# once (17µs+3µs) by installer::windows::assembly::BEGIN@33 at line 31 # spent 20µs making 1 call to installer::windows::idtglobal::BEGIN@31
# spent 3µs making 1 call to UNIVERSAL::import |
32 | 2 | 53µs | 2 | 18µs | # spent 16µs (14+2) within installer::windows::idtglobal::BEGIN@32 which was called:
# once (14µs+2µs) by installer::windows::assembly::BEGIN@33 at line 32 # spent 16µs making 1 call to installer::windows::idtglobal::BEGIN@32
# spent 2µs making 1 call to UNIVERSAL::import |
33 | 2 | 54µs | 2 | 17µs | # spent 15µs (13+2) within installer::windows::idtglobal::BEGIN@33 which was called:
# once (13µs+2µs) by installer::windows::assembly::BEGIN@33 at line 33 # spent 15µs making 1 call to installer::windows::idtglobal::BEGIN@33
# spent 2µs making 1 call to UNIVERSAL::import |
34 | 2 | 53µs | 2 | 23µs | # spent 21µs (19+2) within installer::windows::idtglobal::BEGIN@34 which was called:
# once (19µs+2µs) by installer::windows::assembly::BEGIN@33 at line 34 # spent 21µs making 1 call to installer::windows::idtglobal::BEGIN@34
# spent 2µs making 1 call to UNIVERSAL::import |
35 | 2 | 53µs | 2 | 20µs | # spent 18µs (15+3) within installer::windows::idtglobal::BEGIN@35 which was called:
# once (15µs+3µs) by installer::windows::assembly::BEGIN@33 at line 35 # spent 18µs making 1 call to installer::windows::idtglobal::BEGIN@35
# spent 2µs making 1 call to UNIVERSAL::import |
36 | 2 | 55µs | 2 | 21µs | # spent 19µs (17+2) within installer::windows::idtglobal::BEGIN@36 which was called:
# once (17µs+2µs) by installer::windows::assembly::BEGIN@33 at line 36 # spent 19µs making 1 call to installer::windows::idtglobal::BEGIN@36
# spent 2µs making 1 call to UNIVERSAL::import |
37 | 2 | 58µs | 2 | 22µs | # spent 20µs (18+2) within installer::windows::idtglobal::BEGIN@37 which was called:
# once (18µs+2µs) by installer::windows::assembly::BEGIN@33 at line 37 # spent 20µs making 1 call to installer::windows::idtglobal::BEGIN@37
# spent 2µs making 1 call to UNIVERSAL::import |
38 | 2 | 52µs | 2 | 20µs | # spent 17µs (15+3) within installer::windows::idtglobal::BEGIN@38 which was called:
# once (15µs+3µs) by installer::windows::assembly::BEGIN@33 at line 38 # spent 17µs making 1 call to installer::windows::idtglobal::BEGIN@38
# spent 3µs making 1 call to UNIVERSAL::import |
39 | 2 | 16.9ms | 2 | 21µs | # spent 19µs (17+2) within installer::windows::idtglobal::BEGIN@39 which was called:
# once (17µs+2µs) by installer::windows::assembly::BEGIN@33 at line 39 # spent 19µs making 1 call to installer::windows::idtglobal::BEGIN@39
# spent 2µs making 1 call to UNIVERSAL::import |
40 | |||||
41 | ############################################################## | ||||
42 | # Shorten the gid for a feature. | ||||
43 | # Attention: Maximum length is 38 | ||||
44 | ############################################################## | ||||
45 | |||||
46 | sub shorten_feature_gid | ||||
47 | # spent 13.5s (10.7+2.72) within installer::windows::idtglobal::shorten_feature_gid which was called 375961 times, avg 36µs/call:
# 169277 times (4.86s+1.20s) by installer::windows::feature::get_feature_gid at line 51 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/feature.pm, avg 36µs/call
# 169277 times (4.73s+1.22s) by installer::windows::feature::get_feature_parent at line 76 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/feature.pm, avg 35µs/call
# 17801 times (520ms+139ms) by installer::windows::featurecomponent::create_featurecomponent_table_from_registry_collector at line 120 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/featurecomponent.pm, avg 37µs/call
# 15890 times (457ms+110ms) by installer::windows::featurecomponent::create_featurecomponent_table_from_files_collector at line 74 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/featurecomponent.pm, avg 36µs/call
# 3706 times (164ms+59.8ms) by installer::windows::idtglobal::add_custom_action_to_install_table at line 1135, avg 60µs/call
# 10 times (291µs+94µs) by installer::windows::assembly::get_msiassembly_feature at line 53 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/assembly.pm, avg 38µs/call | ||||
48 | 3759610 | 14.1s | my ($stringref) = @_; | ||
49 | |||||
50 | 375961 | 928ms | $$stringref =~ s/gid_Module_/gm_/; # spent 928ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 2µs/call | ||
51 | 375961 | 208ms | $$stringref =~ s/_Extension_/_ex_/; # spent 208ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 554ns/call | ||
52 | 375961 | 402ms | $$stringref =~ s/_Root_/_r_/; # spent 402ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 1µs/call | ||
53 | 375961 | 225ms | $$stringref =~ s/_Prg_/_p_/; # spent 225ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 599ns/call | ||
54 | 375961 | 204ms | $$stringref =~ s/_Optional_/_o_/; # spent 204ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 541ns/call | ||
55 | 375961 | 193ms | $$stringref =~ s/_Tools_/_tl_/; # spent 193ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 513ns/call | ||
56 | 375961 | 187ms | $$stringref =~ s/_Wrt_Flt_/_w_f_/; # spent 187ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 498ns/call | ||
57 | 375961 | 192ms | $$stringref =~ s/_Javafilter_/_jf_/; # spent 192ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 512ns/call | ||
58 | 375961 | 183ms | $$stringref =~ s/_Productivity_/_pr_/; # spent 183ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 487ns/call | ||
59 | } | ||||
60 | |||||
61 | ############################################ | ||||
62 | # Getting the next free number, that | ||||
63 | # can be added. | ||||
64 | # Sample: 01-44-~1.DAT, 01-44-~2.DAT, ... | ||||
65 | ############################################ | ||||
66 | |||||
67 | sub get_next_free_number | ||||
68 | # spent 2196s within installer::windows::idtglobal::get_next_free_number which was called 105730 times, avg 20.8ms/call:
# 45889 times (61.9s+0s) by installer::windows::idtglobal::make_eight_three_conform at line 224, avg 1.35ms/call
# 35643 times (701s+0s) by installer::windows::idtglobal::make_eight_three_conform at line 233, avg 19.7ms/call
# 24198 times (1433s+0s) by installer::windows::idtglobal::make_eight_three_conform at line 240, avg 59.2ms/call | ||||
69 | 2045547628 | 2196s | my ($name, $shortnamesref) = @_; | ||
70 | |||||
71 | my $counter = 0; | ||||
72 | my $dontsave = 0; | ||||
73 | my $alreadyexists; | ||||
74 | my ($newname, $shortname); | ||||
75 | |||||
76 | do | ||||
77 | { | ||||
78 | $alreadyexists = 0; | ||||
79 | $counter++; | ||||
80 | $newname = $name . $counter; | ||||
81 | |||||
82 | for ( my $i = 0; $i <= $#{$shortnamesref}; $i++ ) | ||||
83 | { | ||||
84 | $shortname = ${$shortnamesref}[$i]; | ||||
85 | |||||
86 | if ( uc($shortname) eq uc($newname) ) # case insensitive | ||||
87 | { | ||||
88 | $alreadyexists = 1; | ||||
89 | last; | ||||
90 | } | ||||
91 | } | ||||
92 | } | ||||
93 | until (!($alreadyexists)); | ||||
94 | |||||
95 | if (( $counter > 9 ) && ( length($name) > 6 )) { $dontsave = 1; } | ||||
96 | if (( $counter > 99 ) && ( length($name) > 5 )) { $dontsave = 1; } | ||||
97 | |||||
98 | if (!($dontsave)) | ||||
99 | { | ||||
100 | push(@{$shortnamesref}, $newname); # adding the new shortname to the array of shortnames | ||||
101 | } | ||||
102 | |||||
103 | return $counter | ||||
104 | } | ||||
105 | |||||
106 | ############################################ | ||||
107 | # Getting the next free number, that | ||||
108 | # can be added. | ||||
109 | # Sample: 01-44-~1.DAT, 01-44-~2.DAT, ... | ||||
110 | ############################################ | ||||
111 | |||||
112 | sub get_next_free_number_with_hash | ||||
113 | # spent 6.78s within installer::windows::idtglobal::get_next_free_number_with_hash which was called 14217 times, avg 477µs/call:
# 6229 times (237ms+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 303, avg 38µs/call
# 4612 times (1.23s+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 312, avg 267µs/call
# 2496 times (5.11s+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 321, avg 2.05ms/call
# 337 times (15.1ms+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 350, avg 45µs/call
# 321 times (95.1ms+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 359, avg 296µs/call
# 222 times (84.2ms+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 368, avg 379µs/call | ||||
114 | 9961114 | 6.81s | my ($name, $shortnamesref, $ext) = @_; | ||
115 | |||||
116 | my $counter = 0; | ||||
117 | my $dontsave = 0; | ||||
118 | my $saved = 0; | ||||
119 | my $alreadyexists; | ||||
120 | my ($newname, $shortname); | ||||
121 | |||||
122 | do | ||||
123 | { | ||||
124 | $alreadyexists = 0; | ||||
125 | $counter++; | ||||
126 | $newname = $name . $counter; | ||||
127 | $newname = uc($newname); # case insensitive, always upper case | ||||
128 | if ( exists($shortnamesref->{$newname}) || | ||||
129 | exists($installer::globals::savedrev83mapping{$newname.$ext}) ) | ||||
130 | { | ||||
131 | $alreadyexists = 1; | ||||
132 | } | ||||
133 | } | ||||
134 | until (!($alreadyexists)); | ||||
135 | |||||
136 | if (( $counter > 9 ) && ( length($name) > 6 )) { $dontsave = 1; } | ||||
137 | if (( $counter > 99 ) && ( length($name) > 5 )) { $dontsave = 1; } | ||||
138 | |||||
139 | if (!($dontsave)) | ||||
140 | { | ||||
141 | $shortnamesref->{$newname} = 1; # adding the new shortname to the array of shortnames, always uppercase | ||||
142 | $saved = 1; | ||||
143 | } | ||||
144 | |||||
145 | return ( $counter, $saved ) | ||||
146 | } | ||||
147 | |||||
148 | ######################################### | ||||
149 | # 8.3 for filenames and directories | ||||
150 | ######################################### | ||||
151 | |||||
152 | sub make_eight_three_conform | ||||
153 | # spent 2201s (4.44+2197) within installer::windows::idtglobal::make_eight_three_conform which was called 202522 times, avg 10.9ms/call:
# 201432 times (4.41s+2197s) by installer::windows::directory::create_defaultdir_directorynames at line 345 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/directory.pm, avg 10.9ms/call
# 872 times (22.7ms+53.1ms) by installer::windows::shortcut::get_shortcut_name at line 102 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/shortcut.pm, avg 87µs/call
# 109 times (3.97ms+3.76ms) by installer::windows::directory::add_root_directories at line 441 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/directory.pm, avg 71µs/call
# 109 times (3.05ms+2.11ms) by installer::windows::directory::add_root_directories at line 489 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/directory.pm, avg 47µs/call | ||||
154 | 2914878 | 5.19s | my ($inputstring, $pattern, $shortnamesref) = @_; | ||
155 | |||||
156 | # all shortnames are collected in $shortnamesref, because of uniqueness | ||||
157 | |||||
158 | my ($name, $namelength, $number); | ||||
159 | my $conformstring = ""; | ||||
160 | my $changed = 0; | ||||
161 | |||||
162 | 202522 | 278ms | if (( $inputstring =~ /^\s*(.*?)\.(.*?)\s*$/ ) && ( $pattern eq "file" )) # files with a dot # spent 278ms making 202522 calls to installer::windows::idtglobal::CORE:match, avg 1µs/call | ||
163 | { | ||||
164 | $name = $1; | ||||
165 | my $extension = $2; | ||||
166 | |||||
167 | $namelength = length($name); | ||||
168 | my $extensionlength = length($extension); | ||||
169 | |||||
170 | if ( $extensionlength > 3 ) | ||||
171 | { | ||||
172 | # simply taking the first three letters | ||||
173 | $extension = substr($extension, 0, 3); # name, offset, length | ||||
174 | } | ||||
175 | |||||
176 | # Attention: readme.html -> README~1.HTM | ||||
177 | |||||
178 | if (( $namelength > 8 ) || ( $extensionlength > 3 )) | ||||
179 | { | ||||
180 | # taking the first six letters | ||||
181 | $name = substr($name, 0, 6); # name, offset, length | ||||
182 | $name =~ s/\s*$//; # removing ending whitespaces | ||||
183 | $name = $name . "\~"; | ||||
184 | $number = get_next_free_number($name, $shortnamesref); | ||||
185 | |||||
186 | # if $number>9 the new name would be "abcdef~10.xyz", which is 9+3, and therefore not allowed | ||||
187 | |||||
188 | if ( $number > 9 ) | ||||
189 | { | ||||
190 | $name = substr($name, 0, 5); # name, offset, length | ||||
191 | $name =~ s/\s*$//; # removing ending whitespaces | ||||
192 | $name = $name . "\~"; | ||||
193 | $number = get_next_free_number($name, $shortnamesref); | ||||
194 | |||||
195 | if ( $number > 99 ) | ||||
196 | { | ||||
197 | $name = substr($name, 0, 4); # name, offset, length | ||||
198 | $name =~ s/\s*$//; # removing ending whitespaces | ||||
199 | $name = $name . "\~"; | ||||
200 | $number = get_next_free_number($name, $shortnamesref); | ||||
201 | } | ||||
202 | } | ||||
203 | |||||
204 | $name = $name . "$number"; | ||||
205 | |||||
206 | $changed = 1; | ||||
207 | } | ||||
208 | |||||
209 | $conformstring = $name . "\." . $extension; | ||||
210 | |||||
211 | if ( $changed ) { $conformstring= uc($conformstring); } | ||||
212 | } | ||||
213 | else # no dot in filename or directory (also used for shortcuts) | ||||
214 | { | ||||
215 | $name = $inputstring; | ||||
216 | $namelength = length($name); | ||||
217 | |||||
218 | if ( $namelength > 8 ) | ||||
219 | { | ||||
220 | # taking the first six letters | ||||
221 | $name = substr($name, 0, 6); # name, offset, length | ||||
222 | 45889 | 167ms | $name =~ s/\s*$//; # removing ending whitespaces # spent 167ms making 45889 calls to installer::windows::idtglobal::CORE:subst, avg 4µs/call | ||
223 | $name = $name . "\~"; | ||||
224 | 45889 | 61.9s | $number = get_next_free_number($name, $shortnamesref); # spent 61.9s making 45889 calls to installer::windows::idtglobal::get_next_free_number, avg 1.35ms/call | ||
225 | |||||
226 | # if $number>9 the new name would be "abcdef~10.xyz", which is 9+3, and therefore not allowed | ||||
227 | |||||
228 | if ( $number > 9 ) | ||||
229 | { | ||||
230 | $name = substr($name, 0, 5); # name, offset, length | ||||
231 | 35643 | 131ms | $name =~ s/\s*$//; # removing ending whitespaces # spent 131ms making 35643 calls to installer::windows::idtglobal::CORE:subst, avg 4µs/call | ||
232 | $name = $name . "\~"; | ||||
233 | 35643 | 701s | $number = get_next_free_number($name, $shortnamesref); # spent 701s making 35643 calls to installer::windows::idtglobal::get_next_free_number, avg 19.7ms/call | ||
234 | |||||
235 | if ( $number > 99 ) | ||||
236 | { | ||||
237 | $name = substr($name, 0, 4); # name, offset, length | ||||
238 | 24198 | 151ms | $name =~ s/\s*$//; # removing ending whitespaces # spent 151ms making 24198 calls to installer::windows::idtglobal::CORE:subst, avg 6µs/call | ||
239 | $name = $name . "\~"; | ||||
240 | 24198 | 1433s | $number = get_next_free_number($name, $shortnamesref); # spent 1433s making 24198 calls to installer::windows::idtglobal::get_next_free_number, avg 59.2ms/call | ||
241 | } | ||||
242 | } | ||||
243 | |||||
244 | $name = $name . "$number"; | ||||
245 | $changed = 1; | ||||
246 | 45017 | 151ms | if ( $pattern eq "dir" ) { $name =~ s/\./\_/g; } # in directories replacing "." with "_" # spent 151ms making 45017 calls to installer::windows::idtglobal::CORE:subst, avg 3µs/call | ||
247 | } | ||||
248 | |||||
249 | $conformstring = $name; | ||||
250 | |||||
251 | if ( $changed ) { $conformstring = uc($name); } | ||||
252 | } | ||||
253 | |||||
254 | return $conformstring; | ||||
255 | } | ||||
256 | |||||
257 | ######################################### | ||||
258 | # 8.3 for filenames and directories | ||||
259 | # $shortnamesref is a hash in this case | ||||
260 | # -> performance reasons | ||||
261 | ######################################### | ||||
262 | |||||
263 | sub make_eight_three_conform_with_hash | ||||
264 | # spent 7.57s (610ms+6.96) within installer::windows::idtglobal::make_eight_three_conform_with_hash which was called 15888 times, avg 476µs/call:
# 15888 times (610ms+6.96s) by installer::windows::file::generate_filename_for_filetable at line 513 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/file.pm, avg 476µs/call | ||||
265 | 362407 | 780ms | my ($inputstring, $pattern, $shortnamesref) = @_; | ||
266 | |||||
267 | # all shortnames are collected in $shortnamesref, because of uniqueness (a hash!) | ||||
268 | |||||
269 | my ($name, $namelength, $number); | ||||
270 | my $conformstring = ""; | ||||
271 | my $changed = 0; | ||||
272 | my $saved; | ||||
273 | |||||
274 | 15888 | 59.7ms | if (( $inputstring =~ /^\s*(.*)\.(.*?)\s*$/ ) && ( $pattern eq "file" )) # files with a dot # spent 59.7ms making 15888 calls to installer::windows::idtglobal::CORE:match, avg 4µs/call | ||
275 | { | ||||
276 | # extension has to be non-greedy, but name is. This is important to find the last dot in the filename | ||||
277 | $name = $1; | ||||
278 | my $extension = $2; | ||||
279 | |||||
280 | 15542 | 53.2ms | if ( $name =~ /^\s*(.*?)\s*$/ ) { $name = $1; } # now the name is also non-greedy # spent 53.2ms making 15542 calls to installer::windows::idtglobal::CORE:match, avg 3µs/call | ||
281 | 15542 | 21.0ms | $name =~ s/\.//g; # no dots in 8+3 conform filename # spent 21.0ms making 15542 calls to installer::windows::idtglobal::CORE:subst, avg 1µs/call | ||
282 | |||||
283 | $namelength = length($name); | ||||
284 | my $extensionlength = length($extension); | ||||
285 | |||||
286 | if ( $extensionlength > 3 ) | ||||
287 | { | ||||
288 | # simply taking the first three letters | ||||
289 | $extension = substr($extension, 0, 3); # name, offset, length | ||||
290 | $changed = 1; | ||||
291 | } | ||||
292 | |||||
293 | # Attention: readme.html -> README~1.HTM | ||||
294 | |||||
295 | if (( $namelength > 8 ) || ( $extensionlength > 3 )) | ||||
296 | { | ||||
297 | # taking the first six letters, if filename is longer than 6 characters | ||||
298 | if ( $namelength > 6 ) | ||||
299 | { | ||||
300 | $name = substr($name, 0, 6); # name, offset, length | ||||
301 | 6229 | 20.9ms | $name =~ s/\s*$//; # removing ending whitespaces # spent 20.9ms making 6229 calls to installer::windows::idtglobal::CORE:subst, avg 3µs/call | ||
302 | $name = $name . "\~"; | ||||
303 | 6229 | 237ms | ($number, $saved) = get_next_free_number_with_hash($name, $shortnamesref, '.'.uc($extension)); # spent 237ms making 6229 calls to installer::windows::idtglobal::get_next_free_number_with_hash, avg 38µs/call | ||
304 | |||||
305 | # if $number>9 the new name would be "abcdef~10.xyz", which is 9+3, and therefore not allowed | ||||
306 | |||||
307 | if ( ! $saved ) | ||||
308 | { | ||||
309 | $name = substr($name, 0, 5); # name, offset, length | ||||
310 | 4612 | 14.5ms | $name =~ s/\s*$//; # removing ending whitespaces # spent 14.5ms making 4612 calls to installer::windows::idtglobal::CORE:subst, avg 3µs/call | ||
311 | $name = $name . "\~"; | ||||
312 | 4612 | 1.23s | ($number, $saved) = get_next_free_number_with_hash($name, $shortnamesref, '.'.uc($extension)); # spent 1.23s making 4612 calls to installer::windows::idtglobal::get_next_free_number_with_hash, avg 267µs/call | ||
313 | |||||
314 | # if $number>99 the new name would be "abcde~100.xyz", which is 9+3, and therefore not allowed | ||||
315 | |||||
316 | if ( ! $saved ) | ||||
317 | { | ||||
318 | $name = substr($name, 0, 4); # name, offset, length | ||||
319 | 2496 | 7.58ms | $name =~ s/\s*$//; # removing ending whitespaces # spent 7.58ms making 2496 calls to installer::windows::idtglobal::CORE:subst, avg 3µs/call | ||
320 | $name = $name . "\~"; | ||||
321 | 2496 | 5.11s | ($number, $saved) = get_next_free_number_with_hash($name, $shortnamesref, '.'.uc($extension)); # spent 5.11s making 2496 calls to installer::windows::idtglobal::get_next_free_number_with_hash, avg 2.05ms/call | ||
322 | |||||
323 | if ( ! $saved ) | ||||
324 | { | ||||
325 | installer::exiter::exit_program("ERROR: Could not set 8+3 conform name for $inputstring !", "make_eight_three_conform_with_hash"); | ||||
326 | } | ||||
327 | } | ||||
328 | } | ||||
329 | |||||
330 | $name = $name . "$number"; | ||||
331 | $changed = 1; | ||||
332 | } | ||||
333 | } | ||||
334 | |||||
335 | $conformstring = $name . "\." . $extension; | ||||
336 | |||||
337 | if ( $changed ) { $conformstring= uc($conformstring); } | ||||
338 | } | ||||
339 | else # no dot in filename or directory (also used for shortcuts) | ||||
340 | { | ||||
341 | $name = $inputstring; | ||||
342 | $namelength = length($name); | ||||
343 | |||||
344 | if ( $namelength > 8 ) | ||||
345 | { | ||||
346 | # taking the first six letters | ||||
347 | $name = substr($name, 0, 6); # name, offset, length | ||||
348 | 337 | 1.50ms | $name =~ s/\s*$//; # removing ending whitespaces # spent 1.50ms making 337 calls to installer::windows::idtglobal::CORE:subst, avg 4µs/call | ||
349 | $name = $name . "\~"; | ||||
350 | 337 | 15.1ms | ( $number, $saved ) = get_next_free_number_with_hash($name, $shortnamesref, ''); # spent 15.1ms making 337 calls to installer::windows::idtglobal::get_next_free_number_with_hash, avg 45µs/call | ||
351 | |||||
352 | # if $number>9 the new name would be "abcdef~10", which is 9+0, and therefore not allowed | ||||
353 | |||||
354 | if ( ! $saved ) | ||||
355 | { | ||||
356 | $name = substr($name, 0, 5); # name, offset, length | ||||
357 | 321 | 1.18ms | $name =~ s/\s*$//; # removing ending whitespaces # spent 1.18ms making 321 calls to installer::windows::idtglobal::CORE:subst, avg 4µs/call | ||
358 | $name = $name . "\~"; | ||||
359 | 321 | 95.1ms | ( $number, $saved ) = get_next_free_number_with_hash($name, $shortnamesref, ''); # spent 95.1ms making 321 calls to installer::windows::idtglobal::get_next_free_number_with_hash, avg 296µs/call | ||
360 | |||||
361 | # if $number>99 the new name would be "abcde~100", which is 9+0, and therefore not allowed | ||||
362 | |||||
363 | if ( ! $saved ) | ||||
364 | { | ||||
365 | $name = substr($name, 0, 4); # name, offset, length | ||||
366 | 222 | 795µs | $name =~ s/\s*$//; # removing ending whitespaces # spent 795µs making 222 calls to installer::windows::idtglobal::CORE:subst, avg 4µs/call | ||
367 | $name = $name . "\~"; | ||||
368 | 222 | 84.2ms | ( $number, $saved ) = get_next_free_number_with_hash($name, $shortnamesref, ''); # spent 84.2ms making 222 calls to installer::windows::idtglobal::get_next_free_number_with_hash, avg 379µs/call | ||
369 | |||||
370 | if ( ! $saved ) { installer::exiter::exit_program("ERROR: Could not set 8+3 conform name for $inputstring !", "make_eight_three_conform_with_hash"); } | ||||
371 | } | ||||
372 | } | ||||
373 | |||||
374 | $name = $name . "$number"; | ||||
375 | $changed = 1; | ||||
376 | if ( $pattern eq "dir" ) { $name =~ s/\./\_/g; } # in directories replacing "." with "_" | ||||
377 | } | ||||
378 | |||||
379 | $conformstring = $name; | ||||
380 | |||||
381 | if ( $changed ) { $conformstring = uc($name); } | ||||
382 | } | ||||
383 | |||||
384 | return $conformstring; | ||||
385 | } | ||||
386 | |||||
387 | ######################################### | ||||
388 | # Writing the header for idt files | ||||
389 | ######################################### | ||||
390 | |||||
391 | sub write_idt_header | ||||
392 | # spent 12.4ms within installer::windows::idtglobal::write_idt_header which was called 449 times, avg 28µs/call:
# 109 times (3.63ms+0s) by installer::windows::directory::create_directory_table at line 536 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/directory.pm, avg 33µs/call
# 109 times (3.11ms+0s) by installer::windows::feature::create_feature_table at line 378 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/feature.pm, avg 29µs/call
# 109 times (3.08ms+0s) by installer::windows::registry::create_registry_table at line 356 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/registry.pm, avg 28µs/call
# 109 times (2.30ms+0s) by installer::windows::shortcut::create_shortcut_table at line 546 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/shortcut.pm, avg 21µs/call
# once (32µs+0s) by installer::windows::assembly::create_msiassembly_table at line 162 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/assembly.pm
# once (29µs+0s) by installer::windows::media::create_media_table at line 246 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/media.pm
# once (29µs+0s) by installer::windows::featurecomponent::create_featurecomponent_table at line 146 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/featurecomponent.pm
# once (28µs+0s) by installer::windows::font::create_font_table at line 47 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/font.pm
# once (28µs+0s) by installer::windows::file::create_files_table at line 874 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/file.pm
# once (28µs+0s) by installer::windows::component::create_component_table at line 390 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/component.pm
# once (28µs+0s) by installer::windows::icon::create_icon_table at line 38 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/icon.pm
# once (27µs+0s) by installer::windows::upgrade::create_upgrade_table at line 56 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/upgrade.pm
# once (21µs+0s) by installer::windows::inifile::create_inifile_table at line 105 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/inifile.pm
# once (18µs+0s) by installer::windows::assembly::create_msiassemblyname_table at line 207 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/assembly.pm
# once (18µs+0s) by installer::windows::createfolder::create_createfolder_table at line 122 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/createfolder.pm
# once (17µs+0s) by installer::windows::file::create_files_table at line 875 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/file.pm
# once (16µs+0s) by installer::windows::file::create_files_table at line 876 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/file.pm | ||||
393 | 12572 | 12.7ms | my ($idtref, $definestring) = @_; | ||
394 | |||||
395 | my $oneline; | ||||
396 | |||||
397 | if ( $definestring eq "file" ) | ||||
398 | { | ||||
399 | $oneline = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n"; | ||||
400 | push(@{$idtref}, $oneline); | ||||
401 | $oneline = "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti4\n"; | ||||
402 | push(@{$idtref}, $oneline); | ||||
403 | $oneline = "File\tFile\n"; | ||||
404 | push(@{$idtref}, $oneline); | ||||
405 | } | ||||
406 | |||||
407 | if ( $definestring eq "filehash" ) | ||||
408 | { | ||||
409 | $oneline = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n"; | ||||
410 | push(@{$idtref}, $oneline); | ||||
411 | $oneline = "s72\ti2\ti4\ti4\ti4\ti4\n"; | ||||
412 | push(@{$idtref}, $oneline); | ||||
413 | $oneline = "MsiFileHash\tFile_\n"; | ||||
414 | push(@{$idtref}, $oneline); | ||||
415 | } | ||||
416 | |||||
417 | if ( $definestring eq "directory" ) | ||||
418 | { | ||||
419 | $oneline = "Directory\tDirectory_Parent\tDefaultDir\n"; | ||||
420 | push(@{$idtref}, $oneline); | ||||
421 | $oneline = "s72\tS72\tl255\n"; | ||||
422 | push(@{$idtref}, $oneline); | ||||
423 | $oneline = "Directory\tDirectory\n"; | ||||
424 | push(@{$idtref}, $oneline); | ||||
425 | } | ||||
426 | |||||
427 | if ( $definestring eq "component" ) | ||||
428 | { | ||||
429 | $oneline = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n"; | ||||
430 | push(@{$idtref}, $oneline); | ||||
431 | $oneline = "s72\tS38\ts72\ti2\tS255\tS72\n"; | ||||
432 | push(@{$idtref}, $oneline); | ||||
433 | $oneline = "Component\tComponent\n"; | ||||
434 | push(@{$idtref}, $oneline); | ||||
435 | } | ||||
436 | |||||
437 | if ( $definestring eq "feature" ) | ||||
438 | { | ||||
439 | $oneline = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n"; | ||||
440 | push(@{$idtref}, $oneline); | ||||
441 | $oneline = "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n"; | ||||
442 | push(@{$idtref}, $oneline); | ||||
443 | $oneline = "WINDOWSENCODINGTEMPLATE\tFeature\tFeature\n"; | ||||
444 | push(@{$idtref}, $oneline); | ||||
445 | } | ||||
446 | |||||
447 | if ( $definestring eq "featurecomponent" ) | ||||
448 | { | ||||
449 | $oneline = "Feature_\tComponent_\n"; | ||||
450 | push(@{$idtref}, $oneline); | ||||
451 | $oneline = "s38\ts72\n"; | ||||
452 | push(@{$idtref}, $oneline); | ||||
453 | $oneline = "FeatureComponents\tFeature_\tComponent_\n"; | ||||
454 | push(@{$idtref}, $oneline); | ||||
455 | } | ||||
456 | |||||
457 | if ( $definestring eq "media" ) | ||||
458 | { | ||||
459 | $oneline = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n"; | ||||
460 | push(@{$idtref}, $oneline); | ||||
461 | $oneline = "i2\ti4\tL64\tS255\tS32\tS72\n"; | ||||
462 | push(@{$idtref}, $oneline); | ||||
463 | $oneline = "Media\tDiskId\n"; | ||||
464 | push(@{$idtref}, $oneline); | ||||
465 | } | ||||
466 | |||||
467 | if ( $definestring eq "font" ) | ||||
468 | { | ||||
469 | $oneline = "File_\tFontTitle\n"; | ||||
470 | push(@{$idtref}, $oneline); | ||||
471 | $oneline = "s72\tS128\n"; | ||||
472 | push(@{$idtref}, $oneline); | ||||
473 | $oneline = "Font\tFile_\n"; | ||||
474 | push(@{$idtref}, $oneline); | ||||
475 | } | ||||
476 | |||||
477 | if ( $definestring eq "shortcut" ) | ||||
478 | { | ||||
479 | $oneline = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n"; | ||||
480 | push(@{$idtref}, $oneline); | ||||
481 | $oneline = "s72\ts72\tl128\ts72\ts72\tS255\tL255\tI2\tS72\tI2\tI2\tS72\n"; | ||||
482 | push(@{$idtref}, $oneline); | ||||
483 | $oneline = "WINDOWSENCODINGTEMPLATE\tShortcut\tShortcut\n"; | ||||
484 | push(@{$idtref}, $oneline); | ||||
485 | } | ||||
486 | |||||
487 | if ( $definestring eq "registry" ) | ||||
488 | { | ||||
489 | $oneline = "Registry\tRoot\tKey\tName\tValue\tComponent_\n"; | ||||
490 | push(@{$idtref}, $oneline); | ||||
491 | $oneline = "s72\ti2\tl255\tL255\tL0\ts72\n"; | ||||
492 | push(@{$idtref}, $oneline); | ||||
493 | $oneline = "Registry\tRegistry\n"; | ||||
494 | push(@{$idtref}, $oneline); | ||||
495 | } | ||||
496 | |||||
497 | if ( $definestring eq "createfolder" ) | ||||
498 | { | ||||
499 | $oneline = "Directory_\tComponent_\n"; | ||||
500 | push(@{$idtref}, $oneline); | ||||
501 | $oneline = "s72\ts72\n"; | ||||
502 | push(@{$idtref}, $oneline); | ||||
503 | $oneline = "CreateFolder\tDirectory_\tComponent_\n"; | ||||
504 | push(@{$idtref}, $oneline); | ||||
505 | } | ||||
506 | |||||
507 | if ( $definestring eq "removefile" ) | ||||
508 | { | ||||
509 | $oneline = "FileKey\tComponent_\tFileName\tDirProperty\tInstallMode\n"; | ||||
510 | push(@{$idtref}, $oneline); | ||||
511 | $oneline = "s72\ts72\tL255\ts72\ti2\n"; | ||||
512 | push(@{$idtref}, $oneline); | ||||
513 | $oneline = "RemoveFile\tFileKey\n"; | ||||
514 | push(@{$idtref}, $oneline); | ||||
515 | } | ||||
516 | |||||
517 | if ( $definestring eq "upgrade" ) | ||||
518 | { | ||||
519 | $oneline = "UpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\tRemove\tActionProperty\n"; | ||||
520 | push(@{$idtref}, $oneline); | ||||
521 | $oneline = "s38\tS20\tS20\tS255\ti4\tS255\ts72\n"; | ||||
522 | push(@{$idtref}, $oneline); | ||||
523 | $oneline = "Upgrade\tUpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\n"; | ||||
524 | push(@{$idtref}, $oneline); | ||||
525 | } | ||||
526 | |||||
527 | if ( $definestring eq "icon" ) | ||||
528 | { | ||||
529 | $oneline = "Name\tData\n"; | ||||
530 | push(@{$idtref}, $oneline); | ||||
531 | $oneline = "s72\tv0\n"; | ||||
532 | push(@{$idtref}, $oneline); | ||||
533 | $oneline = "Icon\tName\n"; | ||||
534 | push(@{$idtref}, $oneline); | ||||
535 | } | ||||
536 | |||||
537 | if ( $definestring eq "inifile" ) | ||||
538 | { | ||||
539 | $oneline = "IniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n"; | ||||
540 | push(@{$idtref}, $oneline); | ||||
541 | $oneline = "s72\tl255\tS72\tl96\tl128\tl255\ti2\ts72\n"; | ||||
542 | push(@{$idtref}, $oneline); | ||||
543 | $oneline = "IniFile\tIniFile\n"; | ||||
544 | push(@{$idtref}, $oneline); | ||||
545 | } | ||||
546 | |||||
547 | if ( $definestring eq "msiassembly" ) | ||||
548 | { | ||||
549 | $oneline = "Component_\tFeature_\tFile_Manifest\tFile_Application\tAttributes\n"; | ||||
550 | push(@{$idtref}, $oneline); | ||||
551 | $oneline = "s72\ts38\tS72\tS72\tI2\n"; | ||||
552 | push(@{$idtref}, $oneline); | ||||
553 | $oneline = "MsiAssembly\tComponent_\n"; | ||||
554 | push(@{$idtref}, $oneline); | ||||
555 | } | ||||
556 | |||||
557 | if ( $definestring eq "msiassemblyname" ) | ||||
558 | { | ||||
559 | $oneline = "Component_\tName\tValue\n"; | ||||
560 | push(@{$idtref}, $oneline); | ||||
561 | $oneline = "s72\ts255\ts255\n"; | ||||
562 | push(@{$idtref}, $oneline); | ||||
563 | $oneline = "MsiAssemblyName\tComponent_\tName\n"; | ||||
564 | push(@{$idtref}, $oneline); | ||||
565 | } | ||||
566 | |||||
567 | if ( $definestring eq "appsearch" ) | ||||
568 | { | ||||
569 | $oneline = "Property\tSignature_\n"; | ||||
570 | push(@{$idtref}, $oneline); | ||||
571 | $oneline = "s72\ts72\n"; | ||||
572 | push(@{$idtref}, $oneline); | ||||
573 | $oneline = "AppSearch\tProperty\tSignature_\n"; | ||||
574 | push(@{$idtref}, $oneline); | ||||
575 | } | ||||
576 | |||||
577 | if ( $definestring eq "reglocat" ) | ||||
578 | { | ||||
579 | $oneline = "Signature_\tRoot\tKey\tName\tType\n"; | ||||
580 | push(@{$idtref}, $oneline); | ||||
581 | $oneline = "s72\ti2\ts255\tS255\tI2\n"; | ||||
582 | push(@{$idtref}, $oneline); | ||||
583 | $oneline = "RegLocator\tSignature_\n"; | ||||
584 | push(@{$idtref}, $oneline); | ||||
585 | } | ||||
586 | |||||
587 | if ( $definestring eq "signatur" ) | ||||
588 | { | ||||
589 | $oneline = "Signature\tFileName\tMinVersion\tMaxVersion\tMinSize\tMaxSize\tMinDate\tMaxDate\tLanguages\n"; | ||||
590 | push(@{$idtref}, $oneline); | ||||
591 | $oneline = "s72\ts255\tS20\tS20\tI4\tI4\tI4\tI4\tS255\n"; | ||||
592 | push(@{$idtref}, $oneline); | ||||
593 | $oneline = "Signature\tSignature\n"; | ||||
594 | push(@{$idtref}, $oneline); | ||||
595 | } | ||||
596 | |||||
597 | } | ||||
598 | |||||
599 | ############################################################## | ||||
600 | # Returning the name of the rranslation file for a | ||||
601 | # given language. | ||||
602 | # Sample: "01" oder "en-US" -> "1033.txt" | ||||
603 | ############################################################## | ||||
604 | |||||
605 | sub get_languagefilename | ||||
606 | # spent 22.6ms (16.7+5.95) within installer::windows::idtglobal::get_languagefilename which was called 872 times, avg 26µs/call:
# 872 times (16.7ms+5.95ms) by installer::run at line 1589 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm, avg 26µs/call | ||||
607 | 3488 | 22.1ms | my ($idtfilename, $basedir) = @_; | ||
608 | |||||
609 | 872 | 5.95ms | $idtfilename =~ s/\.idt/\.mlf/; # spent 5.95ms making 872 calls to installer::windows::idtglobal::CORE:subst, avg 7µs/call | ||
610 | |||||
611 | my $languagefilename = $basedir . $installer::globals::separator . $idtfilename; | ||||
612 | |||||
613 | return $languagefilename; | ||||
614 | } | ||||
615 | |||||
616 | ############################################################## | ||||
617 | # Returning the complete block in all languages | ||||
618 | # for a specified string | ||||
619 | ############################################################## | ||||
620 | |||||
621 | sub get_language_block_from_language_file | ||||
622 | # spent 4070s (3373+697) within installer::windows::idtglobal::get_language_block_from_language_file which was called 58752 times, avg 69.3ms/call:
# 58315 times (3372s+697s) by installer::windows::idtglobal::translate_idtfile at line 734, avg 69.8ms/call
# 436 times (779ms+173ms) by installer::windows::msiglobal::get_value_from_sis_lng at line 519 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/msiglobal.pm, avg 2.18ms/call
# once (296µs+110µs) by installer::windows::msiglobal::set_global_code_variables at line 1470 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/msiglobal.pm | ||||
623 | 495280351 | 4070s | my ($searchstring, $languagefile) = @_; | ||
624 | |||||
625 | my @language_block = (); | ||||
626 | |||||
627 | for ( my $i = 0; $i <= $#{$languagefile}; $i++ ) | ||||
628 | { | ||||
629 | 963414230 | 691s | if ( ${$languagefile}[$i] =~ /^\s*\[\s*$searchstring\s*\]\s*$/ ) # spent 380s making 481707115 calls to installer::windows::idtglobal::CORE:regcomp, avg 790ns/call
# spent 310s making 481707115 calls to installer::windows::idtglobal::CORE:match, avg 644ns/call | ||
630 | { | ||||
631 | my $counter = $i; | ||||
632 | |||||
633 | push(@language_block, ${$languagefile}[$counter]); | ||||
634 | $counter++; | ||||
635 | |||||
636 | 58752 | 104ms | while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ ))) # spent 104ms making 58752 calls to installer::windows::idtglobal::CORE:match, avg 2µs/call | ||
637 | { | ||||
638 | push(@language_block, ${$languagefile}[$counter]); | ||||
639 | 6521361 | 6.26s | $counter++; # spent 6.26s making 6521361 calls to installer::windows::idtglobal::CORE:match, avg 959ns/call | ||
640 | } | ||||
641 | |||||
642 | last; | ||||
643 | } | ||||
644 | } | ||||
645 | |||||
646 | return \@language_block; | ||||
647 | } | ||||
648 | |||||
649 | ############################################################## | ||||
650 | # Returning a specific language string from the block | ||||
651 | # of all translations | ||||
652 | ############################################################## | ||||
653 | |||||
654 | sub get_language_string_from_language_block | ||||
655 | # spent 29.1s (24.0+5.06) within installer::windows::idtglobal::get_language_string_from_language_block which was called 58752 times, avg 495µs/call:
# 58315 times (24.0s+5.05s) by installer::windows::idtglobal::translate_idtfile at line 735, avg 498µs/call
# 436 times (14.0ms+6.76ms) by installer::windows::msiglobal::get_value_from_sis_lng at line 520 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/msiglobal.pm, avg 48µs/call
# once (65µs+48µs) by installer::windows::msiglobal::set_global_code_variables at line 1471 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/msiglobal.pm | ||||
656 | 3695437 | 29.1s | my ($language_block, $language, $oldstring) = @_; | ||
657 | |||||
658 | my $newstring = ""; | ||||
659 | |||||
660 | for ( my $i = 0; $i <= $#{$language_block}; $i++ ) | ||||
661 | { | ||||
662 | 6568338 | 5.06s | if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) # spent 2.55s making 3284169 calls to installer::windows::idtglobal::CORE:regcomp, avg 777ns/call
# spent 2.50s making 3284169 calls to installer::windows::idtglobal::CORE:match, avg 762ns/call | ||
663 | { | ||||
664 | $newstring = $1; | ||||
665 | last; | ||||
666 | } | ||||
667 | } | ||||
668 | |||||
669 | if ( $newstring eq "" ) | ||||
670 | { | ||||
671 | $language = "en-US"; # defaulting to english | ||||
672 | |||||
673 | for ( my $i = 0; $i <= $#{$language_block}; $i++ ) | ||||
674 | { | ||||
675 | 4 | 24µs | if ( ${$language_block}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) # spent 18µs making 2 calls to installer::windows::idtglobal::CORE:regcomp, avg 9µs/call
# spent 6µs making 2 calls to installer::windows::idtglobal::CORE:match, avg 3µs/call | ||
676 | { | ||||
677 | $newstring = $1; | ||||
678 | last; | ||||
679 | } | ||||
680 | } | ||||
681 | } | ||||
682 | |||||
683 | return $newstring; | ||||
684 | } | ||||
685 | |||||
686 | ############################################################## | ||||
687 | # Returning a specific code from the block | ||||
688 | # of all codes. No defaulting to english! | ||||
689 | ############################################################## | ||||
690 | |||||
691 | sub get_code_from_code_block | ||||
692 | { | ||||
693 | my ($codeblock, $language) = @_; | ||||
694 | |||||
695 | my $newstring = ""; | ||||
696 | |||||
697 | for ( my $i = 0; $i <= $#{$codeblock}; $i++ ) | ||||
698 | { | ||||
699 | if ( ${$codeblock}[$i] =~ /^\s*$language\s*\=\s*\"(.*)\"\s*$/ ) | ||||
700 | { | ||||
701 | $newstring = $1; | ||||
702 | last; | ||||
703 | } | ||||
704 | } | ||||
705 | |||||
706 | return $newstring; | ||||
707 | } | ||||
708 | |||||
709 | ############################################################## | ||||
710 | # Translating an idt file | ||||
711 | ############################################################## | ||||
712 | |||||
713 | sub translate_idtfile | ||||
714 | # spent 4106s (5.04+4101) within installer::windows::idtglobal::translate_idtfile which was called 872 times, avg 4.71s/call:
# 872 times (5.04s+4101s) by installer::run at line 1596 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm, avg 4.71s/call | ||||
715 | 712969 | 7.51s | my ($idtfile, $languagefile, $onelanguage) = @_; | ||
716 | |||||
717 | for ( my $i = 0; $i <= $#{$idtfile}; $i++ ) | ||||
718 | { | ||||
719 | my @allstrings = (); | ||||
720 | |||||
721 | my $oneline = ${$idtfile}[$i]; | ||||
722 | |||||
723 | 72267 | 241ms | while ( $oneline =~ /\b(OOO_\w+)\b/ ) # spent 241ms making 72267 calls to installer::windows::idtglobal::CORE:match, avg 3µs/call | ||
724 | { | ||||
725 | my $replacestring = $1; | ||||
726 | push(@allstrings, $replacestring); | ||||
727 | 174945 | 910ms | $oneline =~ s/$replacestring//; # spent 714ms making 58315 calls to installer::windows::idtglobal::CORE:regcomp, avg 12µs/call
# spent 145ms making 58315 calls to installer::windows::idtglobal::CORE:subst, avg 2µs/call
# spent 50.5ms making 58315 calls to installer::windows::idtglobal::CORE:match, avg 866ns/call | ||
728 | } | ||||
729 | |||||
730 | my $oldstring; | ||||
731 | |||||
732 | foreach $oldstring (@allstrings) | ||||
733 | { | ||||
734 | 58315 | 4069s | my $language_block = get_language_block_from_language_file($oldstring, $languagefile); # spent 4069s making 58315 calls to installer::windows::idtglobal::get_language_block_from_language_file, avg 69.8ms/call | ||
735 | 58315 | 29.0s | my $newstring = get_language_string_from_language_block($language_block, $onelanguage, $oldstring); # spent 29.0s making 58315 calls to installer::windows::idtglobal::get_language_string_from_language_block, avg 498µs/call | ||
736 | |||||
737 | 116630 | 1.52s | ${$idtfile}[$i] =~ s/$oldstring/$newstring/; # always substitute, even if $newstring eq "" (there are empty strings for control.idt) # spent 1.18s making 58315 calls to installer::windows::idtglobal::CORE:regcomp, avg 20µs/call
# spent 334ms making 58315 calls to installer::windows::idtglobal::CORE:subst, avg 6µs/call | ||
738 | } | ||||
739 | } | ||||
740 | } | ||||
741 | |||||
742 | ############################################################## | ||||
743 | # Copying all needed files to create a msi database | ||||
744 | # into one language specific directory | ||||
745 | ############################################################## | ||||
746 | |||||
747 | sub prepare_language_idt_directory | ||||
748 | # spent 26.6s (31.7ms+26.6) within installer::windows::idtglobal::prepare_language_idt_directory which was called 109 times, avg 244ms/call:
# 109 times (31.7ms+26.6s) by installer::run at line 1565 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm, avg 244ms/call | ||||
749 | 6758 | 52.4ms | my ($destinationdir, $newidtdir, $onelanguage, $filesref, $iconfilecollector, $binarytablefiles, $allvariables) = @_; | ||
750 | |||||
751 | # Copying all idt-files from the source $installer::globals::idttemplatepath to the destination $destinationdir | ||||
752 | # Copying all files in the subdirectory "Binary" | ||||
753 | # Copying all files in the subdirectory "Icon" | ||||
754 | |||||
755 | my $infoline = ""; | ||||
756 | |||||
757 | 109 | 7.39s | installer::systemactions::copy_directory($installer::globals::idttemplatepath, $destinationdir); # spent 7.39s making 109 calls to installer::systemactions::copy_directory, avg 67.8ms/call | ||
758 | |||||
759 | 109 | 8.17ms | if ( -d $installer::globals::idttemplatepath . $installer::globals::separator . "Binary") # spent 8.17ms making 109 calls to installer::windows::idtglobal::CORE:ftdir, avg 75µs/call | ||
760 | { | ||||
761 | 109 | 74.4ms | installer::systemactions::create_directory($destinationdir . $installer::globals::separator . "Binary"); # spent 74.4ms making 109 calls to installer::systemactions::create_directory, avg 682µs/call | ||
762 | 109 | 4.09s | installer::systemactions::copy_directory($installer::globals::idttemplatepath . $installer::globals::separator . "Binary", $destinationdir . $installer::globals::separator . "Binary"); # spent 4.09s making 109 calls to installer::systemactions::copy_directory, avg 37.5ms/call | ||
763 | |||||
764 | if ((( $installer::globals::patch ) && ( $allvariables->{'WINDOWSPATCHBITMAPDIRECTORY'} )) || ( $allvariables->{'WINDOWSBITMAPDIRECTORY'} )) | ||||
765 | { | ||||
766 | my $bitmapdir = ""; | ||||
767 | if ( $allvariables->{'WINDOWSPATCHBITMAPDIRECTORY'} ) { $bitmapdir = $allvariables->{'WINDOWSPATCHBITMAPDIRECTORY'}; } | ||||
768 | if ( $allvariables->{'WINDOWSBITMAPDIRECTORY'} ) { $bitmapdir = $allvariables->{'WINDOWSBITMAPDIRECTORY'}; } | ||||
769 | |||||
770 | my $newsourcedir = $installer::globals::unpackpath . $installer::globals::separator . $bitmapdir; # path setting in list file dependent from unpackpath !? | ||||
771 | $infoline = "\nOverwriting files in directory \"" . $destinationdir . $installer::globals::separator . "Binary" . "\" with files from directory \"" . $newsourcedir . "\".\n"; | ||||
772 | push( @installer::globals::logfileinfo, $infoline); | ||||
773 | if ( ! -d $newsourcedir ) | ||||
774 | { | ||||
775 | my $currentdir = cwd(); | ||||
776 | installer::exiter::exit_program("ERROR: Directory $newsourcedir does not exist! Current directory is: $currentdir", "prepare_language_idt_directory"); | ||||
777 | } | ||||
778 | installer::systemactions::copy_directory($newsourcedir, $destinationdir . $installer::globals::separator . "Binary"); | ||||
779 | } | ||||
780 | } | ||||
781 | |||||
782 | 109 | 73.6ms | installer::systemactions::create_directory($destinationdir . $installer::globals::separator . "Icon"); # spent 73.6ms making 109 calls to installer::systemactions::create_directory, avg 676µs/call | ||
783 | |||||
784 | 109 | 18.9ms | if ( -d $installer::globals::idttemplatepath . $installer::globals::separator . "Icon") # spent 18.9ms making 109 calls to installer::windows::idtglobal::CORE:ftdir, avg 173µs/call | ||
785 | { | ||||
786 | installer::systemactions::copy_directory($installer::globals::idttemplatepath . $installer::globals::separator . "Icon", $destinationdir . $installer::globals::separator . "Icon"); | ||||
787 | } | ||||
788 | |||||
789 | # Copying all files in $iconfilecollector, that describe icons of folderitems | ||||
790 | |||||
791 | for ( my $i = 0; $i <= $#{$iconfilecollector}; $i++ ) | ||||
792 | { | ||||
793 | my $iconfilename = ${$iconfilecollector}[$i]; | ||||
794 | 109 | 3.41ms | installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$iconfilename); # spent 3.41ms making 109 calls to installer::pathanalyzer::make_absolute_filename_to_relative_filename, avg 31µs/call | ||
795 | 109 | 244ms | installer::systemactions::copy_one_file(${$iconfilecollector}[$i], $destinationdir . $installer::globals::separator . "Icon" . $installer::globals::separator . $iconfilename); # spent 244ms making 109 calls to installer::systemactions::copy_one_file, avg 2.24ms/call | ||
796 | } | ||||
797 | |||||
798 | # Copying all files in $binarytablefiles in the binary directory | ||||
799 | |||||
800 | for ( my $i = 0; $i <= $#{$binarytablefiles}; $i++ ) | ||||
801 | { | ||||
802 | my $binaryfile = ${$binarytablefiles}[$i]; | ||||
803 | my $binaryfilepath = $binaryfile->{'sourcepath'}; | ||||
804 | my $binaryfilename = $binaryfilepath; | ||||
805 | 981 | 18.4ms | installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$binaryfilename); # spent 18.4ms making 981 calls to installer::pathanalyzer::make_absolute_filename_to_relative_filename, avg 19µs/call | ||
806 | 981 | 2.33s | installer::systemactions::copy_one_file($binaryfilepath, $destinationdir . $installer::globals::separator . "Binary" . $installer::globals::separator . $binaryfilename); # spent 2.33s making 981 calls to installer::systemactions::copy_one_file, avg 2.37ms/call | ||
807 | } | ||||
808 | |||||
809 | # Copying all new created and language independent idt-files to the destination $destinationdir. | ||||
810 | # Example: "File.idt" | ||||
811 | |||||
812 | 109 | 5.46s | installer::systemactions::copy_directory_with_fileextension($newidtdir, $destinationdir, "idt"); # spent 5.46s making 109 calls to installer::systemactions::copy_directory_with_fileextension, avg 50.1ms/call | ||
813 | |||||
814 | # Copying all new created and language dependent idt-files to the destination $destinationdir. | ||||
815 | # Example: "Feature.idt.01" | ||||
816 | |||||
817 | 109 | 6.11s | installer::systemactions::copy_directory_with_fileextension($newidtdir, $destinationdir, $onelanguage); # spent 6.11s making 109 calls to installer::systemactions::copy_directory_with_fileextension, avg 56.1ms/call | ||
818 | 109 | 777ms | installer::systemactions::rename_files_with_fileextension($destinationdir, $onelanguage); # spent 777ms making 109 calls to installer::systemactions::rename_files_with_fileextension, avg 7.13ms/call | ||
819 | |||||
820 | } | ||||
821 | |||||
822 | ############################################################## | ||||
823 | # Returning the source path of the rtf licensefile for | ||||
824 | # a specified language | ||||
825 | ############################################################## | ||||
826 | |||||
827 | sub get_rtflicensefilesource | ||||
828 | { | ||||
829 | my ($language, $includepatharrayref) = @_; | ||||
830 | |||||
831 | my $licensefilename = "license_" . $language . ".rtf"; | ||||
832 | |||||
833 | my $sourcefileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $includepatharrayref, 1); | ||||
834 | |||||
835 | if ($$sourcefileref eq "") { installer::exiter::exit_program("ERROR: Could not find $licensefilename!", "get_rtflicensefilesource"); } | ||||
836 | |||||
837 | my $infoline = "Using licensefile: $$sourcefileref\n"; | ||||
838 | push( @installer::globals::logfileinfo, $infoline); | ||||
839 | |||||
840 | return $$sourcefileref; | ||||
841 | } | ||||
842 | |||||
843 | ############################################################## | ||||
844 | # A simple converter to create a license txt string from | ||||
845 | # the rtf format | ||||
846 | ############################################################## | ||||
847 | |||||
848 | sub make_string_licensetext | ||||
849 | { | ||||
850 | my ($licensefile) = @_; | ||||
851 | |||||
852 | my $rtf_licensetext = ""; | ||||
853 | |||||
854 | for ( my $i = 0; $i <= $#{$licensefile}; $i++ ) | ||||
855 | { | ||||
856 | my $oneline = ${$licensefile}[$i]; | ||||
857 | $oneline =~ s/\s*$//g; # no whitespace at line end | ||||
858 | |||||
859 | $rtf_licensetext = $rtf_licensetext . $oneline . " "; | ||||
860 | } | ||||
861 | |||||
862 | return $rtf_licensetext; | ||||
863 | } | ||||
864 | |||||
865 | ############################################################## | ||||
866 | # Including the license text into the table control.idt | ||||
867 | ############################################################## | ||||
868 | |||||
869 | sub add_licensefile_to_database | ||||
870 | { | ||||
871 | my ($licensefile, $controltable) = @_; | ||||
872 | |||||
873 | # Nine tabs before the license text and two tabs after it | ||||
874 | # The license text has to be included into the dialog | ||||
875 | # LicenseAgreement into the control Memo. | ||||
876 | |||||
877 | my $foundlicenseline = 0; | ||||
878 | my ($number, $line); | ||||
879 | |||||
880 | for ( my $i = 0; $i <= $#{$controltable}; $i++ ) | ||||
881 | { | ||||
882 | $line = ${$controltable}[$i]; | ||||
883 | |||||
884 | if ( $line =~ /^\s*\bLicenseAgreement\b\t\bMemo\t/ ) | ||||
885 | { | ||||
886 | $foundlicenseline = 1; | ||||
887 | $number = $i; | ||||
888 | last; | ||||
889 | } | ||||
890 | } | ||||
891 | |||||
892 | if (!($foundlicenseline)) | ||||
893 | { | ||||
894 | installer::exiter::exit_program("ERROR: Line for license file in Control.idt not found!", "add_licensefile_to_database"); | ||||
895 | } | ||||
896 | else | ||||
897 | { | ||||
898 | my %control = (); | ||||
899 | |||||
900 | if ( $line =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) | ||||
901 | { | ||||
902 | $control{'Dialog_'} = $1; | ||||
903 | $control{'Control'} = $2; | ||||
904 | $control{'Type'} = $3; | ||||
905 | $control{'X'} = $4; | ||||
906 | $control{'Y'} = $5; | ||||
907 | $control{'Width'} = $6; | ||||
908 | $control{'Height'} = $7; | ||||
909 | $control{'Attributes'} = $8; | ||||
910 | $control{'Property'} = $9; | ||||
911 | $control{'Text'} = $10; | ||||
912 | $control{'Control_Next'} = $11; | ||||
913 | $control{'Help'} = $12; | ||||
914 | } | ||||
915 | else | ||||
916 | { | ||||
917 | installer::exiter::exit_program("ERROR: Could not split line correctly!", "add_licensefile_to_database"); | ||||
918 | } | ||||
919 | |||||
920 | my $licensetext = make_string_licensetext($licensefile); | ||||
921 | |||||
922 | $control{'Text'} = $licensetext; | ||||
923 | |||||
924 | my $newline = $control{'Dialog_'} . "\t" . $control{'Control'} . "\t" . $control{'Type'} . "\t" . | ||||
925 | $control{'X'} . "\t" . $control{'Y'} . "\t" . $control{'Width'} . "\t" . | ||||
926 | $control{'Height'} . "\t" . $control{'Attributes'} . "\t" . $control{'Property'} . "\t" . | ||||
927 | $control{'Text'} . "\t" . $control{'Control_Next'} . "\t" . $control{'Help'} . "\n"; | ||||
928 | |||||
929 | ${$controltable}[$number] = $newline | ||||
930 | } | ||||
931 | } | ||||
932 | |||||
933 | ################################################################### | ||||
934 | # Determining the last position in a sequencetable | ||||
935 | # into the tables CustomAc.idt and InstallE.idt. | ||||
936 | ################################################################### | ||||
937 | |||||
938 | sub get_last_position_in_sequencetable | ||||
939 | # spent 170ms (129+41.1) within installer::windows::idtglobal::get_last_position_in_sequencetable which was called 327 times, avg 521µs/call:
# 327 times (129ms+41.1ms) by installer::windows::idtglobal::set_positions_in_table at line 1585, avg 521µs/call | ||||
940 | 56680 | 171ms | my ($sequencetable) = @_; | ||
941 | |||||
942 | my $position = 0; | ||||
943 | |||||
944 | for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) | ||||
945 | { | ||||
946 | my $line = ${$sequencetable}[$i]; | ||||
947 | |||||
948 | 16350 | 41.1ms | if ( $line =~ /^\s*\w+\t.*\t\s*(\d+)\s$/ ) # spent 41.1ms making 16350 calls to installer::windows::idtglobal::CORE:match, avg 3µs/call | ||
949 | { | ||||
950 | my $newposition = $1; | ||||
951 | if ( $newposition > $position ) { $position = $newposition; } | ||||
952 | } | ||||
953 | } | ||||
954 | |||||
955 | return $position; | ||||
956 | } | ||||
957 | |||||
958 | ######################################################################### | ||||
959 | # Determining the position of a specified Action in the sequencetable | ||||
960 | ######################################################################### | ||||
961 | |||||
962 | sub get_position_in_sequencetable | ||||
963 | { | ||||
964 | my ($action, $sequencetable) = @_; | ||||
965 | |||||
966 | my $position = 0; | ||||
967 | |||||
968 | $action =~ s/^\s*behind_//; | ||||
969 | |||||
970 | for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) | ||||
971 | { | ||||
972 | my $line = ${$sequencetable}[$i]; | ||||
973 | |||||
974 | if ( $line =~ /^\s*(\w+)\t.*\t\s*(\d+)\s$/ ) | ||||
975 | { | ||||
976 | my $compareaction = $1; | ||||
977 | $position = $2; | ||||
978 | if ( $compareaction eq $action ) { last; } | ||||
979 | } | ||||
980 | } | ||||
981 | |||||
982 | return $position; | ||||
983 | } | ||||
984 | |||||
985 | ################################################################################################ | ||||
986 | # Including the CustomAction for the configuration | ||||
987 | # into the tables CustomAc.idt and InstallE.idt. | ||||
988 | # | ||||
989 | # CustomAc.idt: ExecutePkgchk 82 pkgchk.exe -s | ||||
990 | # InstallE.idt: ExecutePkgchk Not REMOVE="ALL" 3175 | ||||
991 | # | ||||
992 | # CustomAc.idt: ExecuteQuickstart 82 install_quickstart.exe | ||||
993 | # InstallE.idt: ExecuteQuickstart &gm_o_Quickstart=3 3200 | ||||
994 | # | ||||
995 | # CustomAc.idt: ExecuteInstallRegsvrex 82 regsvrex.exe shlxthdl.dll | ||||
996 | # InstallE.idt: ExecuteInstallRegsvrex Not REMOVE="ALL" 3225 | ||||
997 | # | ||||
998 | # CustomAc.idt: ExecuteUninstallRegsvrex 82 regsvrex.exe /u shlxthdl.dll | ||||
999 | # InstallE.idt: ExecuteUninstallRegsvrex REMOVE="ALL" 690 | ||||
1000 | # | ||||
1001 | # CustomAc.idt: Regmsdocmsidll1 1 reg4msdocmsidll Reg4MsDocEntry | ||||
1002 | # InstallU.idt: Regmsdocmsidll1 Not REMOVE="ALL" 610 | ||||
1003 | # | ||||
1004 | # CustomAc.idt: Regmsdocmsidll2 1 reg4msdocmsidll Reg4MsDocEntry | ||||
1005 | # InstallE.idt: Regmsdocmsidll2 Not REMOVE="ALL" 3160 | ||||
1006 | ################################################################################################ | ||||
1007 | |||||
1008 | sub set_custom_action | ||||
1009 | # spent 115s (115+38.5ms) within installer::windows::idtglobal::set_custom_action which was called 4360 times, avg 26.3ms/call:
# 4360 times (115s+38.5ms) by installer::windows::idtglobal::addcustomactions at line 1725, avg 26.3ms/call | ||||
1010 | 104146012 | 115s | my ($customactionidttable, $actionname, $actionflags, $exefilename, $actionparameter, $inbinarytable, $filesref, $customactionidttablename, $styles) = @_; | ||
1011 | |||||
1012 | my $included_customaction = 0; | ||||
1013 | my $infoline = ""; | ||||
1014 | my $customaction_exefilename = $exefilename; | ||||
1015 | my $uniquename = ""; | ||||
1016 | |||||
1017 | # when the style NO_FILE is set, no searching for the file is needed, no filtering is done, we can add that custom action | ||||
1018 | 4360 | 5.85ms | if ( $styles =~ /\bNO_FILE\b/ ) # spent 5.85ms making 4360 calls to installer::windows::idtglobal::CORE:match, avg 1µs/call | ||
1019 | { | ||||
1020 | my $line = $actionname . "\t" . $actionflags . "\t" . $customaction_exefilename . "\t" . $actionparameter . "\n"; | ||||
1021 | push(@{$customactionidttable}, $line); | ||||
1022 | |||||
1023 | $infoline = "Added $actionname CustomAction into table $customactionidttablename (NO_FILE has been set)\n"; | ||||
1024 | push(@installer::globals::logfileinfo, $infoline); | ||||
1025 | |||||
1026 | $included_customaction = 1; | ||||
1027 | return $included_customaction; | ||||
1028 | } | ||||
1029 | |||||
1030 | # is the $exefilename a library that is included into the binary table | ||||
1031 | |||||
1032 | 4360 | 32.7ms | if ( $inbinarytable ) { $customaction_exefilename =~ s/\.//; } # this is the entry in the binary table ("abc.dll" -> "abcdll") # spent 32.7ms making 4360 calls to installer::windows::idtglobal::CORE:subst, avg 7µs/call | ||
1033 | |||||
1034 | # is the $exefilename included into the product? | ||||
1035 | |||||
1036 | my $contains_file = 0; | ||||
1037 | |||||
1038 | # All files are located in $filesref and in @installer::globals::binarytableonlyfiles. | ||||
1039 | # Both must be added together | ||||
1040 | my $localfilesref = [@installer::globals::binarytableonlyfiles, @{$filesref}]; | ||||
1041 | |||||
1042 | for ( my $i = 0; $i <= $#{$localfilesref}; $i++ ) | ||||
1043 | { | ||||
1044 | my $onefile = ${$localfilesref}[$i]; | ||||
1045 | my $filename = ""; | ||||
1046 | if ( exists($onefile->{'Name'}) ) | ||||
1047 | { | ||||
1048 | $filename = $onefile->{'Name'}; | ||||
1049 | |||||
1050 | if ( $filename eq $exefilename ) | ||||
1051 | { | ||||
1052 | $contains_file = 1; | ||||
1053 | $uniquename = ${$localfilesref}[$i]->{'uniquename'}; | ||||
1054 | last; | ||||
1055 | } | ||||
1056 | } | ||||
1057 | else | ||||
1058 | { | ||||
1059 | installer::exiter::exit_program("ERROR: Did not find \"Name\" for file \"$onefile->{'uniquename'}\" ($onefile->{'gid'})!", "set_custom_action"); | ||||
1060 | } | ||||
1061 | } | ||||
1062 | |||||
1063 | if ( $contains_file ) | ||||
1064 | { | ||||
1065 | # Now the CustomAction can be included into the CustomAc.idt | ||||
1066 | |||||
1067 | if ( ! $inbinarytable ) { $customaction_exefilename = $uniquename; } # the unique file name has to be added to the custom action table | ||||
1068 | |||||
1069 | my $line = $actionname . "\t" . $actionflags . "\t" . $customaction_exefilename . "\t" . $actionparameter . "\n"; | ||||
1070 | push(@{$customactionidttable}, $line); | ||||
1071 | |||||
1072 | $included_customaction = 1; | ||||
1073 | } | ||||
1074 | |||||
1075 | if ( $included_customaction ) { $infoline = "Added $actionname CustomAction into table $customactionidttablename\n"; } | ||||
1076 | else { $infoline = "Did not add $actionname CustomAction into table $customactionidttablename\n"; } | ||||
1077 | push(@installer::globals::logfileinfo, $infoline); | ||||
1078 | |||||
1079 | return $included_customaction; | ||||
1080 | } | ||||
1081 | |||||
1082 | #################################################################### | ||||
1083 | # Adding a Custom Action to InstallExecuteTable or InstallUITable | ||||
1084 | #################################################################### | ||||
1085 | |||||
1086 | sub add_custom_action_to_install_table | ||||
1087 | # spent 12.8s (12.5+260ms) within installer::windows::idtglobal::add_custom_action_to_install_table which was called 3706 times, avg 3.45ms/call:
# 3706 times (12.5s+260ms) by installer::windows::idtglobal::addcustomactions at line 1766, avg 3.45ms/call | ||||
1088 | 131890 | 12.6s | my ($installtable, $exefilename, $actionname, $actioncondition, $position, $filesref, $installtablename, $styles) = @_; | ||
1089 | |||||
1090 | my $included_customaction = 0; | ||||
1091 | my $feature = ""; | ||||
1092 | my $infoline = ""; | ||||
1093 | |||||
1094 | # when the style NO_FILE is set, no searching for the file is needed, no filtering is done, we can add that custom action | ||||
1095 | 3706 | 3.03ms | if ( $styles =~ /\bNO_FILE\b/ ) # spent 3.03ms making 3706 calls to installer::windows::idtglobal::CORE:match, avg 818ns/call | ||
1096 | { | ||||
1097 | # then the InstallE.idt.idt or InstallU.idt.idt | ||||
1098 | $actioncondition =~ s/FEATURETEMPLATE/$feature/g; # only execute Custom Action, if feature of the file is installed | ||||
1099 | |||||
1100 | my $actionposition = 0; | ||||
1101 | |||||
1102 | if ( $position eq "end" ) { $actionposition = get_last_position_in_sequencetable($installtable) + 25; } | ||||
1103 | elsif ( $position =~ /^\s*behind_/ ) { $actionposition = get_position_in_sequencetable($position, $installtable) + 2; } | ||||
1104 | else { $actionposition = get_position_in_sequencetable($position, $installtable) - 2; } | ||||
1105 | |||||
1106 | my $line = $actionname . "\t" . $actioncondition . "\t" . $actionposition . "\n"; | ||||
1107 | push(@{$installtable}, $line); | ||||
1108 | |||||
1109 | $infoline = "Added $actionname CustomAction into table $installtablename (NO_FILE has been set)\n"; | ||||
1110 | push(@installer::globals::logfileinfo, $infoline); | ||||
1111 | return; | ||||
1112 | } | ||||
1113 | |||||
1114 | my $contains_file = 0; | ||||
1115 | |||||
1116 | # All files are located in $filesref and in @installer::globals::binarytableonlyfiles. | ||||
1117 | # Both must be added together | ||||
1118 | my $localfilesref = [@installer::globals::binarytableonlyfiles, @{$filesref}]; | ||||
1119 | |||||
1120 | for ( my $i = 0; $i <= $#{$localfilesref}; $i++ ) | ||||
1121 | { | ||||
1122 | my $filename = ${$localfilesref}[$i]->{'Name'}; | ||||
1123 | |||||
1124 | if ( $filename eq $exefilename ) | ||||
1125 | { | ||||
1126 | $contains_file = 1; | ||||
1127 | |||||
1128 | # Determining the feature of the file | ||||
1129 | |||||
1130 | if ( ${$localfilesref}[$i] ) { $feature = ${$localfilesref}[$i]->{'modules'}; } | ||||
1131 | |||||
1132 | # If modules contains a list of modules, only taking the first one. | ||||
1133 | 3706 | 13.9ms | if ( $feature =~ /^\s*(.*?)\,/ ) { $feature = $1; } # spent 13.9ms making 3706 calls to installer::windows::idtglobal::CORE:match, avg 4µs/call | ||
1134 | # Attention: Maximum feature length is 38! | ||||
1135 | 3706 | 224ms | shorten_feature_gid(\$feature); # spent 224ms making 3706 calls to installer::windows::idtglobal::shorten_feature_gid, avg 60µs/call | ||
1136 | |||||
1137 | last; | ||||
1138 | } | ||||
1139 | } | ||||
1140 | |||||
1141 | if ( $contains_file ) | ||||
1142 | { | ||||
1143 | # then the InstallE.idt.idt or InstallU.idt.idt | ||||
1144 | |||||
1145 | 3706 | 5.66ms | $actioncondition =~ s/FEATURETEMPLATE/$feature/g; # only execute Custom Action, if feature of the file is installed # spent 5.66ms making 3706 calls to installer::windows::idtglobal::CORE:subst, avg 2µs/call | ||
1146 | |||||
1147 | # my $actionposition = 0; | ||||
1148 | # if ( $position eq "end" ) { $actionposition = get_last_position_in_sequencetable($installtable) + 25; } | ||||
1149 | # elsif ( $position =~ /^\s*behind_/ ) { $actionposition = get_position_in_sequencetable($position, $installtable) + 2; } | ||||
1150 | # else { $actionposition = get_position_in_sequencetable($position, $installtable) - 2; } | ||||
1151 | # my $line = $actionname . "\t" . $actioncondition . "\t" . $actionposition . "\n"; | ||||
1152 | |||||
1153 | my $positiontemplate = ""; | ||||
1154 | 3706 | 13.9ms | if ( $position =~ /^\s*\d+\s*$/ ) { $positiontemplate = $position; } # setting the position directly, number defined in scp2 # spent 13.9ms making 3706 calls to installer::windows::idtglobal::CORE:match, avg 4µs/call | ||
1155 | else { $positiontemplate = "POSITIONTEMPLATE_" . $position; } | ||||
1156 | |||||
1157 | my $line = $actionname . "\t" . $actioncondition . "\t" . $positiontemplate . "\n"; | ||||
1158 | push(@{$installtable}, $line); | ||||
1159 | |||||
1160 | $included_customaction = 1; | ||||
1161 | } | ||||
1162 | |||||
1163 | if ( $included_customaction ) { $infoline = "Added $actionname CustomAction into table $installtablename\n"; } | ||||
1164 | else { $infoline = "Did not add $actionname CustomAction into table $installtablename\n"; } | ||||
1165 | push(@installer::globals::logfileinfo, $infoline); | ||||
1166 | |||||
1167 | } | ||||
1168 | |||||
1169 | ################################################################## | ||||
1170 | # A line in the table ControlEvent connects a Control | ||||
1171 | # with a Custom Action | ||||
1172 | ################################################################# | ||||
1173 | |||||
1174 | sub connect_custom_action_to_control | ||||
1175 | # spent 20.3ms (10.5+9.83) within installer::windows::idtglobal::connect_custom_action_to_control which was called 545 times, avg 37µs/call:
# 545 times (10.5ms+9.83ms) by installer::windows::idtglobal::addcustomactions at line 1766, avg 37µs/call | ||||
1176 | 3270 | 21.1ms | my ( $table, $tablename, $dialog, $control, $event, $argument, $condition, $ordering) = @_; | ||
1177 | |||||
1178 | my $line = $dialog . "\t" . $control. "\t" . $event. "\t" . $argument. "\t" . $condition. "\t" . $ordering . "\n"; | ||||
1179 | |||||
1180 | push(@{$table}, $line); | ||||
1181 | |||||
1182 | 545 | 9.83ms | $line =~ s/\s*$//g; # spent 9.83ms making 545 calls to installer::windows::idtglobal::CORE:subst, avg 18µs/call | ||
1183 | |||||
1184 | $infoline = "Added line \"$line\" into table $tablename\n"; | ||||
1185 | push(@installer::globals::logfileinfo, $infoline); | ||||
1186 | } | ||||
1187 | |||||
1188 | ################################################################## | ||||
1189 | # A line in the table ControlCondition connects a Control state | ||||
1190 | # with a condition | ||||
1191 | ################################################################## | ||||
1192 | |||||
1193 | sub connect_condition_to_control | ||||
1194 | { | ||||
1195 | my ( $table, $tablename, $dialog, $control, $event, $condition) = @_; | ||||
1196 | |||||
1197 | my $line = $dialog . "\t" . $control. "\t" . $event. "\t" . $condition. "\n"; | ||||
1198 | |||||
1199 | push(@{$table}, $line); | ||||
1200 | |||||
1201 | $line =~ s/\s*$//g; | ||||
1202 | |||||
1203 | $infoline = "Added line \"$line\" into table $tablename\n"; | ||||
1204 | push(@installer::globals::logfileinfo, $infoline); | ||||
1205 | } | ||||
1206 | |||||
1207 | ################################################################## | ||||
1208 | # Searching for a sequencenumber in InstallUISequence table | ||||
1209 | # "ExecuteAction" must be the last action | ||||
1210 | ################################################################## | ||||
1211 | |||||
1212 | sub get_free_number_in_uisequence_table | ||||
1213 | { | ||||
1214 | my ( $installuitable ) = @_; | ||||
1215 | |||||
1216 | # determining the sequence of "ExecuteAction" | ||||
1217 | |||||
1218 | my $executeactionnumber = 0; | ||||
1219 | |||||
1220 | for ( my $i = 0; $i <= $#{$installuitable}; $i++ ) | ||||
1221 | { | ||||
1222 | if ( ${$installuitable}[$i] =~ /^\s*(\w+)\t\w*\t(\d+)\s*$/ ) | ||||
1223 | { | ||||
1224 | my $actionname = $1; | ||||
1225 | my $actionnumber = $2; | ||||
1226 | |||||
1227 | if ( $actionname eq "ExecuteAction" ) | ||||
1228 | { | ||||
1229 | $executeactionnumber = $actionnumber; | ||||
1230 | last; | ||||
1231 | } | ||||
1232 | } | ||||
1233 | } | ||||
1234 | |||||
1235 | if ( $executeactionnumber == 0 ) { installer::exiter::exit_program("ERROR: Did not find \"ExecuteAction\" in InstallUISequence table!", "get_free_number_in_uisequence_table"); } | ||||
1236 | |||||
1237 | # determining the sequence of the action before "ExecuteAction" | ||||
1238 | |||||
1239 | my $lastactionnumber = 0; | ||||
1240 | |||||
1241 | for ( my $i = 0; $i <= $#{$installuitable}; $i++ ) | ||||
1242 | { | ||||
1243 | if ( ${$installuitable}[$i] =~ /^\s*\w+\t\w*\t(\d+)\s*$/ ) | ||||
1244 | { | ||||
1245 | my $actionnumber = $1; | ||||
1246 | |||||
1247 | if (( $actionnumber > $lastactionnumber ) && ( $actionnumber != $executeactionnumber )) | ||||
1248 | { | ||||
1249 | $lastactionnumber = $actionnumber; | ||||
1250 | } | ||||
1251 | } | ||||
1252 | } | ||||
1253 | |||||
1254 | # the new number can now be calculated | ||||
1255 | |||||
1256 | my $newnumber = 0; | ||||
1257 | |||||
1258 | if ((( $lastactionnumber + $executeactionnumber ) % 2 ) == 0 ) { $newnumber = ( $lastactionnumber + $executeactionnumber ) / 2; } | ||||
1259 | else { $newnumber = ( $lastactionnumber + $executeactionnumber -1 ) / 2; } | ||||
1260 | |||||
1261 | return $newnumber; | ||||
1262 | } | ||||
1263 | |||||
1264 | ############################################################# | ||||
1265 | # Including the new subdir into the directory table | ||||
1266 | ############################################################# | ||||
1267 | |||||
1268 | sub include_subdirname_into_directory_table | ||||
1269 | { | ||||
1270 | my ($dirname, $directorytable, $directorytablename, $onefile) = @_; | ||||
1271 | |||||
1272 | my $subdir = ""; | ||||
1273 | if ( $onefile->{'Subdir'} ) { $subdir = $onefile->{'Subdir'}; } | ||||
1274 | if ( $subdir eq "" ) { installer::exiter::exit_program("ERROR: No \"Subdir\" defined for $onefile->{'Name'}", "include_subdirname_into_directory_table"); } | ||||
1275 | |||||
1276 | # program INSTALLLOCATION program -> subjava INSTALLLOCATION program:java | ||||
1277 | |||||
1278 | my $uniquename = ""; | ||||
1279 | my $parent = ""; | ||||
1280 | my $name = ""; | ||||
1281 | |||||
1282 | my $includedline = 0; | ||||
1283 | |||||
1284 | my $newdir = ""; | ||||
1285 | |||||
1286 | for ( my $i = 0; $i <= $#{$directorytable}; $i++ ) | ||||
1287 | { | ||||
1288 | |||||
1289 | if ( ${$directorytable}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\s*$/ ) | ||||
1290 | { | ||||
1291 | $uniquename = $1; | ||||
1292 | $parent = $2; | ||||
1293 | $name = $3; | ||||
1294 | |||||
1295 | if ( $dirname eq $name ) | ||||
1296 | { | ||||
1297 | my $newuniquename = "sub" . $subdir; | ||||
1298 | $newdir = $newuniquename; | ||||
1299 | my $newparent = "INSTALLLOCATION"; | ||||
1300 | my $newname = $name . "\:" . $subdir; | ||||
1301 | my $newline = | ||||
1302 | $line = "$newuniquename\t$newparent\t$newname\n"; | ||||
1303 | push(@{$directorytable}, $line); | ||||
1304 | installer::remover::remove_leading_and_ending_whitespaces(\$line); | ||||
1305 | $infoline = "Added $line into directory table $directorytablename\n"; | ||||
1306 | push(@installer::globals::logfileinfo, $infoline); | ||||
1307 | |||||
1308 | $includedline = 1; | ||||
1309 | last; | ||||
1310 | } | ||||
1311 | } | ||||
1312 | } | ||||
1313 | |||||
1314 | if ( ! $includedline ) { installer::exiter::exit_program("ERROR: Could not include new subdirectory into directory table for file $onefile->{'Name'}!", "include_subdirname_into_directory_table"); } | ||||
1315 | |||||
1316 | return $newdir; | ||||
1317 | } | ||||
1318 | |||||
1319 | ################################################################## | ||||
1320 | # Including the new sub directory into the component table | ||||
1321 | ################################################################## | ||||
1322 | |||||
1323 | sub include_subdir_into_componenttable | ||||
1324 | { | ||||
1325 | my ($subdir, $onefile, $componenttable) = @_; | ||||
1326 | |||||
1327 | my $componentname = $onefile->{'componentname'}; | ||||
1328 | |||||
1329 | my $changeddirectory = 0; | ||||
1330 | |||||
1331 | for ( my $i = 0; $i <= $#{$componenttable}; $i++ ) | ||||
1332 | { | ||||
1333 | if ( ${$componenttable}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) | ||||
1334 | { | ||||
1335 | my $localcomponentname = $1; | ||||
1336 | my $directory = $3; | ||||
1337 | |||||
1338 | if ( $componentname eq $localcomponentname ) | ||||
1339 | { | ||||
1340 | my $oldvalue = ${$componenttable}[$i]; | ||||
1341 | ${$componenttable}[$i] =~ s/\b\Q$directory\E\b/$subdir/; | ||||
1342 | my $newvalue = ${$componenttable}[$i]; | ||||
1343 | |||||
1344 | installer::remover::remove_leading_and_ending_whitespaces(\$oldvalue); | ||||
1345 | installer::remover::remove_leading_and_ending_whitespaces(\$newvalue); | ||||
1346 | $infoline = "Change in Component table: From \"$oldvalue\" to \"$newvalue\"\n"; | ||||
1347 | push(@installer::globals::logfileinfo, $infoline); | ||||
1348 | |||||
1349 | $changeddirectory = 1; | ||||
1350 | last; | ||||
1351 | } | ||||
1352 | } | ||||
1353 | } | ||||
1354 | |||||
1355 | if ( ! $changeddirectory ) { installer::exiter::exit_program("ERROR: Could not change directory for component: $onefile->{'Name'}!", "include_subdir_into_componenttable"); } | ||||
1356 | |||||
1357 | } | ||||
1358 | |||||
1359 | ################################################################## | ||||
1360 | # Setting the encoding in all idt files. Replacing the | ||||
1361 | # variable WINDOWSENCODINGTEMPLATE | ||||
1362 | ################################################################## | ||||
1363 | |||||
1364 | sub setencoding | ||||
1365 | # spent 65.0s (29.1+35.9) within installer::windows::idtglobal::setencoding which was called 109 times, avg 597ms/call:
# 109 times (29.1s+35.9s) by installer::run at line 1608 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm, avg 597ms/call | ||||
1366 | 6205152 | 32.7s | my ( $languageidtdir, $onelanguage ) = @_; | ||
1367 | |||||
1368 | 109 | 1.87ms | my $encoding = installer::windows::language::get_windows_encoding($onelanguage); # spent 1.87ms making 109 calls to installer::windows::language::get_windows_encoding, avg 17µs/call | ||
1369 | |||||
1370 | # collecting all idt files in the directory $languageidtdir and substituting the string | ||||
1371 | |||||
1372 | 109 | 110ms | my $idtfiles = installer::systemactions::find_file_with_file_extension("idt", $languageidtdir); # spent 110ms making 109 calls to installer::systemactions::find_file_with_file_extension, avg 1.01ms/call | ||
1373 | |||||
1374 | for ( my $i = 0; $i <= $#{$idtfiles}; $i++ ) | ||||
1375 | { | ||||
1376 | my $onefilename = $languageidtdir . $installer::globals::separator . ${$idtfiles}[$i]; | ||||
1377 | 4578 | 27.8s | my $onefile = installer::files::read_file($onefilename); # spent 27.8s making 4578 calls to installer::files::read_file, avg 6.08ms/call | ||
1378 | |||||
1379 | for ( my $j = 0; $j <= $#{$onefile}; $j++ ) | ||||
1380 | { | ||||
1381 | 6186404 | 3.61s | ${$onefile}[$j] =~ s/WINDOWSENCODINGTEMPLATE/$encoding/g; # spent 3.61s making 6186404 calls to installer::windows::idtglobal::CORE:subst, avg 584ns/call | ||
1382 | } | ||||
1383 | |||||
1384 | 4578 | 4.37s | installer::files::save_file($onefilename, $onefile); # spent 4.37s making 4578 calls to installer::files::save_file, avg 955µs/call | ||
1385 | } | ||||
1386 | } | ||||
1387 | |||||
1388 | ################################################################## | ||||
1389 | # Setting the condition, that at least one module is selected. | ||||
1390 | # All modules with flag SHOW_MULTILINGUAL_ONLY were already | ||||
1391 | # collected. In table ControlE.idt, the string | ||||
1392 | # LANGUAGECONDITIONINSTALL needs to be replaced. | ||||
1393 | # Also for APPLICATIONCONDITIONINSTALL for the applications | ||||
1394 | # with flag APPLICATIONMODULE. | ||||
1395 | ################################################################## | ||||
1396 | |||||
1397 | sub set_multilanguageonly_condition | ||||
1398 | # spent 358ms (164+194) within installer::windows::idtglobal::set_multilanguageonly_condition which was called 109 times, avg 3.28ms/call:
# 109 times (164ms+194ms) by installer::run at line 1615 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm, avg 3.28ms/call | ||||
1399 | 44145 | 209ms | my ( $languageidtdir ) = @_; | ||
1400 | |||||
1401 | my $onefilename = $languageidtdir . $installer::globals::separator . "ControlE.idt"; | ||||
1402 | 109 | 93.0ms | my $onefile = installer::files::read_file($onefilename); # spent 93.0ms making 109 calls to installer::files::read_file, avg 853µs/call | ||
1403 | |||||
1404 | # Language modules | ||||
1405 | |||||
1406 | my $condition = ""; | ||||
1407 | |||||
1408 | 109 | 8.91ms | foreach my $module ( sort keys %installer::globals::multilingual_only_modules ) # spent 8.91ms making 109 calls to installer::windows::idtglobal::CORE:sort, avg 82µs/call | ||
1409 | { | ||||
1410 | $condition = $condition . " &$module=3 Or"; | ||||
1411 | } | ||||
1412 | |||||
1413 | 109 | 925µs | $condition =~ s/^\s*//; # spent 925µs making 109 calls to installer::windows::idtglobal::CORE:subst, avg 8µs/call | ||
1414 | 109 | 18.1ms | $condition =~ s/\s*Or\s*$//; # removing the ending "Or" # spent 18.1ms making 109 calls to installer::windows::idtglobal::CORE:subst, avg 166µs/call | ||
1415 | |||||
1416 | if ( $condition eq "" ) { $condition = "1"; } | ||||
1417 | |||||
1418 | for ( my $j = 0; $j <= $#{$onefile}; $j++ ) | ||||
1419 | { | ||||
1420 | 14933 | 8.51ms | ${$onefile}[$j] =~ s/LANGUAGECONDITIONINSTALL/$condition/; # spent 8.51ms making 14933 calls to installer::windows::idtglobal::CORE:subst, avg 570ns/call | ||
1421 | } | ||||
1422 | |||||
1423 | # Application modules | ||||
1424 | |||||
1425 | $condition = ""; | ||||
1426 | |||||
1427 | 109 | 442µs | foreach my $module ( sort keys %installer::globals::application_modules ) # spent 442µs making 109 calls to installer::windows::idtglobal::CORE:sort, avg 4µs/call | ||
1428 | { | ||||
1429 | $condition = $condition . " &$module=3 Or"; | ||||
1430 | } | ||||
1431 | |||||
1432 | 109 | 336µs | $condition =~ s/^\s*//; # spent 336µs making 109 calls to installer::windows::idtglobal::CORE:subst, avg 3µs/call | ||
1433 | 109 | 1.12ms | $condition =~ s/\s*Or\s*$//; # removing the ending "Or" # spent 1.12ms making 109 calls to installer::windows::idtglobal::CORE:subst, avg 10µs/call | ||
1434 | |||||
1435 | if ( $condition eq "" ) { $condition = "1"; } | ||||
1436 | |||||
1437 | for ( my $j = 0; $j <= $#{$onefile}; $j++ ) | ||||
1438 | { | ||||
1439 | 14933 | 7.99ms | ${$onefile}[$j] =~ s/APPLICATIONCONDITIONINSTALL/$condition/; # spent 7.99ms making 14933 calls to installer::windows::idtglobal::CORE:subst, avg 535ns/call | ||
1440 | } | ||||
1441 | |||||
1442 | 109 | 55.1ms | installer::files::save_file($onefilename, $onefile); # spent 55.1ms making 109 calls to installer::files::save_file, avg 506µs/call | ||
1443 | } | ||||
1444 | |||||
1445 | ############################################# | ||||
1446 | # Putting array values into hash | ||||
1447 | ############################################# | ||||
1448 | |||||
1449 | sub fill_assignment_hash | ||||
1450 | # spent 716ms (461+255) within installer::windows::idtglobal::fill_assignment_hash which was called 4251 times, avg 168µs/call:
# 2616 times (250ms+140ms) by installer::windows::idtglobal::create_customaction_assignment_hash at line 1506, avg 149µs/call
# 654 times (59.7ms+33.6ms) by installer::windows::idtglobal::create_customaction_assignment_hash at line 1499, avg 143µs/call
# 545 times (111ms+59.7ms) by installer::windows::idtglobal::create_customaction_assignment_hash at line 1520, avg 313µs/call
# 436 times (40.1ms+21.3ms) by installer::windows::idtglobal::create_customaction_assignment_hash at line 1513, avg 141µs/call | ||||
1451 | 166334 | 500ms | my ($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray) = @_; | ||
1452 | |||||
1453 | my $max = $parameter - 1; | ||||
1454 | |||||
1455 | if ( $max != $#{$assignmentarray} ) | ||||
1456 | { | ||||
1457 | my $definedparameter = $#{$assignmentarray} + 1; | ||||
1458 | installer::exiter::exit_program("ERROR: gid: $gid, key: $key ! Wrong parameter in scp. For table $tablename $parameter parameter are required ! You defined: $definedparameter", "fill_assignment_hash"); | ||||
1459 | } | ||||
1460 | |||||
1461 | for ( my $i = 0; $i <= $#{$assignmentarray}; $i++ ) | ||||
1462 | { | ||||
1463 | my $counter = $i + 1; | ||||
1464 | my $key = "parameter". $counter; | ||||
1465 | |||||
1466 | my $localvalue = ${$assignmentarray}[$i]; | ||||
1467 | 14933 | 196ms | installer::remover::remove_leading_and_ending_quotationmarks(\$localvalue); # spent 196ms making 14933 calls to installer::remover::remove_leading_and_ending_quotationmarks, avg 13µs/call | ||
1468 | 14933 | 26.0ms | $localvalue =~ s/\\\"/\"/g; # spent 26.0ms making 14933 calls to installer::windows::idtglobal::CORE:subst, avg 2µs/call | ||
1469 | 14933 | 9.00ms | $localvalue =~ s/\\\!/\!/g; # spent 9.00ms making 14933 calls to installer::windows::idtglobal::CORE:subst, avg 603ns/call | ||
1470 | 14933 | 8.82ms | $localvalue =~ s/\\\&/\&/g; # spent 8.82ms making 14933 calls to installer::windows::idtglobal::CORE:subst, avg 591ns/call | ||
1471 | 14933 | 7.36ms | $localvalue =~ s/\\\</\</g; # spent 7.36ms making 14933 calls to installer::windows::idtglobal::CORE:subst, avg 493ns/call | ||
1472 | 14933 | 7.11ms | $localvalue =~ s/\\\>/\>/g; # spent 7.11ms making 14933 calls to installer::windows::idtglobal::CORE:subst, avg 476ns/call | ||
1473 | $assignmenthashref->{$key} = $localvalue; | ||||
1474 | } | ||||
1475 | } | ||||
1476 | |||||
1477 | ########################################################################## | ||||
1478 | # Checking the assignment of a Windows CustomAction and putting it | ||||
1479 | # into a hash | ||||
1480 | ########################################################################## | ||||
1481 | |||||
1482 | sub create_customaction_assignment_hash | ||||
1483 | # spent 923ms (121+802) within installer::windows::idtglobal::create_customaction_assignment_hash which was called 4251 times, avg 217µs/call:
# 4251 times (121ms+802ms) by installer::windows::idtglobal::addcustomactions at line 1764, avg 217µs/call | ||||
1484 | 72267 | 108ms | my ($gid, $name, $key, $assignmentarray) = @_; | ||
1485 | |||||
1486 | my %assignment = (); | ||||
1487 | my $assignmenthashref = \%assignment; | ||||
1488 | |||||
1489 | my $tablename = ${$assignmentarray}[0]; | ||||
1490 | 4251 | 86.2ms | installer::remover::remove_leading_and_ending_quotationmarks(\$tablename); # spent 86.2ms making 4251 calls to installer::remover::remove_leading_and_ending_quotationmarks, avg 20µs/call | ||
1491 | |||||
1492 | my $tablename_defined = 0; | ||||
1493 | my $parameter = 0; | ||||
1494 | |||||
1495 | if ( $tablename eq "InstallUISequence" ) | ||||
1496 | { | ||||
1497 | $tablename_defined = 1; | ||||
1498 | $parameter = 3; | ||||
1499 | 654 | 93.3ms | fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); # spent 93.3ms making 654 calls to installer::windows::idtglobal::fill_assignment_hash, avg 143µs/call | ||
1500 | } | ||||
1501 | |||||
1502 | if ( $tablename eq "InstallExecuteSequence" ) | ||||
1503 | { | ||||
1504 | $tablename_defined = 1; | ||||
1505 | $parameter = 3; | ||||
1506 | 2616 | 390ms | fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); # spent 390ms making 2616 calls to installer::windows::idtglobal::fill_assignment_hash, avg 149µs/call | ||
1507 | } | ||||
1508 | |||||
1509 | if ( $tablename eq "AdminExecuteSequence" ) | ||||
1510 | { | ||||
1511 | $tablename_defined = 1; | ||||
1512 | $parameter = 3; | ||||
1513 | 436 | 61.3ms | fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); # spent 61.3ms making 436 calls to installer::windows::idtglobal::fill_assignment_hash, avg 141µs/call | ||
1514 | } | ||||
1515 | |||||
1516 | if ( $tablename eq "ControlEvent" ) | ||||
1517 | { | ||||
1518 | $tablename_defined = 1; | ||||
1519 | $parameter = 7; | ||||
1520 | 545 | 171ms | fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); # spent 171ms making 545 calls to installer::windows::idtglobal::fill_assignment_hash, avg 313µs/call | ||
1521 | } | ||||
1522 | |||||
1523 | if ( $tablename eq "ControlCondition" ) | ||||
1524 | { | ||||
1525 | $tablename_defined = 1; | ||||
1526 | $parameter = 5; | ||||
1527 | fill_assignment_hash($gid, $name, $key, $assignmenthashref, $parameter, $tablename, $assignmentarray); | ||||
1528 | } | ||||
1529 | |||||
1530 | if ( ! $tablename_defined ) | ||||
1531 | { | ||||
1532 | installer::exiter::exit_program("ERROR: gid: $gid, key: $key ! Unknown Windows CustomAction table: $tablename ! Currently supported: InstallUISequence, InstallExecuteSequence, ControlEvent, ControlCondition", "create_customaction_assignment_hash"); | ||||
1533 | } | ||||
1534 | |||||
1535 | return $assignmenthashref; | ||||
1536 | } | ||||
1537 | |||||
1538 | ########################################################################## | ||||
1539 | # Finding the position of a specified CustomAction. | ||||
1540 | # If the CustomAction is not found, the return value is "-1". | ||||
1541 | # If the CustomAction position is not defined yet, | ||||
1542 | # the return value is also "-1". | ||||
1543 | ########################################################################## | ||||
1544 | |||||
1545 | sub get_customaction_position | ||||
1546 | # spent 1.34s (1.02+324ms) within installer::windows::idtglobal::get_customaction_position which was called 2943 times, avg 457µs/call:
# 2943 times (1.02s+324ms) by installer::windows::idtglobal::set_positions_in_table at line 1635, avg 457µs/call | ||||
1547 | 602552 | 1.35s | my ($action, $sequencetable) = @_; | ||
1548 | |||||
1549 | my $position = -1; | ||||
1550 | |||||
1551 | for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) | ||||
1552 | { | ||||
1553 | my $line = ${$sequencetable}[$i]; | ||||
1554 | |||||
1555 | 126004 | 324ms | if ( $line =~ /^\s*([\w\.]+)\t.*\t\s*(\d+)\s$/ ) # matching only, if position is a number! # spent 324ms making 126004 calls to installer::windows::idtglobal::CORE:match, avg 3µs/call | ||
1556 | { | ||||
1557 | my $compareaction = $1; | ||||
1558 | my $localposition = $2; | ||||
1559 | |||||
1560 | if ( $compareaction eq $action ) | ||||
1561 | { | ||||
1562 | $position = $localposition; | ||||
1563 | last; | ||||
1564 | } | ||||
1565 | } | ||||
1566 | } | ||||
1567 | |||||
1568 | return $position; | ||||
1569 | } | ||||
1570 | |||||
1571 | ########################################################################## | ||||
1572 | # Setting the position of CustomActions in sequence tables. | ||||
1573 | # Replacing all occurrences of "POSITIONTEMPLATE_" | ||||
1574 | ########################################################################## | ||||
1575 | |||||
1576 | sub set_positions_in_table | ||||
1577 | # spent 2.04s (423ms+1.62) within installer::windows::idtglobal::set_positions_in_table which was called 327 times, avg 6.25ms/call:
# 109 times (297ms+1.37s) by installer::windows::idtglobal::addcustomactions at line 1796, avg 15.3ms/call
# 109 times (93.5ms+214ms) by installer::windows::idtglobal::addcustomactions at line 1797, avg 2.82ms/call
# 109 times (32.4ms+37.3ms) by installer::windows::idtglobal::addcustomactions at line 1798, avg 639µs/call | ||||
1578 | 135051 | 522ms | my ( $sequencetable, $tablename ) = @_; | ||
1579 | |||||
1580 | my $infoline = "\nSetting positions in table \"$tablename\".\n"; | ||||
1581 | push(@installer::globals::logfileinfo, $infoline); | ||||
1582 | |||||
1583 | # Step 1: Resolving all occurrences of "POSITIONTEMPLATE_end" | ||||
1584 | |||||
1585 | 327 | 170ms | my $lastposition = get_last_position_in_sequencetable($sequencetable); # spent 170ms making 327 calls to installer::windows::idtglobal::get_last_position_in_sequencetable, avg 521µs/call | ||
1586 | |||||
1587 | for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) | ||||
1588 | { | ||||
1589 | 16350 | 12.0ms | if ( ${$sequencetable}[$i] =~ /^\s*([\w\.]+)\t.*\t\s*POSITIONTEMPLATE_end\s*$/ ) # spent 12.0ms making 16350 calls to installer::windows::idtglobal::CORE:match, avg 731ns/call | ||
1590 | { | ||||
1591 | my $customaction = $1; | ||||
1592 | $lastposition = $lastposition + 25; | ||||
1593 | 1308 | 3.53ms | ${$sequencetable}[$i] =~ s/POSITIONTEMPLATE_end/$lastposition/; # spent 3.53ms making 1308 calls to installer::windows::idtglobal::CORE:subst, avg 3µs/call | ||
1594 | $infoline = "Setting position \"$lastposition\" for custom action \"$customaction\".\n"; | ||||
1595 | push(@installer::globals::logfileinfo, $infoline); | ||||
1596 | } | ||||
1597 | } | ||||
1598 | |||||
1599 | # Step 2: Resolving all occurrences of "POSITIONTEMPLATE_abc" or "POSITIONTEMPLATE_behind_abc" | ||||
1600 | # where abc is the name of the reference Custom Action. | ||||
1601 | # This has to be done, until there is no more occurrence of POSITIONTEMPLATE (success) | ||||
1602 | # or there is no replacement in one circle (failure). | ||||
1603 | |||||
1604 | my $template_exists = 0; | ||||
1605 | my $template_replaced = 0; | ||||
1606 | my $counter = 0; | ||||
1607 | |||||
1608 | do | ||||
1609 | { | ||||
1610 | $template_exists = 0; | ||||
1611 | $template_replaced = 0; | ||||
1612 | $counter++; | ||||
1613 | |||||
1614 | for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) | ||||
1615 | { | ||||
1616 | 47197 | 38.9ms | if ( ${$sequencetable}[$i] =~ /^\s*([\w\.]+)\t.*\t\s*(POSITIONTEMPLATE_.*?)\s*$/ ) # spent 38.9ms making 47197 calls to installer::windows::idtglobal::CORE:match, avg 824ns/call | ||
1617 | { | ||||
1618 | my $onename = $1; | ||||
1619 | my $templatename = $2; | ||||
1620 | my $positionname = $templatename; | ||||
1621 | my $customaction = $templatename; | ||||
1622 | 2943 | 6.37ms | $customaction =~ s/POSITIONTEMPLATE_//; # spent 6.37ms making 2943 calls to installer::windows::idtglobal::CORE:subst, avg 2µs/call | ||
1623 | $template_exists = 1; | ||||
1624 | |||||
1625 | # Trying to find the correct number. | ||||
1626 | # This can fail, if the custom action has no number | ||||
1627 | |||||
1628 | my $setbehind = 0; | ||||
1629 | 2943 | 2.11ms | if ( $customaction =~ /^\s*behind_(.*?)\s*$/ ) # spent 2.11ms making 2943 calls to installer::windows::idtglobal::CORE:match, avg 716ns/call | ||
1630 | { | ||||
1631 | $customaction = $1; | ||||
1632 | $setbehind = 1; | ||||
1633 | } | ||||
1634 | |||||
1635 | 2943 | 1.34s | my $position = get_customaction_position($customaction, $sequencetable); # spent 1.34s making 2943 calls to installer::windows::idtglobal::get_customaction_position, avg 457µs/call | ||
1636 | |||||
1637 | if ( $position >= 0 ) # Found CustomAction and is has a position. Otherwise return value is "-1". | ||||
1638 | { | ||||
1639 | my $newposition = 0; | ||||
1640 | if ( $setbehind ) { $newposition = $position + 2; } | ||||
1641 | else { $newposition = $position - 2; } | ||||
1642 | 4578 | 35.9ms | ${$sequencetable}[$i] =~ s/$templatename/$newposition/; # spent 29.6ms making 2289 calls to installer::windows::idtglobal::CORE:regcomp, avg 13µs/call
# spent 6.29ms making 2289 calls to installer::windows::idtglobal::CORE:subst, avg 3µs/call | ||
1643 | $template_replaced = 1; | ||||
1644 | $infoline = "Setting position \"$newposition\" for custom action \"$onename\" (scp: \"$positionname\" at position $position).\n"; | ||||
1645 | push(@installer::globals::logfileinfo, $infoline); | ||||
1646 | } | ||||
1647 | else | ||||
1648 | { | ||||
1649 | $infoline = "Could not assign position for custom action \"$onename\" yet (scp: \"$positionname\").\n"; | ||||
1650 | push(@installer::globals::logfileinfo, $infoline); | ||||
1651 | } | ||||
1652 | } | ||||
1653 | } | ||||
1654 | } while (( $template_exists ) && ( $template_replaced )); | ||||
1655 | |||||
1656 | # An error occurred, because templates still exist, but could not be replaced. | ||||
1657 | # Reason: | ||||
1658 | # 1. Wrong name of CustomAction in scp2 (typo?) | ||||
1659 | # 2. Circular dependencies of CustomActions (A after B and B after A) | ||||
1660 | |||||
1661 | # Problem: It is allowed, that a CustomAction is defined in scp2 in a library that is | ||||
1662 | # part of product ABC, but this CustomAction is not used in this product | ||||
1663 | # and the reference CustomAction is not part of this product. | ||||
1664 | # Therefore this cannot be an error, but only produce a warning. The assigned number | ||||
1665 | # must be the last sequence number. | ||||
1666 | |||||
1667 | if (( $template_exists ) && ( ! $template_replaced )) | ||||
1668 | { | ||||
1669 | for ( my $i = 0; $i <= $#{$sequencetable}; $i++ ) | ||||
1670 | { | ||||
1671 | 10464 | 5.87ms | if ( ${$sequencetable}[$i] =~ /^\s*([\w\.]+)\t.*\t\s*(POSITIONTEMPLATE_.*?)\s*$/ ) # spent 5.87ms making 10464 calls to installer::windows::idtglobal::CORE:match, avg 561ns/call | ||
1672 | { | ||||
1673 | my $customactionname = $1; | ||||
1674 | my $fulltemplate = $2; | ||||
1675 | my $template = $fulltemplate; | ||||
1676 | 109 | 297µs | $template =~ s/POSITIONTEMPLATE_//; # spent 297µs making 109 calls to installer::windows::idtglobal::CORE:subst, avg 3µs/call | ||
1677 | $lastposition = $lastposition + 25; | ||||
1678 | 218 | 406µs | ${$sequencetable}[$i] =~ s/$fulltemplate/$lastposition/; # spent 314µs making 109 calls to installer::windows::idtglobal::CORE:subst, avg 3µs/call
# spent 92µs making 109 calls to installer::windows::idtglobal::CORE:regcomp, avg 847ns/call | ||
1679 | $infoline = "WARNING: Setting position \"$lastposition\" for custom action \"$customactionname\". Could not find CustomAction \"$template\".\n"; | ||||
1680 | push(@installer::globals::logfileinfo, $infoline); | ||||
1681 | } | ||||
1682 | } | ||||
1683 | } | ||||
1684 | } | ||||
1685 | |||||
1686 | ########################################################################## | ||||
1687 | # Setting the Windows custom actions into different tables | ||||
1688 | # CustomAc.idt, InstallE.idt, InstallU.idt, ControlE.idt, ControlC.idt | ||||
1689 | ########################################################################## | ||||
1690 | |||||
1691 | sub addcustomactions | ||||
1692 | # spent 132s (447ms+131) within installer::windows::idtglobal::addcustomactions which was called 109 times, avg 1.21s/call:
# 109 times (447ms+131s) by installer::run at line 1665 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm, avg 1.21s/call | ||||
1693 | 105512 | 438ms | my ($languageidtdir, $customactions, $filesarray) = @_; | ||
1694 | |||||
1695 | 109 | 21.5ms | installer::logger::include_timestamp_into_logfile("\nPerformance Info: addcustomactions start\n"); # spent 21.5ms making 109 calls to installer::logger::include_timestamp_into_logfile, avg 197µs/call | ||
1696 | |||||
1697 | my $customactionidttablename = $languageidtdir . $installer::globals::separator . "CustomAc.idt"; | ||||
1698 | 109 | 40.4ms | my $customactionidttable = installer::files::read_file($customactionidttablename); # spent 40.4ms making 109 calls to installer::files::read_file, avg 371µs/call | ||
1699 | my $installexecutetablename = $languageidtdir . $installer::globals::separator . "InstallE.idt"; | ||||
1700 | 109 | 63.7ms | my $installexecutetable = installer::files::read_file($installexecutetablename); # spent 63.7ms making 109 calls to installer::files::read_file, avg 585µs/call | ||
1701 | my $adminexecutetablename = $languageidtdir . $installer::globals::separator . "AdminExe.idt"; | ||||
1702 | 109 | 38.3ms | my $adminexecutetable = installer::files::read_file($adminexecutetablename); # spent 38.3ms making 109 calls to installer::files::read_file, avg 352µs/call | ||
1703 | my $installuitablename = $languageidtdir . $installer::globals::separator . "InstallU.idt"; | ||||
1704 | 109 | 46.5ms | my $installuitable = installer::files::read_file($installuitablename); # spent 46.5ms making 109 calls to installer::files::read_file, avg 427µs/call | ||
1705 | my $controleventtablename = $languageidtdir . $installer::globals::separator . "ControlE.idt"; | ||||
1706 | 109 | 95.5ms | my $controleventtable = installer::files::read_file($controleventtablename); # spent 95.5ms making 109 calls to installer::files::read_file, avg 876µs/call | ||
1707 | my $controlconditiontablename = $languageidtdir . $installer::globals::separator . "ControlC.idt"; | ||||
1708 | 109 | 62.9ms | my $controlconditiontable = installer::files::read_file($controlconditiontablename); # spent 62.9ms making 109 calls to installer::files::read_file, avg 577µs/call | ||
1709 | |||||
1710 | # Iterating over all Windows custom actions | ||||
1711 | |||||
1712 | for ( my $i = 0; $i <= $#{$customactions}; $i++ ) | ||||
1713 | { | ||||
1714 | my $customaction = ${$customactions}[$i]; | ||||
1715 | my $name = $customaction->{'Name'}; | ||||
1716 | my $typ = $customaction->{'Typ'}; | ||||
1717 | my $source = $customaction->{'Source'}; | ||||
1718 | my $target = $customaction->{'Target'}; | ||||
1719 | my $inbinarytable = $customaction->{'Inbinarytable'}; | ||||
1720 | my $gid = $customaction->{'gid'}; | ||||
1721 | |||||
1722 | my $styles = ""; | ||||
1723 | if ( $customaction->{'Styles'} ) { $styles = $customaction->{'Styles'}; } | ||||
1724 | |||||
1725 | 4360 | 115s | my $added_customaction = set_custom_action($customactionidttable, $name, $typ, $source, $target, $inbinarytable, $filesarray, $customactionidttablename, $styles); # spent 115s making 4360 calls to installer::windows::idtglobal::set_custom_action, avg 26.3ms/call | ||
1726 | |||||
1727 | if ( $added_customaction ) | ||||
1728 | { | ||||
1729 | # If the CustomAction was added into the CustomAc.idt, it can be connected to the installation. | ||||
1730 | # There are currently two different ways for doing this: | ||||
1731 | # 1. Using "add_custom_action_to_install_table", which adds the CustomAction to the install sequences, | ||||
1732 | # which are saved in InstallE.idt and InstallU.idt | ||||
1733 | # 2. Using "connect_custom_action_to_control" and "connect_custom_action_to_control". The first method | ||||
1734 | # connects a CustomAction to a control in ControlE.idt. The second method sets a condition for a control, | ||||
1735 | # which might be influenced by the CustomAction. This happens in ControlC.idt. | ||||
1736 | |||||
1737 | # Any Windows CustomAction can have a lot of different assignments. | ||||
1738 | |||||
1739 | for ( my $j = 1; $j <= 50; $j++ ) | ||||
1740 | { | ||||
1741 | my $key = "Assignment" . $j; | ||||
1742 | my $value = ""; | ||||
1743 | if ( $customaction->{$key} ) | ||||
1744 | { | ||||
1745 | $value = $customaction->{$key}; | ||||
1746 | |||||
1747 | # in a patch the Assignment can be overwritten by a PatchAssignment | ||||
1748 | if ( $installer::globals::patch ) | ||||
1749 | { | ||||
1750 | $patchkey = "PatchAssignment" . $j; | ||||
1751 | if ( $customaction->{$patchkey} ) | ||||
1752 | { | ||||
1753 | $value = $customaction->{$patchkey}; | ||||
1754 | $key = $patchkey; | ||||
1755 | } | ||||
1756 | } | ||||
1757 | |||||
1758 | } | ||||
1759 | else { last; } | ||||
1760 | |||||
1761 | # $value is now a comma separated list | ||||
1762 | 4251 | 59.2ms | if ( $value =~ /^\s*\(\s*(.*)\s*\);?\s*$/ ) { $value = $1; } # spent 59.2ms making 4251 calls to installer::windows::idtglobal::CORE:match, avg 14µs/call | ||
1763 | 4251 | 140ms | my $assignmentarray = installer::converter::convert_stringlist_into_array(\$value, ","); # spent 140ms making 4251 calls to installer::converter::convert_stringlist_into_array, avg 33µs/call | ||
1764 | 4251 | 923ms | my $assignment = create_customaction_assignment_hash($gid, $name, $key, $assignmentarray); # spent 923ms making 4251 calls to installer::windows::idtglobal::create_customaction_assignment_hash, avg 217µs/call | ||
1765 | |||||
1766 | 4251 | 12.8s | if ( $assignment->{'parameter1'} eq "InstallExecuteSequence" ) # spent 12.8s making 3706 calls to installer::windows::idtglobal::add_custom_action_to_install_table, avg 3.45ms/call
# spent 20.3ms making 545 calls to installer::windows::idtglobal::connect_custom_action_to_control, avg 37µs/call | ||
1767 | { | ||||
1768 | add_custom_action_to_install_table($installexecutetable, $source, $name, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $filesarray, $installexecutetablename, $styles); | ||||
1769 | } | ||||
1770 | elsif ( $assignment->{'parameter1'} eq "AdminExecuteSequence" ) | ||||
1771 | { | ||||
1772 | add_custom_action_to_install_table($adminexecutetable, $source, $name, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $filesarray, $adminexecutetablename, $styles); | ||||
1773 | } | ||||
1774 | elsif ( $assignment->{'parameter1'} eq "InstallUISequence" ) | ||||
1775 | { | ||||
1776 | add_custom_action_to_install_table($installuitable, $source, $name, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $filesarray, $installuitablename, $styles); | ||||
1777 | } | ||||
1778 | elsif ( $assignment->{'parameter1'} eq "ControlEvent" ) | ||||
1779 | { | ||||
1780 | connect_custom_action_to_control($controleventtable, $controleventtablename, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $assignment->{'parameter4'}, $assignment->{'parameter5'}, $assignment->{'parameter6'}, $assignment->{'parameter7'}); | ||||
1781 | } | ||||
1782 | elsif ( $assignment->{'parameter1'} eq "ControlCondition" ) | ||||
1783 | { | ||||
1784 | connect_condition_to_control($controlconditiontable, $controlconditiontablename, $assignment->{'parameter2'}, $assignment->{'parameter3'}, $assignment->{'parameter4'}, $assignment->{'parameter5'}); | ||||
1785 | } | ||||
1786 | else | ||||
1787 | { | ||||
1788 | installer::exiter::exit_program("ERROR: gid: $gid, key: $key ! Unknown Windows CustomAction table: $assignmenthashref->{'parameter1'} ! Currently supported: InstallUISequence, InstallESequence, ControlEvent, ControlCondition", "addcustomactions"); | ||||
1789 | } | ||||
1790 | } | ||||
1791 | } | ||||
1792 | } | ||||
1793 | |||||
1794 | # Setting the positions in the tables | ||||
1795 | |||||
1796 | 109 | 1.67s | set_positions_in_table($installexecutetable, $installexecutetablename); # spent 1.67s making 109 calls to installer::windows::idtglobal::set_positions_in_table, avg 15.3ms/call | ||
1797 | 109 | 308ms | set_positions_in_table($installuitable, $installuitablename); # spent 308ms making 109 calls to installer::windows::idtglobal::set_positions_in_table, avg 2.82ms/call | ||
1798 | 109 | 69.6ms | set_positions_in_table($adminexecutetable, $adminexecutetablename); # spent 69.6ms making 109 calls to installer::windows::idtglobal::set_positions_in_table, avg 639µs/call | ||
1799 | |||||
1800 | # Saving the files | ||||
1801 | |||||
1802 | 109 | 88.7ms | installer::files::save_file($customactionidttablename, $customactionidttable); # spent 88.7ms making 109 calls to installer::files::save_file, avg 814µs/call | ||
1803 | 109 | 47.3ms | installer::files::save_file($installexecutetablename, $installexecutetable); # spent 47.3ms making 109 calls to installer::files::save_file, avg 434µs/call | ||
1804 | 109 | 44.8ms | installer::files::save_file($adminexecutetablename, $adminexecutetable); # spent 44.8ms making 109 calls to installer::files::save_file, avg 411µs/call | ||
1805 | 109 | 43.3ms | installer::files::save_file($installuitablename, $installuitable); # spent 43.3ms making 109 calls to installer::files::save_file, avg 397µs/call | ||
1806 | 109 | 50.7ms | installer::files::save_file($controleventtablename, $controleventtable); # spent 50.7ms making 109 calls to installer::files::save_file, avg 465µs/call | ||
1807 | 109 | 45.5ms | installer::files::save_file($controlconditiontablename, $controlconditiontable); # spent 45.5ms making 109 calls to installer::files::save_file, avg 418µs/call | ||
1808 | |||||
1809 | my $infoline = "Updated idt file: $customactionidttablename\n"; | ||||
1810 | push(@installer::globals::logfileinfo, $infoline); | ||||
1811 | $infoline = "Updated idt file: $installexecutetablename\n"; | ||||
1812 | push(@installer::globals::logfileinfo, $infoline); | ||||
1813 | $infoline = "Updated idt file: $adminexecutetablename\n"; | ||||
1814 | push(@installer::globals::logfileinfo, $infoline); | ||||
1815 | $infoline = "Updated idt file: $installuitablename\n"; | ||||
1816 | push(@installer::globals::logfileinfo, $infoline); | ||||
1817 | $infoline = "Updated idt file: $controleventtablename\n"; | ||||
1818 | push(@installer::globals::logfileinfo, $infoline); | ||||
1819 | $infoline = "Updated idt file: $controlconditiontablename\n"; | ||||
1820 | push(@installer::globals::logfileinfo, $infoline); | ||||
1821 | |||||
1822 | 109 | 19.9ms | installer::logger::include_timestamp_into_logfile("\nPerformance Info: addcustomactions end\n"); # spent 19.9ms making 109 calls to installer::logger::include_timestamp_into_logfile, avg 183µs/call | ||
1823 | } | ||||
1824 | |||||
1825 | ########################################################################## | ||||
1826 | # Setting bidi attributes in idt tables | ||||
1827 | ########################################################################## | ||||
1828 | |||||
1829 | sub setbidiattributes | ||||
1830 | # spent 43.9ms (25.8+18.2) within installer::windows::idtglobal::setbidiattributes which was called 4 times, avg 11.0ms/call:
# 4 times (25.8ms+18.2ms) by installer::run at line 1612 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm, avg 11.0ms/call | ||||
1831 | 21452 | 31.8ms | my ($languageidtdir, $onelanguage) = @_; | ||
1832 | |||||
1833 | # Editing the files Dialog.idt and Control.idt | ||||
1834 | |||||
1835 | my $dialogfilename = $languageidtdir . $installer::globals::separator . "Dialog.idt"; | ||||
1836 | my $controlfilename = $languageidtdir . $installer::globals::separator . "Control.idt"; | ||||
1837 | |||||
1838 | 4 | 1.79ms | my $dialogfile = installer::files::read_file($dialogfilename); # spent 1.79ms making 4 calls to installer::files::read_file, avg 448µs/call | ||
1839 | 4 | 6.30ms | my $controlfile = installer::files::read_file($controlfilename); # spent 6.30ms making 4 calls to installer::files::read_file, avg 1.58ms/call | ||
1840 | |||||
1841 | # Searching attributes in Dialog.idt and adding "896". | ||||
1842 | # Attributes are in column 6 (from 10). | ||||
1843 | |||||
1844 | my $bidiattribute = 896; | ||||
1845 | for ( my $i = 0; $i <= $#{$dialogfile}; $i++ ) | ||||
1846 | { | ||||
1847 | if ( $i < 3 ) { next; } | ||||
1848 | 120 | 722µs | if ( ${$dialogfile}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) # spent 722µs making 120 calls to installer::windows::idtglobal::CORE:match, avg 6µs/call | ||
1849 | { | ||||
1850 | my $one = $1; | ||||
1851 | my $two = $2; | ||||
1852 | my $three = $3; | ||||
1853 | my $four = $4; | ||||
1854 | my $five = $5; | ||||
1855 | my $attribute = $6; | ||||
1856 | my $seven = $7; | ||||
1857 | my $eight = $8; | ||||
1858 | $attribute = $attribute + $bidiattribute; | ||||
1859 | ${$dialogfile}[$i] = "$one\t$two\t$three\t$four\t$five\t$attribute\t$seven\t$eight\n"; | ||||
1860 | } | ||||
1861 | } | ||||
1862 | |||||
1863 | # Searching attributes in Control.idt and adding "224". | ||||
1864 | # Attributes are in column 8 (from 12). | ||||
1865 | |||||
1866 | $bidiattribute = 224; | ||||
1867 | for ( my $i = 0; $i <= $#{$controlfile}; $i++ ) | ||||
1868 | { | ||||
1869 | if ( $i < 3 ) { next; } | ||||
1870 | 1244 | 5.37ms | if ( ${$controlfile}[$i] =~ /^\s*(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\t(.*?)\s*$/ ) # spent 5.37ms making 1244 calls to installer::windows::idtglobal::CORE:match, avg 4µs/call | ||
1871 | { | ||||
1872 | my $one = $1; | ||||
1873 | my $two = $2; | ||||
1874 | my $three = $3; | ||||
1875 | my $four = $4; | ||||
1876 | my $five = $5; | ||||
1877 | my $six = $6; | ||||
1878 | my $seven = $7; | ||||
1879 | my $attribute = $8; | ||||
1880 | my $nine = $9; | ||||
1881 | my $ten = $10; | ||||
1882 | my $eleven = $11; | ||||
1883 | my $twelve = $12; | ||||
1884 | $attribute = $attribute + $bidiattribute; | ||||
1885 | ${$controlfile}[$i] = "$one\t$two\t$three\t$four\t$five\t$six\t$seven\t$attribute\t$nine\t$ten\t$eleven\t$twelve\n"; | ||||
1886 | } | ||||
1887 | } | ||||
1888 | |||||
1889 | # Saving the file | ||||
1890 | |||||
1891 | 4 | 2.01ms | installer::files::save_file($dialogfilename, $dialogfile); # spent 2.01ms making 4 calls to installer::files::save_file, avg 502µs/call | ||
1892 | $infoline = "Set bidi support in idt file \"$dialogfilename\" for language $onelanguage\n"; | ||||
1893 | push(@installer::globals::logfileinfo, $infoline); | ||||
1894 | |||||
1895 | 4 | 1.97ms | installer::files::save_file($controlfilename, $controlfile); # spent 1.97ms making 4 calls to installer::files::save_file, avg 494µs/call | ||
1896 | $infoline = "Set bidi support in idt file \"$controlfilename\" for language $onelanguage\n"; | ||||
1897 | push(@installer::globals::logfileinfo, $infoline); | ||||
1898 | } | ||||
1899 | |||||
1900 | 1 | 9µs | 1; | ||
# spent 27.0ms within installer::windows::idtglobal::CORE:ftdir which was called 218 times, avg 124µs/call:
# 109 times (18.9ms+0s) by installer::windows::idtglobal::prepare_language_idt_directory at line 784, avg 173µs/call
# 109 times (8.17ms+0s) by installer::windows::idtglobal::prepare_language_idt_directory at line 759, avg 75µs/call | |||||
# spent 321s within installer::windows::idtglobal::CORE:match which was called 492176334 times, avg 651ns/call:
# 481707115 times (310s+0s) by installer::windows::idtglobal::get_language_block_from_language_file at line 629, avg 644ns/call
# 6521361 times (6.26s+0s) by installer::windows::idtglobal::get_language_block_from_language_file at line 639, avg 959ns/call
# 3284169 times (2.50s+0s) by installer::windows::idtglobal::get_language_string_from_language_block at line 662, avg 762ns/call
# 202522 times (278ms+0s) by installer::windows::idtglobal::make_eight_three_conform at line 162, avg 1µs/call
# 126004 times (324ms+0s) by installer::windows::idtglobal::get_customaction_position at line 1555, avg 3µs/call
# 72267 times (241ms+0s) by installer::windows::idtglobal::translate_idtfile at line 723, avg 3µs/call
# 58752 times (104ms+0s) by installer::windows::idtglobal::get_language_block_from_language_file at line 636, avg 2µs/call
# 58315 times (50.5ms+0s) by installer::windows::idtglobal::translate_idtfile at line 727, avg 866ns/call
# 47197 times (38.9ms+0s) by installer::windows::idtglobal::set_positions_in_table at line 1616, avg 824ns/call
# 16350 times (41.1ms+0s) by installer::windows::idtglobal::get_last_position_in_sequencetable at line 948, avg 3µs/call
# 16350 times (12.0ms+0s) by installer::windows::idtglobal::set_positions_in_table at line 1589, avg 731ns/call
# 15888 times (59.7ms+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 274, avg 4µs/call
# 15542 times (53.2ms+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 280, avg 3µs/call
# 10464 times (5.87ms+0s) by installer::windows::idtglobal::set_positions_in_table at line 1671, avg 561ns/call
# 4360 times (5.85ms+0s) by installer::windows::idtglobal::set_custom_action at line 1018, avg 1µs/call
# 4251 times (59.2ms+0s) by installer::windows::idtglobal::addcustomactions at line 1762, avg 14µs/call
# 3706 times (13.9ms+0s) by installer::windows::idtglobal::add_custom_action_to_install_table at line 1154, avg 4µs/call
# 3706 times (13.9ms+0s) by installer::windows::idtglobal::add_custom_action_to_install_table at line 1133, avg 4µs/call
# 3706 times (3.03ms+0s) by installer::windows::idtglobal::add_custom_action_to_install_table at line 1095, avg 818ns/call
# 2943 times (2.11ms+0s) by installer::windows::idtglobal::set_positions_in_table at line 1629, avg 716ns/call
# 1244 times (5.37ms+0s) by installer::windows::idtglobal::setbidiattributes at line 1870, avg 4µs/call
# 120 times (722µs+0s) by installer::windows::idtglobal::setbidiattributes at line 1848, avg 6µs/call
# 2 times (6µs+0s) by installer::windows::idtglobal::get_language_string_from_language_block at line 675, avg 3µs/call | |||||
# spent 385s within installer::windows::idtglobal::CORE:regcomp which was called 485110314 times, avg 793ns/call:
# 481707115 times (380s+0s) by installer::windows::idtglobal::get_language_block_from_language_file at line 629, avg 790ns/call
# 3284169 times (2.55s+0s) by installer::windows::idtglobal::get_language_string_from_language_block at line 662, avg 777ns/call
# 58315 times (1.18s+0s) by installer::windows::idtglobal::translate_idtfile at line 737, avg 20µs/call
# 58315 times (714ms+0s) by installer::windows::idtglobal::translate_idtfile at line 727, avg 12µs/call
# 2289 times (29.6ms+0s) by installer::windows::idtglobal::set_positions_in_table at line 1642, avg 13µs/call
# 109 times (92µs+0s) by installer::windows::idtglobal::set_positions_in_table at line 1678, avg 847ns/call
# 2 times (18µs+0s) by installer::windows::idtglobal::get_language_string_from_language_block at line 675, avg 9µs/call | |||||
# spent 9.35ms within installer::windows::idtglobal::CORE:sort which was called 218 times, avg 43µs/call:
# 109 times (8.91ms+0s) by installer::windows::idtglobal::set_multilanguageonly_condition at line 1408, avg 82µs/call
# 109 times (442µs+0s) by installer::windows::idtglobal::set_multilanguageonly_condition at line 1427, avg 4µs/call | |||||
# spent 7.65s within installer::windows::idtglobal::CORE:subst which was called 9988397 times, avg 765ns/call:
# 6186404 times (3.61s+0s) by installer::windows::idtglobal::setencoding at line 1381, avg 584ns/call
# 375961 times (928ms+0s) by installer::windows::idtglobal::shorten_feature_gid at line 50, avg 2µs/call
# 375961 times (402ms+0s) by installer::windows::idtglobal::shorten_feature_gid at line 52, avg 1µs/call
# 375961 times (225ms+0s) by installer::windows::idtglobal::shorten_feature_gid at line 53, avg 599ns/call
# 375961 times (208ms+0s) by installer::windows::idtglobal::shorten_feature_gid at line 51, avg 554ns/call
# 375961 times (204ms+0s) by installer::windows::idtglobal::shorten_feature_gid at line 54, avg 541ns/call
# 375961 times (193ms+0s) by installer::windows::idtglobal::shorten_feature_gid at line 55, avg 513ns/call
# 375961 times (192ms+0s) by installer::windows::idtglobal::shorten_feature_gid at line 57, avg 512ns/call
# 375961 times (187ms+0s) by installer::windows::idtglobal::shorten_feature_gid at line 56, avg 498ns/call
# 375961 times (183ms+0s) by installer::windows::idtglobal::shorten_feature_gid at line 58, avg 487ns/call
# 58315 times (334ms+0s) by installer::windows::idtglobal::translate_idtfile at line 737, avg 6µs/call
# 58315 times (145ms+0s) by installer::windows::idtglobal::translate_idtfile at line 727, avg 2µs/call
# 45889 times (167ms+0s) by installer::windows::idtglobal::make_eight_three_conform at line 222, avg 4µs/call
# 45017 times (151ms+0s) by installer::windows::idtglobal::make_eight_three_conform at line 246, avg 3µs/call
# 35643 times (131ms+0s) by installer::windows::idtglobal::make_eight_three_conform at line 231, avg 4µs/call
# 24198 times (151ms+0s) by installer::windows::idtglobal::make_eight_three_conform at line 238, avg 6µs/call
# 15542 times (21.0ms+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 281, avg 1µs/call
# 14933 times (26.0ms+0s) by installer::windows::idtglobal::fill_assignment_hash at line 1468, avg 2µs/call
# 14933 times (9.00ms+0s) by installer::windows::idtglobal::fill_assignment_hash at line 1469, avg 603ns/call
# 14933 times (8.82ms+0s) by installer::windows::idtglobal::fill_assignment_hash at line 1470, avg 591ns/call
# 14933 times (8.51ms+0s) by installer::windows::idtglobal::set_multilanguageonly_condition at line 1420, avg 570ns/call
# 14933 times (7.99ms+0s) by installer::windows::idtglobal::set_multilanguageonly_condition at line 1439, avg 535ns/call
# 14933 times (7.36ms+0s) by installer::windows::idtglobal::fill_assignment_hash at line 1471, avg 493ns/call
# 14933 times (7.11ms+0s) by installer::windows::idtglobal::fill_assignment_hash at line 1472, avg 476ns/call
# 6229 times (20.9ms+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 301, avg 3µs/call
# 4612 times (14.5ms+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 310, avg 3µs/call
# 4360 times (32.7ms+0s) by installer::windows::idtglobal::set_custom_action at line 1032, avg 7µs/call
# 3706 times (5.66ms+0s) by installer::windows::idtglobal::add_custom_action_to_install_table at line 1145, avg 2µs/call
# 2943 times (6.37ms+0s) by installer::windows::idtglobal::set_positions_in_table at line 1622, avg 2µs/call
# 2496 times (7.58ms+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 319, avg 3µs/call
# 2289 times (6.29ms+0s) by installer::windows::idtglobal::set_positions_in_table at line 1642, avg 3µs/call
# 1308 times (3.53ms+0s) by installer::windows::idtglobal::set_positions_in_table at line 1593, avg 3µs/call
# 872 times (5.95ms+0s) by installer::windows::idtglobal::get_languagefilename at line 609, avg 7µs/call
# 545 times (9.83ms+0s) by installer::windows::idtglobal::connect_custom_action_to_control at line 1182, avg 18µs/call
# 337 times (1.50ms+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 348, avg 4µs/call
# 321 times (1.18ms+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 357, avg 4µs/call
# 222 times (795µs+0s) by installer::windows::idtglobal::make_eight_three_conform_with_hash at line 366, avg 4µs/call
# 109 times (18.1ms+0s) by installer::windows::idtglobal::set_multilanguageonly_condition at line 1414, avg 166µs/call
# 109 times (1.12ms+0s) by installer::windows::idtglobal::set_multilanguageonly_condition at line 1433, avg 10µs/call
# 109 times (925µs+0s) by installer::windows::idtglobal::set_multilanguageonly_condition at line 1413, avg 8µs/call
# 109 times (336µs+0s) by installer::windows::idtglobal::set_multilanguageonly_condition at line 1432, avg 3µs/call
# 109 times (314µs+0s) by installer::windows::idtglobal::set_positions_in_table at line 1678, avg 3µs/call
# 109 times (297µs+0s) by installer::windows::idtglobal::set_positions_in_table at line 1676, avg 3µs/call |