← Index
NYTProf Performance Profile   « block view • line view • sub view »
For C:/lo/libo-master/solenv/bin/make_installer.pl
  Run on Mon Sep 24 00:52:54 2012
Reported on Mon Sep 24 07:34:42 2012

Filename/cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/idtglobal.pm
StatementsExecuted 2673947550 statements in 6494s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
58752323373s4070sinstaller::windows::idtglobal::::get_language_block_from_language_fileinstaller::windows::idtglobal::get_language_block_from_language_file
105730312196s2196sinstaller::windows::idtglobal::::get_next_free_numberinstaller::windows::idtglobal::get_next_free_number
48511031471385s385sinstaller::windows::idtglobal::::CORE:regcompinstaller::windows::idtglobal::CORE:regcomp (opcode)
492176334231321s321sinstaller::windows::idtglobal::::CORE:matchinstaller::windows::idtglobal::CORE:match (opcode)
436011115s115sinstaller::windows::idtglobal::::set_custom_actioninstaller::windows::idtglobal::set_custom_action
1091129.1s65.0sinstaller::windows::idtglobal::::setencodinginstaller::windows::idtglobal::setencoding
587523224.0s29.1sinstaller::windows::idtglobal::::get_language_string_from_language_blockinstaller::windows::idtglobal::get_language_string_from_language_block
37061112.5s12.8sinstaller::windows::idtglobal::::add_custom_action_to_install_tableinstaller::windows::idtglobal::add_custom_action_to_install_table
3759616410.7s13.5sinstaller::windows::idtglobal::::shorten_feature_gidinstaller::windows::idtglobal::shorten_feature_gid
99883974317.65s7.65sinstaller::windows::idtglobal::::CORE:substinstaller::windows::idtglobal::CORE:subst (opcode)
14217616.78s6.78sinstaller::windows::idtglobal::::get_next_free_number_with_hashinstaller::windows::idtglobal::get_next_free_number_with_hash
872115.04s4106sinstaller::windows::idtglobal::::translate_idtfileinstaller::windows::idtglobal::translate_idtfile
202522424.44s2201sinstaller::windows::idtglobal::::make_eight_three_conforminstaller::windows::idtglobal::make_eight_three_conform
2943111.02s1.34sinstaller::windows::idtglobal::::get_customaction_positioninstaller::windows::idtglobal::get_customaction_position
1588811610ms7.57sinstaller::windows::idtglobal::::make_eight_three_conform_with_hashinstaller::windows::idtglobal::make_eight_three_conform_with_hash
425141461ms716msinstaller::windows::idtglobal::::fill_assignment_hashinstaller::windows::idtglobal::fill_assignment_hash
10911447ms132sinstaller::windows::idtglobal::::addcustomactionsinstaller::windows::idtglobal::addcustomactions
32731423ms2.04sinstaller::windows::idtglobal::::set_positions_in_tableinstaller::windows::idtglobal::set_positions_in_table
10911164ms358msinstaller::windows::idtglobal::::set_multilanguageonly_conditioninstaller::windows::idtglobal::set_multilanguageonly_condition
32711129ms170msinstaller::windows::idtglobal::::get_last_position_in_sequencetableinstaller::windows::idtglobal::get_last_position_in_sequencetable
425111121ms923msinstaller::windows::idtglobal::::create_customaction_assignment_hashinstaller::windows::idtglobal::create_customaction_assignment_hash
1091131.7ms26.6sinstaller::windows::idtglobal::::prepare_language_idt_directoryinstaller::windows::idtglobal::prepare_language_idt_directory
2182127.0ms27.0msinstaller::windows::idtglobal::::CORE:ftdirinstaller::windows::idtglobal::CORE:ftdir (opcode)
41125.8ms43.9msinstaller::windows::idtglobal::::setbidiattributesinstaller::windows::idtglobal::setbidiattributes
8721116.7ms22.6msinstaller::windows::idtglobal::::get_languagefilenameinstaller::windows::idtglobal::get_languagefilename
449171412.4ms12.4msinstaller::windows::idtglobal::::write_idt_headerinstaller::windows::idtglobal::write_idt_header
5451110.5ms20.3msinstaller::windows::idtglobal::::connect_custom_action_to_controlinstaller::windows::idtglobal::connect_custom_action_to_control
218219.35ms9.35msinstaller::windows::idtglobal::::CORE:sortinstaller::windows::idtglobal::CORE:sort (opcode)
111417µs516µsinstaller::windows::idtglobal::::BEGIN@30installer::windows::idtglobal::BEGIN@30
11119µs21µsinstaller::windows::idtglobal::::BEGIN@34installer::windows::idtglobal::BEGIN@34
11118µs20µsinstaller::windows::idtglobal::::BEGIN@37installer::windows::idtglobal::BEGIN@37
11117µs20µsinstaller::windows::idtglobal::::BEGIN@31installer::windows::idtglobal::BEGIN@31
11117µs19µsinstaller::windows::idtglobal::::BEGIN@36installer::windows::idtglobal::BEGIN@36
11117µs19µsinstaller::windows::idtglobal::::BEGIN@39installer::windows::idtglobal::BEGIN@39
11115µs18µsinstaller::windows::idtglobal::::BEGIN@35installer::windows::idtglobal::BEGIN@35
11115µs17µsinstaller::windows::idtglobal::::BEGIN@38installer::windows::idtglobal::BEGIN@38
11114µs16µsinstaller::windows::idtglobal::::BEGIN@32installer::windows::idtglobal::BEGIN@32
11113µs15µsinstaller::windows::idtglobal::::BEGIN@33installer::windows::idtglobal::BEGIN@33
0000s0sinstaller::windows::idtglobal::::add_licensefile_to_databaseinstaller::windows::idtglobal::add_licensefile_to_database
0000s0sinstaller::windows::idtglobal::::connect_condition_to_controlinstaller::windows::idtglobal::connect_condition_to_control
0000s0sinstaller::windows::idtglobal::::get_code_from_code_blockinstaller::windows::idtglobal::get_code_from_code_block
0000s0sinstaller::windows::idtglobal::::get_free_number_in_uisequence_tableinstaller::windows::idtglobal::get_free_number_in_uisequence_table
0000s0sinstaller::windows::idtglobal::::get_position_in_sequencetableinstaller::windows::idtglobal::get_position_in_sequencetable
0000s0sinstaller::windows::idtglobal::::get_rtflicensefilesourceinstaller::windows::idtglobal::get_rtflicensefilesource
0000s0sinstaller::windows::idtglobal::::include_subdir_into_componenttableinstaller::windows::idtglobal::include_subdir_into_componenttable
0000s0sinstaller::windows::idtglobal::::include_subdirname_into_directory_tableinstaller::windows::idtglobal::include_subdirname_into_directory_table
0000s0sinstaller::windows::idtglobal::::make_string_licensetextinstaller::windows::idtglobal::make_string_licensetext
Call graph for these subroutines as a Graphviz dot language file.
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
28package installer::windows::idtglobal;
29
30264µs2615µ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
use Cwd;
# spent 516µs making 1 call to installer::windows::idtglobal::BEGIN@30 # spent 99µs making 1 call to Exporter::import
31256µs223µ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
use installer::converter;
# spent 20µs making 1 call to installer::windows::idtglobal::BEGIN@31 # spent 3µs making 1 call to UNIVERSAL::import
32253µs218µ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
use installer::exiter;
# spent 16µs making 1 call to installer::windows::idtglobal::BEGIN@32 # spent 2µs making 1 call to UNIVERSAL::import
33254µs217µ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
use installer::files;
# spent 15µs making 1 call to installer::windows::idtglobal::BEGIN@33 # spent 2µs making 1 call to UNIVERSAL::import
34253µs223µ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
use installer::globals;
# spent 21µs making 1 call to installer::windows::idtglobal::BEGIN@34 # spent 2µs making 1 call to UNIVERSAL::import
35253µs220µ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
use installer::pathanalyzer;
# spent 18µs making 1 call to installer::windows::idtglobal::BEGIN@35 # spent 2µs making 1 call to UNIVERSAL::import
36255µs221µ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
use installer::remover;
# spent 19µs making 1 call to installer::windows::idtglobal::BEGIN@36 # spent 2µs making 1 call to UNIVERSAL::import
37258µs222µ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
use installer::scriptitems;
# spent 20µs making 1 call to installer::windows::idtglobal::BEGIN@37 # spent 2µs making 1 call to UNIVERSAL::import
38252µs220µ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
use installer::systemactions;
# spent 17µs making 1 call to installer::windows::idtglobal::BEGIN@38 # spent 3µs making 1 call to UNIVERSAL::import
39216.9ms221µ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
use installer::windows::language;
# 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
46sub 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
{
48375961014.1s my ($stringref) = @_;
49
50375961928ms $$stringref =~ s/gid_Module_/gm_/;
# spent 928ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 2µs/call
51375961208ms $$stringref =~ s/_Extension_/_ex_/;
# spent 208ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 554ns/call
52375961402ms $$stringref =~ s/_Root_/_r_/;
# spent 402ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 1µs/call
53375961225ms $$stringref =~ s/_Prg_/_p_/;
# spent 225ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 599ns/call
54375961204ms $$stringref =~ s/_Optional_/_o_/;
# spent 204ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 541ns/call
55375961193ms $$stringref =~ s/_Tools_/_tl_/;
# spent 193ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 513ns/call
56375961187ms $$stringref =~ s/_Wrt_Flt_/_w_f_/;
# spent 187ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 498ns/call
57375961192ms $$stringref =~ s/_Javafilter_/_jf_/;
# spent 192ms making 375961 calls to installer::windows::idtglobal::CORE:subst, avg 512ns/call
58375961183ms $$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
67sub 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
{
6910573001.65s my ($name, $shortnamesref) = @_;
70
71 my $counter = 0;
72 my $dontsave = 0;
73 my $alreadyexists;
74 my ($newname, $shortname);
75
76 do
77241770721095s {
78 $alreadyexists = 0;
79 $counter++;
80 $newname = $name . $counter;
81
8220084361801094s for ( my $i = 0; $i <= $#{$shortnamesref}; $i++ )
83 {
84 $shortname = ${$shortnamesref}[$i];
85
86118770765.55s 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
112sub 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
{
114156387165ms 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
12397915956.63s {
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
1391313215.9ms 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
152sub 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
{
15412151322.62s 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
1621012610517ms202522278ms 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
218367112748ms if ( $namelength > 8 )
219 {
220 # taking the first six letters
221 $name = substr($name, 0, 6); # name, offset, length
22245889167ms $name =~ s/\s*$//; # removing ending whitespaces
# spent 167ms making 45889 calls to installer::windows::idtglobal::CORE:subst, avg 4µs/call
223 $name = $name . "\~";
2244588961.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
228178215500ms if ( $number > 9 )
229 {
230 $name = substr($name, 0, 5); # name, offset, length
23135643131ms $name =~ s/\s*$//; # removing ending whitespaces
# spent 131ms making 35643 calls to installer::windows::idtglobal::CORE:subst, avg 4µs/call
232 $name = $name . "\~";
23335643701s $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
23596792447ms if ( $number > 99 )
236 {
237 $name = substr($name, 0, 4); # name, offset, length
23824198151ms $name =~ s/\s*$//; # removing ending whitespaces
# spent 151ms making 24198 calls to installer::windows::idtglobal::CORE:subst, avg 6µs/call
239 $name = $name . "\~";
240241981433s $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;
24645017358ms45017151ms 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
263sub 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
{
265111216264ms 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
274157150294ms1588859.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
2801554253.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
2811554221.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
28624922.27ms 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
29569956.05ms if (( $namelength > 8 ) || ( $extensionlength > 3 ))
296 {
297 # taking the first six letters, if filename is longer than 6 characters
29843603101ms if ( $namelength > 6 )
299 {
300 $name = substr($name, 0, 6); # name, offset, length
301622920.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 . "\~";
3036229237ms ($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
3072306063.9ms if ( ! $saved )
308 {
309 $name = substr($name, 0, 5); # name, offset, length
310461214.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 . "\~";
31246121.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
3161248034.4ms if ( ! $saved )
317 {
318 $name = substr($name, 0, 4); # name, offset, length
31924967.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 . "\~";
32124965.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
34426966.96ms if ( $namelength > 8 )
345 {
346 # taking the first six letters
347 $name = substr($name, 0, 6); # name, offset, length
3483371.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 . "\~";
35033715.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
35416054.99ms if ( ! $saved )
355 {
356 $name = substr($name, 0, 5); # name, offset, length
3573211.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 . "\~";
35932195.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
36311103.35ms if ( ! $saved )
364 {
365 $name = substr($name, 0, 4); # name, offset, length
366222795µ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 . "\~";
36822284.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
391sub 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
{
393987810.1ms my ($idtref, $definestring) = @_;
394
395 my $oneline;
396
39767µs 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
40767µs 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
417654779µs 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
42766µs 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
437654578µs 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
44767µs 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
45767µs 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
46766µs 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
477654539µs 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
487654592µs 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
49766µs 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
50766µs 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
51766µs 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
52767µs 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
53765µs 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
54768µs 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
55766µs 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
605sub 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
{
607348822.1ms my ($idtfilename, $basedir) = @_;
608
6098725.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
621sub 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
{
623235008562s my ($searchstring, $languagefile) = @_;
624
625 my @language_block = ();
626
6274817071153467s for ( my $i = 0; $i <= $#{$languagefile}; $i++ )
628 {
629293760843ms963414230691s 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
63658752104ms while (( $counter <= $#{$languagefile} ) && (!( ${$languagefile}[$counter] =~ /^\s*\[/ )))
# spent 104ms making 58752 calls to installer::windows::idtglobal::CORE:match, avg 2µs/call
637 {
6381304446840.2s push(@language_block, ${$languagefile}[$counter]);
63965213616.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
654sub 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
{
6562937604.46s my ($language_block, $language, $oldstring) = @_;
657
658 my $newstring = "";
659
660328416924.4s for ( my $i = 0; $i <= $#{$language_block}; $i++ )
661 {
662117502225ms65683385.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
66924µs if ( $newstring eq "" )
670 {
671 $language = "en-US"; # defaulting to english
672
673244µs for ( my $i = 0; $i <= $#{$language_block}; $i++ )
674 {
67526µs424µ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
691sub 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
713sub 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
{
7151744169ms my ($idtfile, $languagefile, $onelanguage) = @_;
716
717361335904ms for ( my $i = 0; $i <= $#{$idtfile}; $i++ )
718 {
719 my @allstrings = ();
720
721 my $oneline = ${$idtfile}[$i];
722
72372267241ms while ( $oneline =~ /\b(OOO_\w+)\b/ )
# spent 241ms making 72267 calls to installer::windows::idtglobal::CORE:match, avg 3µs/call
724 {
7251749451.71s my $replacestring = $1;
726 push(@allstrings, $replacestring);
727174945910ms $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 {
7341749454.73s583154069s 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
7355831529.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
7371166301.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
747sub 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
{
749119937.0ms 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
7571097.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
7593271.84ms1098.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 {
76110974.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
7621094.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
78210973.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
78410918.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
7913271.45ms for ( my $i = 0; $i <= $#{$iconfilecollector}; $i++ )
792 {
793 my $iconfilename = ${$iconfilecollector}[$i];
7941093.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
795109244ms 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
800490512.1ms for ( my $i = 0; $i <= $#{$binarytablefiles}; $i++ )
801 {
802 my $binaryfile = ${$binarytablefiles}[$i];
803 my $binaryfilepath = $binaryfile->{'sourcepath'};
804 my $binaryfilename = $binaryfilepath;
80598118.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
8069812.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
8121095.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
8171096.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
818109777ms 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
827sub 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
848sub 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
869sub 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
938sub 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
{
940130823.7ms my ($sequencetable) = @_;
941
942 my $position = 0;
943
94432700127ms for ( my $i = 0; $i <= $#{$sequencetable}; $i++ )
945 {
946 my $line = ${$sequencetable}[$i];
947
9482267220.4ms1635041.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
962sub 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
1008sub 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
{
10106104039.5s 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
101843605.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
1032436055.0ms436032.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
10426243476449.7s for ( my $i = 0; $i <= $#{$localfilesref}; $i++ )
1043 {
1044 my $onefile = ${$localfilesref}[$i];
1045 my $filename = "";
10464162317625.3s if ( exists($onefile->{'Name'}) )
1047 {
1048 $filename = $onefile->{'Name'};
1049
1050915610.7ms 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
10631220825.1ms 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
107513085.23ms 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
1086sub 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
{
10884076612.4s 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
109537063.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
11204665251.2ms for ( my $i = 0; $i <= $#{$localfilesref}; $i++ )
1121 {
1122 my $filename = ${$localfilesref}[$i]->{'Name'};
1123
11241853093.5ms 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.
1133370613.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!
11353706224ms 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
11412223678.0ms if ( $contains_file )
1142 {
1143 # then the InstallE.idt.idt or InstallU.idt.idt
1144
114537065.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 = "";
115437065.31ms370613.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
1174sub 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
{
1176327021.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
11825459.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
1193sub 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
1212sub 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
1268sub 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
1323sub 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
1364sub 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
{
136643618.6ms my ( $languageidtdir, $onelanguage ) = @_;
1367
13681091.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
1372109110ms 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
1374183129.84s for ( my $i = 0; $i <= $#{$idtfiles}; $i++ )
1375 {
1376 my $onefilename = $languageidtdir . $installer::globals::separator . ${$idtfiles}[$i];
1377457827.8s my $onefile = installer::files::read_file($onefilename);
# spent 27.8s making 4578 calls to installer::files::read_file, avg 6.08ms/call
1378
1379618640422.8s for ( my $j = 0; $j <= $#{$onefile}; $j++ )
1380 {
138161864043.61s ${$onefile}[$j] =~ s/WINDOWSENCODINGTEMPLATE/$encoding/g;
# spent 3.61s making 6186404 calls to installer::windows::idtglobal::CORE:subst, avg 584ns/call
1382 }
1383
138445784.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
1397sub 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
{
1399174482.2ms my ( $languageidtdir ) = @_;
1400
1401 my $onefilename = $languageidtdir . $installer::globals::separator . "ControlE.idt";
140210993.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
14081098.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 {
14101188112.8ms $condition = $condition . " &$module=3 Or";
1411 }
1412
1413109925µs $condition =~ s/^\s*//;
# spent 925µs making 109 calls to installer::windows::idtglobal::CORE:subst, avg 8µs/call
141410918.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
14181493356.9ms for ( my $j = 0; $j <= $#{$onefile}; $j++ )
1419 {
1420149338.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
1427109442µ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 {
1429654925µs $condition = $condition . " &$module=3 Or";
1430 }
1431
1432109336µs $condition =~ s/^\s*//;
# spent 336µs making 109 calls to installer::windows::idtglobal::CORE:subst, avg 3µs/call
14331091.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
14371493356.4ms for ( my $j = 0; $j <= $#{$onefile}; $j++ )
1438 {
1439149337.99ms ${$onefile}[$j] =~ s/APPLICATIONCONDITIONINSTALL/$condition/;
# spent 7.99ms making 14933 calls to installer::windows::idtglobal::CORE:subst, avg 535ns/call
1440 }
1441
144210955.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
1449sub 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
{
14511700479.0ms 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
1461149330421ms for ( my $i = 0; $i <= $#{$assignmentarray}; $i++ )
1462 {
1463 my $counter = $i + 1;
1464 my $key = "parameter". $counter;
1465
1466 my $localvalue = ${$assignmentarray}[$i];
146714933196ms 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
14681493326.0ms $localvalue =~ s/\\\"/\"/g;
# spent 26.0ms making 14933 calls to installer::windows::idtglobal::CORE:subst, avg 2µs/call
1469149339.00ms $localvalue =~ s/\\\!/\!/g;
# spent 9.00ms making 14933 calls to installer::windows::idtglobal::CORE:subst, avg 603ns/call
1470149338.82ms $localvalue =~ s/\\\&/\&/g;
# spent 8.82ms making 14933 calls to installer::windows::idtglobal::CORE:subst, avg 591ns/call
1471149337.36ms $localvalue =~ s/\\\</\</g;
# spent 7.36ms making 14933 calls to installer::windows::idtglobal::CORE:subst, avg 493ns/call
1472149337.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
1482sub 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
{
14845951487.8ms my ($gid, $name, $key, $assignmentarray) = @_;
1485
1486 my %assignment = ();
1487 my $assignmenthashref = \%assignment;
1488
1489 my $tablename = ${$assignmentarray}[0];
1490425186.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
149519622.86ms if ( $tablename eq "InstallUISequence" )
1496 {
1497 $tablename_defined = 1;
1498 $parameter = 3;
149965493.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
1502784812.7ms if ( $tablename eq "InstallExecuteSequence" )
1503 {
1504 $tablename_defined = 1;
1505 $parameter = 3;
15062616390ms 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
150913081.95ms if ( $tablename eq "AdminExecuteSequence" )
1510 {
1511 $tablename_defined = 1;
1512 $parameter = 3;
151343661.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
151616352.39ms if ( $tablename eq "ControlEvent" )
1517 {
1518 $tablename_defined = 1;
1519 $parameter = 7;
1520545171ms 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
1545sub 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
{
154711772204ms my ($action, $sequencetable) = @_;
1548
1549 my $position = -1;
1550
1551252008906ms for ( my $i = 0; $i <= $#{$sequencetable}; $i++ )
1552 {
1553 my $line = ${$sequencetable}[$i];
1554
1555334194238ms126004324ms 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
156045783.14ms 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
1576sub 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
{
1578327023.6ms 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
1585327170ms 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
15871635065.2ms for ( my $i = 0; $i <= $#{$sequencetable}; $i++ )
1588 {
1589654013.9ms1635012.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;
159313083.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
1609348853.7ms {
1610 $template_exists = 0;
1611 $template_replaced = 0;
1612 $counter++;
1613
161447197192ms for ( my $i = 0; $i <= $#{$sequencetable}; $i++ )
1615 {
16162943053.9ms4719738.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;
162229436.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;
162929432.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
163529431.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
16371504265.4ms if ( $position >= 0 ) # Found CustomAction and is has a position. Otherwise return value is "-1".
1638 {
1639 my $newposition = 0;
164022891.58ms if ( $setbehind ) { $newposition = $position + 2; }
1641 else { $newposition = $position - 2; }
1642457835.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
166710911.3ms if (( $template_exists ) && ( ! $template_replaced ))
1668 {
16691046438.8ms for ( my $i = 0; $i <= $#{$sequencetable}; $i++ )
1670 {
16718722.98ms104645.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;
1676109297µs $template =~ s/POSITIONTEMPLATE_//;
# spent 297µs making 109 calls to installer::windows::idtglobal::CORE:subst, avg 3µs/call
1677 $lastposition = $lastposition + 25;
1678218406µ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
1691sub 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
{
1693403342.2ms my ($languageidtdir, $customactions, $filesarray) = @_;
1694
169510921.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";
169810940.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";
170010963.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";
170210938.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";
170410946.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";
170610995.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";
170810962.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
171247960103ms 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
17254360115s 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
1727305216.0ms 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
173938913265ms for ( my $j = 1; $j <= 50; $j++ )
1740 {
1741 my $key = "Assignment" . $j;
1742 my $value = "";
17431155411.5ms 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
1762425159.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
17634251140ms 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
17644251923ms 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
1766425112.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
17961091.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
1797109308ms set_positions_in_table($installuitable, $installuitablename);
# spent 308ms making 109 calls to installer::windows::idtglobal::set_positions_in_table, avg 2.82ms/call
179810969.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
180210988.7ms installer::files::save_file($customactionidttablename, $customactionidttable);
# spent 88.7ms making 109 calls to installer::files::save_file, avg 814µs/call
180310947.3ms installer::files::save_file($installexecutetablename, $installexecutetable);
# spent 47.3ms making 109 calls to installer::files::save_file, avg 434µs/call
180410944.8ms installer::files::save_file($adminexecutetablename, $adminexecutetable);
# spent 44.8ms making 109 calls to installer::files::save_file, avg 411µs/call
180510943.3ms installer::files::save_file($installuitablename, $installuitable);
# spent 43.3ms making 109 calls to installer::files::save_file, avg 397µs/call
180610950.7ms installer::files::save_file($controleventtablename, $controleventtable);
# spent 50.7ms making 109 calls to installer::files::save_file, avg 465µs/call
180710945.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
182210919.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
1829sub 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
{
1831602.37ms 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
183841.79ms my $dialogfile = installer::files::read_file($dialogfilename);
# spent 1.79ms making 4 calls to installer::files::read_file, avg 448µs/call
183946.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;
18452521.34ms for ( my $i = 0; $i <= $#{$dialogfile}; $i++ )
1846 {
18471210µs if ( $i < 3 ) { next; }
184812001.20ms120722µ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;
1867250011.3ms for ( my $i = 0; $i <= $#{$controlfile}; $i++ )
1868 {
1869128µs if ( $i < 3 ) { next; }
18701741615.6ms12445.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
189142.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
189541.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
190019µs1;
 
# 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
sub installer::windows::idtglobal::CORE:ftdir; # opcode
# 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
sub installer::windows::idtglobal::CORE:match; # opcode
# 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
sub installer::windows::idtglobal::CORE:regcomp; # opcode
# 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
sub installer::windows::idtglobal::CORE:sort; # opcode
# 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
sub installer::windows::idtglobal::CORE:subst; # opcode