diff options
author | Jacek Antonelli | 2008-08-15 23:45:19 -0500 |
---|---|---|
committer | Jacek Antonelli | 2008-08-15 23:45:19 -0500 |
commit | b235c59d60472f818a9142c0886b95a0ff4191d7 (patch) | |
tree | d323c55587584b19cc43a03f58a178823f12d3cd | |
parent | Second Life viewer sources 1.18.5.3 (diff) | |
download | meta-impy-b235c59d60472f818a9142c0886b95a0ff4191d7.zip meta-impy-b235c59d60472f818a9142c0886b95a0ff4191d7.tar.gz meta-impy-b235c59d60472f818a9142c0886b95a0ff4191d7.tar.bz2 meta-impy-b235c59d60472f818a9142c0886b95a0ff4191d7.tar.xz |
Second Life viewer sources 1.18.6.0-RC
353 files changed, 18888 insertions, 13019 deletions
diff --git a/linden/doc/contributions.txt b/linden/doc/contributions.txt index 897977c..62210f0 100644 --- a/linden/doc/contributions.txt +++ b/linden/doc/contributions.txt | |||
@@ -215,6 +215,7 @@ Nicholaz Beresford | |||
215 | VWR-1861 | 215 | VWR-1861 |
216 | VWR-1872 | 216 | VWR-1872 |
217 | VWR-1968 | 217 | VWR-1968 |
218 | VWR-2046 | ||
218 | VWR-2152 | 219 | VWR-2152 |
219 | Nounouch Hapmouche | 220 | Nounouch Hapmouche |
220 | VWR-238 | 221 | VWR-238 |
diff --git a/linden/etc/message.xml b/linden/etc/message.xml index 3d9d0eb..1e6e30e 100644 --- a/linden/etc/message.xml +++ b/linden/etc/message.xml | |||
@@ -255,7 +255,7 @@ | |||
255 | <key>CoarseLocationUpdate</key> | 255 | <key>CoarseLocationUpdate</key> |
256 | <map> | 256 | <map> |
257 | <key>flavor</key> | 257 | <key>flavor</key> |
258 | <string>llsd</string> | 258 | <string>template</string> |
259 | <key>trusted-sender</key> | 259 | <key>trusted-sender</key> |
260 | <boolean>true</boolean> | 260 | <boolean>true</boolean> |
261 | </map> | 261 | </map> |
@@ -399,6 +399,14 @@ | |||
399 | <boolean>true</boolean> | 399 | <boolean>true</boolean> |
400 | </map> | 400 | </map> |
401 | 401 | ||
402 | <!-- UDPDeprecated Messages --> | ||
403 | <key>ScriptRunningReply</key> | ||
404 | <map> | ||
405 | <key>flavor</key> | ||
406 | <string>llsd</string> | ||
407 | <key>trusted-sender</key> | ||
408 | <boolean>false</boolean> | ||
409 | </map> | ||
402 | 410 | ||
403 | </map> | 411 | </map> |
404 | <key>capBans</key> | 412 | <key>capBans</key> |
diff --git a/linden/indra/SConstruct b/linden/indra/SConstruct index f1a6c89..0e68039 100644 --- a/linden/indra/SConstruct +++ b/linden/indra/SConstruct | |||
@@ -91,7 +91,7 @@ opts.AddOptions( | |||
91 | BoolOption('GSTREAMER', 'Enabled GStreamer support', True), | 91 | BoolOption('GSTREAMER', 'Enabled GStreamer support', True), |
92 | BoolOption('COLORGCC', 'Enabled colorgcc', True), | 92 | BoolOption('COLORGCC', 'Enabled colorgcc', True), |
93 | EnumOption('GRID', 'Client package\'s default grid', 'default', | 93 | EnumOption('GRID', 'Client package\'s default grid', 'default', |
94 | allowed_values=('default', 'aditi', 'agni', 'dmz', 'durga', 'ganga', 'shakti', 'siva', 'soma', 'uma', 'vaak')), | 94 | allowed_values=('default', 'aditi', 'agni', 'dmz', 'durga', 'ganga', 'shakti', 'siva', 'soma', 'uma', 'vaak', 'yami')), |
95 | EnumOption('CHANNEL', 'Client package\'s default channel', 'Release', | 95 | EnumOption('CHANNEL', 'Client package\'s default channel', 'Release', |
96 | allowed_values=('Release', 'Release Candidate', 'WindLight')), | 96 | allowed_values=('Release', 'Release Candidate', 'WindLight')), |
97 | BoolOption('ELFIO', 'Enabled enhanced backtraces with libELFIO symbol extraction support', True), | 97 | BoolOption('ELFIO', 'Enabled enhanced backtraces with libELFIO symbol extraction support', True), |
@@ -203,7 +203,7 @@ for build_target in targets: | |||
203 | ### Base include directories ### | 203 | ### Base include directories ### |
204 | 204 | ||
205 | include_dirs = Split(""" | 205 | include_dirs = Split(""" |
206 | ./llcommon ./llmath ./llwindow ./llaudio ./llcharacter | 206 | ./llcommon ./llmath ./llwindow ./llaudio ./llcharacter ./llcrashlogger |
207 | ./lldatabase ./llhavok ./llimage ./llinventory ./llmedia ./llmessage | 207 | ./lldatabase ./llhavok ./llimage ./llinventory ./llmedia ./llmessage |
208 | ./llprimitive ./llrender ./llscene ./llui ./llvfs ./llwindow | 208 | ./llprimitive ./llrender ./llscene ./llui ./llvfs ./llwindow |
209 | ./llxml ./lscript ./lscript/lscript_compile | 209 | ./llxml ./lscript ./lscript/lscript_compile |
@@ -350,7 +350,7 @@ for build_target in targets: | |||
350 | releasenoopt_cppflags = cppflags + '-DNDEBUG -DLL_RELEASE=1 ' | 350 | releasenoopt_cppflags = cppflags + '-DNDEBUG -DLL_RELEASE=1 ' |
351 | releasefordownload_cflags = cflags + '-O2 ' | 351 | releasefordownload_cflags = cflags + '-O2 ' |
352 | releasefordownload_cxxflags = cxxflags + '-O2 ' | 352 | releasefordownload_cxxflags = cxxflags + '-O2 ' |
353 | releasefordownload_cppflags = cppflags + '-DNDEBUG -DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 ' | 353 | releasefordownload_cppflags = cppflags + '-DNDEBUG -DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -DLL_SEND_CRASH_REPORTS=1 ' |
354 | 354 | ||
355 | ################ | 355 | ################ |
356 | # ENVIRONMENT # | 356 | # ENVIRONMENT # |
@@ -585,6 +585,7 @@ for build_target in targets: | |||
585 | create_cond_module('llvfs') | 585 | create_cond_module('llvfs') |
586 | create_cond_module('llimagej2coj', module_libs=['openjpeg']) | 586 | create_cond_module('llimagej2coj', module_libs=['openjpeg']) |
587 | create_cond_module('llimage', module_libs=['llimagej2coj', 'jpeg', 'png12']) | 587 | create_cond_module('llimage', module_libs=['llimagej2coj', 'jpeg', 'png12']) |
588 | create_static_module('llcrashlogger') | ||
588 | create_static_module('llmessage') | 589 | create_static_module('llmessage') |
589 | create_static_module('llinventory') | 590 | create_static_module('llinventory') |
590 | create_static_module('llcharacter') | 591 | create_static_module('llcharacter') |
@@ -616,7 +617,7 @@ for build_target in targets: | |||
616 | pkgconfig('--libs-only-l', ['gtk+-2.0']).split()] | 617 | pkgconfig('--libs-only-l', ['gtk+-2.0']).split()] |
617 | else: | 618 | else: |
618 | external_libs = net_external_libs + [ 'db-4.2', 'gtk-x11-2.0' ] | 619 | external_libs = net_external_libs + [ 'db-4.2', 'gtk-x11-2.0' ] |
619 | internal_libs = [ 'llvfs', 'llmath', 'llcommon' ] | 620 | internal_libs = [ 'llui', 'llxml', 'llmessage', 'llvfs', 'llmath', 'llcommon' ] |
620 | create_executable(output_crashlogger_bin + '-globalsyms', | 621 | create_executable(output_crashlogger_bin + '-globalsyms', |
621 | 'linux_crash_logger', | 622 | 'linux_crash_logger', |
622 | internal_libs + external_libs) | 623 | internal_libs + external_libs) |
diff --git a/linden/indra/indra_complete/indra_complete.sln b/linden/indra/indra_complete/indra_complete.sln index 513d9a8..83dbdc5 100644 --- a/linden/indra/indra_complete/indra_complete.sln +++ b/linden/indra/indra_complete/indra_complete.sln | |||
@@ -482,6 +482,7 @@ Global | |||
482 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload.ActiveCfg = Release|Win32 | 482 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload.ActiveCfg = Release|Win32 |
483 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload.Build.0 = Release|Win32 | 483 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload.Build.0 = Release|Win32 |
484 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseNoOpt.ActiveCfg = ReleaseNoOpt|Win32 | 484 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseNoOpt.ActiveCfg = ReleaseNoOpt|Win32 |
485 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseNoOpt.Build.0 = ReleaseNoOpt|Win32 | ||
485 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug.ActiveCfg = Debug|Win32 | 486 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug.ActiveCfg = Debug|Win32 |
486 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug.Build.0 = Debug|Win32 | 487 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug.Build.0 = Debug|Win32 |
487 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Release.ActiveCfg = Release|Win32 | 488 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Release.ActiveCfg = Release|Win32 |
diff --git a/linden/indra/indra_complete/indra_complete_vc8.sln b/linden/indra/indra_complete/indra_complete_vc8.sln index 04e1e9a..f677d2c 100644 --- a/linden/indra/indra_complete/indra_complete_vc8.sln +++ b/linden/indra/indra_complete/indra_complete_vc8.sln | |||
@@ -26,28 +26,27 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "llinventory", "..\llinvento | |||
26 | EndProject | 26 | EndProject |
27 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "newview", "..\newview\newview_vc8.vcproj", "{E6F4CF1B-6109-4CA8-B58D-87FA936CDE08}" | 27 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "newview", "..\newview\newview_vc8.vcproj", "{E6F4CF1B-6109-4CA8-B58D-87FA936CDE08}" |
28 | ProjectSection(ProjectDependencies) = postProject | 28 | ProjectSection(ProjectDependencies) = postProject |
29 | {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B} = {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B} | ||
30 | {9D0C7E02-6506-4EE7-BC5C-75671D28D594} = {9D0C7E02-6506-4EE7-BC5C-75671D28D594} | ||
31 | {2ADE3C14-94C4-40BF-B033-70F3C954EE90} = {2ADE3C14-94C4-40BF-B033-70F3C954EE90} | ||
32 | {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB} | ||
33 | {93B2BA29-FBE9-4376-92C1-6108DCFE09D3} = {93B2BA29-FBE9-4376-92C1-6108DCFE09D3} | ||
34 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
35 | {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B} | ||
36 | {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552} | ||
37 | {076DD042-2E58-42EA-9401-53210B65C1FC} = {076DD042-2E58-42EA-9401-53210B65C1FC} | ||
38 | {DE55D666-6A3D-476C-937F-109269B83681} = {DE55D666-6A3D-476C-937F-109269B83681} | ||
39 | {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5} | ||
40 | {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} | ||
41 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228} = {B771CF1B-E253-47BD-8B0A-6B0440CC9228} | ||
42 | {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808} | ||
43 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
44 | {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59} | ||
45 | {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} = {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} | ||
46 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
47 | {4C8D64D5-649F-481E-96BE-EF1E82A77ACB} = {4C8D64D5-649F-481E-96BE-EF1E82A77ACB} | ||
48 | {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} = {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} | ||
49 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4} = {648685F3-8760-4CC5-BB2B-CAF9DECC25A4} | ||
50 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} | 29 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} |
30 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4} = {648685F3-8760-4CC5-BB2B-CAF9DECC25A4} | ||
31 | {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} = {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} | ||
32 | {4C8D64D5-649F-481E-96BE-EF1E82A77ACB} = {4C8D64D5-649F-481E-96BE-EF1E82A77ACB} | ||
33 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
34 | {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} = {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} | ||
35 | {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59} | ||
36 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
37 | {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808} | ||
38 | {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} | ||
39 | {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5} | ||
40 | {DE55D666-6A3D-476C-937F-109269B83681} = {DE55D666-6A3D-476C-937F-109269B83681} | ||
41 | {076DD042-2E58-42EA-9401-53210B65C1FC} = {076DD042-2E58-42EA-9401-53210B65C1FC} | ||
42 | {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552} | ||
43 | {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B} | ||
44 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
45 | {93B2BA29-FBE9-4376-92C1-6108DCFE09D3} = {93B2BA29-FBE9-4376-92C1-6108DCFE09D3} | ||
46 | {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB} | ||
47 | {2ADE3C14-94C4-40BF-B033-70F3C954EE90} = {2ADE3C14-94C4-40BF-B033-70F3C954EE90} | ||
48 | {9D0C7E02-6506-4EE7-BC5C-75671D28D594} = {9D0C7E02-6506-4EE7-BC5C-75671D28D594} | ||
49 | {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B} = {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B} | ||
51 | EndProjectSection | 50 | EndProjectSection |
52 | EndProject | 51 | EndProject |
53 | EndProject | 52 | EndProject |
@@ -70,45 +69,43 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lscript_compile", "..\lscri | |||
70 | EndProjectSection | 69 | EndProjectSection |
71 | EndProject | 70 | EndProject |
72 | ProjectSection(ProjectDependencies) = postProject | 71 | ProjectSection(ProjectDependencies) = postProject |
73 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
74 | {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B} | ||
75 | {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552} | ||
76 | {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} | ||
77 | {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5} | ||
78 | {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} | ||
79 | {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808} | ||
80 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
81 | {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59} | ||
82 | {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} = {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} | ||
83 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
84 | {B4B838C7-2C72-428E-BBFD-25764E659A8B} = {B4B838C7-2C72-428E-BBFD-25764E659A8B} | ||
85 | {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} = {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} | ||
86 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} | ||
87 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE} = {023011F7-3ADB-49D3-9EC5-6D392F6D15FE} | 72 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE} = {023011F7-3ADB-49D3-9EC5-6D392F6D15FE} |
73 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} | ||
74 | {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} = {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} | ||
75 | {B4B838C7-2C72-428E-BBFD-25764E659A8B} = {B4B838C7-2C72-428E-BBFD-25764E659A8B} | ||
76 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
77 | {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} = {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} | ||
78 | {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59} | ||
79 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
80 | {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808} | ||
81 | {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} | ||
82 | {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5} | ||
83 | {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} | ||
84 | {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552} | ||
85 | {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B} | ||
86 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
88 | EndProjectSection | 87 | EndProjectSection |
89 | EndProject | 88 | EndProject |
90 | ProjectSection(ProjectDependencies) = postProject | 89 | ProjectSection(ProjectDependencies) = postProject |
91 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
92 | {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} | ||
93 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
94 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
95 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} | 90 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} |
91 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
92 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
93 | {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} | ||
94 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
96 | EndProjectSection | 95 | EndProjectSection |
97 | EndProject | 96 | EndProject |
98 | ProjectSection(ProjectDependencies) = postProject | 97 | ProjectSection(ProjectDependencies) = postProject |
99 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
100 | {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} | ||
101 | {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5} | ||
102 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
103 | {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59} | ||
104 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
105 | {B4B838C7-2C72-428E-BBFD-25764E659A8B} = {B4B838C7-2C72-428E-BBFD-25764E659A8B} | ||
106 | {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} = {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} | ||
107 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} | 98 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} |
99 | {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} = {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} | ||
100 | {B4B838C7-2C72-428E-BBFD-25764E659A8B} = {B4B838C7-2C72-428E-BBFD-25764E659A8B} | ||
101 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
102 | {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59} | ||
103 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
104 | {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5} | ||
105 | {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} | ||
106 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
108 | EndProjectSection | 107 | EndProjectSection |
109 | EndProject | 108 | EndProject |
110 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lscript_compile_fb", "..\lscript\lscript_compile\lscript_compile_fb_vc8.vcproj", "{B771CF1B-E253-47BD-8B0A-6B0440CC9228}" | ||
111 | EndProject | ||
112 | ProjectSection(ProjectDependencies) = postProject | 109 | ProjectSection(ProjectDependencies) = postProject |
113 | {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808} | 110 | {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808} |
114 | EndProjectSection | 111 | EndProjectSection |
@@ -119,11 +116,11 @@ EndProject | |||
119 | EndProject | 116 | EndProject |
120 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win_crash_logger", "..\win_crash_logger\win_crash_logger_vc8.vcproj", "{648685F3-8760-4CC5-BB2B-CAF9DECC25A4}" | 117 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win_crash_logger", "..\win_crash_logger\win_crash_logger_vc8.vcproj", "{648685F3-8760-4CC5-BB2B-CAF9DECC25A4}" |
121 | ProjectSection(ProjectDependencies) = postProject | 118 | ProjectSection(ProjectDependencies) = postProject |
122 | {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB} | ||
123 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
124 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
125 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
126 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} | 119 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} |
120 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
121 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
122 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
123 | {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB} | ||
127 | EndProjectSection | 124 | EndProjectSection |
128 | EndProject | 125 | EndProject |
129 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win_updater", "..\win_updater\win_updater_vc8.vcproj", "{E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}" | 126 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win_updater", "..\win_updater\win_updater_vc8.vcproj", "{E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}" |
@@ -133,16 +130,16 @@ EndProject | |||
133 | EndProjectSection | 130 | EndProjectSection |
134 | EndProject | 131 | EndProject |
135 | ProjectSection(ProjectDependencies) = postProject | 132 | ProjectSection(ProjectDependencies) = postProject |
136 | {2ADE3C14-94C4-40BF-B033-70F3C954EE90} = {2ADE3C14-94C4-40BF-B033-70F3C954EE90} | ||
137 | {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB} | ||
138 | {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} = {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} | ||
139 | {93B2BA29-FBE9-4376-92C1-6108DCFE09D3} = {93B2BA29-FBE9-4376-92C1-6108DCFE09D3} | ||
140 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
141 | {DE55D666-6A3D-476C-937F-109269B83681} = {DE55D666-6A3D-476C-937F-109269B83681} | ||
142 | {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} | ||
143 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
144 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
145 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} | 133 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} |
134 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
135 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
136 | {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} | ||
137 | {DE55D666-6A3D-476C-937F-109269B83681} = {DE55D666-6A3D-476C-937F-109269B83681} | ||
138 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
139 | {93B2BA29-FBE9-4376-92C1-6108DCFE09D3} = {93B2BA29-FBE9-4376-92C1-6108DCFE09D3} | ||
140 | {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} = {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} | ||
141 | {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB} | ||
142 | {2ADE3C14-94C4-40BF-B033-70F3C954EE90} = {2ADE3C14-94C4-40BF-B033-70F3C954EE90} | ||
146 | EndProjectSection | 143 | EndProjectSection |
147 | EndProject | 144 | EndProject |
148 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "llmedia", "..\llmedia\llmedia_vc8.vcproj", "{9D0C7E02-6506-4EE7-BC5C-75671D28D594}" | 145 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "llmedia", "..\llmedia\llmedia_vc8.vcproj", "{9D0C7E02-6506-4EE7-BC5C-75671D28D594}" |
@@ -150,51 +147,52 @@ EndProject | |||
150 | EndProject | 147 | EndProject |
151 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "..\test\test_vc8.vcproj", "{BBAA6588-CA96-4A87-A988-B02270B8D02B}" | 148 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "..\test\test_vc8.vcproj", "{BBAA6588-CA96-4A87-A988-B02270B8D02B}" |
152 | ProjectSection(ProjectDependencies) = postProject | 149 | ProjectSection(ProjectDependencies) = postProject |
153 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
154 | {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B} | ||
155 | {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552} | ||
156 | {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} | ||
157 | {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5} | ||
158 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228} = {B771CF1B-E253-47BD-8B0A-6B0440CC9228} | ||
159 | {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808} | ||
160 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
161 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC} = {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC} | ||
162 | {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59} | ||
163 | {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} = {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} | ||
164 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC} = {777F38BE-2DFE-4051-9AAD-2832ABC474CC} | ||
165 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
166 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} | 150 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} |
151 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
152 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC} = {777F38BE-2DFE-4051-9AAD-2832ABC474CC} | ||
153 | {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} = {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} | ||
154 | {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59} | ||
155 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC} = {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC} | ||
156 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
157 | {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808} | ||
158 | {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5} | ||
159 | {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} | ||
160 | {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552} | ||
161 | {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B} | ||
162 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
167 | EndProjectSection | 163 | EndProjectSection |
168 | EndProject | 164 | EndProject |
169 | ProjectSection(ProjectDependencies) = postProject | 165 | ProjectSection(ProjectDependencies) = postProject |
170 | {2ADE3C14-94C4-40BF-B033-70F3C954EE90} = {2ADE3C14-94C4-40BF-B033-70F3C954EE90} | ||
171 | {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB} | ||
172 | {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} = {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} | ||
173 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
174 | {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B} | ||
175 | {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} | ||
176 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
177 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
178 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} | 166 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} |
167 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
168 | {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34} | ||
169 | {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} | ||
170 | {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B} | ||
171 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
172 | {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} = {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} | ||
173 | {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB} | ||
174 | {2ADE3C14-94C4-40BF-B033-70F3C954EE90} = {2ADE3C14-94C4-40BF-B033-70F3C954EE90} | ||
179 | EndProjectSection | 175 | EndProjectSection |
180 | EndProject | 176 | EndProject |
181 | EndProject | 177 | EndProject |
182 | EndProject | 178 | EndProject |
183 | ProjectSection(ProjectDependencies) = postProject | 179 | ProjectSection(ProjectDependencies) = postProject |
184 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
185 | {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} | ||
186 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
187 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} | 180 | {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} |
181 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | ||
182 | {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} | ||
183 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
188 | EndProjectSection | 184 | EndProjectSection |
189 | EndProject | 185 | EndProject |
190 | ProjectSection(ProjectDependencies) = postProject | 186 | ProjectSection(ProjectDependencies) = postProject |
191 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
192 | {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} | ||
193 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} | 187 | {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} |
188 | {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} | ||
189 | {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} | ||
194 | EndProjectSection | 190 | EndProjectSection |
195 | EndProject | 191 | EndProject |
196 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "llimagej2coj", "..\llimagej2coj\llimagej2coj_vc8.vcproj", "{4C8D64D5-649F-481E-96BE-EF1E82A77ACB}" | 192 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "llimagej2coj", "..\llimagej2coj\llimagej2coj_vc8.vcproj", "{4C8D64D5-649F-481E-96BE-EF1E82A77ACB}" |
197 | EndProject | 193 | EndProject |
194 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lscript_compile_fb_vc8", "..\lscript\lscript_compile\lscript_compile_fb_vc8.vcproj", "{B771CF1B-E253-47BD-8B0A-6B0440CC9228}" | ||
195 | EndProject | ||
198 | Global | 196 | Global |
199 | GlobalSection(SolutionConfigurationPlatforms) = preSolution | 197 | GlobalSection(SolutionConfigurationPlatforms) = preSolution |
200 | Debug|Win32 = Debug|Win32 | 198 | Debug|Win32 = Debug|Win32 |
@@ -414,16 +412,6 @@ Global | |||
414 | {A5504A1E-8BA4-45D2-8144-1B6937E37E98}.ReleaseForDownload|Win32.Build.0 = Release|Win32 | 412 | {A5504A1E-8BA4-45D2-8144-1B6937E37E98}.ReleaseForDownload|Win32.Build.0 = Release|Win32 |
415 | {A5504A1E-8BA4-45D2-8144-1B6937E37E98}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32 | 413 | {A5504A1E-8BA4-45D2-8144-1B6937E37E98}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32 |
416 | {A5504A1E-8BA4-45D2-8144-1B6937E37E98}.ReleaseNoOpt|Win32.Build.0 = ReleaseNoOpt|Win32 | 414 | {A5504A1E-8BA4-45D2-8144-1B6937E37E98}.ReleaseNoOpt|Win32.Build.0 = ReleaseNoOpt|Win32 |
417 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Debug|Win32.ActiveCfg = Debug|Win32 | ||
418 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Debug|Win32.Build.0 = Debug|Win32 | ||
419 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 | ||
420 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.DebugMesaHeadless|Win32.Build.0 = Debug|Win32 | ||
421 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Release|Win32.ActiveCfg = Release|Win32 | ||
422 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Release|Win32.Build.0 = Release|Win32 | ||
423 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 | ||
424 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseForDownload|Win32.Build.0 = Release|Win32 | ||
425 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseNoOpt|Win32.ActiveCfg = Release|Win32 | ||
426 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseNoOpt|Win32.Build.0 = Release|Win32 | ||
427 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.Debug|Win32.ActiveCfg = Debug|Win32 | 415 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.Debug|Win32.ActiveCfg = Debug|Win32 |
428 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.Debug|Win32.Build.0 = Debug|Win32 | 416 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.Debug|Win32.Build.0 = Debug|Win32 |
429 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 | 417 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 |
@@ -432,6 +420,7 @@ Global | |||
432 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.Release|Win32.Build.0 = Release|Win32 | 420 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.Release|Win32.Build.0 = Release|Win32 |
433 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 | 421 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 |
434 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.ReleaseNoOpt|Win32.ActiveCfg = Release|Win32 | 422 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.ReleaseNoOpt|Win32.ActiveCfg = Release|Win32 |
423 | {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.ReleaseNoOpt|Win32.Build.0 = Release|Win32 | ||
435 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.Debug|Win32.ActiveCfg = Debug|Win32 | 424 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.Debug|Win32.ActiveCfg = Debug|Win32 |
436 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.Debug|Win32.Build.0 = Debug|Win32 | 425 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.Debug|Win32.Build.0 = Debug|Win32 |
437 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 | 426 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 |
@@ -440,6 +429,7 @@ Global | |||
440 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.Release|Win32.Build.0 = Release|Win32 | 429 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.Release|Win32.Build.0 = Release|Win32 |
441 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 | 430 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 |
442 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.ReleaseNoOpt|Win32.ActiveCfg = Release|Win32 | 431 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.ReleaseNoOpt|Win32.ActiveCfg = Release|Win32 |
432 | {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.ReleaseNoOpt|Win32.Build.0 = Release|Win32 | ||
443 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.Debug|Win32.ActiveCfg = Debug|Win32 | 433 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.Debug|Win32.ActiveCfg = Debug|Win32 |
444 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.Debug|Win32.Build.0 = Debug|Win32 | 434 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.Debug|Win32.Build.0 = Debug|Win32 |
445 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 | 435 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 |
@@ -449,7 +439,6 @@ Global | |||
449 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 | 439 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 |
450 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseForDownload|Win32.Build.0 = Release|Win32 | 440 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseForDownload|Win32.Build.0 = Release|Win32 |
451 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32 | 441 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32 |
452 | {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseNoOpt|Win32.Build.0 = ReleaseNoOpt|Win32 | ||
453 | {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}.Debug|Win32.ActiveCfg = Debug|Win32 | 442 | {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}.Debug|Win32.ActiveCfg = Debug|Win32 |
454 | {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}.Debug|Win32.Build.0 = Debug|Win32 | 443 | {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}.Debug|Win32.Build.0 = Debug|Win32 |
455 | {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 | 444 | {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 |
@@ -513,6 +502,7 @@ Global | |||
513 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 | 502 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 |
514 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload|Win32.Build.0 = Release|Win32 | 503 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload|Win32.Build.0 = Release|Win32 |
515 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32 | 504 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32 |
505 | {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseNoOpt|Win32.Build.0 = ReleaseNoOpt|Win32 | ||
516 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug|Win32.ActiveCfg = Debug|Win32 | 506 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug|Win32.ActiveCfg = Debug|Win32 |
517 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug|Win32.Build.0 = Debug|Win32 | 507 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug|Win32.Build.0 = Debug|Win32 |
518 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 | 508 | {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 |
@@ -563,6 +553,16 @@ Global | |||
563 | {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}.ReleaseForDownload|Win32.Build.0 = Release|Win32 | 553 | {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}.ReleaseForDownload|Win32.Build.0 = Release|Win32 |
564 | {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32 | 554 | {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32 |
565 | {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}.ReleaseNoOpt|Win32.Build.0 = ReleaseNoOpt|Win32 | 555 | {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}.ReleaseNoOpt|Win32.Build.0 = ReleaseNoOpt|Win32 |
556 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Debug|Win32.ActiveCfg = Debug|Win32 | ||
557 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Debug|Win32.Build.0 = Debug|Win32 | ||
558 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 | ||
559 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.DebugMesaHeadless|Win32.Build.0 = Debug|Win32 | ||
560 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Release|Win32.ActiveCfg = Release|Win32 | ||
561 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Release|Win32.Build.0 = Release|Win32 | ||
562 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 | ||
563 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseForDownload|Win32.Build.0 = Release|Win32 | ||
564 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseNoOpt|Win32.ActiveCfg = Release|Win32 | ||
565 | {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseNoOpt|Win32.Build.0 = Release|Win32 | ||
566 | EndGlobalSection | 566 | EndGlobalSection |
567 | GlobalSection(SolutionProperties) = preSolution | 567 | GlobalSection(SolutionProperties) = preSolution |
568 | HideSolutionNode = FALSE | 568 | HideSolutionNode = FALSE |
diff --git a/linden/indra/lib/python/indra/util/llmanifest.py b/linden/indra/lib/python/indra/util/llmanifest.py index 029b697..2408fab 100644 --- a/linden/indra/lib/python/indra/util/llmanifest.py +++ b/linden/indra/lib/python/indra/util/llmanifest.py | |||
@@ -38,6 +38,7 @@ import re | |||
38 | import shutil | 38 | import shutil |
39 | import sys | 39 | import sys |
40 | import tarfile | 40 | import tarfile |
41 | import errno | ||
41 | 42 | ||
42 | def path_ancestors(path): | 43 | def path_ancestors(path): |
43 | path = os.path.normpath(path) | 44 | path = os.path.normpath(path) |
@@ -463,6 +464,12 @@ class LLManifest(object): | |||
463 | return | 464 | return |
464 | # only copy if it's not excluded | 465 | # only copy if it's not excluded |
465 | if(self.includes(src, dst)): | 466 | if(self.includes(src, dst)): |
467 | try: | ||
468 | os.unlink(dst) | ||
469 | except OSError, err: | ||
470 | if err.errno != errno.ENOENT: | ||
471 | raise | ||
472 | |||
466 | shutil.copy2(src, dst) | 473 | shutil.copy2(src, dst) |
467 | 474 | ||
468 | def ccopytree(self, src, dst): | 475 | def ccopytree(self, src, dst): |
diff --git a/linden/indra/linux_crash_logger/files.lst b/linden/indra/linux_crash_logger/files.lst index 8bf99b0..5c8b9a2 100644 --- a/linden/indra/linux_crash_logger/files.lst +++ b/linden/indra/linux_crash_logger/files.lst | |||
@@ -1 +1,3 @@ | |||
1 | llcrashlogger/llcrashlogger.cpp | ||
1 | linux_crash_logger/linux_crash_logger.cpp | 2 | linux_crash_logger/linux_crash_logger.cpp |
3 | linux_crash_logger/llcrashloggerlinux.cpp | ||
diff --git a/linden/indra/linux_crash_logger/linux_crash_logger.cpp b/linden/indra/linux_crash_logger/linux_crash_logger.cpp index e75a317..5310093 100644 --- a/linden/indra/linux_crash_logger/linux_crash_logger.cpp +++ b/linden/indra/linux_crash_logger/linux_crash_logger.cpp | |||
@@ -29,542 +29,16 @@ | |||
29 | * $/LicenseInfo$ | 29 | * $/LicenseInfo$ |
30 | */ | 30 | */ |
31 | 31 | ||
32 | #include "linden_common.h" | 32 | #include "llcrashloggerlinux.h" |
33 | |||
34 | #include <sys/types.h> | ||
35 | #include <sys/stat.h> | ||
36 | #include <unistd.h> | ||
37 | |||
38 | #include <curl/curl.h> | ||
39 | |||
40 | #if LL_GTK | ||
41 | # include "gtk/gtk.h" | ||
42 | #endif // LL_GTK | ||
43 | |||
44 | #include "indra_constants.h" // CRASH_BEHAVIOR_ASK | ||
45 | #include "llerror.h" | ||
46 | #include "lltimer.h" | ||
47 | #include "lldir.h" | ||
48 | |||
49 | #include "llstring.h" | ||
50 | |||
51 | |||
52 | // These need to be localized. | ||
53 | static const char dialog_text[] = | ||
54 | "Second Life appears to have crashed.\n" | ||
55 | "This crash reporter collects information about your computer's hardware, operating system, and some Second Life logs, which are used for debugging purposes only.\n" | ||
56 | "Sending crash reports is the best way to help us improve the quality of Second Life.\n" | ||
57 | "If you continue to experience this problem, please try:\n" | ||
58 | "- Contacting support by visiting http://www.secondlife.com/support\n" | ||
59 | "\n" | ||
60 | "Send crash report?"; | ||
61 | |||
62 | static const char dialog_title[] = | ||
63 | "Second Life Crash Logger"; | ||
64 | |||
65 | |||
66 | class LLFileEncoder | ||
67 | { | ||
68 | public: | ||
69 | LLFileEncoder(const char *formname, const char *filename, bool isCrashLog = false); | ||
70 | |||
71 | BOOL isValid() const { return mIsValid; } | ||
72 | LLString encodeURL(const S32 max_length = 0); | ||
73 | public: | ||
74 | BOOL mIsValid; | ||
75 | LLString mFilename; | ||
76 | LLString mFormname; | ||
77 | LLString mBuf; | ||
78 | }; | ||
79 | |||
80 | LLString encode_string(const char *formname, const LLString &str); | ||
81 | |||
82 | LLString gServerResponse; | ||
83 | BOOL gSendReport = FALSE; | ||
84 | LLString gUserserver; | ||
85 | LLString gUserText; | ||
86 | BOOL gCrashInPreviousExec = FALSE; | ||
87 | time_t gLaunchTime; | ||
88 | |||
89 | static size_t curl_download_callback(void *data, size_t size, size_t nmemb, | ||
90 | void *user_data) | ||
91 | { | ||
92 | S32 bytes = size * nmemb; | ||
93 | char *cdata = (char *) data; | ||
94 | for (int i =0; i < bytes; i += 1) | ||
95 | { | ||
96 | gServerResponse += (cdata[i]); | ||
97 | } | ||
98 | return bytes; | ||
99 | } | ||
100 | |||
101 | #if LL_GTK | ||
102 | static void response_callback (GtkDialog *dialog, | ||
103 | gint arg1, | ||
104 | gpointer user_data) | ||
105 | { | ||
106 | gint *response = (gint*)user_data; | ||
107 | *response = arg1; | ||
108 | gtk_widget_destroy(GTK_WIDGET(dialog)); | ||
109 | gtk_main_quit(); | ||
110 | } | ||
111 | #endif // LL_GTK | ||
112 | |||
113 | static BOOL do_ask_dialog(void) | ||
114 | { | ||
115 | #if LL_GTK | ||
116 | gtk_disable_setlocale(); | ||
117 | if (!gtk_init_check(NULL, NULL)) { | ||
118 | llinfos << "Could not initialize GTK for 'ask to send crash report' dialog; not sending report." << llendl; | ||
119 | return FALSE; | ||
120 | } | ||
121 | |||
122 | GtkWidget *win = NULL; | ||
123 | GtkDialogFlags flags = GTK_DIALOG_MODAL; | ||
124 | GtkMessageType messagetype = GTK_MESSAGE_QUESTION; | ||
125 | GtkButtonsType buttons = GTK_BUTTONS_YES_NO; | ||
126 | gint response = GTK_RESPONSE_NONE; | ||
127 | |||
128 | win = gtk_message_dialog_new(NULL, | ||
129 | flags, messagetype, buttons, | ||
130 | dialog_text); | ||
131 | gtk_window_set_type_hint(GTK_WINDOW(win), | ||
132 | GDK_WINDOW_TYPE_HINT_DIALOG); | ||
133 | gtk_window_set_title(GTK_WINDOW(win), dialog_title); | ||
134 | g_signal_connect (win, | ||
135 | "response", | ||
136 | G_CALLBACK (response_callback), | ||
137 | &response); | ||
138 | gtk_widget_show_all (win); | ||
139 | gtk_main(); | ||
140 | |||
141 | return (GTK_RESPONSE_OK == response || | ||
142 | GTK_RESPONSE_YES == response || | ||
143 | GTK_RESPONSE_APPLY == response); | ||
144 | #else | ||
145 | return FALSE; | ||
146 | #endif // LL_GTK | ||
147 | } | ||
148 | |||
149 | 33 | ||
150 | int main(int argc, char **argv) | 34 | int main(int argc, char **argv) |
151 | { | 35 | { |
152 | const S32 BT_MAX_SIZE = 100000; // Maximum size to transmit of the backtrace file | 36 | LLCrashLoggerLinux app; |
153 | const S32 SL_MAX_SIZE = 100000; // Maximum size of the Second Life log file. | 37 | app.parseCommandOptions(argc, argv); |
154 | int i; | 38 | app.init(); |
155 | S32 crash_behavior = CRASH_BEHAVIOR_ALWAYS_SEND; | 39 | app.mainLoop(); |
156 | 40 | app.cleanup(); | |
157 | time(&gLaunchTime); | ||
158 | |||
159 | llinfos << "Starting Second Life Viewer Crash Reporter" << llendl; | ||
160 | |||
161 | for(i=1; i<argc; i++) | ||
162 | { | ||
163 | if(!strcmp(argv[i], "-dialog")) | ||
164 | { | ||
165 | llinfos << "Show the user dialog" << llendl; | ||
166 | crash_behavior = CRASH_BEHAVIOR_ASK; | ||
167 | } | ||
168 | if(!strcmp(argv[i], "-previous")) | ||
169 | { | ||
170 | gCrashInPreviousExec = TRUE; | ||
171 | } | ||
172 | if(!strcmp(argv[i], "-user")) | ||
173 | { | ||
174 | if ((i + 1) < argc) | ||
175 | { | ||
176 | i++; | ||
177 | gUserserver = argv[i]; | ||
178 | llinfos << "Got userserver " << gUserserver << llendl; | ||
179 | } | ||
180 | } | ||
181 | } | ||
182 | |||
183 | if( gCrashInPreviousExec ) | ||
184 | { | ||
185 | llinfos << "Previous execution did not remove SecondLife.exec_marker" << llendl; | ||
186 | } | ||
187 | |||
188 | if(!gCrashInPreviousExec) | ||
189 | { | ||
190 | // Wait a while to let the crashed client finish exiting, | ||
191 | // freeing up the screen/etc. | ||
192 | sleep(5); | ||
193 | } | ||
194 | |||
195 | // *FIX: do some dialog stuff here? | ||
196 | if (CRASH_BEHAVIOR_ALWAYS_SEND == crash_behavior) | ||
197 | { | ||
198 | gSendReport = TRUE; | ||
199 | } | ||
200 | else if (CRASH_BEHAVIOR_ASK == crash_behavior) | ||
201 | { | ||
202 | gSendReport = do_ask_dialog(); | ||
203 | } | ||
204 | |||
205 | if(!gSendReport) | ||
206 | { | ||
207 | // Only send the report if the user agreed to it. | ||
208 | llinfos << "User cancelled, not sending report" << llendl; | ||
209 | |||
210 | return(0); | ||
211 | } | ||
212 | |||
213 | // We assume that all the logs we're looking for reside on the current drive | ||
214 | gDirUtilp->initAppDirs("SecondLife"); | ||
215 | |||
216 | // Lots of silly variable, replicated for each log file. | ||
217 | LLString db_file_name; | ||
218 | LLString sl_file_name; | ||
219 | LLString bt_file_name; // stack_trace.log file | ||
220 | LLString st_file_name; // stats.log file | ||
221 | LLString si_file_name; // settings.xml file | ||
222 | |||
223 | LLFileEncoder *db_filep = NULL; | ||
224 | LLFileEncoder *sl_filep = NULL; | ||
225 | LLFileEncoder *st_filep = NULL; | ||
226 | LLFileEncoder *bt_filep = NULL; | ||
227 | LLFileEncoder *si_filep = NULL; | ||
228 | |||
229 | /////////////////////////////////// | ||
230 | // | ||
231 | // We do the parsing for the debug_info file first, as that will | ||
232 | // give us the location of the SecondLife.log file. | ||
233 | // | ||
234 | |||
235 | // Figure out the filename of the debug log | ||
236 | db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log").c_str(); | ||
237 | db_filep = new LLFileEncoder("DB", db_file_name.c_str()); | ||
238 | |||
239 | // Get the filename of the SecondLife.log file | ||
240 | // *NOTE: These buffer sizes are hardcoded into a scanf() below. | ||
241 | char tmp_sl_name[LL_MAX_PATH]; | ||
242 | tmp_sl_name[0] = '\0'; | ||
243 | char tmp_space[256]; | ||
244 | tmp_space[0] = '\0'; | ||
245 | |||
246 | // Look for it in the debug_info.log file | ||
247 | if (db_filep->isValid()) | ||
248 | { | ||
249 | // This was originally scanning for "SL Log: %[^\r\n]", which happily skipped to the next line | ||
250 | // on debug logs (which don't have anything after "SL Log:" and tried to open a nonsensical filename. | ||
251 | sscanf(db_filep->mBuf.c_str(), "SL Log:%255[ ]%1023[^\r\n]", tmp_space, tmp_sl_name); | ||
252 | } | ||
253 | else | ||
254 | { | ||
255 | delete db_filep; | ||
256 | db_filep = NULL; | ||
257 | } | ||
258 | |||
259 | // If we actually have a legitimate file name, use it. | ||
260 | if (gCrashInPreviousExec) | ||
261 | { | ||
262 | // If we froze, the crash log this time around isn't useful. | ||
263 | // Use the old one. | ||
264 | sl_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.old"); | ||
265 | } | ||
266 | else if (tmp_sl_name[0]) | ||
267 | { | ||
268 | sl_file_name = tmp_sl_name; | ||
269 | llinfos << "Using log file from debug log: " << sl_file_name << llendl; | ||
270 | } | ||
271 | else | ||
272 | { | ||
273 | // Figure out the filename of the second life log | ||
274 | sl_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.log").c_str(); | ||
275 | } | ||
276 | |||
277 | // Now we get the SecondLife.log file if it's there, and recent enough... | ||
278 | sl_filep = new LLFileEncoder("SL", sl_file_name.c_str()); | ||
279 | if (!sl_filep->isValid()) | ||
280 | { | ||
281 | delete sl_filep; | ||
282 | sl_filep = NULL; | ||
283 | } | ||
284 | |||
285 | st_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stats.log").c_str(); | ||
286 | st_filep = new LLFileEncoder("ST", st_file_name.c_str()); | ||
287 | if (!st_filep->isValid()) | ||
288 | { | ||
289 | delete st_filep; | ||
290 | st_filep = NULL; | ||
291 | } | ||
292 | |||
293 | si_file_name = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.xml").c_str(); | ||
294 | si_filep = new LLFileEncoder("SI", si_file_name.c_str()); | ||
295 | if (!si_filep->isValid()) | ||
296 | { | ||
297 | delete si_filep; | ||
298 | si_filep = NULL; | ||
299 | } | ||
300 | |||
301 | // encode this as if it were a 'Dr Watson' plain-text backtrace | ||
302 | bt_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log").c_str(); | ||
303 | bt_filep = new LLFileEncoder("DW", bt_file_name.c_str()); | ||
304 | if (!bt_filep->isValid()) | ||
305 | { | ||
306 | delete bt_filep; | ||
307 | bt_filep = NULL; | ||
308 | } | ||
309 | |||
310 | LLString post_data; | ||
311 | LLString tmp_url_buf; | ||
312 | |||
313 | // Append the userserver | ||
314 | tmp_url_buf = encode_string("USER", gUserserver); | ||
315 | post_data += tmp_url_buf; | ||
316 | llinfos << "PostData:" << post_data << llendl; | ||
317 | |||
318 | if (gCrashInPreviousExec) | ||
319 | { | ||
320 | post_data.append("&"); | ||
321 | tmp_url_buf = encode_string("EF", "Y"); | ||
322 | post_data += tmp_url_buf; | ||
323 | } | ||
324 | |||
325 | if (db_filep) | ||
326 | { | ||
327 | post_data.append("&"); | ||
328 | tmp_url_buf = db_filep->encodeURL(); | ||
329 | post_data += tmp_url_buf; | ||
330 | llinfos << "Sending DB log file" << llendl; | ||
331 | } | ||
332 | else | ||
333 | { | ||
334 | llinfos << "Not sending DB log file" << llendl; | ||
335 | } | ||
336 | |||
337 | if (sl_filep) | ||
338 | { | ||
339 | post_data.append("&"); | ||
340 | tmp_url_buf = sl_filep->encodeURL(SL_MAX_SIZE); | ||
341 | post_data += tmp_url_buf; | ||
342 | llinfos << "Sending SL log file" << llendl; | ||
343 | } | ||
344 | else | ||
345 | { | ||
346 | llinfos << "Not sending SL log file" << llendl; | ||
347 | } | ||
348 | |||
349 | if (st_filep) | ||
350 | { | ||
351 | post_data.append("&"); | ||
352 | tmp_url_buf = st_filep->encodeURL(SL_MAX_SIZE); | ||
353 | post_data += tmp_url_buf; | ||
354 | llinfos << "Sending stats log file" << llendl; | ||
355 | } | ||
356 | else | ||
357 | { | ||
358 | llinfos << "Not sending stats log file" << llendl; | ||
359 | } | ||
360 | |||
361 | if (bt_filep) | ||
362 | { | ||
363 | post_data.append("&"); | ||
364 | tmp_url_buf = bt_filep->encodeURL(BT_MAX_SIZE); | ||
365 | post_data += tmp_url_buf; | ||
366 | llinfos << "Sending crash log file" << llendl; | ||
367 | } | ||
368 | else | ||
369 | { | ||
370 | llinfos << "Not sending crash log file" << llendl; | ||
371 | } | ||
372 | |||
373 | if (si_filep) | ||
374 | { | ||
375 | post_data.append("&"); | ||
376 | tmp_url_buf = si_filep->encodeURL(); | ||
377 | post_data += tmp_url_buf; | ||
378 | llinfos << "Sending settings log file" << llendl; | ||
379 | } | ||
380 | else | ||
381 | { | ||
382 | llinfos << "Not sending settings.xml file" << llendl; | ||
383 | } | ||
384 | |||
385 | if (gUserText.size()) | ||
386 | { | ||
387 | post_data.append("&"); | ||
388 | tmp_url_buf = encode_string("UN", gUserText); | ||
389 | post_data += tmp_url_buf; | ||
390 | } | ||
391 | |||
392 | delete db_filep; | ||
393 | db_filep = NULL; | ||
394 | delete sl_filep; | ||
395 | sl_filep = NULL; | ||
396 | delete bt_filep; | ||
397 | bt_filep = NULL; | ||
398 | |||
399 | // Debugging spam | ||
400 | #if 0 | ||
401 | printf("Crash report post data:\n--------\n"); | ||
402 | printf("%s", post_data.getString()); | ||
403 | printf("\n--------\n"); | ||
404 | #endif | ||
405 | |||
406 | // Send the report. Yes, it's this easy. | ||
407 | { | ||
408 | CURL *curl = curl_easy_init(); | ||
409 | |||
410 | curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); | ||
411 | curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curl_download_callback); | ||
412 | curl_easy_setopt(curl, CURLOPT_POST, 1); | ||
413 | curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data.c_str()); | ||
414 | curl_easy_setopt(curl, CURLOPT_URL, "http://EXAMPLE.com/cgi-bin/viewer_crash_reporter2"); | ||
415 | |||
416 | llinfos << "Connecting to crash report server" << llendl; | ||
417 | CURLcode result = curl_easy_perform(curl); | ||
418 | |||
419 | curl_easy_cleanup(curl); | ||
420 | |||
421 | if(result != CURLE_OK) | ||
422 | { | ||
423 | llinfos << "Couldn't talk to crash report server" << llendl; | ||
424 | } | ||
425 | else | ||
426 | { | ||
427 | llinfos << "Response from crash report server:" << llendl; | ||
428 | llinfos << gServerResponse << llendl; | ||
429 | } | ||
430 | } | ||
431 | |||
432 | return 0; | 41 | return 0; |
433 | } | 42 | } |
434 | 43 | ||
435 | LLFileEncoder::LLFileEncoder(const char *form_name, const char *filename, bool isCrashLog) | ||
436 | { | ||
437 | mFormname = form_name; | ||
438 | mFilename = filename; | ||
439 | mIsValid = FALSE; | ||
440 | |||
441 | int res; | ||
442 | |||
443 | struct stat stat_data; | ||
444 | res = stat(mFilename.c_str(), &stat_data); | ||
445 | if (res) | ||
446 | { | ||
447 | llwarns << "File " << mFilename << " is missing!" << llendl; | ||
448 | return; | ||
449 | } | ||
450 | else | ||
451 | { | ||
452 | // Debugging spam | ||
453 | // llinfos << "File " << mFilename << " is present..." << llendl; | ||
454 | |||
455 | if(!gCrashInPreviousExec && isCrashLog) | ||
456 | { | ||
457 | // Make sure the file isn't too old. | ||
458 | double age = difftime(gLaunchTime, stat_data.st_mtim.tv_sec); | ||
459 | |||
460 | // llinfos << "age is " << age << llendl; | ||
461 | 44 | ||
462 | if(age > 60.0) | ||
463 | { | ||
464 | // The file was last modified more than 60 seconds before the crash reporter was launched. Assume it's stale. | ||
465 | llwarns << "File " << mFilename << " is too old!" << llendl; | ||
466 | return; | ||
467 | } | ||
468 | } | ||
469 | |||
470 | } | ||
471 | |||
472 | S32 buf_size = stat_data.st_size; | ||
473 | FILE *fp = fopen(mFilename.c_str(), "rb"); | ||
474 | U8 *buf = new U8[buf_size + 1]; | ||
475 | size_t nread = fread(buf, 1, buf_size, fp); | ||
476 | fclose(fp); | ||
477 | buf[nread] = 0; | ||
478 | |||
479 | mBuf = (char *)buf; | ||
480 | |||
481 | if(isCrashLog) | ||
482 | { | ||
483 | // Crash logs consist of a number of entries, one per crash. | ||
484 | // Each entry is preceeded by "**********" on a line by itself. | ||
485 | // We want only the most recent (i.e. last) one. | ||
486 | const char *sep = "**********"; | ||
487 | const char *start = mBuf.c_str(); | ||
488 | const char *cur = start; | ||
489 | const char *temp = strstr(cur, sep); | ||
490 | |||
491 | while(temp != NULL) | ||
492 | { | ||
493 | // Skip past the marker we just found | ||
494 | cur = temp + strlen(sep); | ||
495 | |||
496 | // and try to find another | ||
497 | temp = strstr(cur, sep); | ||
498 | } | ||
499 | |||
500 | // If there's more than one entry in the log file, strip all but the last one. | ||
501 | if(cur != start) | ||
502 | { | ||
503 | mBuf.erase(0, cur - start); | ||
504 | } | ||
505 | } | ||
506 | |||
507 | mIsValid = TRUE; | ||
508 | delete[] buf; | ||
509 | } | ||
510 | |||
511 | LLString LLFileEncoder::encodeURL(const S32 max_length) | ||
512 | { | ||
513 | LLString result = mFormname; | ||
514 | result.append("="); | ||
515 | |||
516 | S32 i = 0; | ||
517 | |||
518 | if (max_length) | ||
519 | { | ||
520 | if ((S32)mBuf.size() > max_length) | ||
521 | { | ||
522 | i = mBuf.size() - max_length; | ||
523 | } | ||
524 | } | ||
525 | |||
526 | #if 0 | ||
527 | // Plain text version for debugging | ||
528 | result.append(mBuf); | ||
529 | #else | ||
530 | // Not using LLString because of bad performance issues | ||
531 | S32 buf_size = mBuf.size(); | ||
532 | S32 url_buf_size = 3*mBuf.size() + 1; | ||
533 | char *url_buf = new char[url_buf_size]; | ||
534 | |||
535 | S32 cur_pos = 0; | ||
536 | for (; i < buf_size; i++) | ||
537 | { | ||
538 | sprintf(url_buf + cur_pos, "%%%02x", mBuf[i]); | ||
539 | cur_pos += 3; | ||
540 | } | ||
541 | url_buf[i*3] = 0; | ||
542 | |||
543 | result.append(url_buf); | ||
544 | delete[] url_buf; | ||
545 | #endif | ||
546 | return result; | ||
547 | } | ||
548 | |||
549 | LLString encode_string(const char *formname, const LLString &str) | ||
550 | { | ||
551 | LLString result = formname; | ||
552 | result.append("="); | ||
553 | // Not using LLString because of bad performance issues | ||
554 | S32 buf_size = str.size(); | ||
555 | S32 url_buf_size = 3*str.size() + 1; | ||
556 | char *url_buf = new char[url_buf_size]; | ||
557 | |||
558 | S32 cur_pos = 0; | ||
559 | S32 i; | ||
560 | for (i = 0; i < buf_size; i++) | ||
561 | { | ||
562 | sprintf(url_buf + cur_pos, "%%%02x", str[i]); | ||
563 | cur_pos += 3; | ||
564 | } | ||
565 | url_buf[i*3] = 0; | ||
566 | |||
567 | result.append(url_buf); | ||
568 | delete[] url_buf; | ||
569 | return result; | ||
570 | } | ||
diff --git a/linden/indra/linux_crash_logger/llcrashloggerlinux.cpp b/linden/indra/linux_crash_logger/llcrashloggerlinux.cpp new file mode 100644 index 0000000..26a8f0c --- /dev/null +++ b/linden/indra/linux_crash_logger/llcrashloggerlinux.cpp | |||
@@ -0,0 +1,140 @@ | |||
1 | /** | ||
2 | * @file llcrashloggerlinux.cpp | ||
3 | * @brief Linux crash logger implementation | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2003&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2003-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #include "llcrashloggerlinux.h" | ||
33 | |||
34 | #include <iostream> | ||
35 | |||
36 | #include "linden_common.h" | ||
37 | |||
38 | #include "boost/tokenizer.hpp" | ||
39 | |||
40 | #include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME | ||
41 | #include "llerror.h" | ||
42 | #include "llfile.h" | ||
43 | #include "lltimer.h" | ||
44 | #include "llstring.h" | ||
45 | #include "lldir.h" | ||
46 | #include "llsdserialize.h" | ||
47 | |||
48 | #if LL_GTK | ||
49 | # include "gtk/gtk.h" | ||
50 | #endif // LL_GTK | ||
51 | |||
52 | #define MAX_LOADSTRING 100 | ||
53 | |||
54 | // These need to be localized. | ||
55 | static const char dialog_text[] = | ||
56 | "Second Life appears to have crashed or frozen last time it ran.\n" | ||
57 | "This crash reporter collects information about your computer's hardware, operating system, and some Second Life logs, all of which are used for debugging purposes only.\n" | ||
58 | "In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!\n" | ||
59 | "This report is NOT read by Customer Support. If you have billing or other questions, contact support by visiting http://www.secondlife.com/support\n" | ||
60 | "\n" | ||
61 | "Send crash report?"; | ||
62 | |||
63 | static const char dialog_title[] = | ||
64 | "Second Life Crash Logger"; | ||
65 | |||
66 | #if LL_GTK | ||
67 | static void response_callback (GtkDialog *dialog, | ||
68 | gint arg1, | ||
69 | gpointer user_data) | ||
70 | { | ||
71 | gint *response = (gint*)user_data; | ||
72 | *response = arg1; | ||
73 | gtk_widget_destroy(GTK_WIDGET(dialog)); | ||
74 | gtk_main_quit(); | ||
75 | } | ||
76 | #endif // LL_GTK | ||
77 | |||
78 | static BOOL do_ask_dialog(void) | ||
79 | { | ||
80 | #if LL_GTK | ||
81 | gtk_disable_setlocale(); | ||
82 | if (!gtk_init_check(NULL, NULL)) { | ||
83 | llinfos << "Could not initialize GTK for 'ask to send crash report' dialog; not sending report." << llendl; | ||
84 | return FALSE; | ||
85 | } | ||
86 | |||
87 | GtkWidget *win = NULL; | ||
88 | GtkDialogFlags flags = GTK_DIALOG_MODAL; | ||
89 | GtkMessageType messagetype = GTK_MESSAGE_QUESTION; | ||
90 | GtkButtonsType buttons = GTK_BUTTONS_YES_NO; | ||
91 | gint response = GTK_RESPONSE_NONE; | ||
92 | |||
93 | win = gtk_message_dialog_new(NULL, | ||
94 | flags, messagetype, buttons, | ||
95 | dialog_text); | ||
96 | gtk_window_set_type_hint(GTK_WINDOW(win), | ||
97 | GDK_WINDOW_TYPE_HINT_DIALOG); | ||
98 | gtk_window_set_title(GTK_WINDOW(win), dialog_title); | ||
99 | g_signal_connect (win, | ||
100 | "response", | ||
101 | G_CALLBACK (response_callback), | ||
102 | &response); | ||
103 | gtk_widget_show_all (win); | ||
104 | gtk_main(); | ||
105 | |||
106 | return (GTK_RESPONSE_OK == response || | ||
107 | GTK_RESPONSE_YES == response || | ||
108 | GTK_RESPONSE_APPLY == response); | ||
109 | #else | ||
110 | return FALSE; | ||
111 | #endif // LL_GTK | ||
112 | } | ||
113 | |||
114 | LLCrashLoggerLinux::LLCrashLoggerLinux(void) | ||
115 | { | ||
116 | } | ||
117 | |||
118 | LLCrashLoggerLinux::~LLCrashLoggerLinux(void) | ||
119 | { | ||
120 | } | ||
121 | |||
122 | void LLCrashLoggerLinux::gatherPlatformSpecificFiles() | ||
123 | { | ||
124 | mFileMap["CrashLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log").c_str(); | ||
125 | } | ||
126 | |||
127 | bool LLCrashLoggerLinux::mainLoop() | ||
128 | { | ||
129 | if(!do_ask_dialog()) | ||
130 | { | ||
131 | return true; | ||
132 | } | ||
133 | sendCrashLogs(); | ||
134 | return true; | ||
135 | } | ||
136 | |||
137 | void LLCrashLoggerLinux::updateApplication(LLString message) | ||
138 | { | ||
139 | LLCrashLogger::updateApplication(message); | ||
140 | } | ||
diff --git a/linden/indra/linux_crash_logger/llcrashloggerlinux.h b/linden/indra/linux_crash_logger/llcrashloggerlinux.h new file mode 100644 index 0000000..a84ee00 --- /dev/null +++ b/linden/indra/linux_crash_logger/llcrashloggerlinux.h | |||
@@ -0,0 +1,49 @@ | |||
1 | /** | ||
2 | * @file llcrashloggerlinux.h | ||
3 | * @brief Linux crash logger definition | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2003&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2003-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #ifndef LLCRASHLOGGERLINUX_H | ||
33 | #define LLCRASHLOGGERLINUX_H | ||
34 | |||
35 | #include "linden_common.h" | ||
36 | #include "llcrashlogger.h" | ||
37 | #include "llstring.h" | ||
38 | |||
39 | class LLCrashLoggerLinux : public LLCrashLogger | ||
40 | { | ||
41 | public: | ||
42 | LLCrashLoggerLinux(void); | ||
43 | ~LLCrashLoggerLinux(void); | ||
44 | virtual bool mainLoop(); | ||
45 | virtual void updateApplication(LLString message = ""); | ||
46 | virtual void gatherPlatformSpecificFiles(); | ||
47 | }; | ||
48 | |||
49 | #endif | ||
diff --git a/linden/indra/llcommon/llapp.cpp b/linden/indra/llcommon/llapp.cpp index b0751b8..2347ac9 100644 --- a/linden/indra/llcommon/llapp.cpp +++ b/linden/indra/llcommon/llapp.cpp | |||
@@ -47,6 +47,7 @@ | |||
47 | // | 47 | // |
48 | #if LL_WINDOWS | 48 | #if LL_WINDOWS |
49 | LONG WINAPI default_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop); | 49 | LONG WINAPI default_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop); |
50 | BOOL ConsoleCtrlHandler(DWORD fdwCtrlType); | ||
50 | #else | 51 | #else |
51 | #include <unistd.h> // for fork() | 52 | #include <unistd.h> // for fork() |
52 | void setup_signals(); | 53 | void setup_signals(); |
@@ -219,6 +220,11 @@ void LLApp::setupErrorHandling() | |||
219 | // Disable this until the viewer gets ported so server crashes can be JIT debugged. | 220 | // Disable this until the viewer gets ported so server crashes can be JIT debugged. |
220 | //LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; | 221 | //LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; |
221 | //prev_filter = SetUnhandledExceptionFilter(default_windows_exception_handler); | 222 | //prev_filter = SetUnhandledExceptionFilter(default_windows_exception_handler); |
223 | |||
224 | // This sets a callback to handle w32 signals to the console window. | ||
225 | // The viewer shouldn't be affected, sicne its a windowed app. | ||
226 | SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ConsoleCtrlHandler, TRUE); | ||
227 | |||
222 | #else | 228 | #else |
223 | // | 229 | // |
224 | // Start up signal handling. | 230 | // Start up signal handling. |
@@ -399,6 +405,34 @@ LONG WINAPI default_windows_exception_handler(struct _EXCEPTION_POINTERS *except | |||
399 | return retval; | 405 | return retval; |
400 | } | 406 | } |
401 | 407 | ||
408 | // Win32 doesn't support signals. This is used instead. | ||
409 | BOOL ConsoleCtrlHandler(DWORD fdwCtrlType) | ||
410 | { | ||
411 | switch (fdwCtrlType) | ||
412 | { | ||
413 | case CTRL_BREAK_EVENT: | ||
414 | case CTRL_LOGOFF_EVENT: | ||
415 | case CTRL_SHUTDOWN_EVENT: | ||
416 | case CTRL_CLOSE_EVENT: // From end task or the window close button. | ||
417 | case CTRL_C_EVENT: // from CTRL-C on the keyboard | ||
418 | // Just set our state to quitting, not error | ||
419 | if (LLApp::isQuitting() || LLApp::isError()) | ||
420 | { | ||
421 | // We're already trying to die, just ignore this signal | ||
422 | if (LLApp::sLogInSignal) | ||
423 | { | ||
424 | llinfos << "Signal handler - Already trying to quit, ignoring signal!" << llendl; | ||
425 | } | ||
426 | return TRUE; | ||
427 | } | ||
428 | LLApp::setQuitting(); | ||
429 | return TRUE; | ||
430 | |||
431 | default: | ||
432 | return FALSE; | ||
433 | } | ||
434 | } | ||
435 | |||
402 | #else //!LL_WINDOWS | 436 | #else //!LL_WINDOWS |
403 | void LLApp::setChildCallback(pid_t pid, LLAppChildCallback callback) | 437 | void LLApp::setChildCallback(pid_t pid, LLAppChildCallback callback) |
404 | { | 438 | { |
diff --git a/linden/indra/llcommon/llavatarconstants.h b/linden/indra/llcommon/llavatarconstants.h index c62cae2..4ba6642 100644 --- a/linden/indra/llcommon/llavatarconstants.h +++ b/linden/indra/llcommon/llavatarconstants.h | |||
@@ -49,6 +49,7 @@ const U32 AVATAR_MATURE_PUBLISH = 0x1 << 1; // profile is "mature" | |||
49 | const U32 AVATAR_IDENTIFIED = 0x1 << 2; // whether avatar has provided payment info | 49 | const U32 AVATAR_IDENTIFIED = 0x1 << 2; // whether avatar has provided payment info |
50 | const U32 AVATAR_TRANSACTED = 0x1 << 3; // whether avatar has actively used payment info | 50 | const U32 AVATAR_TRANSACTED = 0x1 << 3; // whether avatar has actively used payment info |
51 | const U32 AVATAR_ONLINE = 0x1 << 4; // the online status of this avatar, if known. | 51 | const U32 AVATAR_ONLINE = 0x1 << 4; // the online status of this avatar, if known. |
52 | const U32 AVATAR_AGEVERIFIED = 0x1 << 5; // whether avatar has been age-verified | ||
52 | 53 | ||
53 | static const std::string VISIBILITY_DEFAULT("default"); | 54 | static const std::string VISIBILITY_DEFAULT("default"); |
54 | static const std::string VISIBILITY_HIDDEN("hidden"); | 55 | static const std::string VISIBILITY_HIDDEN("hidden"); |
diff --git a/linden/indra/llcommon/llcommon.vcproj b/linden/indra/llcommon/llcommon.vcproj index 80704af..0ab544e 100644 --- a/linden/indra/llcommon/llcommon.vcproj +++ b/linden/indra/llcommon/llcommon.vcproj | |||
@@ -415,6 +415,9 @@ | |||
415 | RelativePath=".\llindexedqueue.h"> | 415 | RelativePath=".\llindexedqueue.h"> |
416 | </File> | 416 | </File> |
417 | <File | 417 | <File |
418 | RelativePath=".\llkeythrottle.h"> | ||
419 | </File> | ||
420 | <File | ||
418 | RelativePath=".\lllinkedqueue.h"> | 421 | RelativePath=".\lllinkedqueue.h"> |
419 | </File> | 422 | </File> |
420 | <File | 423 | <File |
diff --git a/linden/indra/llcommon/llcommon_vc8.vcproj b/linden/indra/llcommon/llcommon_vc8.vcproj index 1687a89..4790b61 100644 --- a/linden/indra/llcommon/llcommon_vc8.vcproj +++ b/linden/indra/llcommon/llcommon_vc8.vcproj | |||
@@ -201,7 +201,9 @@ | |||
201 | /> | 201 | /> |
202 | <Tool | 202 | <Tool |
203 | Name="VCLibrarianTool" | 203 | Name="VCLibrarianTool" |
204 | AdditionalDependencies="psapi.lib" | ||
204 | OutputFile="$(OutDir)/llcommon.lib" | 205 | OutputFile="$(OutDir)/llcommon.lib" |
206 | AdditionalLibraryDirectories="" | ||
205 | /> | 207 | /> |
206 | <Tool | 208 | <Tool |
207 | Name="VCALinkTool" | 209 | Name="VCALinkTool" |
diff --git a/linden/indra/llcommon/llsd.cpp b/linden/indra/llcommon/llsd.cpp index 305531b..829ea25 100644 --- a/linden/indra/llcommon/llsd.cpp +++ b/linden/indra/llcommon/llsd.cpp | |||
@@ -36,11 +36,23 @@ | |||
36 | #include "../llmath/llmath.h" | 36 | #include "../llmath/llmath.h" |
37 | #include "llformat.h" | 37 | #include "llformat.h" |
38 | 38 | ||
39 | #ifndef LL_RELEASE_FOR_DOWNLOAD | ||
40 | #define NAME_UNNAMED_NAMESPACE | ||
41 | #endif | ||
42 | |||
43 | #ifdef NAME_UNNAMED_NAMESPACE | ||
44 | namespace LLSDUnnamedNamespace { | ||
45 | #else | ||
39 | namespace { | 46 | namespace { |
47 | #endif | ||
40 | class ImplMap; | 48 | class ImplMap; |
41 | class ImplArray; | 49 | class ImplArray; |
42 | } | 50 | } |
43 | 51 | ||
52 | #ifdef NAME_UNNAMED_NAMESPACE | ||
53 | using namespace LLSDUnnamedNamespace; | ||
54 | #endif | ||
55 | |||
44 | class LLSD::Impl | 56 | class LLSD::Impl |
45 | /**< This class is the abstract base class of the implementation of LLSD | 57 | /**< This class is the abstract base class of the implementation of LLSD |
46 | It provides the reference counting implementation, and the default | 58 | It provides the reference counting implementation, and the default |
@@ -125,7 +137,11 @@ public: | |||
125 | static U32 sOutstandingCount; | 137 | static U32 sOutstandingCount; |
126 | }; | 138 | }; |
127 | 139 | ||
140 | #ifdef NAME_UNNAMED_NAMESPACE | ||
141 | namespace LLSDUnnamedNamespace { | ||
142 | #else | ||
128 | namespace { | 143 | namespace { |
144 | #endif | ||
129 | template<LLSD::Type T, class Data, class DataRef = Data> | 145 | template<LLSD::Type T, class Data, class DataRef = Data> |
130 | class ImplBase : public LLSD::Impl | 146 | class ImplBase : public LLSD::Impl |
131 | ///< This class handles most of the work for a subclass of Impl | 147 | ///< This class handles most of the work for a subclass of Impl |
@@ -632,7 +648,11 @@ U32 LLSD::Impl::sOutstandingCount = 0; | |||
632 | 648 | ||
633 | 649 | ||
634 | 650 | ||
651 | #ifdef NAME_UNNAMED_NAMESPACE | ||
652 | namespace LLSDUnnamedNamespace { | ||
653 | #else | ||
635 | namespace { | 654 | namespace { |
655 | #endif | ||
636 | inline LLSD::Impl& safe(LLSD::Impl* impl) | 656 | inline LLSD::Impl& safe(LLSD::Impl* impl) |
637 | { return LLSD::Impl::safe(impl); } | 657 | { return LLSD::Impl::safe(impl); } |
638 | 658 | ||
diff --git a/linden/indra/llcommon/llsd.h b/linden/indra/llcommon/llsd.h index 1fb917f..65ba7dd 100644 --- a/linden/indra/llcommon/llsd.h +++ b/linden/indra/llcommon/llsd.h | |||
@@ -376,6 +376,7 @@ struct llsd_select_string : public std::unary_function<LLSD, LLSD::String> | |||
376 | } | 376 | } |
377 | }; | 377 | }; |
378 | 378 | ||
379 | std::ostream& operator<<(std::ostream& s, const LLSD& llsd); | ||
379 | 380 | ||
380 | /** QUESTIONS & TO DOS | 381 | /** QUESTIONS & TO DOS |
381 | - Would Binary be more convenient as usigned char* buffer semantics? | 382 | - Would Binary be more convenient as usigned char* buffer semantics? |
diff --git a/linden/indra/llcommon/llsdserialize.cpp b/linden/indra/llcommon/llsdserialize.cpp index a7470be..5ab9471 100644 --- a/linden/indra/llcommon/llsdserialize.cpp +++ b/linden/indra/llcommon/llsdserialize.cpp | |||
@@ -1641,4 +1641,9 @@ void serialize_string(const std::string& value, std::ostream& str) | |||
1641 | } | 1641 | } |
1642 | } | 1642 | } |
1643 | 1643 | ||
1644 | std::ostream& operator<<(std::ostream& s, const LLSD& llsd) | ||
1645 | { | ||
1646 | s << LLSDNotationStreamer(llsd); | ||
1647 | return s; | ||
1648 | } | ||
1644 | 1649 | ||
diff --git a/linden/indra/llcommon/llstring.cpp b/linden/indra/llcommon/llstring.cpp index 6dab598..e701ea0 100644 --- a/linden/indra/llcommon/llstring.cpp +++ b/linden/indra/llcommon/llstring.cpp | |||
@@ -34,6 +34,13 @@ | |||
34 | #include "llstring.h" | 34 | #include "llstring.h" |
35 | #include "llerror.h" | 35 | #include "llerror.h" |
36 | 36 | ||
37 | #if LL_WINDOWS | ||
38 | #define WIN32_LEAN_AND_MEAN | ||
39 | #include <winsock2.h> | ||
40 | #include <windows.h> | ||
41 | #include <winnls.h> // for WideCharToMultiByte | ||
42 | #endif | ||
43 | |||
37 | std::string ll_safe_string(const char* in) | 44 | std::string ll_safe_string(const char* in) |
38 | { | 45 | { |
39 | if(in) return std::string(in); | 46 | if(in) return std::string(in); |
@@ -718,19 +725,7 @@ std::string utf8str_removeCRLF(const std::string& utf8str) | |||
718 | } | 725 | } |
719 | 726 | ||
720 | #if LL_WINDOWS | 727 | #if LL_WINDOWS |
721 | /* If the size of the passed in buffer is not large enough to hold the string, | 728 | // documentation moved to header. Phoenix 2007-11-27 |
722 | * two bad things happen: | ||
723 | * 1. resulting formatted string is NOT null terminated | ||
724 | * 2. Depending on the platform, the return value could be a) the required | ||
725 | * size of the buffer to copy the entire formatted string or b) -1. | ||
726 | * On Windows with VS.Net 2003, it returns -1 e.g. | ||
727 | * | ||
728 | * safe_snprintf always adds a NULL terminator so that the caller does not | ||
729 | * need to check for return value or need to add the NULL terminator. | ||
730 | * It does not, however change the return value - to let the caller know | ||
731 | * that the passed in buffer size was not large enough to hold the formatted string. | ||
732 | * | ||
733 | */ | ||
734 | int safe_snprintf(char *str, size_t size, const char *format, ...) | 729 | int safe_snprintf(char *str, size_t size, const char *format, ...) |
735 | { | 730 | { |
736 | va_list args; | 731 | va_list args; |
@@ -742,6 +737,43 @@ int safe_snprintf(char *str, size_t size, const char *format, ...) | |||
742 | str[size-1] = '\0'; // always null terminate | 737 | str[size-1] = '\0'; // always null terminate |
743 | return num_written; | 738 | return num_written; |
744 | } | 739 | } |
740 | |||
741 | std::string ll_convert_wide_to_string(const wchar_t* in) | ||
742 | { | ||
743 | std::string out; | ||
744 | if(in) | ||
745 | { | ||
746 | int len_in = wcslen(in); | ||
747 | int len_out = WideCharToMultiByte( | ||
748 | CP_ACP, | ||
749 | 0, | ||
750 | in, | ||
751 | len_in, | ||
752 | NULL, | ||
753 | 0, | ||
754 | 0, | ||
755 | 0); | ||
756 | // We will need two more bytes for the double NULL ending | ||
757 | // created in WideCharToMultiByte(). | ||
758 | char* pout = new char [len_out + 2]; | ||
759 | memset(pout, 0, len_out + 2); | ||
760 | if(pout) | ||
761 | { | ||
762 | WideCharToMultiByte( | ||
763 | CP_ACP, | ||
764 | 0, | ||
765 | in, | ||
766 | len_in, | ||
767 | pout, | ||
768 | len_out, | ||
769 | 0, | ||
770 | 0); | ||
771 | out.assign(pout); | ||
772 | delete[] pout; | ||
773 | } | ||
774 | } | ||
775 | return out; | ||
776 | } | ||
745 | #endif // LL_WINDOWS | 777 | #endif // LL_WINDOWS |
746 | 778 | ||
747 | S32 LLStringOps::collate(const llwchar* a, const llwchar* b) | 779 | S32 LLStringOps::collate(const llwchar* a, const llwchar* b) |
diff --git a/linden/indra/llcommon/llstring.h b/linden/indra/llcommon/llstring.h index 70f7d54..ae44ac3 100644 --- a/linden/indra/llcommon/llstring.h +++ b/linden/indra/llcommon/llstring.h | |||
@@ -481,7 +481,37 @@ std::ostream& operator<<(std::ostream &s, const LLStringBase<T> &str) | |||
481 | std::ostream& operator<<(std::ostream &s, const LLWString &wstr); | 481 | std::ostream& operator<<(std::ostream &s, const LLWString &wstr); |
482 | 482 | ||
483 | #if LL_WINDOWS | 483 | #if LL_WINDOWS |
484 | int safe_snprintf(char *str, size_t size, const char *format, ...); | 484 | /* @name Windows string helpers |
485 | */ | ||
486 | //@{ | ||
487 | |||
488 | /** | ||
489 | * @brief Implementation the expected snprintf interface. | ||
490 | * | ||
491 | * If the size of the passed in buffer is not large enough to hold the string, | ||
492 | * two bad things happen: | ||
493 | * 1. resulting formatted string is NOT null terminated | ||
494 | * 2. Depending on the platform, the return value could be a) the required | ||
495 | * size of the buffer to copy the entire formatted string or b) -1. | ||
496 | * On Windows with VS.Net 2003, it returns -1 e.g. | ||
497 | * | ||
498 | * safe_snprintf always adds a NULL terminator so that the caller does not | ||
499 | * need to check for return value or need to add the NULL terminator. | ||
500 | * It does not, however change the return value - to let the caller know | ||
501 | * that the passed in buffer size was not large enough to hold the | ||
502 | * formatted string. | ||
503 | * | ||
504 | */ | ||
505 | int safe_snprintf(char* str, size_t size, const char* format, ...); | ||
506 | |||
507 | /** | ||
508 | * @brief Convert a wide string to std::string | ||
509 | * | ||
510 | * This replaces the unsafe W2A macro from ATL. | ||
511 | */ | ||
512 | std::string ll_convert_wide_to_string(const wchar_t* in); | ||
513 | |||
514 | //@} | ||
485 | #endif // LL_WINDOWS | 515 | #endif // LL_WINDOWS |
486 | 516 | ||
487 | /** | 517 | /** |
diff --git a/linden/indra/llcommon/llsys.cpp b/linden/indra/llcommon/llsys.cpp index 3b57db7..7346b29 100644 --- a/linden/indra/llcommon/llsys.cpp +++ b/linden/indra/llcommon/llsys.cpp | |||
@@ -65,8 +65,7 @@ static const S32 CPUINFO_BUFFER_SIZE = 16383; | |||
65 | LLCPUInfo gSysCPU; | 65 | LLCPUInfo gSysCPU; |
66 | 66 | ||
67 | LLOSInfo::LLOSInfo() : | 67 | LLOSInfo::LLOSInfo() : |
68 | mMajorVer(0), mMinorVer(0), mBuild(0), | 68 | mMajorVer(0), mMinorVer(0), mBuild(0) |
69 | mOSString("") | ||
70 | { | 69 | { |
71 | 70 | ||
72 | #if LL_WINDOWS | 71 | #if LL_WINDOWS |
@@ -94,27 +93,28 @@ LLOSInfo::LLOSInfo() : | |||
94 | // Test for the product. | 93 | // Test for the product. |
95 | if(osvi.dwMajorVersion <= 4) | 94 | if(osvi.dwMajorVersion <= 4) |
96 | { | 95 | { |
97 | mOSString = "Microsoft Windows NT "; | 96 | mOSStringSimple = "Microsoft Windows NT "; |
98 | } | 97 | } |
99 | else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) | 98 | else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) |
100 | { | 99 | { |
101 | mOSString = "Microsoft Windows 2000 "; | 100 | mOSStringSimple = "Microsoft Windows 2000 "; |
102 | } | 101 | } |
103 | else if(osvi.dwMajorVersion ==5 && osvi.dwMinorVersion == 1) | 102 | else if(osvi.dwMajorVersion ==5 && osvi.dwMinorVersion == 1) |
104 | { | 103 | { |
105 | mOSString = "Microsoft Windows XP "; | 104 | mOSStringSimple = "Microsoft Windows XP "; |
106 | } | 105 | } |
107 | else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) | 106 | else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) |
108 | { | 107 | { |
109 | if(osvi.wProductType == VER_NT_WORKSTATION) | 108 | if(osvi.wProductType == VER_NT_WORKSTATION) |
110 | mOSString = "Microsoft Windows XP x64 Edition "; | 109 | mOSStringSimple = "Microsoft Windows XP x64 Edition "; |
111 | else mOSString = "Microsoft Windows Server 2003 "; | 110 | else |
111 | mOSStringSimple = "Microsoft Windows Server 2003 "; | ||
112 | } | 112 | } |
113 | else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) | 113 | else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) |
114 | { | 114 | { |
115 | if(osvi.wProductType == VER_NT_WORKSTATION) | 115 | if(osvi.wProductType == VER_NT_WORKSTATION) |
116 | mOSString = "Microsoft Windows Vista "; | 116 | mOSStringSimple = "Microsoft Windows Vista "; |
117 | else mOSString = "Microsoft Windows Vista Server "; | 117 | else mOSStringSimple = "Microsoft Windows Vista Server "; |
118 | } | 118 | } |
119 | else // Use the registry on early versions of Windows NT. | 119 | else // Use the registry on early versions of Windows NT. |
120 | { | 120 | { |
@@ -129,15 +129,15 @@ LLOSInfo::LLOSInfo() : | |||
129 | RegCloseKey( hKey ); | 129 | RegCloseKey( hKey ); |
130 | if ( lstrcmpi( L"WINNT", szProductType) == 0 ) | 130 | if ( lstrcmpi( L"WINNT", szProductType) == 0 ) |
131 | { | 131 | { |
132 | mOSString += "Professional "; | 132 | mOSStringSimple += "Professional "; |
133 | } | 133 | } |
134 | else if ( lstrcmpi( L"LANMANNT", szProductType) == 0 ) | 134 | else if ( lstrcmpi( L"LANMANNT", szProductType) == 0 ) |
135 | { | 135 | { |
136 | mOSString += "Server "; | 136 | mOSStringSimple += "Server "; |
137 | } | 137 | } |
138 | else if ( lstrcmpi( L"SERVERNT", szProductType) == 0 ) | 138 | else if ( lstrcmpi( L"SERVERNT", szProductType) == 0 ) |
139 | { | 139 | { |
140 | mOSString += "Advanced Server "; | 140 | mOSStringSimple += "Advanced Server "; |
141 | } | 141 | } |
142 | } | 142 | } |
143 | 143 | ||
@@ -164,7 +164,7 @@ LLOSInfo::LLOSInfo() : | |||
164 | csdversion.c_str(), | 164 | csdversion.c_str(), |
165 | (osvi.dwBuildNumber & 0xffff)); | 165 | (osvi.dwBuildNumber & 0xffff)); |
166 | } | 166 | } |
167 | mOSString += tmp; | 167 | mOSString = mOSStringSimple + tmp; |
168 | } | 168 | } |
169 | break; | 169 | break; |
170 | 170 | ||
@@ -172,41 +172,65 @@ LLOSInfo::LLOSInfo() : | |||
172 | // Test for the Windows 95 product family. | 172 | // Test for the Windows 95 product family. |
173 | if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) | 173 | if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) |
174 | { | 174 | { |
175 | mOSString = "Microsoft Windows 95 "; | 175 | mOSStringSimple = "Microsoft Windows 95 "; |
176 | if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' ) | 176 | if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' ) |
177 | { | 177 | { |
178 | mOSString += "OSR2 "; | 178 | mOSStringSimple += "OSR2 "; |
179 | } | 179 | } |
180 | } | 180 | } |
181 | if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) | 181 | if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) |
182 | { | 182 | { |
183 | mOSString = "Microsoft Windows 98 "; | 183 | mOSStringSimple = "Microsoft Windows 98 "; |
184 | if ( osvi.szCSDVersion[1] == 'A' ) | 184 | if ( osvi.szCSDVersion[1] == 'A' ) |
185 | { | 185 | { |
186 | mOSString += "SE "; | 186 | mOSStringSimple += "SE "; |
187 | } | 187 | } |
188 | } | 188 | } |
189 | if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) | 189 | if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) |
190 | { | 190 | { |
191 | mOSString = "Microsoft Windows Millennium Edition "; | 191 | mOSStringSimple = "Microsoft Windows Millennium Edition "; |
192 | } | 192 | } |
193 | mOSString = mOSStringSimple; | ||
193 | break; | 194 | break; |
194 | } | 195 | } |
195 | #else | 196 | #else |
196 | struct utsname un; | 197 | struct utsname un; |
197 | if(uname(&un) != -1) | 198 | if(uname(&un) != -1) |
198 | { | 199 | { |
199 | mOSString.append(un.sysname); | 200 | mOSStringSimple.append(un.sysname); |
200 | mOSString.append(" "); | 201 | mOSStringSimple.append(" "); |
201 | mOSString.append(un.release); | 202 | mOSStringSimple.append(un.release); |
203 | |||
204 | mOSString = mOSStringSimple; | ||
202 | mOSString.append(" "); | 205 | mOSString.append(" "); |
203 | mOSString.append(un.version); | 206 | mOSString.append(un.version); |
204 | mOSString.append(" "); | 207 | mOSString.append(" "); |
205 | mOSString.append(un.machine); | 208 | mOSString.append(un.machine); |
209 | |||
210 | // Simplify 'Simple' | ||
211 | std::string ostype = mOSStringSimple.substr(0, mOSStringSimple.find_first_of(" ", 0)); | ||
212 | if (ostype == "Darwin") | ||
213 | { | ||
214 | // Only care about major Darwin versions, truncate at first '.' | ||
215 | S32 idx1 = mOSStringSimple.find_first_of(".", 0); | ||
216 | std::string simple = mOSStringSimple.substr(0, idx1); | ||
217 | if (simple.length() > 0) | ||
218 | mOSStringSimple = simple; | ||
219 | } | ||
220 | else if (ostype == "Linux") | ||
221 | { | ||
222 | // Only care about major and minor Linux versions, truncate at second '.' | ||
223 | S32 idx1 = mOSStringSimple.find_first_of(".", 0); | ||
224 | S32 idx2 = (idx1 != std::string::npos) ? mOSStringSimple.find_first_of(".", idx1+1) : std::string::npos; | ||
225 | std::string simple = mOSStringSimple.substr(0, idx2); | ||
226 | if (simple.length() > 0) | ||
227 | mOSStringSimple = simple; | ||
228 | } | ||
206 | } | 229 | } |
207 | else | 230 | else |
208 | { | 231 | { |
209 | mOSString.append("Unable to collect OS info"); | 232 | mOSStringSimple.append("Unable to collect OS info"); |
233 | mOSString = mOSStringSimple; | ||
210 | } | 234 | } |
211 | #endif | 235 | #endif |
212 | 236 | ||
@@ -255,6 +279,11 @@ const std::string& LLOSInfo::getOSString() const | |||
255 | return mOSString; | 279 | return mOSString; |
256 | } | 280 | } |
257 | 281 | ||
282 | const std::string& LLOSInfo::getOSStringSimple() const | ||
283 | { | ||
284 | return mOSStringSimple; | ||
285 | } | ||
286 | |||
258 | const S32 STATUS_SIZE = 8192; | 287 | const S32 STATUS_SIZE = 8192; |
259 | 288 | ||
260 | //static | 289 | //static |
diff --git a/linden/indra/llcommon/llsys.h b/linden/indra/llcommon/llsys.h index fc4e027..332d62c 100644 --- a/linden/indra/llcommon/llsys.h +++ b/linden/indra/llcommon/llsys.h | |||
@@ -51,6 +51,7 @@ public: | |||
51 | void stream(std::ostream& s) const; | 51 | void stream(std::ostream& s) const; |
52 | 52 | ||
53 | const std::string& getOSString() const; | 53 | const std::string& getOSString() const; |
54 | const std::string& getOSStringSimple() const; | ||
54 | 55 | ||
55 | S32 mMajorVer; | 56 | S32 mMajorVer; |
56 | S32 mMinorVer; | 57 | S32 mMinorVer; |
@@ -64,6 +65,7 @@ public: | |||
64 | static U32 getProcessResidentSizeKB(); | 65 | static U32 getProcessResidentSizeKB(); |
65 | private: | 66 | private: |
66 | std::string mOSString; | 67 | std::string mOSString; |
68 | std::string mOSStringSimple; | ||
67 | }; | 69 | }; |
68 | 70 | ||
69 | 71 | ||
diff --git a/linden/indra/llcommon/lluri.cpp b/linden/indra/llcommon/lluri.cpp index df79043..5e4dec7 100644 --- a/linden/indra/llcommon/lluri.cpp +++ b/linden/indra/llcommon/lluri.cpp | |||
@@ -40,6 +40,8 @@ | |||
40 | 40 | ||
41 | #include "../llmath/lluuid.h" | 41 | #include "../llmath/lluuid.h" |
42 | 42 | ||
43 | // system includes | ||
44 | #include <boost/tokenizer.hpp> | ||
43 | 45 | ||
44 | // static | 46 | // static |
45 | std::string LLURI::escape(const std::string& str, const std::string & allowed) | 47 | std::string LLURI::escape(const std::string& str, const std::string & allowed) |
@@ -130,7 +132,7 @@ LLURI::LLURI() | |||
130 | 132 | ||
131 | LLURI::LLURI(const std::string& escaped_str) | 133 | LLURI::LLURI(const std::string& escaped_str) |
132 | { | 134 | { |
133 | std::string::size_type delim_pos, delim_pos2; | 135 | std::string::size_type delim_pos; |
134 | delim_pos = escaped_str.find(':'); | 136 | delim_pos = escaped_str.find(':'); |
135 | std::string temp; | 137 | std::string temp; |
136 | if (delim_pos == std::string::npos) | 138 | if (delim_pos == std::string::npos) |
@@ -144,13 +146,39 @@ LLURI::LLURI(const std::string& escaped_str) | |||
144 | mEscapedOpaque = escaped_str.substr(delim_pos+1); | 146 | mEscapedOpaque = escaped_str.substr(delim_pos+1); |
145 | } | 147 | } |
146 | 148 | ||
147 | if (mScheme == "http" || mScheme == "https" || mScheme == "ftp") | 149 | parseAuthorityAndPathUsingOpaque(); |
150 | |||
151 | delim_pos = mEscapedPath.find('?'); | ||
152 | if (delim_pos != std::string::npos) | ||
153 | { | ||
154 | mEscapedQuery = mEscapedPath.substr(delim_pos+1); | ||
155 | mEscapedPath = mEscapedPath.substr(0,delim_pos); | ||
156 | } | ||
157 | } | ||
158 | |||
159 | static BOOL isDefault(const std::string& scheme, U16 port) | ||
160 | { | ||
161 | if (scheme == "http") | ||
162 | return port == 80; | ||
163 | if (scheme == "https") | ||
164 | return port == 443; | ||
165 | if (scheme == "ftp") | ||
166 | return port == 21; | ||
167 | |||
168 | return FALSE; | ||
169 | } | ||
170 | |||
171 | void LLURI::parseAuthorityAndPathUsingOpaque() | ||
172 | { | ||
173 | if (mScheme == "http" || mScheme == "https" || | ||
174 | mScheme == "ftp" || mScheme == "secondlife" ) | ||
148 | { | 175 | { |
149 | if (mEscapedOpaque.substr(0,2) != "//") | 176 | if (mEscapedOpaque.substr(0,2) != "//") |
150 | { | 177 | { |
151 | return; | 178 | return; |
152 | } | 179 | } |
153 | 180 | ||
181 | std::string::size_type delim_pos, delim_pos2; | ||
154 | delim_pos = mEscapedOpaque.find('/', 2); | 182 | delim_pos = mEscapedOpaque.find('/', 2); |
155 | delim_pos2 = mEscapedOpaque.find('?', 2); | 183 | delim_pos2 = mEscapedOpaque.find('?', 2); |
156 | // no path, no query | 184 | // no path, no query |
@@ -182,27 +210,12 @@ LLURI::LLURI(const std::string& escaped_str) | |||
182 | mEscapedPath = mEscapedOpaque.substr(delim_pos); | 210 | mEscapedPath = mEscapedOpaque.substr(delim_pos); |
183 | } | 211 | } |
184 | } | 212 | } |
185 | 213 | else if (mScheme == "about") | |
186 | delim_pos = mEscapedPath.find('?'); | ||
187 | if (delim_pos != std::string::npos) | ||
188 | { | 214 | { |
189 | mEscapedQuery = mEscapedPath.substr(delim_pos+1); | 215 | mEscapedPath = mEscapedOpaque; |
190 | mEscapedPath = mEscapedPath.substr(0,delim_pos); | ||
191 | } | 216 | } |
192 | } | 217 | } |
193 | 218 | ||
194 | static BOOL isDefault(const std::string& scheme, U16 port) | ||
195 | { | ||
196 | if (scheme == "http") | ||
197 | return port == 80; | ||
198 | if (scheme == "https") | ||
199 | return port == 443; | ||
200 | if (scheme == "ftp") | ||
201 | return port == 21; | ||
202 | |||
203 | return FALSE; | ||
204 | } | ||
205 | |||
206 | LLURI::LLURI(const std::string& scheme, | 219 | LLURI::LLURI(const std::string& scheme, |
207 | const std::string& userName, | 220 | const std::string& userName, |
208 | const std::string& password, | 221 | const std::string& password, |
@@ -440,6 +453,22 @@ std::string LLURI::path() const | |||
440 | return unescape(mEscapedPath); | 453 | return unescape(mEscapedPath); |
441 | } | 454 | } |
442 | 455 | ||
456 | LLSD LLURI::pathArray() const | ||
457 | { | ||
458 | typedef boost::tokenizer<boost::char_separator<char> > tokenizer; | ||
459 | boost::char_separator<char> sep("/", "", boost::drop_empty_tokens); | ||
460 | tokenizer tokens(mEscapedPath, sep); | ||
461 | tokenizer::iterator it = tokens.begin(); | ||
462 | tokenizer::iterator end = tokens.end(); | ||
463 | |||
464 | LLSD params; | ||
465 | for ( ; it != end; ++it) | ||
466 | { | ||
467 | params.append(*it); | ||
468 | } | ||
469 | return params; | ||
470 | } | ||
471 | |||
443 | std::string LLURI::query() const | 472 | std::string LLURI::query() const |
444 | { | 473 | { |
445 | return unescape(mEscapedQuery); | 474 | return unescape(mEscapedQuery); |
diff --git a/linden/indra/llcommon/lluri.h b/linden/indra/llcommon/lluri.h index 3246dcd..bfe673c 100644 --- a/linden/indra/llcommon/lluri.h +++ b/linden/indra/llcommon/lluri.h | |||
@@ -107,7 +107,7 @@ public: | |||
107 | BOOL defaultPort() const; // true if port is default for scheme | 107 | BOOL defaultPort() const; // true if port is default for scheme |
108 | const std::string& escapedPath() const { return mEscapedPath; } | 108 | const std::string& escapedPath() const { return mEscapedPath; } |
109 | std::string path() const; // ex.: "/abc/def", includes leading slash | 109 | std::string path() const; // ex.: "/abc/def", includes leading slash |
110 | // LLSD pathArray() const; // above decoded into an array of strings | 110 | LLSD pathArray() const; // above decoded into an array of strings |
111 | std::string query() const; // ex.: "x=34", section after "?" | 111 | std::string query() const; // ex.: "x=34", section after "?" |
112 | const std::string& escapedQuery() const { return mEscapedQuery; } | 112 | const std::string& escapedQuery() const { return mEscapedQuery; } |
113 | LLSD queryMap() const; // above decoded into a map | 113 | LLSD queryMap() const; // above decoded into a map |
@@ -135,6 +135,11 @@ public: | |||
135 | //@} | 135 | //@} |
136 | 136 | ||
137 | private: | 137 | private: |
138 | // only "http", "https", "ftp", and "secondlife" schemes are parsed | ||
139 | // secondlife scheme parses authority as "" and includes it as part of | ||
140 | // the path. See lluri_tut.cpp | ||
141 | // i.e. secondlife://app/login has mAuthority = "" and mPath = "/app/login" | ||
142 | void parseAuthorityAndPathUsingOpaque(); | ||
138 | std::string mScheme; | 143 | std::string mScheme; |
139 | std::string mEscapedOpaque; | 144 | std::string mEscapedOpaque; |
140 | std::string mEscapedAuthority; | 145 | std::string mEscapedAuthority; |
diff --git a/linden/indra/llcommon/llversionserver.h b/linden/indra/llcommon/llversionserver.h index e36702a..9e1a8f5 100644 --- a/linden/indra/llcommon/llversionserver.h +++ b/linden/indra/llcommon/llversionserver.h | |||
@@ -34,8 +34,8 @@ | |||
34 | 34 | ||
35 | const S32 LL_VERSION_MAJOR = 1; | 35 | const S32 LL_VERSION_MAJOR = 1; |
36 | const S32 LL_VERSION_MINOR = 18; | 36 | const S32 LL_VERSION_MINOR = 18; |
37 | const S32 LL_VERSION_PATCH = 3; | 37 | const S32 LL_VERSION_PATCH = 6; |
38 | const S32 LL_VERSION_BUILD = 73552; | 38 | const S32 LL_VERSION_BUILD = 74522; |
39 | 39 | ||
40 | const char * const LL_CHANNEL = "Second Life Server"; | 40 | const char * const LL_CHANNEL = "Second Life Server"; |
41 | 41 | ||
diff --git a/linden/indra/llcommon/llversionviewer.h b/linden/indra/llcommon/llversionviewer.h index 1df8a89..f9f3bf2 100644 --- a/linden/indra/llcommon/llversionviewer.h +++ b/linden/indra/llcommon/llversionviewer.h | |||
@@ -34,8 +34,8 @@ | |||
34 | 34 | ||
35 | const S32 LL_VERSION_MAJOR = 1; | 35 | const S32 LL_VERSION_MAJOR = 1; |
36 | const S32 LL_VERSION_MINOR = 18; | 36 | const S32 LL_VERSION_MINOR = 18; |
37 | const S32 LL_VERSION_PATCH = 5; | 37 | const S32 LL_VERSION_PATCH = 6; |
38 | const S32 LL_VERSION_BUILD = 3; | 38 | const S32 LL_VERSION_BUILD = 0; |
39 | 39 | ||
40 | const char * const LL_CHANNEL = "Second Life Release"; | 40 | const char * const LL_CHANNEL = "Second Life Release"; |
41 | 41 | ||
diff --git a/linden/indra/llcrashlogger/llcrashlogger.cpp b/linden/indra/llcrashlogger/llcrashlogger.cpp new file mode 100755 index 0000000..01e9901 --- /dev/null +++ b/linden/indra/llcrashlogger/llcrashlogger.cpp | |||
@@ -0,0 +1,309 @@ | |||
1 | /** | ||
2 | * @file llcrashlogger.cpp | ||
3 | * @brief Crash logger implementation | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2003&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2003-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | #include <cstdio> | ||
32 | #include <cstdlib> | ||
33 | #include <sstream> | ||
34 | #include <map> | ||
35 | |||
36 | #include "llcrashlogger.h" | ||
37 | #include "linden_common.h" | ||
38 | #include "llstring.h" | ||
39 | #include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME | ||
40 | #include "llerror.h" | ||
41 | #include "lltimer.h" | ||
42 | #include "lldir.h" | ||
43 | #include "llsdserialize.h" | ||
44 | #include "lliopipe.h" | ||
45 | #include "llpumpio.h" | ||
46 | #include "llhttpclient.h" | ||
47 | #include "llsdserialize.h" | ||
48 | |||
49 | LLPumpIO* gServicePump; | ||
50 | BOOL gBreak = false; | ||
51 | BOOL gSent = false; | ||
52 | |||
53 | class LLCrashLoggerResponder : public LLHTTPClient::Responder | ||
54 | { | ||
55 | public: | ||
56 | LLCrashLoggerResponder() | ||
57 | { | ||
58 | } | ||
59 | |||
60 | virtual void error(U32 status, const std::string& reason) | ||
61 | { | ||
62 | gBreak = true; | ||
63 | } | ||
64 | |||
65 | virtual void result(const LLSD& content) | ||
66 | { | ||
67 | gBreak = true; | ||
68 | gSent = true; | ||
69 | } | ||
70 | }; | ||
71 | |||
72 | bool LLCrashLoggerText::mainLoop() | ||
73 | { | ||
74 | std::cout << "Entering main loop" << std::endl; | ||
75 | sendCrashLogs(); | ||
76 | return true; | ||
77 | } | ||
78 | |||
79 | void LLCrashLoggerText::updateApplication(LLString message) | ||
80 | { | ||
81 | LLCrashLogger::updateApplication(message); | ||
82 | std::cout << message << std::endl; | ||
83 | } | ||
84 | |||
85 | LLCrashLogger::LLCrashLogger() : | ||
86 | mSentCrashLogs(false) | ||
87 | { | ||
88 | |||
89 | } | ||
90 | |||
91 | LLCrashLogger::~LLCrashLogger() | ||
92 | { | ||
93 | |||
94 | } | ||
95 | |||
96 | void LLCrashLogger::gatherFiles() | ||
97 | { | ||
98 | |||
99 | /* | ||
100 | //TODO:This function needs to be reimplemented somewhere in here... | ||
101 | if(!previous_crash && is_crash_log) | ||
102 | { | ||
103 | // Make sure the file isn't too old. | ||
104 | double age = difftime(gLaunchTime, stat_data.st_mtimespec.tv_sec); | ||
105 | |||
106 | // llinfos << "age is " << age << llendl; | ||
107 | |||
108 | if(age > 60.0) | ||
109 | { | ||
110 | // The file was last modified more than 60 seconds before the crash reporter was launched. Assume it's stale. | ||
111 | llwarns << "File " << mFilename << " is too old!" << llendl; | ||
112 | return; | ||
113 | } | ||
114 | } | ||
115 | */ | ||
116 | |||
117 | updateApplication("Gathering logs..."); | ||
118 | |||
119 | // Figure out the filename of the debug log | ||
120 | LLString db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log").c_str(); | ||
121 | std::ifstream debug_log_file(db_file_name.c_str()); | ||
122 | |||
123 | // Look for it in the debug_info.log file | ||
124 | if (debug_log_file.is_open()) | ||
125 | { | ||
126 | LLSDSerialize::fromXML(mDebugLog, debug_log_file); | ||
127 | mFileMap["SecondLifeLog"] = mDebugLog["SLLog"].asString(); | ||
128 | mFileMap["SettingsXml"] = mDebugLog["SettingsFilename"].asString(); | ||
129 | LLHTTPClient::setCABundle(mDebugLog["CAFilename"].asString()); | ||
130 | llinfos << "Using log file from debug log " << mFileMap["SecondLifeLog"] << llendl; | ||
131 | llinfos << "Using settings file from debug log " << mFileMap["SettingsXml"] << llendl; | ||
132 | } | ||
133 | else | ||
134 | { | ||
135 | // Figure out the filename of the second life log | ||
136 | LLHTTPClient::setCABundle(gDirUtilp->getCAFile()); | ||
137 | mFileMap["SecondLifeLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.log"); | ||
138 | mFileMap["SettingsXml"] = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.xml"); | ||
139 | } | ||
140 | |||
141 | gatherPlatformSpecificFiles(); | ||
142 | |||
143 | //Use the debug log to reconstruct the URL to send the crash report to | ||
144 | mCrashHost = "https://"; | ||
145 | mCrashHost += mDebugLog["CurrentSimHost"].asString(); | ||
146 | mCrashHost += ":12043/crash/report"; | ||
147 | mAltCrashHost = "https://"; | ||
148 | mAltCrashHost += mDebugLog["GridUtilHost"].asString(); | ||
149 | mAltCrashHost += ":12043/crash/report"; | ||
150 | |||
151 | mCrashInfo["DebugLog"] = mDebugLog; | ||
152 | mFileMap["StatsLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stats.log"); | ||
153 | mFileMap["StackTrace"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); | ||
154 | |||
155 | updateApplication("Encoding files..."); | ||
156 | |||
157 | for(std::map<LLString, LLString>::iterator itr = mFileMap.begin(); itr != mFileMap.end(); ++itr) | ||
158 | { | ||
159 | std::ifstream f((*itr).second.c_str()); | ||
160 | if(!f.is_open()) | ||
161 | { | ||
162 | std::cout << "Can't find file " << (*itr).second.c_str() << std::endl; | ||
163 | continue; | ||
164 | } | ||
165 | std::stringstream s; | ||
166 | s << f.rdbuf(); | ||
167 | mCrashInfo[(*itr).first] = s.str(); | ||
168 | } | ||
169 | } | ||
170 | |||
171 | LLSD LLCrashLogger::constructPostData() | ||
172 | { | ||
173 | LLSD ret; | ||
174 | |||
175 | if(mCrashInPreviousExec) | ||
176 | { | ||
177 | mCrashInfo["CrashInPreviousExecution"] = "Y"; | ||
178 | } | ||
179 | |||
180 | return mCrashInfo; | ||
181 | } | ||
182 | |||
183 | S32 LLCrashLogger::loadCrashBehaviorSetting() | ||
184 | { | ||
185 | std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); | ||
186 | |||
187 | mCrashSettings.loadFromFile(filename); | ||
188 | |||
189 | S32 value = mCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); | ||
190 | |||
191 | if (value < CRASH_BEHAVIOR_ASK || CRASH_BEHAVIOR_NEVER_SEND < value) return CRASH_BEHAVIOR_ASK; | ||
192 | |||
193 | return value; | ||
194 | } | ||
195 | |||
196 | bool LLCrashLogger::saveCrashBehaviorSetting(S32 crash_behavior) | ||
197 | { | ||
198 | if (crash_behavior < CRASH_BEHAVIOR_ASK) return false; | ||
199 | if (crash_behavior > CRASH_BEHAVIOR_NEVER_SEND) return false; | ||
200 | |||
201 | mCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, crash_behavior); | ||
202 | std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); | ||
203 | |||
204 | mCrashSettings.saveToFile(filename, FALSE); | ||
205 | |||
206 | return true; | ||
207 | } | ||
208 | |||
209 | bool LLCrashLogger::sendCrashLogs() | ||
210 | { | ||
211 | gatherFiles(); | ||
212 | |||
213 | LLSD post_data; | ||
214 | post_data = constructPostData(); | ||
215 | |||
216 | updateApplication("Sending reports..."); | ||
217 | |||
218 | std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, | ||
219 | "SecondLifeCrashReport"); | ||
220 | std::string report_file = dump_path + ".log"; | ||
221 | |||
222 | std::ofstream out_file(report_file.c_str()); | ||
223 | LLSDSerialize::toPrettyXML(post_data, out_file); | ||
224 | out_file.close(); | ||
225 | LLHTTPClient::post(mCrashHost, post_data, new LLCrashLoggerResponder(), 5); | ||
226 | |||
227 | gBreak = false; | ||
228 | while(!gBreak) | ||
229 | { | ||
230 | updateApplication("Sending logs..."); | ||
231 | } | ||
232 | |||
233 | if(!gSent) | ||
234 | { | ||
235 | gBreak = false; | ||
236 | LLHTTPClient::post(mAltCrashHost, post_data, new LLCrashLoggerResponder(), 5); | ||
237 | |||
238 | while(!gBreak) | ||
239 | { | ||
240 | updateApplication("Sending logs to Alternate Server..."); | ||
241 | } | ||
242 | } | ||
243 | mSentCrashLogs = gSent; | ||
244 | |||
245 | return true; | ||
246 | } | ||
247 | |||
248 | void LLCrashLogger::updateApplication(LLString message) | ||
249 | { | ||
250 | gServicePump->pump(); | ||
251 | gServicePump->callback(); | ||
252 | } | ||
253 | |||
254 | bool LLCrashLogger::init() | ||
255 | { | ||
256 | // We assume that all the logs we're looking for reside on the current drive | ||
257 | gDirUtilp->initAppDirs("SecondLife"); | ||
258 | |||
259 | // Default to the product name "Second Life" (this is overridden by the -name argument) | ||
260 | mProductName = "Second Life"; | ||
261 | |||
262 | mCrashSettings.declareS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ASK, "Controls behavior when viewer crashes " | ||
263 | "(0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)"); | ||
264 | |||
265 | llinfos << "Loading crash behavior setting" << llendl; | ||
266 | mCrashBehavior = loadCrashBehaviorSetting(); | ||
267 | |||
268 | //Run through command line options | ||
269 | if(getOption("previous").isDefined()) | ||
270 | { | ||
271 | llinfos << "Previous execution did not remove SecondLife.exec_marker" << llendl; | ||
272 | mCrashInPreviousExec = TRUE; | ||
273 | } | ||
274 | |||
275 | if(getOption("dialog").isDefined()) | ||
276 | { | ||
277 | llinfos << "Show the user dialog" << llendl; | ||
278 | mCrashBehavior = CRASH_BEHAVIOR_ASK; | ||
279 | } | ||
280 | |||
281 | LLSD server = getOption("user"); | ||
282 | if(server.isDefined()) | ||
283 | { | ||
284 | mGridName = server.asString(); | ||
285 | llinfos << "Got userserver " << mGridName << llendl; | ||
286 | } | ||
287 | else | ||
288 | { | ||
289 | mGridName = "agni"; | ||
290 | } | ||
291 | |||
292 | LLSD name = getOption("name"); | ||
293 | if(name.isDefined()) | ||
294 | { | ||
295 | mProductName = name.asString(); | ||
296 | } | ||
297 | |||
298 | // If user doesn't want to send, bail out | ||
299 | if (mCrashBehavior == CRASH_BEHAVIOR_NEVER_SEND) | ||
300 | { | ||
301 | llinfos << "Crash behavior is never_send, quitting" << llendl; | ||
302 | return false; | ||
303 | } | ||
304 | |||
305 | gServicePump = new LLPumpIO(gAPRPoolp); | ||
306 | gServicePump->prime(gAPRPoolp); | ||
307 | LLHTTPClient::setPump(*gServicePump); | ||
308 | return true; | ||
309 | } | ||
diff --git a/linden/indra/llcrashlogger/llcrashlogger.h b/linden/indra/llcrashlogger/llcrashlogger.h new file mode 100755 index 0000000..f797a2f --- /dev/null +++ b/linden/indra/llcrashlogger/llcrashlogger.h | |||
@@ -0,0 +1,85 @@ | |||
1 | /** | ||
2 | * @file llcrashlogger.h | ||
3 | * @brief Crash Logger Definition | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2003&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2003-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | #ifndef LLCRASHLOGGER_H | ||
32 | #define LLCRASHLOGGER_H | ||
33 | |||
34 | #include <vector> | ||
35 | |||
36 | #include "linden_common.h" | ||
37 | |||
38 | #include "llapp.h" | ||
39 | #include "llsd.h" | ||
40 | #include "llcontrol.h" | ||
41 | |||
42 | class LLCrashLogger : public LLApp | ||
43 | { | ||
44 | public: | ||
45 | LLCrashLogger(); | ||
46 | virtual ~LLCrashLogger(); | ||
47 | S32 loadCrashBehaviorSetting(); | ||
48 | void gatherFiles(); | ||
49 | virtual void gatherPlatformSpecificFiles() {} | ||
50 | bool saveCrashBehaviorSetting(S32 crash_behavior); | ||
51 | bool sendCrashLogs(); | ||
52 | LLSD constructPostData(); | ||
53 | virtual void updateApplication(LLString message = ""); | ||
54 | virtual bool init(); | ||
55 | virtual bool mainLoop() = 0; | ||
56 | virtual bool cleanup() { return true; } | ||
57 | void setUserText(LLString& text) { mCrashInfo["UserNotes"] = text; } | ||
58 | S32 getCrashBehavior() { return mCrashBehavior; } | ||
59 | protected: | ||
60 | S32 mCrashBehavior; | ||
61 | BOOL mCrashInPreviousExec; | ||
62 | std::map<LLString, LLString> mFileMap; | ||
63 | static const int mMaxSendSize = 200000; | ||
64 | LLString mGridName; | ||
65 | LLControlGroup mCrashSettings; | ||
66 | LLString mProductName; | ||
67 | LLSD mCrashInfo; | ||
68 | LLString mCrashHost; | ||
69 | LLString mAltCrashHost; | ||
70 | LLSD mDebugLog; | ||
71 | bool mSentCrashLogs; | ||
72 | }; | ||
73 | |||
74 | class LLCrashLoggerText : public LLCrashLogger | ||
75 | { | ||
76 | public: | ||
77 | LLCrashLoggerText(void) {} | ||
78 | ~LLCrashLoggerText(void) {} | ||
79 | |||
80 | virtual bool mainLoop(); | ||
81 | virtual void updateApplication(LLString message = ""); | ||
82 | }; | ||
83 | |||
84 | |||
85 | #endif //LLCRASHLOGGER_H | ||
diff --git a/linden/indra/llinventory/llparcel.cpp b/linden/indra/llinventory/llparcel.cpp index 7cc3e57..a20b307 100644 --- a/linden/indra/llinventory/llparcel.cpp +++ b/linden/indra/llinventory/llparcel.cpp | |||
@@ -1,33 +1,33 @@ | |||
1 | /** | 1 | /** |
2 | * @file llparcel.cpp | 2 | * @file llparcel.cpp |
3 | * @brief A land parcel. | 3 | * @brief A land parcel. |
4 | * | 4 | * |
5 | * $LicenseInfo:firstyear=2002&license=viewergpl$ | 5 | * $LicenseInfo:firstyear=2002&license=viewergpl$ |
6 | * | 6 | * |
7 | * Copyright (c) 2002-2007, Linden Research, Inc. | 7 | * Copyright (c) 2002-2007, Linden Research, Inc. |
8 | * | 8 | * |
9 | * Second Life Viewer Source Code | 9 | * Second Life Viewer Source Code |
10 | * The source code in this file ("Source Code") is provided by Linden Lab | 10 | * The source code in this file ("Source Code") is provided by Linden Lab |
11 | * to you under the terms of the GNU General Public License, version 2.0 | 11 | * to you under the terms of the GNU General Public License, version 2.0 |
12 | * ("GPL"), unless you have obtained a separate licensing agreement | 12 | * ("GPL"), unless you have obtained a separate licensing agreement |
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | 13 | * ("Other License"), formally executed by you and Linden Lab. Terms of |
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | 14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or |
15 | * online at http://secondlife.com/developers/opensource/gplv2 | 15 | * online at http://secondlife.com/developers/opensource/gplv2 |
16 | * | 16 | * |
17 | * There are special exceptions to the terms and conditions of the GPL as | 17 | * There are special exceptions to the terms and conditions of the GPL as |
18 | * it is applied to this Source Code. View the full text of the exception | 18 | * it is applied to this Source Code. View the full text of the exception |
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | 19 | * in the file doc/FLOSS-exception.txt in this software distribution, or |
20 | * online at http://secondlife.com/developers/opensource/flossexception | 20 | * online at http://secondlife.com/developers/opensource/flossexception |
21 | * | 21 | * |
22 | * By copying, modifying or distributing this software, you acknowledge | 22 | * By copying, modifying or distributing this software, you acknowledge |
23 | * that you have read and understood your obligations described above, | 23 | * that you have read and understood your obligations described above, |
24 | * and agree to abide by those obligations. | 24 | * and agree to abide by those obligations. |
25 | * | 25 | * |
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | 26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO |
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | 27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, |
28 | * COMPLETENESS OR PERFORMANCE. | 28 | * COMPLETENESS OR PERFORMANCE. |
29 | * $/LicenseInfo$ | 29 | * $/LicenseInfo$ |
30 | */ | 30 | */ |
31 | 31 | ||
32 | #include "linden_common.h" | 32 | #include "linden_common.h" |
33 | 33 | ||
@@ -49,9 +49,9 @@ static const F32 SOME_BIG_NUMBER = 1000.0f; | |||
49 | static const F32 SOME_BIG_NEG_NUMBER = -1000.0f; | 49 | static const F32 SOME_BIG_NEG_NUMBER = -1000.0f; |
50 | static const char* PARCEL_OWNERSHIP_STATUS_STRING[LLParcel::OS_COUNT] = | 50 | static const char* PARCEL_OWNERSHIP_STATUS_STRING[LLParcel::OS_COUNT] = |
51 | { | 51 | { |
52 | "leased", | 52 | "leased", |
53 | "lease_pending", | 53 | "lease_pending", |
54 | "abandoned" | 54 | "abandoned" |
55 | }; | 55 | }; |
56 | 56 | ||
57 | // NOTE: Adding parcel categories also requires updating: | 57 | // NOTE: Adding parcel categories also requires updating: |
@@ -59,52 +59,52 @@ static const char* PARCEL_OWNERSHIP_STATUS_STRING[LLParcel::OS_COUNT] = | |||
59 | // * Web site "create event" tools | 59 | // * Web site "create event" tools |
60 | static const char* PARCEL_CATEGORY_STRING[LLParcel::C_COUNT] = | 60 | static const char* PARCEL_CATEGORY_STRING[LLParcel::C_COUNT] = |
61 | { | 61 | { |
62 | "none", | 62 | "none", |
63 | "linden", | 63 | "linden", |
64 | "adult", | 64 | "adult", |
65 | "arts", | 65 | "arts", |
66 | "store", // "business" legacy name | 66 | "store", // "business" legacy name |
67 | "educational", | 67 | "educational", |
68 | "game", // "gaming" legacy name | 68 | "game", // "gaming" legacy name |
69 | "gather", // "hangout" legacy name | 69 | "gather", // "hangout" legacy name |
70 | "newcomer", | 70 | "newcomer", |
71 | "park", | 71 | "park", |
72 | "home", // "residential" legacy name | 72 | "home", // "residential" legacy name |
73 | "shopping", | 73 | "shopping", |
74 | "stage", | 74 | "stage", |
75 | "other", | 75 | "other", |
76 | }; | 76 | }; |
77 | static const char* PARCEL_CATEGORY_UI_STRING[LLParcel::C_COUNT + 1] = | 77 | static const char* PARCEL_CATEGORY_UI_STRING[LLParcel::C_COUNT + 1] = |
78 | { | 78 | { |
79 | "None", | 79 | "None", |
80 | "Linden Location", | 80 | "Linden Location", |
81 | "Adult", | 81 | "Adult", |
82 | "Arts & Culture", | 82 | "Arts & Culture", |
83 | "Business", | 83 | "Business", |
84 | "Educational", | 84 | "Educational", |
85 | "Gaming", | 85 | "Gaming", |
86 | "Hangout", | 86 | "Hangout", |
87 | "Newcomer Friendly", | 87 | "Newcomer Friendly", |
88 | "Parks & Nature", | 88 | "Parks & Nature", |
89 | "Residential", | 89 | "Residential", |
90 | "Shopping", | 90 | "Shopping", |
91 | "Stage", | 91 | "Stage", |
92 | "Other", | 92 | "Other", |
93 | "Any", // valid string for parcel searches | 93 | "Any", // valid string for parcel searches |
94 | }; | 94 | }; |
95 | 95 | ||
96 | static const char* PARCEL_ACTION_STRING[LLParcel::A_COUNT + 1] = | 96 | static const char* PARCEL_ACTION_STRING[LLParcel::A_COUNT + 1] = |
97 | { | 97 | { |
98 | "create", | 98 | "create", |
99 | "release", | 99 | "release", |
100 | "absorb", | 100 | "absorb", |
101 | "absorbed", | 101 | "absorbed", |
102 | "divide", | 102 | "divide", |
103 | "division", | 103 | "division", |
104 | "acquire", | 104 | "acquire", |
105 | "relinquish", | 105 | "relinquish", |
106 | "confirm", | 106 | "confirm", |
107 | "unknown" | 107 | "unknown" |
108 | }; | 108 | }; |
109 | 109 | ||
110 | // Timeouts for parcels | 110 | // Timeouts for parcels |
@@ -142,369 +142,365 @@ LLParcel::ECategory category_ui_string_to_category(const char* s); | |||
142 | 142 | ||
143 | LLParcel::LLParcel() | 143 | LLParcel::LLParcel() |
144 | { | 144 | { |
145 | init(LLUUID::null, TRUE, FALSE, FALSE, 0, 0, 0, 0, 0, 1.f, 0); | 145 | init(LLUUID::null, TRUE, FALSE, FALSE, 0, 0, 0, 0, 0, 1.f, 0); |
146 | } | 146 | } |
147 | 147 | ||
148 | 148 | ||
149 | LLParcel::LLParcel(const LLUUID &owner_id, | 149 | LLParcel::LLParcel(const LLUUID &owner_id, |
150 | BOOL modify, BOOL terraform, BOOL damage, | 150 | BOOL modify, BOOL terraform, BOOL damage, |
151 | time_t claim_date, S32 claim_price_per_meter, | 151 | time_t claim_date, S32 claim_price_per_meter, |
152 | S32 rent_price_per_meter, S32 area, S32 sim_object_limit, F32 parcel_object_bonus, | 152 | S32 rent_price_per_meter, S32 area, S32 sim_object_limit, F32 parcel_object_bonus, |
153 | BOOL is_group_owned) | 153 | BOOL is_group_owned) |
154 | { | 154 | { |
155 | init( owner_id, modify, terraform, damage, claim_date, | 155 | init( owner_id, modify, terraform, damage, claim_date, |
156 | claim_price_per_meter, rent_price_per_meter, area, sim_object_limit, parcel_object_bonus, | 156 | claim_price_per_meter, rent_price_per_meter, area, sim_object_limit, parcel_object_bonus, |
157 | is_group_owned); | 157 | is_group_owned); |
158 | } | 158 | } |
159 | 159 | ||
160 | 160 | ||
161 | // virtual | 161 | // virtual |
162 | LLParcel::~LLParcel() | 162 | LLParcel::~LLParcel() |
163 | { | 163 | { |
164 | // user list cleaned up by LLDynamicArray destructor. | 164 | // user list cleaned up by LLDynamicArray destructor. |
165 | } | 165 | } |
166 | 166 | ||
167 | void LLParcel::init(const LLUUID &owner_id, | 167 | void LLParcel::init(const LLUUID &owner_id, |
168 | BOOL modify, BOOL terraform, BOOL damage, | 168 | BOOL modify, BOOL terraform, BOOL damage, |
169 | time_t claim_date, S32 claim_price_per_meter, | 169 | time_t claim_date, S32 claim_price_per_meter, |
170 | S32 rent_price_per_meter, S32 area, S32 sim_object_limit, F32 parcel_object_bonus, | 170 | S32 rent_price_per_meter, S32 area, S32 sim_object_limit, F32 parcel_object_bonus, |
171 | BOOL is_group_owned) | 171 | BOOL is_group_owned) |
172 | { | 172 | { |
173 | mID.setNull(); | 173 | mID.setNull(); |
174 | mOwnerID = owner_id; | 174 | mOwnerID = owner_id; |
175 | mGroupOwned = is_group_owned; | 175 | mGroupOwned = is_group_owned; |
176 | mClaimDate = claim_date; | 176 | mClaimDate = claim_date; |
177 | mClaimPricePerMeter = claim_price_per_meter; | 177 | mClaimPricePerMeter = claim_price_per_meter; |
178 | mRentPricePerMeter = rent_price_per_meter; | 178 | mRentPricePerMeter = rent_price_per_meter; |
179 | mArea = area; | 179 | mArea = area; |
180 | mDiscountRate = 1.0f; | 180 | mDiscountRate = 1.0f; |
181 | mDrawDistance = 512.f; | 181 | mDrawDistance = 512.f; |
182 | 182 | ||
183 | mUserLookAt.setVec(0.0f, 0.f, 0.f); | 183 | mUserLookAt.setVec(0.0f, 0.f, 0.f); |
184 | // Default to using the parcel's landing point, if any. | 184 | // Default to using the parcel's landing point, if any. |
185 | mLandingType = L_LANDING_POINT; | 185 | mLandingType = L_LANDING_POINT; |
186 | 186 | ||
187 | // *FIX: if owner_id != null, should be owned or sale pending, | 187 | // *FIX: if owner_id != null, should be owned or sale pending, |
188 | // investigate init callers. | 188 | // investigate init callers. |
189 | mStatus = OS_NONE; | 189 | mStatus = OS_NONE; |
190 | mCategory = C_NONE; | 190 | mCategory = C_NONE; |
191 | mAuthBuyerID.setNull(); | 191 | mAuthBuyerID.setNull(); |
192 | //mBuyerID.setNull(); | 192 | //mBuyerID.setNull(); |
193 | //mJoinNeighbors = 0x0; | 193 | //mJoinNeighbors = 0x0; |
194 | mSaleTimerExpires.setTimerExpirySec(0); | 194 | mSaleTimerExpires.setTimerExpirySec(0); |
195 | mSaleTimerExpires.stop(); | 195 | mSaleTimerExpires.stop(); |
196 | mGraceExtension = 0; | 196 | mGraceExtension = 0; |
197 | //mExpireAction = STEA_REVERT; | 197 | //mExpireAction = STEA_REVERT; |
198 | mRecordTransaction = FALSE; | 198 | mRecordTransaction = FALSE; |
199 | 199 | ||
200 | mAuctionID = 0; | 200 | mAuctionID = 0; |
201 | mInEscrow = false; | 201 | mInEscrow = false; |
202 | 202 | ||
203 | mParcelFlags = PF_DEFAULT; | 203 | mParcelFlags = PF_DEFAULT; |
204 | setParcelFlag(PF_CREATE_OBJECTS, modify); | 204 | setParcelFlag(PF_CREATE_OBJECTS, modify); |
205 | setParcelFlag(PF_ALLOW_TERRAFORM, terraform); | 205 | setParcelFlag(PF_ALLOW_TERRAFORM, terraform); |
206 | setParcelFlag(PF_ALLOW_DAMAGE, damage); | 206 | setParcelFlag(PF_ALLOW_DAMAGE, damage); |
207 | 207 | ||
208 | mSalePrice = 10000; | 208 | mSalePrice = 10000; |
209 | setName(NULL); | 209 | setName(NULL); |
210 | setDesc(NULL); | 210 | setDesc(NULL); |
211 | setMusicURL(NULL); | 211 | setMusicURL(NULL); |
212 | setMediaURL(NULL); | 212 | setMediaURL(NULL); |
213 | mMediaID.setNull(); | 213 | mMediaID.setNull(); |
214 | mMediaAutoScale = 0; | 214 | mMediaAutoScale = 0; |
215 | 215 | ||
216 | mGroupID.setNull(); | 216 | mGroupID.setNull(); |
217 | 217 | ||
218 | mPassPrice = PARCEL_PASS_PRICE_DEFAULT; | 218 | mPassPrice = PARCEL_PASS_PRICE_DEFAULT; |
219 | mPassHours = PARCEL_PASS_HOURS_DEFAULT; | 219 | mPassHours = PARCEL_PASS_HOURS_DEFAULT; |
220 | 220 | ||
221 | mAABBMin.setVec(SOME_BIG_NUMBER, SOME_BIG_NUMBER, SOME_BIG_NUMBER); | 221 | mAABBMin.setVec(SOME_BIG_NUMBER, SOME_BIG_NUMBER, SOME_BIG_NUMBER); |
222 | mAABBMax.setVec(SOME_BIG_NEG_NUMBER, SOME_BIG_NEG_NUMBER, SOME_BIG_NEG_NUMBER); | 222 | mAABBMax.setVec(SOME_BIG_NEG_NUMBER, SOME_BIG_NEG_NUMBER, SOME_BIG_NEG_NUMBER); |
223 | 223 | ||
224 | mLocalID = 0; | 224 | mLocalID = 0; |
225 | 225 | ||
226 | //mSimWidePrimCorrection = 0; | 226 | //mSimWidePrimCorrection = 0; |
227 | setMaxPrimCapacity((S32)(sim_object_limit * area / (F32)(REGION_WIDTH_METERS * REGION_WIDTH_METERS))); | 227 | setMaxPrimCapacity((S32)(sim_object_limit * area / (F32)(REGION_WIDTH_METERS * REGION_WIDTH_METERS))); |
228 | setSimWideMaxPrimCapacity(0); | 228 | setSimWideMaxPrimCapacity(0); |
229 | setSimWidePrimCount(0); | 229 | setSimWidePrimCount(0); |
230 | setOwnerPrimCount(0); | 230 | setOwnerPrimCount(0); |
231 | setGroupPrimCount(0); | 231 | setGroupPrimCount(0); |
232 | setOtherPrimCount(0); | 232 | setOtherPrimCount(0); |
233 | setSelectedPrimCount(0); | 233 | setSelectedPrimCount(0); |
234 | setTempPrimCount(0); | 234 | setTempPrimCount(0); |
235 | setCleanOtherTime(0); | 235 | setCleanOtherTime(0); |
236 | setParcelPrimBonus(parcel_object_bonus); | 236 | setParcelPrimBonus(parcel_object_bonus); |
237 | 237 | ||
238 | setPreviousOwnerID(LLUUID::null); | 238 | setPreviousOwnerID(LLUUID::null); |
239 | setPreviouslyGroupOwned(FALSE); | 239 | setPreviouslyGroupOwned(FALSE); |
240 | } | 240 | } |
241 | 241 | ||
242 | void LLParcel::overrideOwner(const LLUUID& owner_id, BOOL is_group_owned) | 242 | void LLParcel::overrideOwner(const LLUUID& owner_id, BOOL is_group_owned) |
243 | { | 243 | { |
244 | // Override with system permission (LLUUID::null) | 244 | // Override with system permission (LLUUID::null) |
245 | // Overridden parcels have no group | 245 | // Overridden parcels have no group |
246 | mOwnerID = owner_id; | 246 | mOwnerID = owner_id; |
247 | mGroupOwned = is_group_owned; | 247 | mGroupOwned = is_group_owned; |
248 | if(mGroupOwned) | 248 | if(mGroupOwned) |
249 | { | 249 | { |
250 | mGroupID = mOwnerID; | 250 | mGroupID = mOwnerID; |
251 | } | 251 | } |
252 | else | 252 | else |
253 | { | 253 | { |
254 | mGroupID.setNull(); | 254 | mGroupID.setNull(); |
255 | } | 255 | } |
256 | mInEscrow = false; | 256 | mInEscrow = false; |
257 | } | 257 | } |
258 | 258 | ||
259 | void LLParcel::overrideParcelFlags(U32 flags) | 259 | void LLParcel::overrideParcelFlags(U32 flags) |
260 | { | 260 | { |
261 | mParcelFlags = flags; | 261 | mParcelFlags = flags; |
262 | } | 262 | } |
263 | 263 | ||
264 | void LLParcel::setName(const LLString& name) | 264 | void LLParcel::setName(const LLString& name) |
265 | { | 265 | { |
266 | // The escaping here must match the escaping in the database | 266 | // The escaping here must match the escaping in the database |
267 | // abstraction layer. | 267 | // abstraction layer. |
268 | mName = name; | 268 | mName = name; |
269 | LLStringFn::replace_nonprintable(mName, LL_UNKNOWN_CHAR); | 269 | LLStringFn::replace_nonprintable(mName, LL_UNKNOWN_CHAR); |
270 | } | 270 | } |
271 | 271 | ||
272 | void LLParcel::setDesc(const LLString& desc) | 272 | void LLParcel::setDesc(const LLString& desc) |
273 | { | 273 | { |
274 | // The escaping here must match the escaping in the database | 274 | // The escaping here must match the escaping in the database |
275 | // abstraction layer. | 275 | // abstraction layer. |
276 | mDesc = desc; | 276 | mDesc = desc; |
277 | mDesc = rawstr_to_utf8(mDesc); | 277 | mDesc = rawstr_to_utf8(mDesc); |
278 | } | 278 | } |
279 | 279 | ||
280 | void LLParcel::setMusicURL(const LLString& url) | 280 | void LLParcel::setMusicURL(const LLString& url) |
281 | { | 281 | { |
282 | mMusicURL = url; | 282 | mMusicURL = url; |
283 | // The escaping here must match the escaping in the database | 283 | // The escaping here must match the escaping in the database |
284 | // abstraction layer. | 284 | // abstraction layer. |
285 | // This should really filter the url in some way. Other than | 285 | // This should really filter the url in some way. Other than |
286 | // simply requiring non-printable. | 286 | // simply requiring non-printable. |
287 | LLStringFn::replace_nonprintable(mMusicURL, LL_UNKNOWN_CHAR); | 287 | LLStringFn::replace_nonprintable(mMusicURL, LL_UNKNOWN_CHAR); |
288 | } | 288 | } |
289 | 289 | ||
290 | void LLParcel::setMediaURL(const LLString& url) | 290 | void LLParcel::setMediaURL(const LLString& url) |
291 | { | 291 | { |
292 | mMediaURL = url; | 292 | mMediaURL = url; |
293 | // The escaping here must match the escaping in the database | 293 | // The escaping here must match the escaping in the database |
294 | // abstraction layer if it's ever added. | 294 | // abstraction layer if it's ever added. |
295 | // This should really filter the url in some way. Other than | 295 | // This should really filter the url in some way. Other than |
296 | // simply requiring non-printable. | 296 | // simply requiring non-printable. |
297 | LLStringFn::replace_nonprintable(mMediaURL, LL_UNKNOWN_CHAR); | 297 | LLStringFn::replace_nonprintable(mMediaURL, LL_UNKNOWN_CHAR); |
298 | } | 298 | } |
299 | 299 | ||
300 | // virtual | 300 | // virtual |
301 | void LLParcel::setLocalID(S32 local_id) | 301 | void LLParcel::setLocalID(S32 local_id) |
302 | { | 302 | { |
303 | mLocalID = local_id; | 303 | mLocalID = local_id; |
304 | } | 304 | } |
305 | 305 | ||
306 | void LLParcel::setAllParcelFlags(U32 flags) | 306 | void LLParcel::setAllParcelFlags(U32 flags) |
307 | { | 307 | { |
308 | mParcelFlags = flags; | 308 | mParcelFlags = flags; |
309 | } | 309 | } |
310 | 310 | ||
311 | void LLParcel::setParcelFlag(U32 flag, BOOL b) | 311 | void LLParcel::setParcelFlag(U32 flag, BOOL b) |
312 | { | 312 | { |
313 | if (b) | 313 | if (b) |
314 | { | 314 | { |
315 | mParcelFlags |= flag; | 315 | mParcelFlags |= flag; |
316 | } | 316 | } |
317 | else | 317 | else |
318 | { | 318 | { |
319 | mParcelFlags &= ~flag; | 319 | mParcelFlags &= ~flag; |
320 | } | 320 | } |
321 | } | 321 | } |
322 | 322 | ||
323 | 323 | ||
324 | BOOL LLParcel::allowModifyBy(const LLUUID &agent_id, const LLUUID &group_id) const | 324 | BOOL LLParcel::allowModifyBy(const LLUUID &agent_id, const LLUUID &group_id) const |
325 | { | 325 | { |
326 | if (agent_id == LLUUID::null) | 326 | if (agent_id == LLUUID::null) |
327 | { | 327 | { |
328 | // system always can enter | 328 | // system always can enter |
329 | return TRUE; | 329 | return TRUE; |
330 | } | 330 | } |
331 | else if (isPublic()) | 331 | else if (isPublic()) |
332 | { | 332 | { |
333 | return TRUE; | 333 | return TRUE; |
334 | } | 334 | } |
335 | else if (agent_id == mOwnerID) | 335 | else if (agent_id == mOwnerID) |
336 | { | 336 | { |
337 | // owner can always perform operations | 337 | // owner can always perform operations |
338 | return TRUE; | 338 | return TRUE; |
339 | } | 339 | } |
340 | else if (mParcelFlags & PF_CREATE_OBJECTS) | 340 | else if (mParcelFlags & PF_CREATE_OBJECTS) |
341 | { | 341 | { |
342 | return TRUE; | 342 | return TRUE; |
343 | } | 343 | } |
344 | else if ((mParcelFlags & PF_CREATE_GROUP_OBJECTS) | 344 | else if ((mParcelFlags & PF_CREATE_GROUP_OBJECTS) |
345 | && group_id.notNull() ) | 345 | && group_id.notNull() ) |
346 | { | 346 | { |
347 | return (getGroupID() == group_id); | 347 | return (getGroupID() == group_id); |
348 | } | 348 | } |
349 | 349 | ||
350 | return FALSE; | 350 | return FALSE; |
351 | } | 351 | } |
352 | 352 | ||
353 | BOOL LLParcel::allowTerraformBy(const LLUUID &agent_id) const | 353 | BOOL LLParcel::allowTerraformBy(const LLUUID &agent_id) const |
354 | { | 354 | { |
355 | if (agent_id == LLUUID::null) | 355 | if (agent_id == LLUUID::null) |
356 | { | 356 | { |
357 | // system always can enter | 357 | // system always can enter |
358 | return TRUE; | 358 | return TRUE; |
359 | } | 359 | } |
360 | else if(OS_LEASED == mStatus) | 360 | else if(OS_LEASED == mStatus) |
361 | { | 361 | { |
362 | if(agent_id == mOwnerID) | 362 | if(agent_id == mOwnerID) |
363 | { | 363 | { |
364 | // owner can modify leased land | 364 | // owner can modify leased land |
365 | return TRUE; | 365 | return TRUE; |
366 | } | 366 | } |
367 | else | 367 | else |
368 | { | 368 | { |
369 | // otherwise check other people | 369 | // otherwise check other people |
370 | return mParcelFlags & PF_ALLOW_TERRAFORM; | 370 | return mParcelFlags & PF_ALLOW_TERRAFORM; |
371 | } | 371 | } |
372 | } | 372 | } |
373 | else | 373 | else |
374 | { | 374 | { |
375 | return FALSE; | 375 | return FALSE; |
376 | } | 376 | } |
377 | } | 377 | } |
378 | 378 | ||
379 | 379 | ||
380 | bool LLParcel::isAgentBlockedFromParcel(LLParcel* parcelp, | 380 | bool LLParcel::isAgentBlockedFromParcel(LLParcel* parcelp, |
381 | const LLUUID& agent_id, | 381 | const LLUUID& agent_id, |
382 | const std::vector<LLUUID>& group_ids, | 382 | const std::vector<LLUUID>& group_ids, |
383 | const BOOL is_agent_identified, | 383 | const BOOL is_agent_identified, |
384 | const BOOL is_agent_transacted) | 384 | const BOOL is_agent_transacted, |
385 | const BOOL is_agent_ageverified) | ||
385 | { | 386 | { |
386 | S32 current_group_access = parcelp->blockAccess(agent_id, LLUUID::null, is_agent_identified, is_agent_transacted); | 387 | S32 current_group_access = parcelp->blockAccess(agent_id, LLUUID::null, is_agent_identified, is_agent_transacted, is_agent_ageverified); |
387 | S32 count; | 388 | S32 count; |
388 | bool is_allowed = (current_group_access == BA_ALLOWED) ? true: false; | 389 | bool is_allowed = (current_group_access == BA_ALLOWED) ? true: false; |
389 | LLUUID group_id; | 390 | LLUUID group_id; |
390 | 391 | ||
391 | count = group_ids.size(); | 392 | count = group_ids.size(); |
392 | for (int i = 0; i < count && !is_allowed; i++) | 393 | for (int i = 0; i < count && !is_allowed; i++) |
393 | { | 394 | { |
394 | group_id = group_ids[i]; | 395 | group_id = group_ids[i]; |
395 | current_group_access = parcelp->blockAccess(agent_id, group_id, is_agent_identified, is_agent_transacted); | 396 | current_group_access = parcelp->blockAccess(agent_id, group_id, is_agent_identified, is_agent_transacted, is_agent_ageverified); |
396 | 397 | ||
397 | if (current_group_access == BA_ALLOWED) is_allowed = true; | 398 | if (current_group_access == BA_ALLOWED) is_allowed = true; |
398 | } | 399 | } |
399 | 400 | ||
400 | return !is_allowed; | 401 | return !is_allowed; |
401 | } | 402 | } |
402 | 403 | ||
403 | BOOL LLParcel::isAgentBanned(const LLUUID& agent_id) const | 404 | BOOL LLParcel::isAgentBanned(const LLUUID& agent_id) const |
404 | { | 405 | { |
405 | // Test ban list | 406 | // Test ban list |
406 | if (getParcelFlag(PF_USE_BAN_LIST) | 407 | if (mBanList.find(agent_id) != mBanList.end()) |
407 | && (mBanList.find(agent_id) != mBanList.end())) | ||
408 | { | 408 | { |
409 | return TRUE; | 409 | return TRUE; |
410 | } | 410 | } |
411 | 411 | ||
412 | return FALSE; | 412 | return FALSE; |
413 | } | 413 | } |
414 | |||
414 | S32 LLParcel::blockAccess(const LLUUID& agent_id, const LLUUID& group_id, | 415 | S32 LLParcel::blockAccess(const LLUUID& agent_id, const LLUUID& group_id, |
415 | const BOOL is_agent_identified, | 416 | const BOOL is_agent_identified, |
416 | const BOOL is_agent_transacted) const | 417 | const BOOL is_agent_transacted, |
418 | const BOOL is_agent_ageverified) const | ||
417 | { | 419 | { |
418 | // Test ban list | 420 | // Test ban list |
419 | if (isAgentBanned(agent_id)) | 421 | if (isAgentBanned(agent_id)) |
420 | { | 422 | { |
421 | return BA_BANNED; | 423 | return BA_BANNED; |
422 | } | 424 | } |
423 | 425 | ||
424 | // Always allow owner on (unless he banned himself, useful for | 426 | // Always allow owner on (unless he banned himself, useful for |
425 | // testing). We will also allow estate owners/managers in if they | 427 | // testing). We will also allow estate owners/managers in if they |
426 | // are not explicitly banned. | 428 | // are not explicitly banned. |
427 | if (agent_id == mOwnerID) | 429 | if (agent_id == mOwnerID) |
428 | { | 430 | { |
429 | return BA_ALLOWED; | 431 | return BA_ALLOWED; |
430 | } | 432 | } |
431 | 433 | ||
432 | // Special case when using pass list where group access is being restricted but not | 434 | // Special case when using pass list where group access is being restricted but not |
433 | // using access list. In this case group members are allowed only if they buy a pass. | 435 | // using access list. In this case group members are allowed only if they buy a pass. |
434 | // We return BA_NOT_IN_LIST if not in list | 436 | // We return BA_NOT_IN_LIST if not in list |
435 | BOOL passWithGroup = getParcelFlag(PF_USE_PASS_LIST) && !getParcelFlag(PF_USE_ACCESS_LIST) | 437 | BOOL passWithGroup = getParcelFlag(PF_USE_PASS_LIST) && !getParcelFlag(PF_USE_ACCESS_LIST) |
436 | && getParcelFlag(PF_USE_ACCESS_GROUP) && !mGroupID.isNull() && group_id == mGroupID; | 438 | && getParcelFlag(PF_USE_ACCESS_GROUP) && !mGroupID.isNull() && group_id == mGroupID; |
437 | 439 | ||
438 | 440 | ||
439 | // Test group list | 441 | // Test group list |
440 | if (getParcelFlag(PF_USE_ACCESS_GROUP) | 442 | if (getParcelFlag(PF_USE_ACCESS_GROUP) |
441 | && !mGroupID.isNull() | 443 | && !mGroupID.isNull() |
442 | && group_id == mGroupID | 444 | && group_id == mGroupID |
443 | && !passWithGroup) | 445 | && !passWithGroup) |
444 | { | 446 | { |
445 | return BA_ALLOWED; | 447 | return BA_ALLOWED; |
446 | } | 448 | } |
447 | 449 | ||
448 | // Test access list | 450 | // Test access list |
449 | if (getParcelFlag(PF_USE_ACCESS_LIST) || passWithGroup ) | 451 | if (getParcelFlag(PF_USE_ACCESS_LIST) || passWithGroup ) |
450 | { | 452 | { |
451 | if (mAccessList.find(agent_id) != mAccessList.end()) | 453 | if (mAccessList.find(agent_id) != mAccessList.end()) |
452 | { | 454 | { |
453 | return BA_ALLOWED; | 455 | return BA_ALLOWED; |
454 | } | 456 | } |
455 | 457 | ||
456 | return BA_NOT_ON_LIST; | 458 | return BA_NOT_ON_LIST; |
457 | } | 459 | } |
458 | 460 | ||
459 | // If we're not doing any other limitations, all users | 461 | // If we're not doing any other limitations, all users |
460 | // can enter, unless | 462 | // can enter, unless |
461 | if ( !getParcelFlag(PF_USE_ACCESS_GROUP) | 463 | if ( !getParcelFlag(PF_USE_ACCESS_GROUP) |
462 | && !getParcelFlag(PF_USE_ACCESS_LIST)) | 464 | && !getParcelFlag(PF_USE_ACCESS_LIST)) |
463 | { | 465 | { |
464 | //If the land is group owned, and you are in the group, bypass these checks | 466 | //If the land is group owned, and you are in the group, bypass these checks |
465 | if(getIsGroupOwned() && group_id == mGroupID) | 467 | if(getIsGroupOwned() && group_id == mGroupID) |
466 | { | 468 | { |
467 | return BA_ALLOWED; | 469 | return BA_ALLOWED; |
468 | } | 470 | } |
469 | 471 | ||
470 | // Test for "payment" access levels | 472 | // Test for "payment" access levels |
471 | // Anonymous - No Payment Info on File | 473 | // Anonymous - No Payment Info on File |
472 | if(getParcelFlag(PF_DENY_ANONYMOUS) && !is_agent_identified && !is_agent_transacted) | 474 | if(getParcelFlag(PF_DENY_ANONYMOUS) && !is_agent_identified && !is_agent_transacted) |
473 | { | 475 | { |
474 | return BA_NO_ACCESS_LEVEL; | 476 | return BA_NO_ACCESS_LEVEL; |
475 | } | 477 | } |
476 | // Identified - Payment Info on File | 478 | // AgeUnverified - Not Age Verified |
477 | // Must check to make sure we're only banning Identified, since Transacted accounts | 479 | if(getParcelFlag(PF_DENY_AGEUNVERIFIED) && !is_agent_ageverified) |
478 | // also have their identified flag set | 480 | { |
479 | if(getParcelFlag(PF_DENY_IDENTIFIED) && is_agent_identified && !is_agent_transacted) | 481 | return BA_NOT_AGE_VERIFIED; |
480 | { | 482 | } |
481 | return BA_NO_ACCESS_LEVEL; | 483 | |
482 | } | 484 | return BA_ALLOWED; |
483 | // Transacted - Payment Info Used | 485 | } |
484 | if(getParcelFlag(PF_DENY_TRANSACTED) && is_agent_transacted) | 486 | |
485 | { | 487 | return BA_NOT_IN_GROUP; |
486 | return BA_NO_ACCESS_LEVEL; | 488 | |
487 | } | ||
488 | return BA_ALLOWED; | ||
489 | } | ||
490 | |||
491 | return BA_NOT_IN_GROUP; | ||
492 | |||
493 | } | 489 | } |
494 | 490 | ||
495 | 491 | ||
496 | void LLParcel::setArea(S32 area, S32 sim_object_limit) | 492 | void LLParcel::setArea(S32 area, S32 sim_object_limit) |
497 | { | 493 | { |
498 | mArea = area; | 494 | mArea = area; |
499 | setMaxPrimCapacity((S32)(sim_object_limit * area / (F32)(REGION_WIDTH_METERS * REGION_WIDTH_METERS))); | 495 | setMaxPrimCapacity((S32)(sim_object_limit * area / (F32)(REGION_WIDTH_METERS * REGION_WIDTH_METERS))); |
500 | } | 496 | } |
501 | 497 | ||
502 | void LLParcel::setDiscountRate(F32 rate) | 498 | void LLParcel::setDiscountRate(F32 rate) |
503 | { | 499 | { |
504 | // this is to make sure that the rate is at least sane - this is | 500 | // this is to make sure that the rate is at least sane - this is |
505 | // not intended to enforce economy rules. It only enfoces that the | 501 | // not intended to enforce economy rules. It only enfoces that the |
506 | // rate is a scaler between 0 and 1. | 502 | // rate is a scaler between 0 and 1. |
507 | mDiscountRate = llclampf(rate); | 503 | mDiscountRate = llclampf(rate); |
508 | } | 504 | } |
509 | 505 | ||
510 | 506 | ||
@@ -516,909 +512,918 @@ void LLParcel::setDiscountRate(F32 rate) | |||
516 | // WARNING: Area will be wrong until you calculate it. | 512 | // WARNING: Area will be wrong until you calculate it. |
517 | BOOL LLParcel::importStream(std::istream& input_stream) | 513 | BOOL LLParcel::importStream(std::istream& input_stream) |
518 | { | 514 | { |
519 | U32 setting; | 515 | U32 setting; |
520 | S32 secs_until_revert = 0; | 516 | S32 secs_until_revert = 0; |
521 | 517 | ||
522 | skip_to_end_of_next_keyword("{", input_stream); | 518 | skip_to_end_of_next_keyword("{", input_stream); |
523 | if (!input_stream.good()) | 519 | if (!input_stream.good()) |
524 | { | 520 | { |
525 | llwarns << "LLParcel::importStream() - bad input_stream" << llendl; | 521 | llwarns << "LLParcel::importStream() - bad input_stream" << llendl; |
526 | return FALSE; | 522 | return FALSE; |
527 | } | 523 | } |
528 | 524 | ||
529 | while (input_stream.good()) | 525 | while (input_stream.good()) |
530 | { | 526 | { |
531 | skip_comments_and_emptyspace(input_stream); | 527 | skip_comments_and_emptyspace(input_stream); |
532 | LLString line, keyword, value; | 528 | LLString line, keyword, value; |
533 | get_line(line, input_stream, MAX_STRING); | 529 | get_line(line, input_stream, MAX_STRING); |
534 | get_keyword_and_value(keyword, value, line); | 530 | get_keyword_and_value(keyword, value, line); |
535 | 531 | ||
536 | if ("}" == keyword) | 532 | if ("}" == keyword) |
537 | { | 533 | { |
538 | break; | 534 | break; |
539 | } | 535 | } |
540 | else if ("parcel_id" == keyword) | 536 | else if ("parcel_id" == keyword) |
541 | { | 537 | { |
542 | mID.set(value.c_str()); | 538 | mID.set(value.c_str()); |
543 | } | 539 | } |
544 | else if ("status" == keyword) | 540 | else if ("status" == keyword) |
545 | { | 541 | { |
546 | mStatus = ownership_string_to_status(value.c_str()); | 542 | mStatus = ownership_string_to_status(value.c_str()); |
547 | } | 543 | } |
548 | else if ("category" == keyword) | 544 | else if ("category" == keyword) |
549 | { | 545 | { |
550 | mCategory = category_string_to_category(value.c_str()); | 546 | mCategory = category_string_to_category(value.c_str()); |
551 | } | 547 | } |
552 | else if ("local_id" == keyword) | 548 | else if ("local_id" == keyword) |
553 | { | 549 | { |
554 | LLString::convertToS32(value, mLocalID); | 550 | LLString::convertToS32(value, mLocalID); |
555 | } | 551 | } |
556 | else if ("name" == keyword) | 552 | else if ("name" == keyword) |
557 | { | 553 | { |
558 | setName( value ); | 554 | setName( value ); |
559 | } | 555 | } |
560 | else if ("desc" == keyword) | 556 | else if ("desc" == keyword) |
561 | { | 557 | { |
562 | setDesc( value ); | 558 | setDesc( value ); |
563 | } | 559 | } |
564 | else if ("music_url" == keyword) | 560 | else if ("music_url" == keyword) |
565 | { | 561 | { |
566 | setMusicURL( value ); | 562 | setMusicURL( value ); |
567 | } | 563 | } |
568 | else if ("media_url" == keyword) | 564 | else if ("media_url" == keyword) |
569 | { | 565 | { |
570 | setMediaURL( value ); | 566 | setMediaURL( value ); |
571 | } | 567 | } |
572 | else if ("media_id" == keyword) | 568 | else if ("media_id" == keyword) |
573 | { | 569 | { |
574 | mMediaID.set( value.c_str() ); | 570 | mMediaID.set( value.c_str() ); |
575 | } | 571 | } |
576 | else if ("media_auto_scale" == keyword) | 572 | else if ("media_auto_scale" == keyword) |
577 | { | 573 | { |
578 | LLString::convertToU8(value, mMediaAutoScale); | 574 | LLString::convertToU8(value, mMediaAutoScale); |
579 | } | 575 | } |
580 | else if ("owner_id" == keyword) | 576 | else if ("owner_id" == keyword) |
581 | { | 577 | { |
582 | mOwnerID.set( value.c_str() ); | 578 | mOwnerID.set( value.c_str() ); |
583 | } | 579 | } |
584 | else if ("group_owned" == keyword) | 580 | else if ("group_owned" == keyword) |
585 | { | 581 | { |
586 | LLString::convertToBOOL(value, mGroupOwned); | 582 | LLString::convertToBOOL(value, mGroupOwned); |
587 | } | 583 | } |
588 | else if ("clean_other_time" == keyword) | 584 | else if ("clean_other_time" == keyword) |
589 | { | 585 | { |
590 | S32 time; | 586 | S32 time; |
591 | LLString::convertToS32(value, time); | 587 | LLString::convertToS32(value, time); |
592 | setCleanOtherTime(time); | 588 | setCleanOtherTime(time); |
593 | } | 589 | } |
594 | else if ("auth_buyer_id" == keyword) | 590 | else if ("auth_buyer_id" == keyword) |
595 | { | 591 | { |
596 | mAuthBuyerID.set(value.c_str()); | 592 | mAuthBuyerID.set(value.c_str()); |
597 | } | 593 | } |
598 | else if ("snapshot_id" == keyword) | 594 | else if ("snapshot_id" == keyword) |
599 | { | 595 | { |
600 | mSnapshotID.set(value.c_str()); | 596 | mSnapshotID.set(value.c_str()); |
601 | } | 597 | } |
602 | else if ("user_location" == keyword) | 598 | else if ("user_location" == keyword) |
603 | { | 599 | { |
604 | sscanf(value.c_str(), "%f %f %f", | 600 | sscanf(value.c_str(), "%f %f %f", |
605 | &mUserLocation.mV[VX], | 601 | &mUserLocation.mV[VX], |
606 | &mUserLocation.mV[VY], | 602 | &mUserLocation.mV[VY], |
607 | &mUserLocation.mV[VZ]); | 603 | &mUserLocation.mV[VZ]); |
608 | } | 604 | } |
609 | else if ("user_look_at" == keyword) | 605 | else if ("user_look_at" == keyword) |
610 | { | 606 | { |
611 | sscanf(value.c_str(), "%f %f %f", | 607 | sscanf(value.c_str(), "%f %f %f", |
612 | &mUserLookAt.mV[VX], | 608 | &mUserLookAt.mV[VX], |
613 | &mUserLookAt.mV[VY], | 609 | &mUserLookAt.mV[VY], |
614 | &mUserLookAt.mV[VZ]); | 610 | &mUserLookAt.mV[VZ]); |
615 | } | 611 | } |
616 | else if ("landing_type" == keyword) | 612 | else if ("landing_type" == keyword) |
617 | { | 613 | { |
618 | S32 landing_type = 0; | 614 | S32 landing_type = 0; |
619 | LLString::convertToS32(value, landing_type); | 615 | LLString::convertToS32(value, landing_type); |
620 | mLandingType = (ELandingType) landing_type; | 616 | mLandingType = (ELandingType) landing_type; |
621 | } | 617 | } |
622 | else if ("join_neighbors" == keyword) | 618 | else if ("join_neighbors" == keyword) |
623 | { | 619 | { |
624 | llinfos << "found deprecated keyword join_neighbors" << llendl; | 620 | llinfos << "found deprecated keyword join_neighbors" << llendl; |
625 | } | 621 | } |
626 | else if ("revert_sale" == keyword) | 622 | else if ("revert_sale" == keyword) |
627 | { | 623 | { |
628 | LLString::convertToS32(value, secs_until_revert); | 624 | LLString::convertToS32(value, secs_until_revert); |
629 | if (secs_until_revert > 0) | 625 | if (secs_until_revert > 0) |
630 | { | 626 | { |
631 | mSaleTimerExpires.start(); | 627 | mSaleTimerExpires.start(); |
632 | mSaleTimerExpires.setTimerExpirySec((F32)secs_until_revert); | 628 | mSaleTimerExpires.setTimerExpirySec((F32)secs_until_revert); |
633 | } | 629 | } |
634 | } | 630 | } |
635 | else if("extended_grace" == keyword) | 631 | else if("extended_grace" == keyword) |
636 | { | 632 | { |
637 | LLString::convertToS32(value, mGraceExtension); | 633 | LLString::convertToS32(value, mGraceExtension); |
638 | } | 634 | } |
639 | else if ("user_list_type" == keyword) | 635 | else if ("user_list_type" == keyword) |
640 | { | 636 | { |
641 | // deprecated | 637 | // deprecated |
642 | } | 638 | } |
643 | else if("auction_id" == keyword) | 639 | else if("auction_id" == keyword) |
644 | { | 640 | { |
645 | LLString::convertToU32(value, mAuctionID); | 641 | LLString::convertToU32(value, mAuctionID); |
646 | } | 642 | } |
647 | else if ("allow_modify" == keyword) | 643 | else if ("allow_modify" == keyword) |
648 | { | 644 | { |
649 | LLString::convertToU32(value, setting); | 645 | LLString::convertToU32(value, setting); |
650 | setParcelFlag(PF_CREATE_OBJECTS, setting); | 646 | setParcelFlag(PF_CREATE_OBJECTS, setting); |
651 | } | 647 | } |
652 | else if ("allow_group_modify" == keyword) | 648 | else if ("allow_group_modify" == keyword) |
653 | { | 649 | { |
654 | LLString::convertToU32(value, setting); | 650 | LLString::convertToU32(value, setting); |
655 | setParcelFlag(PF_CREATE_GROUP_OBJECTS, setting); | 651 | setParcelFlag(PF_CREATE_GROUP_OBJECTS, setting); |
656 | } | 652 | } |
657 | else if ("allow_all_object_entry" == keyword) | 653 | else if ("allow_all_object_entry" == keyword) |
658 | { | 654 | { |
659 | LLString::convertToU32(value, setting); | 655 | LLString::convertToU32(value, setting); |
660 | setParcelFlag(PF_ALLOW_ALL_OBJECT_ENTRY, setting); | 656 | setParcelFlag(PF_ALLOW_ALL_OBJECT_ENTRY, setting); |
661 | } | 657 | } |
662 | else if ("allow_group_object_entry" == keyword) | 658 | else if ("allow_group_object_entry" == keyword) |
663 | { | 659 | { |
664 | LLString::convertToU32(value, setting); | 660 | LLString::convertToU32(value, setting); |
665 | setParcelFlag(PF_ALLOW_GROUP_OBJECT_ENTRY, setting); | 661 | setParcelFlag(PF_ALLOW_GROUP_OBJECT_ENTRY, setting); |
666 | } | 662 | } |
667 | else if ("allow_deed_to_group" == keyword) | 663 | else if ("allow_deed_to_group" == keyword) |
668 | { | 664 | { |
669 | LLString::convertToU32(value, setting); | 665 | LLString::convertToU32(value, setting); |
670 | setParcelFlag(PF_ALLOW_DEED_TO_GROUP, setting); | 666 | setParcelFlag(PF_ALLOW_DEED_TO_GROUP, setting); |
671 | } | 667 | } |
672 | else if("contribute_with_deed" == keyword) | 668 | else if("contribute_with_deed" == keyword) |
673 | { | 669 | { |
674 | LLString::convertToU32(value, setting); | 670 | LLString::convertToU32(value, setting); |
675 | setParcelFlag(PF_CONTRIBUTE_WITH_DEED, setting); | 671 | setParcelFlag(PF_CONTRIBUTE_WITH_DEED, setting); |
676 | } | 672 | } |
677 | else if ("allow_terraform" == keyword) | 673 | else if ("allow_terraform" == keyword) |
678 | { | 674 | { |
679 | LLString::convertToU32(value, setting); | 675 | LLString::convertToU32(value, setting); |
680 | setParcelFlag(PF_ALLOW_TERRAFORM, setting); | 676 | setParcelFlag(PF_ALLOW_TERRAFORM, setting); |
681 | } | 677 | } |
682 | else if ("allow_damage" == keyword) | 678 | else if ("allow_damage" == keyword) |
683 | { | 679 | { |
684 | LLString::convertToU32(value, setting); | 680 | LLString::convertToU32(value, setting); |
685 | setParcelFlag(PF_ALLOW_DAMAGE, setting); | 681 | setParcelFlag(PF_ALLOW_DAMAGE, setting); |
686 | } | 682 | } |
687 | else if ("allow_fly" == keyword) | 683 | else if ("allow_fly" == keyword) |
688 | { | 684 | { |
689 | LLString::convertToU32(value, setting); | 685 | LLString::convertToU32(value, setting); |
690 | setParcelFlag(PF_ALLOW_FLY, setting); | 686 | setParcelFlag(PF_ALLOW_FLY, setting); |
691 | } | 687 | } |
692 | else if ("allow_landmark" == keyword) | 688 | else if ("allow_landmark" == keyword) |
693 | { | 689 | { |
694 | LLString::convertToU32(value, setting); | 690 | LLString::convertToU32(value, setting); |
695 | setParcelFlag(PF_ALLOW_LANDMARK, setting); | 691 | setParcelFlag(PF_ALLOW_LANDMARK, setting); |
696 | } | 692 | } |
697 | else if ("sound_local" == keyword) | 693 | else if ("sound_local" == keyword) |
698 | { | 694 | { |
699 | LLString::convertToU32(value, setting); | 695 | LLString::convertToU32(value, setting); |
700 | setParcelFlag(PF_SOUND_LOCAL, setting); | 696 | setParcelFlag(PF_SOUND_LOCAL, setting); |
701 | } | 697 | } |
702 | else if ("allow_group_scripts" == keyword) | 698 | else if ("allow_group_scripts" == keyword) |
703 | { | 699 | { |
704 | LLString::convertToU32(value, setting); | 700 | LLString::convertToU32(value, setting); |
705 | setParcelFlag(PF_ALLOW_GROUP_SCRIPTS, setting); | 701 | setParcelFlag(PF_ALLOW_GROUP_SCRIPTS, setting); |
706 | } | 702 | } |
707 | else if ("allow_voice_chat" == keyword) | 703 | else if ("allow_voice_chat" == keyword) |
708 | { | 704 | { |
709 | LLString::convertToU32(value, setting); | 705 | LLString::convertToU32(value, setting); |
710 | setParcelFlag(PF_ALLOW_VOICE_CHAT, setting); | 706 | setParcelFlag(PF_ALLOW_VOICE_CHAT, setting); |
711 | } | 707 | } |
712 | else if ("use_estate_voice_chan" == keyword) | 708 | else if ("use_estate_voice_chan" == keyword) |
713 | { | 709 | { |
714 | LLString::convertToU32(value, setting); | 710 | LLString::convertToU32(value, setting); |
715 | setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, setting); | 711 | setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, setting); |
716 | } | 712 | } |
717 | else if ("allow_scripts" == keyword) | 713 | else if ("allow_scripts" == keyword) |
718 | { | 714 | { |
719 | LLString::convertToU32(value, setting); | 715 | LLString::convertToU32(value, setting); |
720 | setParcelFlag(PF_ALLOW_OTHER_SCRIPTS, setting); | 716 | setParcelFlag(PF_ALLOW_OTHER_SCRIPTS, setting); |
721 | } | 717 | } |
722 | else if ("for_sale" == keyword) | 718 | else if ("for_sale" == keyword) |
723 | { | 719 | { |
724 | LLString::convertToU32(value, setting); | 720 | LLString::convertToU32(value, setting); |
725 | setParcelFlag(PF_FOR_SALE, setting); | 721 | setParcelFlag(PF_FOR_SALE, setting); |
726 | } | 722 | } |
727 | else if ("sell_w_objects" == keyword) | 723 | else if ("sell_w_objects" == keyword) |
728 | { | 724 | { |
729 | LLString::convertToU32(value, setting); | 725 | LLString::convertToU32(value, setting); |
730 | setParcelFlag(PF_SELL_PARCEL_OBJECTS, setting); | 726 | setParcelFlag(PF_SELL_PARCEL_OBJECTS, setting); |
731 | } | 727 | } |
732 | else if ("use_pass_list" == keyword) | 728 | else if ("use_pass_list" == keyword) |
733 | { | 729 | { |
734 | LLString::convertToU32(value, setting); | 730 | LLString::convertToU32(value, setting); |
735 | setParcelFlag(PF_USE_PASS_LIST, setting); | 731 | setParcelFlag(PF_USE_PASS_LIST, setting); |
736 | } | 732 | } |
737 | else if ("show_directory" == keyword) | 733 | else if ("show_directory" == keyword) |
738 | { | 734 | { |
739 | LLString::convertToU32(value, setting); | 735 | LLString::convertToU32(value, setting); |
740 | setParcelFlag(PF_SHOW_DIRECTORY, setting); | 736 | setParcelFlag(PF_SHOW_DIRECTORY, setting); |
741 | } | 737 | } |
742 | else if ("allow_publish" == keyword) | 738 | else if ("allow_publish" == keyword) |
743 | { | 739 | { |
744 | LLString::convertToU32(value, setting); | 740 | LLString::convertToU32(value, setting); |
745 | setParcelFlag(PF_ALLOW_PUBLISH, setting); | 741 | setParcelFlag(PF_ALLOW_PUBLISH, setting); |
746 | } | 742 | } |
747 | else if ("mature_publish" == keyword) | 743 | else if ("mature_publish" == keyword) |
748 | { | 744 | { |
749 | LLString::convertToU32(value, setting); | 745 | LLString::convertToU32(value, setting); |
750 | setParcelFlag(PF_MATURE_PUBLISH, setting); | 746 | setParcelFlag(PF_MATURE_PUBLISH, setting); |
751 | } | 747 | } |
752 | else if ("claim_date" == keyword) | 748 | else if ("claim_date" == keyword) |
753 | { | 749 | { |
754 | // BUG: This will fail when time rolls over in 2038. | 750 | // BUG: This will fail when time rolls over in 2038. |
755 | S32 time; | 751 | S32 time; |
756 | LLString::convertToS32(value, time); | 752 | LLString::convertToS32(value, time); |
757 | mClaimDate = time; | 753 | mClaimDate = time; |
758 | } | 754 | } |
759 | else if ("claim_price" == keyword) | 755 | else if ("claim_price" == keyword) |
760 | { | 756 | { |
761 | LLString::convertToS32(value, mClaimPricePerMeter); | 757 | LLString::convertToS32(value, mClaimPricePerMeter); |
762 | } | 758 | } |
763 | else if ("rent_price" == keyword) | 759 | else if ("rent_price" == keyword) |
764 | { | 760 | { |
765 | LLString::convertToS32(value, mRentPricePerMeter); | 761 | LLString::convertToS32(value, mRentPricePerMeter); |
766 | } | 762 | } |
767 | else if ("discount_rate" == keyword) | 763 | else if ("discount_rate" == keyword) |
768 | { | 764 | { |
769 | LLString::convertToF32(value, mDiscountRate); | 765 | LLString::convertToF32(value, mDiscountRate); |
770 | } | 766 | } |
771 | else if ("draw_distance" == keyword) | 767 | else if ("draw_distance" == keyword) |
772 | { | 768 | { |
773 | LLString::convertToF32(value, mDrawDistance); | 769 | LLString::convertToF32(value, mDrawDistance); |
774 | } | 770 | } |
775 | else if ("sale_price" == keyword) | 771 | else if ("sale_price" == keyword) |
776 | { | 772 | { |
777 | LLString::convertToS32(value, mSalePrice); | 773 | LLString::convertToS32(value, mSalePrice); |
778 | } | 774 | } |
779 | else if ("pass_price" == keyword) | 775 | else if ("pass_price" == keyword) |
780 | { | 776 | { |
781 | LLString::convertToS32(value, mPassPrice); | 777 | LLString::convertToS32(value, mPassPrice); |
782 | } | 778 | } |
783 | else if ("pass_hours" == keyword) | 779 | else if ("pass_hours" == keyword) |
784 | { | 780 | { |
785 | LLString::convertToF32(value, mPassHours); | 781 | LLString::convertToF32(value, mPassHours); |
786 | } | 782 | } |
787 | else if ("box" == keyword) | 783 | else if ("box" == keyword) |
788 | { | 784 | { |
789 | // deprecated | 785 | // deprecated |
790 | } | 786 | } |
791 | else if ("aabb_min" == keyword) | 787 | else if ("aabb_min" == keyword) |
792 | { | 788 | { |
793 | sscanf(value.c_str(), "%f %f %f", | 789 | sscanf(value.c_str(), "%f %f %f", |
794 | &mAABBMin.mV[VX], &mAABBMin.mV[VY], &mAABBMin.mV[VZ]); | 790 | &mAABBMin.mV[VX], &mAABBMin.mV[VY], &mAABBMin.mV[VZ]); |
795 | } | 791 | } |
796 | else if ("use_access_group" == keyword) | 792 | else if ("use_access_group" == keyword) |
797 | { | 793 | { |
798 | LLString::convertToU32(value, setting); | 794 | LLString::convertToU32(value, setting); |
799 | setParcelFlag(PF_USE_ACCESS_GROUP, setting); | 795 | setParcelFlag(PF_USE_ACCESS_GROUP, setting); |
800 | } | 796 | } |
801 | else if ("use_access_list" == keyword) | 797 | else if ("use_access_list" == keyword) |
802 | { | 798 | { |
803 | LLString::convertToU32(value, setting); | 799 | LLString::convertToU32(value, setting); |
804 | setParcelFlag(PF_USE_ACCESS_LIST, setting); | 800 | setParcelFlag(PF_USE_ACCESS_LIST, setting); |
805 | } | 801 | } |
806 | else if ("use_ban_list" == keyword) | 802 | else if ("use_ban_list" == keyword) |
807 | { | 803 | { |
808 | LLString::convertToU32(value, setting); | 804 | LLString::convertToU32(value, setting); |
809 | setParcelFlag(PF_USE_BAN_LIST, setting); | 805 | setParcelFlag(PF_USE_BAN_LIST, setting); |
810 | } | 806 | } |
811 | else if ("group_name" == keyword) | 807 | else if ("group_name" == keyword) |
812 | { | 808 | { |
813 | llinfos << "found deprecated keyword group_name" << llendl; | 809 | llinfos << "found deprecated keyword group_name" << llendl; |
814 | } | 810 | } |
815 | else if ("group_id" == keyword) | 811 | else if ("group_id" == keyword) |
816 | { | 812 | { |
817 | mGroupID.set( value.c_str() ); | 813 | mGroupID.set( value.c_str() ); |
818 | } | 814 | } |
819 | // TODO: DEPRECATED FLAG | 815 | // TODO: DEPRECATED FLAG |
820 | // Flag removed from simstate files in 1.11.1 | 816 | // Flag removed from simstate files in 1.11.1 |
821 | // Remove at some point where we have guarenteed this flag | 817 | // Keep if statement until we have guarenteed this flag |
822 | // no longer exists anywhere in simstate files. | 818 | // no longer exists anywhere in simstate files. |
823 | else if ("require_identified" == keyword) | 819 | else if ("require_identified" == keyword) |
824 | { | 820 | { |
825 | LLString::convertToU32(value, setting); | 821 | // LLString::convertToU32(value, setting); |
826 | setParcelFlag(PF_DENY_ANONYMOUS, setting); | 822 | // setParcelFlag(PF_DENY_ANONYMOUS, setting); |
827 | } | 823 | } |
828 | // TODO: DEPRECATED FLAG | 824 | // TODO: DEPRECATED FLAG |
829 | // Flag removed from simstate files in 1.11.1 | 825 | // Flag removed from simstate files in 1.11.1 |
830 | // Remove at some point where we have guarenteed this flag | 826 | // Keep if statement until we have guarenteed this flag |
831 | // no longer exists anywhere in simstate files. | 827 | // no longer exists anywhere in simstate files. |
832 | else if ("require_transacted" == keyword) | 828 | else if ("require_transacted" == keyword) |
833 | { | 829 | { |
834 | LLString::convertToU32(value, setting); | 830 | // LLString::convertToU32(value, setting); |
835 | setParcelFlag(PF_DENY_ANONYMOUS, setting); | 831 | // setParcelFlag(PF_DENY_ANONYMOUS, setting); |
836 | setParcelFlag(PF_DENY_IDENTIFIED, setting); | 832 | // setParcelFlag(PF_DENY_IDENTIFIED, setting); |
837 | } | 833 | } |
838 | else if ("restrict_pushobject" == keyword) | 834 | else if ("restrict_pushobject" == keyword) |
839 | { | 835 | { |
840 | LLString::convertToU32(value, setting); | 836 | LLString::convertToU32(value, setting); |
841 | setParcelFlag(PF_RESTRICT_PUSHOBJECT, setting); | 837 | setParcelFlag(PF_RESTRICT_PUSHOBJECT, setting); |
842 | } | 838 | } |
843 | else if ("deny_anonymous" == keyword) | 839 | else if ("deny_anonymous" == keyword) |
844 | { | 840 | { |
845 | LLString::convertToU32(value, setting); | 841 | LLString::convertToU32(value, setting); |
846 | setParcelFlag(PF_DENY_ANONYMOUS, setting); | 842 | setParcelFlag(PF_DENY_ANONYMOUS, setting); |
847 | } | 843 | } |
844 | // TODO: DEPRECATED FLAG | ||
845 | // Keep if statement until we have guarenteed this flag | ||
846 | // no longer exists anywhere in simstate files. | ||
848 | else if ("deny_identified" == keyword) | 847 | else if ("deny_identified" == keyword) |
849 | { | 848 | { |
850 | LLString::convertToU32(value, setting); | 849 | // LLString::convertToU32(value, setting); |
851 | setParcelFlag(PF_DENY_IDENTIFIED, setting); | 850 | // setParcelFlag(PF_DENY_IDENTIFIED, setting); |
852 | } | 851 | } |
853 | else if ("deny_transacted" == keyword) | 852 | else if ("deny_transacted" == keyword) |
854 | { | 853 | { |
855 | LLString::convertToU32(value, setting); | 854 | // LLString::convertToU32(value, setting); |
856 | setParcelFlag(PF_DENY_TRANSACTED, setting); | 855 | // setParcelFlag(PF_DENY_TRANSACTED, setting); |
857 | } | 856 | } |
858 | else if ("access_list" == keyword) | 857 | else if ("deny_age_unverified" == keyword) |
859 | { | 858 | { |
860 | S32 entry_count = 0; | 859 | LLString::convertToU32(value, setting); |
861 | LLString::convertToS32(value, entry_count); | 860 | setParcelFlag(PF_DENY_AGEUNVERIFIED, setting); |
862 | for (S32 i = 0; i < entry_count; i++) | 861 | } |
863 | { | 862 | else if ("access_list" == keyword) |
864 | LLAccessEntry entry; | 863 | { |
865 | if (importAccessEntry(input_stream, &entry)) | 864 | S32 entry_count = 0; |
866 | { | 865 | LLString::convertToS32(value, entry_count); |
867 | mAccessList[entry.mID] = entry; | 866 | for (S32 i = 0; i < entry_count; i++) |
868 | } | 867 | { |
869 | } | 868 | LLAccessEntry entry; |
870 | } | 869 | if (importAccessEntry(input_stream, &entry)) |
871 | else if ("ban_list" == keyword) | 870 | { |
872 | { | 871 | mAccessList[entry.mID] = entry; |
873 | S32 entry_count = 0; | 872 | } |
874 | LLString::convertToS32(value, entry_count); | 873 | } |
875 | for (S32 i = 0; i < entry_count; i++) | 874 | } |
876 | { | 875 | else if ("ban_list" == keyword) |
877 | LLAccessEntry entry; | 876 | { |
878 | if (importAccessEntry(input_stream, &entry)) | 877 | S32 entry_count = 0; |
879 | { | 878 | LLString::convertToS32(value, entry_count); |
880 | mBanList[entry.mID] = entry; | 879 | for (S32 i = 0; i < entry_count; i++) |
881 | } | 880 | { |
882 | } | 881 | LLAccessEntry entry; |
883 | } | 882 | if (importAccessEntry(input_stream, &entry)) |
884 | else if ("renter_list" == keyword) | 883 | { |
885 | { | 884 | mBanList[entry.mID] = entry; |
886 | /* | 885 | } |
887 | S32 entry_count = 0; | 886 | } |
888 | LLString::convertToS32(value, entry_count); | 887 | } |
889 | for (S32 i = 0; i < entry_count; i++) | 888 | else if ("renter_list" == keyword) |
890 | { | 889 | { |
891 | LLAccessEntry entry; | 890 | /* |
892 | if (importAccessEntry(input_stream, &entry)) | 891 | S32 entry_count = 0; |
893 | { | 892 | LLString::convertToS32(value, entry_count); |
894 | mRenterList.put(entry); | 893 | for (S32 i = 0; i < entry_count; i++) |
895 | } | 894 | { |
896 | }*/ | 895 | LLAccessEntry entry; |
897 | } | 896 | if (importAccessEntry(input_stream, &entry)) |
898 | else if ("pass_list" == keyword) | 897 | { |
899 | { | 898 | mRenterList.put(entry); |
900 | // legacy - put into access list | 899 | } |
901 | S32 entry_count = 0; | 900 | }*/ |
902 | LLString::convertToS32(value, entry_count); | 901 | } |
903 | for (S32 i = 0; i < entry_count; i++) | 902 | else if ("pass_list" == keyword) |
904 | { | 903 | { |
905 | LLAccessEntry entry; | 904 | // legacy - put into access list |
906 | if (importAccessEntry(input_stream, &entry)) | 905 | S32 entry_count = 0; |
907 | { | 906 | LLString::convertToS32(value, entry_count); |
908 | mAccessList[entry.mID] = entry; | 907 | for (S32 i = 0; i < entry_count; i++) |
909 | } | 908 | { |
910 | } | 909 | LLAccessEntry entry; |
911 | } | 910 | if (importAccessEntry(input_stream, &entry)) |
912 | 911 | { | |
913 | else | 912 | mAccessList[entry.mID] = entry; |
914 | { | 913 | } |
915 | llwarns << "Unknown keyword in parcel section: <" | 914 | } |
916 | << keyword << ">" << llendl; | 915 | } |
917 | } | 916 | |
918 | } | 917 | else |
919 | 918 | { | |
920 | // this code block detects if we have loaded a 1.1 simstate file, | 919 | llwarns << "Unknown keyword in parcel section: <" |
921 | // and follows the conversion rules specified in | 920 | << keyword << ">" << llendl; |
922 | // design_docs/land/pay_for_parcel.txt. | 921 | } |
923 | F32 time_to_expire = 0.0f; | 922 | } |
924 | if(mID.isNull()) | 923 | |
925 | { | 924 | // this code block detects if we have loaded a 1.1 simstate file, |
926 | mID.generate(); | 925 | // and follows the conversion rules specified in |
927 | mStatus = OS_LEASE_PENDING; | 926 | // design_docs/land/pay_for_parcel.txt. |
928 | //mBuyerID = mOwnerID; | 927 | F32 time_to_expire = 0.0f; |
929 | if(getIsGroupOwned()) | 928 | if(mID.isNull()) |
930 | { | 929 | { |
931 | time_to_expire += GROUP_USEC_CONVERSION_TIMEOUT / SEC_TO_MICROSEC; | 930 | mID.generate(); |
932 | } | 931 | mStatus = OS_LEASE_PENDING; |
933 | else | 932 | //mBuyerID = mOwnerID; |
934 | { | 933 | if(getIsGroupOwned()) |
935 | time_to_expire += DEFAULT_USEC_CONVERSION_TIMEOUT / SEC_TO_MICROSEC; | 934 | { |
936 | } | 935 | time_to_expire += GROUP_USEC_CONVERSION_TIMEOUT / SEC_TO_MICROSEC; |
937 | //mExpireAction = STEA_PUBLIC; | 936 | } |
938 | mRecordTransaction = TRUE; | 937 | else |
939 | } | 938 | { |
940 | 939 | time_to_expire += DEFAULT_USEC_CONVERSION_TIMEOUT / SEC_TO_MICROSEC; | |
941 | // this code block deals with giving an extension to pending | 940 | } |
942 | // parcels to the midday of 2004-01-19 if they were originally set | 941 | //mExpireAction = STEA_PUBLIC; |
943 | // for some time on 2004-01-12. | 942 | mRecordTransaction = TRUE; |
944 | if((0 == mGraceExtension) | 943 | } |
945 | && (EXTEND_GRACE_IF_MORE_THAN_SEC < secs_until_revert)) | 944 | |
946 | { | 945 | // this code block deals with giving an extension to pending |
947 | const S32 NEW_CONVERSION_DATE = 1074538800; // 2004-01-19T11:00:00 | 946 | // parcels to the midday of 2004-01-19 if they were originally set |
948 | time_t now = time(NULL); // now in epoch | 947 | // for some time on 2004-01-12. |
949 | secs_until_revert = (S32)(NEW_CONVERSION_DATE - now); | 948 | if((0 == mGraceExtension) |
950 | time_to_expire = (F32)secs_until_revert; | 949 | && (EXTEND_GRACE_IF_MORE_THAN_SEC < secs_until_revert)) |
951 | mGraceExtension = 1; | 950 | { |
952 | } | 951 | const S32 NEW_CONVERSION_DATE = 1074538800; // 2004-01-19T11:00:00 |
953 | 952 | time_t now = time(NULL); // now in epoch | |
954 | // This code block adds yet another week to the deadline. :( | 953 | secs_until_revert = (S32)(NEW_CONVERSION_DATE - now); |
955 | if(1 == mGraceExtension) | 954 | time_to_expire = (F32)secs_until_revert; |
956 | { | 955 | mGraceExtension = 1; |
957 | time_to_expire += SEVEN_DAYS_IN_USEC / SEC_TO_MICROSEC; | 956 | } |
958 | mGraceExtension = 2; | 957 | |
959 | } | 958 | // This code block adds yet another week to the deadline. :( |
960 | 959 | if(1 == mGraceExtension) | |
961 | if (time_to_expire > 0) | 960 | { |
962 | { | 961 | time_to_expire += SEVEN_DAYS_IN_USEC / SEC_TO_MICROSEC; |
963 | mSaleTimerExpires.setTimerExpirySec(time_to_expire); | 962 | mGraceExtension = 2; |
964 | mSaleTimerExpires.start(); | 963 | } |
965 | } | 964 | |
966 | 965 | if (time_to_expire > 0) | |
967 | // successful import | 966 | { |
968 | return TRUE; | 967 | mSaleTimerExpires.setTimerExpirySec(time_to_expire); |
968 | mSaleTimerExpires.start(); | ||
969 | } | ||
970 | |||
971 | // successful import | ||
972 | return TRUE; | ||
969 | } | 973 | } |
970 | 974 | ||
971 | 975 | ||
972 | BOOL LLParcel::importAccessEntry(std::istream& input_stream, LLAccessEntry* entry) | 976 | BOOL LLParcel::importAccessEntry(std::istream& input_stream, LLAccessEntry* entry) |
973 | { | 977 | { |
974 | skip_to_end_of_next_keyword("{", input_stream); | 978 | skip_to_end_of_next_keyword("{", input_stream); |
975 | while (input_stream.good()) | 979 | while (input_stream.good()) |
976 | { | 980 | { |
977 | skip_comments_and_emptyspace(input_stream); | 981 | skip_comments_and_emptyspace(input_stream); |
978 | LLString line, keyword, value; | 982 | LLString line, keyword, value; |
979 | get_line(line, input_stream, MAX_STRING); | 983 | get_line(line, input_stream, MAX_STRING); |
980 | get_keyword_and_value(keyword, value, line); | 984 | get_keyword_and_value(keyword, value, line); |
981 | 985 | ||
982 | if ("}" == keyword) | 986 | if ("}" == keyword) |
983 | { | 987 | { |
984 | break; | 988 | break; |
985 | } | 989 | } |
986 | else if ("id" == keyword) | 990 | else if ("id" == keyword) |
987 | { | 991 | { |
988 | entry->mID.set( value.c_str() ); | 992 | entry->mID.set( value.c_str() ); |
989 | } | 993 | } |
990 | else if ("name" == keyword) | 994 | else if ("name" == keyword) |
991 | { | 995 | { |
992 | // deprecated | 996 | // deprecated |
993 | } | 997 | } |
994 | else if ("time" == keyword) | 998 | else if ("time" == keyword) |
995 | { | 999 | { |
996 | S32 when; | 1000 | S32 when; |
997 | LLString::convertToS32(value, when); | 1001 | LLString::convertToS32(value, when); |
998 | entry->mTime = when; | 1002 | entry->mTime = when; |
999 | } | 1003 | } |
1000 | else if ("flags" == keyword) | 1004 | else if ("flags" == keyword) |
1001 | { | 1005 | { |
1002 | U32 setting; | 1006 | U32 setting; |
1003 | LLString::convertToU32(value, setting); | 1007 | LLString::convertToU32(value, setting); |
1004 | entry->mFlags = setting; | 1008 | entry->mFlags = setting; |
1005 | } | 1009 | } |
1006 | else | 1010 | else |
1007 | { | 1011 | { |
1008 | llwarns << "Unknown keyword in parcel access entry section: <" | 1012 | llwarns << "Unknown keyword in parcel access entry section: <" |
1009 | << keyword << ">" << llendl; | 1013 | << keyword << ">" << llendl; |
1010 | } | 1014 | } |
1011 | } | 1015 | } |
1012 | return input_stream.good(); | 1016 | return input_stream.good(); |
1013 | } | 1017 | } |
1014 | 1018 | ||
1015 | BOOL LLParcel::exportStream(std::ostream& output_stream) | 1019 | BOOL LLParcel::exportStream(std::ostream& output_stream) |
1016 | { | 1020 | { |
1017 | S32 setting; | 1021 | S32 setting; |
1018 | char id_string[MAX_STRING]; /* Flawfinder: ignore */ | 1022 | char id_string[MAX_STRING]; /* Flawfinder: ignore */ |
1019 | 1023 | ||
1020 | std::ios::fmtflags old_flags = output_stream.flags(); | 1024 | std::ios::fmtflags old_flags = output_stream.flags(); |
1021 | output_stream.setf(std::ios::showpoint); | 1025 | output_stream.setf(std::ios::showpoint); |
1022 | output_stream << "\t{\n"; | 1026 | output_stream << "\t{\n"; |
1023 | 1027 | ||
1024 | mID.toString(id_string); | 1028 | mID.toString(id_string); |
1025 | output_stream << "\t\t parcel_id " << id_string << "\n"; | 1029 | output_stream << "\t\t parcel_id " << id_string << "\n"; |
1026 | output_stream << "\t\t status " << ownership_status_to_string(mStatus) << "\n"; | 1030 | output_stream << "\t\t status " << ownership_status_to_string(mStatus) << "\n"; |
1027 | output_stream << "\t\t category " << category_to_string(mCategory) << "\n"; | 1031 | output_stream << "\t\t category " << category_to_string(mCategory) << "\n"; |
1028 | 1032 | ||
1029 | output_stream << "\t\t local_id " << mLocalID << "\n"; | 1033 | output_stream << "\t\t local_id " << mLocalID << "\n"; |
1030 | 1034 | ||
1031 | const char* name = (mName.empty() ? "" : mName.c_str() ); | 1035 | const char* name = (mName.empty() ? "" : mName.c_str() ); |
1032 | output_stream << "\t\t name " << name << "\n"; | 1036 | output_stream << "\t\t name " << name << "\n"; |
1033 | 1037 | ||
1034 | const char* desc = (mDesc.empty() ? "" : mDesc.c_str() ); | 1038 | const char* desc = (mDesc.empty() ? "" : mDesc.c_str() ); |
1035 | output_stream << "\t\t desc " << desc << "\n"; | 1039 | output_stream << "\t\t desc " << desc << "\n"; |
1036 | 1040 | ||
1037 | const char* music_url = (mMusicURL.empty() ? "" : mMusicURL.c_str() ); | 1041 | const char* music_url = (mMusicURL.empty() ? "" : mMusicURL.c_str() ); |
1038 | output_stream << "\t\t music_url " << music_url << "\n"; | 1042 | output_stream << "\t\t music_url " << music_url << "\n"; |
1039 | 1043 | ||
1040 | const char* media_url = (mMediaURL.empty() ? "" : mMediaURL.c_str() ); | 1044 | const char* media_url = (mMediaURL.empty() ? "" : mMediaURL.c_str() ); |
1041 | output_stream << "\t\t media_url " << media_url << "\n"; | 1045 | output_stream << "\t\t media_url " << media_url << "\n"; |
1042 | 1046 | ||
1043 | output_stream << "\t\t media_auto_scale " << (mMediaAutoScale ? 1 : 0) << "\n"; | 1047 | output_stream << "\t\t media_auto_scale " << (mMediaAutoScale ? 1 : 0) << "\n"; |
1044 | 1048 | ||
1045 | mMediaID.toString(id_string); | 1049 | mMediaID.toString(id_string); |
1046 | output_stream << "\t\t media_id " << id_string << "\n"; | 1050 | output_stream << "\t\t media_id " << id_string << "\n"; |
1047 | 1051 | ||
1048 | mOwnerID.toString(id_string); | 1052 | mOwnerID.toString(id_string); |
1049 | output_stream << "\t\t owner_id " << id_string << "\n"; | 1053 | output_stream << "\t\t owner_id " << id_string << "\n"; |
1050 | output_stream << "\t\t group_owned " << (mGroupOwned ? 1 : 0) << "\n"; | 1054 | output_stream << "\t\t group_owned " << (mGroupOwned ? 1 : 0) << "\n"; |
1051 | output_stream << "\t\t clean_other_time " << getCleanOtherTime() << "\n"; | 1055 | output_stream << "\t\t clean_other_time " << getCleanOtherTime() << "\n"; |
1052 | 1056 | ||
1053 | if(!mAuthBuyerID.isNull()) | 1057 | if(!mAuthBuyerID.isNull()) |
1054 | { | 1058 | { |
1055 | mAuthBuyerID.toString(id_string); | 1059 | mAuthBuyerID.toString(id_string); |
1056 | output_stream << "\t\t auth_buyer_id " << id_string << "\n"; | 1060 | output_stream << "\t\t auth_buyer_id " << id_string << "\n"; |
1057 | } | 1061 | } |
1058 | if (!mSnapshotID.isNull()) | 1062 | if (!mSnapshotID.isNull()) |
1059 | { | 1063 | { |
1060 | mSnapshotID.toString(id_string); | 1064 | mSnapshotID.toString(id_string); |
1061 | output_stream << "\t\t snapshot_id " << id_string << "\n"; | 1065 | output_stream << "\t\t snapshot_id " << id_string << "\n"; |
1062 | } | 1066 | } |
1063 | if (!mUserLocation.isExactlyZero()) | 1067 | if (!mUserLocation.isExactlyZero()) |
1064 | { | 1068 | { |
1065 | output_stream << "\t\t user_location " | 1069 | output_stream << "\t\t user_location " |
1066 | << (F64)mUserLocation.mV[VX] | 1070 | << (F64)mUserLocation.mV[VX] |
1067 | << " " << (F64)mUserLocation.mV[VY] | 1071 | << " " << (F64)mUserLocation.mV[VY] |
1068 | << " " << (F64)mUserLocation.mV[VZ] << "\n"; | 1072 | << " " << (F64)mUserLocation.mV[VZ] << "\n"; |
1069 | output_stream << "\t\t user_look_at " | 1073 | output_stream << "\t\t user_look_at " |
1070 | << (F64)mUserLookAt.mV[VX] | 1074 | << (F64)mUserLookAt.mV[VX] |
1071 | << " " << (F64)mUserLookAt.mV[VY] | 1075 | << " " << (F64)mUserLookAt.mV[VY] |
1072 | << " " << (F64)mUserLookAt.mV[VZ] << "\n"; | 1076 | << " " << (F64)mUserLookAt.mV[VZ] << "\n"; |
1073 | } | 1077 | } |
1074 | output_stream << "\t\t landing_type " << mLandingType << "\n"; | 1078 | output_stream << "\t\t landing_type " << mLandingType << "\n"; |
1075 | //if(mJoinNeighbors) | 1079 | //if(mJoinNeighbors) |
1076 | //{ | 1080 | //{ |
1077 | // output_stream << "\t\t join_neighbors " << mJoinNeighbors << "\n"; | 1081 | // output_stream << "\t\t join_neighbors " << mJoinNeighbors << "\n"; |
1078 | //} | 1082 | //} |
1079 | if(mSaleTimerExpires.getStarted()) | 1083 | if(mSaleTimerExpires.getStarted()) |
1080 | { | 1084 | { |
1081 | S32 dt_sec = (S32) mSaleTimerExpires.getRemainingTimeF32()+60; // Add a minute to prevent race conditions | 1085 | S32 dt_sec = (S32) mSaleTimerExpires.getRemainingTimeF32()+60; // Add a minute to prevent race conditions |
1082 | output_stream << "\t\t revert_sale " << dt_sec << "\n"; | 1086 | output_stream << "\t\t revert_sale " << dt_sec << "\n"; |
1083 | //output_stream << "\t\t revert_action " << revert_action_to_string(mExpireAction) << "\n"; | 1087 | //output_stream << "\t\t revert_action " << revert_action_to_string(mExpireAction) << "\n"; |
1084 | output_stream << "\t\t extended_grace " << mGraceExtension << "\n"; | 1088 | output_stream << "\t\t extended_grace " << mGraceExtension << "\n"; |
1085 | } | 1089 | } |
1086 | 1090 | ||
1087 | if(0 != mAuctionID) | 1091 | if(0 != mAuctionID) |
1088 | { | 1092 | { |
1089 | output_stream << "\t\t auction_id " << mAuctionID << "\n"; | 1093 | output_stream << "\t\t auction_id " << mAuctionID << "\n"; |
1090 | } | 1094 | } |
1091 | 1095 | ||
1092 | output_stream << "\t\t allow_modify " << getAllowModify() << "\n"; | 1096 | output_stream << "\t\t allow_modify " << getAllowModify() << "\n"; |
1093 | output_stream << "\t\t allow_group_modify " << getAllowGroupModify() << "\n"; | 1097 | output_stream << "\t\t allow_group_modify " << getAllowGroupModify() << "\n"; |
1094 | output_stream << "\t\t allow_all_object_entry " << getAllowAllObjectEntry() << "\n"; | 1098 | output_stream << "\t\t allow_all_object_entry " << getAllowAllObjectEntry() << "\n"; |
1095 | output_stream << "\t\t allow_group_object_entry " << getAllowGroupObjectEntry() << "\n"; | 1099 | output_stream << "\t\t allow_group_object_entry " << getAllowGroupObjectEntry() << "\n"; |
1096 | output_stream << "\t\t allow_terraform " << getAllowTerraform() << "\n"; | 1100 | output_stream << "\t\t allow_terraform " << getAllowTerraform() << "\n"; |
1097 | output_stream << "\t\t allow_deed_to_group " << getAllowDeedToGroup() << "\n"; | 1101 | output_stream << "\t\t allow_deed_to_group " << getAllowDeedToGroup() << "\n"; |
1098 | output_stream << "\t\t contribute_with_deed " << getContributeWithDeed() << "\n"; | 1102 | output_stream << "\t\t contribute_with_deed " << getContributeWithDeed() << "\n"; |
1099 | output_stream << "\t\t allow_damage " << getAllowDamage() << "\n"; | 1103 | output_stream << "\t\t allow_damage " << getAllowDamage() << "\n"; |
1100 | output_stream << "\t\t claim_date " << (S32)mClaimDate << "\n"; | 1104 | output_stream << "\t\t claim_date " << (S32)mClaimDate << "\n"; |
1101 | output_stream << "\t\t claim_price " << mClaimPricePerMeter << "\n"; | 1105 | output_stream << "\t\t claim_price " << mClaimPricePerMeter << "\n"; |
1102 | output_stream << "\t\t rent_price " << mRentPricePerMeter << "\n"; | 1106 | output_stream << "\t\t rent_price " << mRentPricePerMeter << "\n"; |
1103 | output_stream << "\t\t discount_rate " << mDiscountRate << "\n"; | 1107 | output_stream << "\t\t discount_rate " << mDiscountRate << "\n"; |
1104 | output_stream << "\t\t allow_fly " << (getAllowFly() ? 1 : 0) << "\n"; | 1108 | output_stream << "\t\t allow_fly " << (getAllowFly() ? 1 : 0) << "\n"; |
1105 | output_stream << "\t\t allow_landmark " << (getAllowLandmark() ? 1 : 0) << "\n"; | 1109 | output_stream << "\t\t allow_landmark " << (getAllowLandmark() ? 1 : 0) << "\n"; |
1106 | output_stream << "\t\t sound_local " << (getSoundLocal() ? 1 : 0) << "\n"; | 1110 | output_stream << "\t\t sound_local " << (getSoundLocal() ? 1 : 0) << "\n"; |
1107 | output_stream << "\t\t allow_scripts " << (getAllowOtherScripts() ? 1 : 0) << "\n"; | 1111 | output_stream << "\t\t allow_scripts " << (getAllowOtherScripts() ? 1 : 0) << "\n"; |
1108 | output_stream << "\t\t allow_group_scripts " << (getAllowGroupScripts() ? 1 : 0) << "\n"; | 1112 | output_stream << "\t\t allow_group_scripts " << (getAllowGroupScripts() ? 1 : 0) << "\n"; |
1109 | output_stream << "\t\t allow_voice_chat " << (getVoiceEnabled() ? 1 : 0) << "\n"; | 1113 | output_stream << "\t\t allow_voice_chat " << (getVoiceEnabled() ? 1 : 0) << "\n"; |
1110 | output_stream << "\t\t use_estate_voice_chan " << (getVoiceUseEstateChannel() ? 1 : 0) << "\n"; | 1114 | output_stream << "\t\t use_estate_voice_chan " << (getVoiceUseEstateChannel() ? 1 : 0) << "\n"; |
1111 | output_stream << "\t\t for_sale " << (getForSale() ? 1 : 0) << "\n"; | 1115 | output_stream << "\t\t for_sale " << (getForSale() ? 1 : 0) << "\n"; |
1112 | output_stream << "\t\t sell_w_objects " << (getSellWithObjects() ? 1 : 0) << "\n"; | 1116 | output_stream << "\t\t sell_w_objects " << (getSellWithObjects() ? 1 : 0) << "\n"; |
1113 | output_stream << "\t\t draw_distance " << mDrawDistance << "\n"; | 1117 | output_stream << "\t\t draw_distance " << mDrawDistance << "\n"; |
1114 | output_stream << "\t\t sale_price " << mSalePrice << "\n"; | 1118 | output_stream << "\t\t sale_price " << mSalePrice << "\n"; |
1115 | 1119 | ||
1116 | setting = (getParcelFlag(PF_USE_ACCESS_GROUP) ? 1 : 0); | 1120 | setting = (getParcelFlag(PF_USE_ACCESS_GROUP) ? 1 : 0); |
1117 | output_stream << "\t\t use_access_group " << setting << "\n"; | 1121 | output_stream << "\t\t use_access_group " << setting << "\n"; |
1118 | 1122 | ||
1119 | setting = (getParcelFlag(PF_USE_ACCESS_LIST) ? 1 : 0); | 1123 | setting = (getParcelFlag(PF_USE_ACCESS_LIST) ? 1 : 0); |
1120 | output_stream << "\t\t use_access_list " << setting << "\n"; | 1124 | output_stream << "\t\t use_access_list " << setting << "\n"; |
1121 | 1125 | ||
1122 | setting = (getParcelFlag(PF_USE_BAN_LIST) ? 1 : 0); | 1126 | setting = (getParcelFlag(PF_USE_BAN_LIST) ? 1 : 0); |
1123 | output_stream << "\t\t use_ban_list " << setting << "\n"; | 1127 | output_stream << "\t\t use_ban_list " << setting << "\n"; |
1124 | 1128 | ||
1125 | mGroupID.toString(id_string); | 1129 | mGroupID.toString(id_string); |
1126 | output_stream << "\t\t group_id " << id_string << "\n"; | 1130 | output_stream << "\t\t group_id " << id_string << "\n"; |
1127 | 1131 | ||
1128 | //const char* group_name | 1132 | //const char* group_name |
1129 | // = (mGroupName.isEmpty() ? "" : mGroupName.c_str() ); | 1133 | // = (mGroupName.isEmpty() ? "" : mGroupName.c_str() ); |
1130 | //output_stream << "\t\t group_name " << group_name << "\n"; | 1134 | //output_stream << "\t\t group_name " << group_name << "\n"; |
1131 | 1135 | ||
1132 | setting = (getParcelFlag(PF_USE_PASS_LIST) ? 1 : 0); | 1136 | setting = (getParcelFlag(PF_USE_PASS_LIST) ? 1 : 0); |
1133 | output_stream << "\t\t use_pass_list " << setting << "\n"; | 1137 | output_stream << "\t\t use_pass_list " << setting << "\n"; |
1134 | 1138 | ||
1135 | output_stream << "\t\t pass_price " << mPassPrice << "\n"; | 1139 | output_stream << "\t\t pass_price " << mPassPrice << "\n"; |
1136 | output_stream << "\t\t pass_hours " << mPassHours << "\n"; | 1140 | output_stream << "\t\t pass_hours " << mPassHours << "\n"; |
1137 | 1141 | ||
1138 | setting = (getParcelFlag(PF_SHOW_DIRECTORY) ? 1 : 0); | 1142 | setting = (getParcelFlag(PF_SHOW_DIRECTORY) ? 1 : 0); |
1139 | output_stream << "\t\t show_directory " << setting << "\n"; | 1143 | output_stream << "\t\t show_directory " << setting << "\n"; |
1140 | 1144 | ||
1141 | setting = (getParcelFlag(PF_ALLOW_PUBLISH) ? 1 : 0); | 1145 | setting = (getParcelFlag(PF_ALLOW_PUBLISH) ? 1 : 0); |
1142 | output_stream << "\t\t allow_publish " << setting << "\n"; | 1146 | output_stream << "\t\t allow_publish " << setting << "\n"; |
1143 | 1147 | ||
1144 | setting = (getParcelFlag(PF_MATURE_PUBLISH) ? 1 : 0); | 1148 | setting = (getParcelFlag(PF_MATURE_PUBLISH) ? 1 : 0); |
1145 | output_stream << "\t\t mature_publish " << setting << "\n"; | 1149 | output_stream << "\t\t mature_publish " << setting << "\n"; |
1146 | 1150 | ||
1147 | setting = (getParcelFlag(PF_DENY_ANONYMOUS) ? 1 : 0); | 1151 | setting = (getParcelFlag(PF_DENY_ANONYMOUS) ? 1 : 0); |
1148 | output_stream << "\t\t deny_anonymous " << setting << "\n"; | 1152 | output_stream << "\t\t deny_anonymous " << setting << "\n"; |
1149 | 1153 | ||
1150 | setting = (getParcelFlag(PF_DENY_IDENTIFIED) ? 1 : 0); | 1154 | // setting = (getParcelFlag(PF_DENY_IDENTIFIED) ? 1 : 0); |
1151 | output_stream << "\t\t deny_identified " << setting << "\n"; | 1155 | // output_stream << "\t\t deny_identified " << setting << "\n"; |
1152 | 1156 | ||
1153 | setting = (getParcelFlag(PF_DENY_TRANSACTED) ? 1 : 0); | 1157 | // setting = (getParcelFlag(PF_DENY_TRANSACTED) ? 1 : 0); |
1154 | output_stream << "\t\t deny_transacted " << setting << "\n"; | 1158 | // output_stream << "\t\t deny_transacted " << setting << "\n"; |
1155 | 1159 | ||
1156 | setting = (getParcelFlag(PF_RESTRICT_PUSHOBJECT) ? 1 : 0); | 1160 | setting = (getParcelFlag(PF_DENY_AGEUNVERIFIED) ? 1 : 0); |
1157 | output_stream << "\t\t restrict_pushobject " << setting << "\n"; | 1161 | output_stream << "\t\t deny_age_unverified " << setting << "\n"; |
1158 | 1162 | ||
1159 | output_stream << "\t\t aabb_min " | 1163 | setting = (getParcelFlag(PF_RESTRICT_PUSHOBJECT) ? 1 : 0); |
1160 | << mAABBMin.mV[VX] | 1164 | output_stream << "\t\t restrict_pushobject " << setting << "\n"; |
1161 | << " " << mAABBMin.mV[VY] | 1165 | |
1162 | << " " << mAABBMin.mV[VZ] << "\n"; | 1166 | output_stream << "\t\t aabb_min " |
1163 | 1167 | << mAABBMin.mV[VX] | |
1164 | if (!mAccessList.empty()) | 1168 | << " " << mAABBMin.mV[VY] |
1165 | { | 1169 | << " " << mAABBMin.mV[VZ] << "\n"; |
1166 | output_stream << "\t\t access_list " << mAccessList.size() << "\n"; | 1170 | |
1167 | access_map_const_iterator cit = mAccessList.begin(); | 1171 | if (!mAccessList.empty()) |
1168 | access_map_const_iterator end = mAccessList.end(); | 1172 | { |
1169 | 1173 | output_stream << "\t\t access_list " << mAccessList.size() << "\n"; | |
1170 | for ( ; cit != end; ++cit) | 1174 | access_map_const_iterator cit = mAccessList.begin(); |
1171 | { | 1175 | access_map_const_iterator end = mAccessList.end(); |
1172 | output_stream << "\t\t{\n"; | 1176 | |
1173 | const LLAccessEntry& entry = (*cit).second; | 1177 | for ( ; cit != end; ++cit) |
1174 | entry.mID.toString(id_string); | 1178 | { |
1175 | output_stream << "\t\t\tid " << id_string << "\n"; | 1179 | output_stream << "\t\t{\n"; |
1176 | output_stream << "\t\t\ttime " << entry.mTime << "\n"; | 1180 | const LLAccessEntry& entry = (*cit).second; |
1177 | output_stream << "\t\t\tflags " << entry.mFlags << "\n"; | 1181 | entry.mID.toString(id_string); |
1178 | output_stream << "\t\t}\n"; | 1182 | output_stream << "\t\t\tid " << id_string << "\n"; |
1179 | } | 1183 | output_stream << "\t\t\ttime " << entry.mTime << "\n"; |
1180 | } | 1184 | output_stream << "\t\t\tflags " << entry.mFlags << "\n"; |
1181 | 1185 | output_stream << "\t\t}\n"; | |
1182 | if (!mBanList.empty()) | 1186 | } |
1183 | { | 1187 | } |
1184 | output_stream << "\t\t ban_list " << mBanList.size() << "\n"; | 1188 | |
1185 | access_map_const_iterator cit = mBanList.begin(); | 1189 | if (!mBanList.empty()) |
1186 | access_map_const_iterator end = mBanList.end(); | 1190 | { |
1187 | 1191 | output_stream << "\t\t ban_list " << mBanList.size() << "\n"; | |
1188 | for ( ; cit != end; ++cit) | 1192 | access_map_const_iterator cit = mBanList.begin(); |
1189 | { | 1193 | access_map_const_iterator end = mBanList.end(); |
1190 | output_stream << "\t\t{\n"; | 1194 | |
1191 | const LLAccessEntry& entry = (*cit).second; | 1195 | for ( ; cit != end; ++cit) |
1192 | entry.mID.toString(id_string); | 1196 | { |
1193 | output_stream << "\t\t\tid " << id_string << "\n"; | 1197 | output_stream << "\t\t{\n"; |
1194 | output_stream << "\t\t\ttime " << entry.mTime << "\n"; | 1198 | const LLAccessEntry& entry = (*cit).second; |
1195 | output_stream << "\t\t\tflags " << entry.mFlags << "\n"; | 1199 | entry.mID.toString(id_string); |
1196 | output_stream << "\t\t}\n"; | 1200 | output_stream << "\t\t\tid " << id_string << "\n"; |
1197 | } | 1201 | output_stream << "\t\t\ttime " << entry.mTime << "\n"; |
1198 | } | 1202 | output_stream << "\t\t\tflags " << entry.mFlags << "\n"; |
1199 | 1203 | output_stream << "\t\t}\n"; | |
1200 | /*if (mRenterList.count() > 0) | 1204 | } |
1201 | { | 1205 | } |
1202 | output_stream << "\t\t renter_list " << mRenterList.count() << "\n"; | 1206 | |
1203 | for (i = 0; i < mRenterList.count(); i++) | 1207 | /*if (mRenterList.count() > 0) |
1204 | { | 1208 | { |
1205 | output_stream << "\t\t{\n"; | 1209 | output_stream << "\t\t renter_list " << mRenterList.count() << "\n"; |
1206 | const LLAccessEntry& entry = mRenterList.get(i); | 1210 | for (i = 0; i < mRenterList.count(); i++) |
1207 | entry.mID.toString(id_string); | 1211 | { |
1208 | output_stream << "\t\t\tid " << id_string << "\n"; | 1212 | output_stream << "\t\t{\n"; |
1209 | output_stream << "\t\t\ttime " << entry.mTime << "\n"; | 1213 | const LLAccessEntry& entry = mRenterList.get(i); |
1210 | output_stream << "\t\t\tflags " << entry.mFlags << "\n"; | 1214 | entry.mID.toString(id_string); |
1211 | output_stream << "\t\t}\n"; | 1215 | output_stream << "\t\t\tid " << id_string << "\n"; |
1212 | } | 1216 | output_stream << "\t\t\ttime " << entry.mTime << "\n"; |
1213 | }*/ | 1217 | output_stream << "\t\t\tflags " << entry.mFlags << "\n"; |
1214 | 1218 | output_stream << "\t\t}\n"; | |
1215 | output_stream << "\t}\n"; | 1219 | } |
1216 | output_stream.flags(old_flags); | 1220 | }*/ |
1217 | 1221 | ||
1218 | return TRUE; | 1222 | output_stream << "\t}\n"; |
1223 | output_stream.flags(old_flags); | ||
1224 | |||
1225 | return TRUE; | ||
1219 | } | 1226 | } |
1220 | 1227 | ||
1221 | 1228 | ||
1222 | // Assumes we are in a block "ParcelData" | 1229 | // Assumes we are in a block "ParcelData" |
1223 | void LLParcel::packMessage(LLMessageSystem* msg) | 1230 | void LLParcel::packMessage(LLMessageSystem* msg) |
1224 | { | 1231 | { |
1225 | msg->addU32Fast( _PREHASH_ParcelFlags, getParcelFlags() ); | 1232 | msg->addU32Fast( _PREHASH_ParcelFlags, getParcelFlags() ); |
1226 | msg->addS32Fast( _PREHASH_SalePrice, getSalePrice() ); | 1233 | msg->addS32Fast( _PREHASH_SalePrice, getSalePrice() ); |
1227 | msg->addStringFast( _PREHASH_Name, getName() ); | 1234 | msg->addStringFast( _PREHASH_Name, getName() ); |
1228 | msg->addStringFast( _PREHASH_Desc, getDesc() ); | 1235 | msg->addStringFast( _PREHASH_Desc, getDesc() ); |
1229 | msg->addStringFast( _PREHASH_MusicURL, getMusicURL() ); | 1236 | msg->addStringFast( _PREHASH_MusicURL, getMusicURL() ); |
1230 | msg->addStringFast( _PREHASH_MediaURL, getMediaURL() ); | 1237 | msg->addStringFast( _PREHASH_MediaURL, getMediaURL() ); |
1231 | msg->addU8 ( "MediaAutoScale", getMediaAutoScale () ); | 1238 | msg->addU8 ( "MediaAutoScale", getMediaAutoScale () ); |
1232 | msg->addUUIDFast( _PREHASH_MediaID, getMediaID() ); | 1239 | msg->addUUIDFast( _PREHASH_MediaID, getMediaID() ); |
1233 | msg->addUUIDFast( _PREHASH_GroupID, getGroupID() ); | 1240 | msg->addUUIDFast( _PREHASH_GroupID, getGroupID() ); |
1234 | msg->addS32Fast( _PREHASH_PassPrice, mPassPrice ); | 1241 | msg->addS32Fast( _PREHASH_PassPrice, mPassPrice ); |
1235 | msg->addF32Fast( _PREHASH_PassHours, mPassHours ); | 1242 | msg->addF32Fast( _PREHASH_PassHours, mPassHours ); |
1236 | msg->addU8Fast( _PREHASH_Category, (U8)mCategory); | 1243 | msg->addU8Fast( _PREHASH_Category, (U8)mCategory); |
1237 | msg->addUUIDFast( _PREHASH_AuthBuyerID, mAuthBuyerID); | 1244 | msg->addUUIDFast( _PREHASH_AuthBuyerID, mAuthBuyerID); |
1238 | msg->addUUIDFast( _PREHASH_SnapshotID, mSnapshotID); | 1245 | msg->addUUIDFast( _PREHASH_SnapshotID, mSnapshotID); |
1239 | msg->addVector3Fast(_PREHASH_UserLocation, mUserLocation); | 1246 | msg->addVector3Fast(_PREHASH_UserLocation, mUserLocation); |
1240 | msg->addVector3Fast(_PREHASH_UserLookAt, mUserLookAt); | 1247 | msg->addVector3Fast(_PREHASH_UserLookAt, mUserLookAt); |
1241 | msg->addU8Fast( _PREHASH_LandingType, (U8)mLandingType); | 1248 | msg->addU8Fast( _PREHASH_LandingType, (U8)mLandingType); |
1242 | } | 1249 | } |
1243 | 1250 | ||
1244 | 1251 | ||
1245 | void LLParcel::unpackMessage(LLMessageSystem* msg) | 1252 | void LLParcel::unpackMessage(LLMessageSystem* msg) |
1246 | { | 1253 | { |
1247 | char buffer[256]; /* Flawfinder: ignore */ | 1254 | char buffer[256]; /* Flawfinder: ignore */ |
1248 | 1255 | ||
1249 | msg->getU32Fast( _PREHASH_ParcelData,_PREHASH_ParcelFlags, mParcelFlags ); | 1256 | msg->getU32Fast( _PREHASH_ParcelData,_PREHASH_ParcelFlags, mParcelFlags ); |
1250 | msg->getS32Fast( _PREHASH_ParcelData,_PREHASH_SalePrice, mSalePrice ); | 1257 | msg->getS32Fast( _PREHASH_ParcelData,_PREHASH_SalePrice, mSalePrice ); |
1251 | msg->getStringFast( _PREHASH_ParcelData,_PREHASH_Name, 256, buffer ); | 1258 | msg->getStringFast( _PREHASH_ParcelData,_PREHASH_Name, 256, buffer ); |
1252 | setName(buffer); | 1259 | setName(buffer); |
1253 | msg->getStringFast( _PREHASH_ParcelData,_PREHASH_Desc, 256, buffer ); | 1260 | msg->getStringFast( _PREHASH_ParcelData,_PREHASH_Desc, 256, buffer ); |
1254 | setDesc(buffer); | 1261 | setDesc(buffer); |
1255 | msg->getStringFast( _PREHASH_ParcelData,_PREHASH_MusicURL, 256, buffer ); | 1262 | msg->getStringFast( _PREHASH_ParcelData,_PREHASH_MusicURL, 256, buffer ); |
1256 | setMusicURL(buffer); | 1263 | setMusicURL(buffer); |
1257 | msg->getStringFast( _PREHASH_ParcelData,_PREHASH_MediaURL, 256, buffer ); | 1264 | msg->getStringFast( _PREHASH_ParcelData,_PREHASH_MediaURL, 256, buffer ); |
1258 | setMediaURL(buffer); | 1265 | setMediaURL(buffer); |
1259 | 1266 | ||
1260 | // non-optimized version | 1267 | // non-optimized version |
1261 | msg->getU8 ( "ParcelData", "MediaAutoScale", mMediaAutoScale ); | 1268 | msg->getU8 ( "ParcelData", "MediaAutoScale", mMediaAutoScale ); |
1262 | 1269 | ||
1263 | msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_MediaID, mMediaID ); | 1270 | msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_MediaID, mMediaID ); |
1264 | msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_GroupID, mGroupID ); | 1271 | msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_GroupID, mGroupID ); |
1265 | msg->getS32Fast( _PREHASH_ParcelData,_PREHASH_PassPrice, mPassPrice ); | 1272 | msg->getS32Fast( _PREHASH_ParcelData,_PREHASH_PassPrice, mPassPrice ); |
1266 | msg->getF32Fast( _PREHASH_ParcelData,_PREHASH_PassHours, mPassHours ); | 1273 | msg->getF32Fast( _PREHASH_ParcelData,_PREHASH_PassHours, mPassHours ); |
1267 | U8 category; | 1274 | U8 category; |
1268 | msg->getU8Fast( _PREHASH_ParcelData,_PREHASH_Category, category); | 1275 | msg->getU8Fast( _PREHASH_ParcelData,_PREHASH_Category, category); |
1269 | mCategory = (ECategory)category; | 1276 | mCategory = (ECategory)category; |
1270 | msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_AuthBuyerID, mAuthBuyerID); | 1277 | msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_AuthBuyerID, mAuthBuyerID); |
1271 | msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_SnapshotID, mSnapshotID); | 1278 | msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_SnapshotID, mSnapshotID); |
1272 | msg->getVector3Fast(_PREHASH_ParcelData,_PREHASH_UserLocation, mUserLocation); | 1279 | msg->getVector3Fast(_PREHASH_ParcelData,_PREHASH_UserLocation, mUserLocation); |
1273 | msg->getVector3Fast(_PREHASH_ParcelData,_PREHASH_UserLookAt, mUserLookAt); | 1280 | msg->getVector3Fast(_PREHASH_ParcelData,_PREHASH_UserLookAt, mUserLookAt); |
1274 | U8 landing_type; | 1281 | U8 landing_type; |
1275 | msg->getU8Fast( _PREHASH_ParcelData,_PREHASH_LandingType, landing_type); | 1282 | msg->getU8Fast( _PREHASH_ParcelData,_PREHASH_LandingType, landing_type); |
1276 | mLandingType = (ELandingType)landing_type; | 1283 | mLandingType = (ELandingType)landing_type; |
1277 | } | 1284 | } |
1278 | 1285 | ||
1279 | 1286 | ||
1280 | void LLParcel::packAccessEntries(LLMessageSystem* msg, | 1287 | void LLParcel::packAccessEntries(LLMessageSystem* msg, |
1281 | const std::map<LLUUID,LLAccessEntry>& list) | 1288 | const std::map<LLUUID,LLAccessEntry>& list) |
1282 | { | 1289 | { |
1283 | access_map_const_iterator cit = list.begin(); | 1290 | access_map_const_iterator cit = list.begin(); |
1284 | access_map_const_iterator end = list.end(); | 1291 | access_map_const_iterator end = list.end(); |
1285 | 1292 | ||
1286 | if (cit == end) | 1293 | if (cit == end) |
1287 | { | 1294 | { |
1288 | msg->nextBlockFast(_PREHASH_List); | 1295 | msg->nextBlockFast(_PREHASH_List); |
1289 | msg->addUUIDFast(_PREHASH_ID, LLUUID::null ); | 1296 | msg->addUUIDFast(_PREHASH_ID, LLUUID::null ); |
1290 | msg->addS32Fast(_PREHASH_Time, 0 ); | 1297 | msg->addS32Fast(_PREHASH_Time, 0 ); |
1291 | msg->addU32Fast(_PREHASH_Flags, 0 ); | 1298 | msg->addU32Fast(_PREHASH_Flags, 0 ); |
1292 | return; | 1299 | return; |
1293 | } | 1300 | } |
1294 | 1301 | ||
1295 | for ( ; cit != end; ++cit) | 1302 | for ( ; cit != end; ++cit) |
1296 | { | 1303 | { |
1297 | const LLAccessEntry& entry = (*cit).second; | 1304 | const LLAccessEntry& entry = (*cit).second; |
1298 | 1305 | ||
1299 | msg->nextBlockFast(_PREHASH_List); | 1306 | msg->nextBlockFast(_PREHASH_List); |
1300 | msg->addUUIDFast(_PREHASH_ID, entry.mID ); | 1307 | msg->addUUIDFast(_PREHASH_ID, entry.mID ); |
1301 | msg->addS32Fast(_PREHASH_Time, entry.mTime ); | 1308 | msg->addS32Fast(_PREHASH_Time, entry.mTime ); |
1302 | msg->addU32Fast(_PREHASH_Flags, entry.mFlags ); | 1309 | msg->addU32Fast(_PREHASH_Flags, entry.mFlags ); |
1303 | } | 1310 | } |
1304 | } | 1311 | } |
1305 | 1312 | ||
1306 | 1313 | ||
1307 | void LLParcel::unpackAccessEntries(LLMessageSystem* msg, | 1314 | void LLParcel::unpackAccessEntries(LLMessageSystem* msg, |
1308 | std::map<LLUUID,LLAccessEntry>* list) | 1315 | std::map<LLUUID,LLAccessEntry>* list) |
1309 | { | 1316 | { |
1310 | LLUUID id; | 1317 | LLUUID id; |
1311 | S32 time; | 1318 | S32 time; |
1312 | U32 flags; | 1319 | U32 flags; |
1313 | 1320 | ||
1314 | S32 i; | 1321 | S32 i; |
1315 | S32 count = msg->getNumberOfBlocksFast(_PREHASH_List); | 1322 | S32 count = msg->getNumberOfBlocksFast(_PREHASH_List); |
1316 | for (i = 0; i < count; i++) | 1323 | for (i = 0; i < count; i++) |
1317 | { | 1324 | { |
1318 | msg->getUUIDFast(_PREHASH_List, _PREHASH_ID, id, i); | 1325 | msg->getUUIDFast(_PREHASH_List, _PREHASH_ID, id, i); |
1319 | msg->getS32Fast( _PREHASH_List, _PREHASH_Time, time, i); | 1326 | msg->getS32Fast( _PREHASH_List, _PREHASH_Time, time, i); |
1320 | msg->getU32Fast( _PREHASH_List, _PREHASH_Flags, flags, i); | 1327 | msg->getU32Fast( _PREHASH_List, _PREHASH_Flags, flags, i); |
1321 | 1328 | ||
1322 | if (id.notNull()) | 1329 | if (id.notNull()) |
1323 | { | 1330 | { |
1324 | LLAccessEntry entry; | 1331 | LLAccessEntry entry; |
1325 | entry.mID = id; | 1332 | entry.mID = id; |
1326 | entry.mTime = time; | 1333 | entry.mTime = time; |
1327 | entry.mFlags = flags; | 1334 | entry.mFlags = flags; |
1328 | 1335 | ||
1329 | (*list)[entry.mID] = entry; | 1336 | (*list)[entry.mID] = entry; |
1330 | } | 1337 | } |
1331 | } | 1338 | } |
1332 | } | 1339 | } |
1333 | 1340 | ||
1334 | 1341 | ||
1335 | void LLParcel::expirePasses(S32 now) | 1342 | void LLParcel::expirePasses(S32 now) |
1336 | { | 1343 | { |
1337 | access_map_iterator itor = mAccessList.begin(); | 1344 | access_map_iterator itor = mAccessList.begin(); |
1338 | while (itor != mAccessList.end()) | 1345 | while (itor != mAccessList.end()) |
1339 | { | 1346 | { |
1340 | const LLAccessEntry& entry = (*itor).second; | 1347 | const LLAccessEntry& entry = (*itor).second; |
1341 | 1348 | ||
1342 | if (entry.mTime != 0 && entry.mTime < now) | 1349 | if (entry.mTime != 0 && entry.mTime < now) |
1343 | { | 1350 | { |
1344 | mAccessList.erase(itor++); | 1351 | mAccessList.erase(itor++); |
1345 | } | 1352 | } |
1346 | else | 1353 | else |
1347 | { | 1354 | { |
1348 | ++itor; | 1355 | ++itor; |
1349 | } | 1356 | } |
1350 | } | 1357 | } |
1351 | } | 1358 | } |
1352 | 1359 | ||
1353 | 1360 | ||
1354 | bool LLParcel::operator==(const LLParcel &rhs) const | 1361 | bool LLParcel::operator==(const LLParcel &rhs) const |
1355 | { | 1362 | { |
1356 | if (mOwnerID != rhs.mOwnerID) | 1363 | if (mOwnerID != rhs.mOwnerID) |
1357 | return FALSE; | 1364 | return FALSE; |
1358 | 1365 | ||
1359 | if (mParcelFlags != rhs.mParcelFlags) | 1366 | if (mParcelFlags != rhs.mParcelFlags) |
1360 | return FALSE; | 1367 | return FALSE; |
1361 | 1368 | ||
1362 | if (mClaimDate != rhs.mClaimDate) | 1369 | if (mClaimDate != rhs.mClaimDate) |
1363 | return FALSE; | 1370 | return FALSE; |
1364 | 1371 | ||
1365 | if (mClaimPricePerMeter != rhs.mClaimPricePerMeter) | 1372 | if (mClaimPricePerMeter != rhs.mClaimPricePerMeter) |
1366 | return FALSE; | 1373 | return FALSE; |
1367 | 1374 | ||
1368 | if (mRentPricePerMeter != rhs.mRentPricePerMeter) | 1375 | if (mRentPricePerMeter != rhs.mRentPricePerMeter) |
1369 | return FALSE; | 1376 | return FALSE; |
1370 | 1377 | ||
1371 | return TRUE; | 1378 | return TRUE; |
1372 | } | 1379 | } |
1373 | 1380 | ||
1374 | // Calculate rent | 1381 | // Calculate rent |
1375 | S32 LLParcel::getTotalRent() const | 1382 | S32 LLParcel::getTotalRent() const |
1376 | { | 1383 | { |
1377 | return (S32)floor(0.5f + (F32)mArea * (F32)mRentPricePerMeter * (1.0f - mDiscountRate)); | 1384 | return (S32)floor(0.5f + (F32)mArea * (F32)mRentPricePerMeter * (1.0f - mDiscountRate)); |
1378 | } | 1385 | } |
1379 | 1386 | ||
1380 | F32 LLParcel::getAdjustedRentPerMeter() const | 1387 | F32 LLParcel::getAdjustedRentPerMeter() const |
1381 | { | 1388 | { |
1382 | return ((F32)mRentPricePerMeter * (1.0f - mDiscountRate)); | 1389 | return ((F32)mRentPricePerMeter * (1.0f - mDiscountRate)); |
1383 | } | 1390 | } |
1384 | 1391 | ||
1385 | LLVector3 LLParcel::getCenterpoint() const | 1392 | LLVector3 LLParcel::getCenterpoint() const |
1386 | { | 1393 | { |
1387 | LLVector3 rv; | 1394 | LLVector3 rv; |
1388 | rv.mV[VX] = (getAABBMin().mV[VX] + getAABBMax().mV[VX]) * 0.5f; | 1395 | rv.mV[VX] = (getAABBMin().mV[VX] + getAABBMax().mV[VX]) * 0.5f; |
1389 | rv.mV[VY] = (getAABBMin().mV[VY] + getAABBMax().mV[VY]) * 0.5f; | 1396 | rv.mV[VY] = (getAABBMin().mV[VY] + getAABBMax().mV[VY]) * 0.5f; |
1390 | rv.mV[VZ] = 0.0f; | 1397 | rv.mV[VZ] = 0.0f; |
1391 | return rv; | 1398 | return rv; |
1392 | } | 1399 | } |
1393 | 1400 | ||
1394 | void LLParcel::extendAABB(const LLVector3& box_min, const LLVector3& box_max) | 1401 | void LLParcel::extendAABB(const LLVector3& box_min, const LLVector3& box_max) |
1395 | { | 1402 | { |
1396 | // Patch up min corner of AABB | 1403 | // Patch up min corner of AABB |
1397 | S32 i; | 1404 | S32 i; |
1398 | for (i=0; i<3; i++) | 1405 | for (i=0; i<3; i++) |
1399 | { | 1406 | { |
1400 | if (box_min.mV[i] < mAABBMin.mV[i]) | 1407 | if (box_min.mV[i] < mAABBMin.mV[i]) |
1401 | { | 1408 | { |
1402 | mAABBMin.mV[i] = box_min.mV[i]; | 1409 | mAABBMin.mV[i] = box_min.mV[i]; |
1403 | } | 1410 | } |
1404 | } | 1411 | } |
1405 | 1412 | ||
1406 | // Patch up max corner of AABB | 1413 | // Patch up max corner of AABB |
1407 | for (i=0; i<3; i++) | 1414 | for (i=0; i<3; i++) |
1408 | { | 1415 | { |
1409 | if (box_max.mV[i] > mAABBMax.mV[i]) | 1416 | if (box_max.mV[i] > mAABBMax.mV[i]) |
1410 | { | 1417 | { |
1411 | mAABBMax.mV[i] = box_max.mV[i]; | 1418 | mAABBMax.mV[i] = box_max.mV[i]; |
1412 | } | 1419 | } |
1413 | } | 1420 | } |
1414 | } | 1421 | } |
1415 | 1422 | ||
1416 | BOOL LLParcel::addToAccessList(const LLUUID& agent_id, S32 time) | 1423 | BOOL LLParcel::addToAccessList(const LLUUID& agent_id, S32 time) |
1417 | { | 1424 | { |
1418 | if (!((mParcelFlags & PF_USE_ACCESS_LIST) || (mParcelFlags & PF_USE_PASS_LIST)) | 1425 | if (mAccessList.size() >= (U32) PARCEL_MAX_ACCESS_LIST) |
1419 | || mAccessList.size() >= (U32) PARCEL_MAX_ACCESS_LIST) | ||
1420 | { | 1426 | { |
1421 | // Not using access list, so not a rational thing to do | ||
1422 | return FALSE; | 1427 | return FALSE; |
1423 | } | 1428 | } |
1424 | if (agent_id == getOwnerID()) | 1429 | if (agent_id == getOwnerID()) |
@@ -1447,21 +1452,20 @@ BOOL LLParcel::addToAccessList(const LLUUID& agent_id, S32 time) | |||
1447 | ++itor; | 1452 | ++itor; |
1448 | } | 1453 | } |
1449 | } | 1454 | } |
1450 | 1455 | ||
1451 | removeFromBanList(agent_id); | 1456 | removeFromBanList(agent_id); |
1452 | 1457 | ||
1453 | LLAccessEntry new_entry; | 1458 | LLAccessEntry new_entry; |
1454 | new_entry.mID = agent_id; | 1459 | new_entry.mID = agent_id; |
1455 | new_entry.mTime = time; | 1460 | new_entry.mTime = time; |
1456 | new_entry.mFlags = 0x0; | 1461 | new_entry.mFlags = 0x0; |
1457 | mAccessList[new_entry.mID] = new_entry; | 1462 | mAccessList[new_entry.mID] = new_entry; |
1458 | return TRUE; | 1463 | return TRUE; |
1459 | } | 1464 | } |
1460 | 1465 | ||
1461 | BOOL LLParcel::addToBanList(const LLUUID& agent_id, S32 time) | 1466 | BOOL LLParcel::addToBanList(const LLUUID& agent_id, S32 time) |
1462 | { | 1467 | { |
1463 | if (!(mParcelFlags & PF_USE_BAN_LIST) | 1468 | if (mBanList.size() >= (U32) PARCEL_MAX_ACCESS_LIST) |
1464 | || mBanList.size() >= (U32) PARCEL_MAX_ACCESS_LIST) | ||
1465 | { | 1469 | { |
1466 | // Not using ban list, so not a rational thing to do | 1470 | // Not using ban list, so not a rational thing to do |
1467 | return FALSE; | 1471 | return FALSE; |
@@ -1471,127 +1475,127 @@ BOOL LLParcel::addToBanList(const LLUUID& agent_id, S32 time) | |||
1471 | // Can't add owner to these lists | 1475 | // Can't add owner to these lists |
1472 | return FALSE; | 1476 | return FALSE; |
1473 | } | 1477 | } |
1474 | 1478 | ||
1475 | access_map_iterator itor = mBanList.begin(); | 1479 | access_map_iterator itor = mBanList.begin(); |
1476 | while (itor != mBanList.end()) | 1480 | while (itor != mBanList.end()) |
1477 | { | 1481 | { |
1478 | const LLAccessEntry& entry = (*itor).second; | 1482 | const LLAccessEntry& entry = (*itor).second; |
1479 | if (entry.mID == agent_id) | 1483 | if (entry.mID == agent_id) |
1480 | { | 1484 | { |
1481 | if (time == 0 || (entry.mTime != 0 && entry.mTime < time)) | 1485 | if (time == 0 || (entry.mTime != 0 && entry.mTime < time)) |
1482 | { | 1486 | { |
1483 | mBanList.erase(itor++); | 1487 | mBanList.erase(itor++); |
1484 | } | 1488 | } |
1485 | else | 1489 | else |
1486 | { | 1490 | { |
1487 | // existing one expires later | 1491 | // existing one expires later |
1488 | return FALSE; | 1492 | return FALSE; |
1489 | } | 1493 | } |
1490 | } | 1494 | } |
1491 | else | 1495 | else |
1492 | { | 1496 | { |
1493 | ++itor; | 1497 | ++itor; |
1494 | } | 1498 | } |
1495 | } | 1499 | } |
1496 | 1500 | ||
1497 | removeFromAccessList(agent_id); | 1501 | removeFromAccessList(agent_id); |
1498 | 1502 | ||
1499 | LLAccessEntry new_entry; | 1503 | LLAccessEntry new_entry; |
1500 | new_entry.mID = agent_id; | 1504 | new_entry.mID = agent_id; |
1501 | new_entry.mTime = time; | 1505 | new_entry.mTime = time; |
1502 | new_entry.mFlags = 0x0; | 1506 | new_entry.mFlags = 0x0; |
1503 | mBanList[new_entry.mID] = new_entry; | 1507 | mBanList[new_entry.mID] = new_entry; |
1504 | return TRUE; | 1508 | return TRUE; |
1505 | } | 1509 | } |
1506 | 1510 | ||
1507 | BOOL remove_from_access_array(std::map<LLUUID,LLAccessEntry>* list, | 1511 | BOOL remove_from_access_array(std::map<LLUUID,LLAccessEntry>* list, |
1508 | const LLUUID& agent_id) | 1512 | const LLUUID& agent_id) |
1509 | { | 1513 | { |
1510 | BOOL removed = FALSE; | 1514 | BOOL removed = FALSE; |
1511 | access_map_iterator itor = list->begin(); | 1515 | access_map_iterator itor = list->begin(); |
1512 | while (itor != list->end()) | 1516 | while (itor != list->end()) |
1513 | { | 1517 | { |
1514 | const LLAccessEntry& entry = (*itor).second; | 1518 | const LLAccessEntry& entry = (*itor).second; |
1515 | if (entry.mID == agent_id) | 1519 | if (entry.mID == agent_id) |
1516 | { | 1520 | { |
1517 | list->erase(itor++); | 1521 | list->erase(itor++); |
1518 | removed = TRUE; | 1522 | removed = TRUE; |
1519 | } | 1523 | } |
1520 | else | 1524 | else |
1521 | { | 1525 | { |
1522 | ++itor; | 1526 | ++itor; |
1523 | } | 1527 | } |
1524 | } | 1528 | } |
1525 | return removed; | 1529 | return removed; |
1526 | } | 1530 | } |
1527 | 1531 | ||
1528 | BOOL LLParcel::removeFromAccessList(const LLUUID& agent_id) | 1532 | BOOL LLParcel::removeFromAccessList(const LLUUID& agent_id) |
1529 | { | 1533 | { |
1530 | return remove_from_access_array(&mAccessList, agent_id); | 1534 | return remove_from_access_array(&mAccessList, agent_id); |
1531 | } | 1535 | } |
1532 | 1536 | ||
1533 | BOOL LLParcel::removeFromBanList(const LLUUID& agent_id) | 1537 | BOOL LLParcel::removeFromBanList(const LLUUID& agent_id) |
1534 | { | 1538 | { |
1535 | return remove_from_access_array(&mBanList, agent_id); | 1539 | return remove_from_access_array(&mBanList, agent_id); |
1536 | } | 1540 | } |
1537 | 1541 | ||
1538 | // static | 1542 | // static |
1539 | const char* LLParcel::getOwnershipStatusString(EOwnershipStatus status) | 1543 | const char* LLParcel::getOwnershipStatusString(EOwnershipStatus status) |
1540 | { | 1544 | { |
1541 | return ownership_status_to_string(status); | 1545 | return ownership_status_to_string(status); |
1542 | } | 1546 | } |
1543 | 1547 | ||
1544 | // static | 1548 | // static |
1545 | const char* LLParcel::getCategoryString(ECategory category) | 1549 | const char* LLParcel::getCategoryString(ECategory category) |
1546 | { | 1550 | { |
1547 | return category_to_string(category); | 1551 | return category_to_string(category); |
1548 | } | 1552 | } |
1549 | 1553 | ||
1550 | // static | 1554 | // static |
1551 | const char* LLParcel::getCategoryUIString(ECategory category) | 1555 | const char* LLParcel::getCategoryUIString(ECategory category) |
1552 | { | 1556 | { |
1553 | return category_to_ui_string(category); | 1557 | return category_to_ui_string(category); |
1554 | } | 1558 | } |
1555 | 1559 | ||
1556 | // static | 1560 | // static |
1557 | LLParcel::ECategory LLParcel::getCategoryFromString(const char* string) | 1561 | LLParcel::ECategory LLParcel::getCategoryFromString(const char* string) |
1558 | { | 1562 | { |
1559 | return category_string_to_category(string); | 1563 | return category_string_to_category(string); |
1560 | } | 1564 | } |
1561 | 1565 | ||
1562 | // static | 1566 | // static |
1563 | LLParcel::ECategory LLParcel::getCategoryFromUIString(const char* string) | 1567 | LLParcel::ECategory LLParcel::getCategoryFromUIString(const char* string) |
1564 | { | 1568 | { |
1565 | return category_ui_string_to_category(string); | 1569 | return category_ui_string_to_category(string); |
1566 | } | 1570 | } |
1567 | 1571 | ||
1568 | // static | 1572 | // static |
1569 | const char* LLParcel::getActionString(LLParcel::EAction action) | 1573 | const char* LLParcel::getActionString(LLParcel::EAction action) |
1570 | { | 1574 | { |
1571 | S32 index = 0; | 1575 | S32 index = 0; |
1572 | if((action >= 0) && (action < LLParcel::A_COUNT)) | 1576 | if((action >= 0) && (action < LLParcel::A_COUNT)) |
1573 | { | 1577 | { |
1574 | index = action; | 1578 | index = action; |
1575 | } | 1579 | } |
1576 | else | 1580 | else |
1577 | { | 1581 | { |
1578 | index = A_COUNT; | 1582 | index = A_COUNT; |
1579 | } | 1583 | } |
1580 | return PARCEL_ACTION_STRING[index]; | 1584 | return PARCEL_ACTION_STRING[index]; |
1581 | } | 1585 | } |
1582 | 1586 | ||
1583 | BOOL LLParcel::isSaleTimerExpired(const U64& time) | 1587 | BOOL LLParcel::isSaleTimerExpired(const U64& time) |
1584 | { | 1588 | { |
1585 | if (mSaleTimerExpires.getStarted() == FALSE) | 1589 | if (mSaleTimerExpires.getStarted() == FALSE) |
1586 | { | 1590 | { |
1587 | return FALSE; | 1591 | return FALSE; |
1588 | } | 1592 | } |
1589 | BOOL expired = mSaleTimerExpires.checkExpirationAndReset(0.0); | 1593 | BOOL expired = mSaleTimerExpires.checkExpirationAndReset(0.0); |
1590 | if (expired) | 1594 | if (expired) |
1591 | { | 1595 | { |
1592 | mSaleTimerExpires.stop(); | 1596 | mSaleTimerExpires.stop(); |
1593 | } | 1597 | } |
1594 | return expired; | 1598 | return expired; |
1595 | } | 1599 | } |
1596 | 1600 | ||
1597 | 1601 | ||
@@ -1623,22 +1627,22 @@ void LLParcel::startSale(const LLUUID& buyer_id, BOOL is_buyer_group) | |||
1623 | 1627 | ||
1624 | void LLParcel::expireSale(U32& type, U8& flags, LLUUID& from_id, LLUUID& to_id) | 1628 | void LLParcel::expireSale(U32& type, U8& flags, LLUUID& from_id, LLUUID& to_id) |
1625 | { | 1629 | { |
1626 | mSaleTimerExpires.setTimerExpirySec(0.0); | 1630 | mSaleTimerExpires.setTimerExpirySec(0.0); |
1627 | mSaleTimerExpires.stop(); | 1631 | mSaleTimerExpires.stop(); |
1628 | setPreviousOwnerID(LLUUID::null); | 1632 | setPreviousOwnerID(LLUUID::null); |
1629 | setPreviouslyGroupOwned(FALSE); | 1633 | setPreviouslyGroupOwned(FALSE); |
1630 | setSellWithObjects(FALSE); | 1634 | setSellWithObjects(FALSE); |
1631 | type = TRANS_LAND_RELEASE; | 1635 | type = TRANS_LAND_RELEASE; |
1632 | mStatus = OS_NONE; | 1636 | mStatus = OS_NONE; |
1633 | flags = pack_transaction_flags(mGroupOwned, FALSE); | 1637 | flags = pack_transaction_flags(mGroupOwned, FALSE); |
1634 | mAuthBuyerID.setNull(); | 1638 | mAuthBuyerID.setNull(); |
1635 | from_id = mOwnerID; | 1639 | from_id = mOwnerID; |
1636 | mOwnerID.setNull(); | 1640 | mOwnerID.setNull(); |
1637 | to_id.setNull(); | 1641 | to_id.setNull(); |
1638 | } | 1642 | } |
1639 | 1643 | ||
1640 | void LLParcel::completeSale(U32& type, U8& flags, | 1644 | void LLParcel::completeSale(U32& type, U8& flags, |
1641 | LLUUID& to_id) | 1645 | LLUUID& to_id) |
1642 | { | 1646 | { |
1643 | mSaleTimerExpires.setTimerExpirySec(0.0); | 1647 | mSaleTimerExpires.setTimerExpirySec(0.0); |
1644 | mSaleTimerExpires.stop(); | 1648 | mSaleTimerExpires.stop(); |
@@ -1660,7 +1664,6 @@ void LLParcel::completeSale(U32& type, U8& flags, | |||
1660 | //should be cleared on sale. | 1664 | //should be cleared on sale. |
1661 | mAccessList.clear(); | 1665 | mAccessList.clear(); |
1662 | mBanList.clear(); | 1666 | mBanList.clear(); |
1663 | |||
1664 | } | 1667 | } |
1665 | 1668 | ||
1666 | void LLParcel::clearSale() | 1669 | void LLParcel::clearSale() |
@@ -1685,143 +1688,144 @@ void LLParcel::clearSale() | |||
1685 | 1688 | ||
1686 | BOOL LLParcel::isPublic() const | 1689 | BOOL LLParcel::isPublic() const |
1687 | { | 1690 | { |
1688 | return (mOwnerID.isNull()); | 1691 | return (mOwnerID.isNull()); |
1689 | } | 1692 | } |
1690 | 1693 | ||
1691 | BOOL LLParcel::isBuyerAuthorized(const LLUUID& buyer_id) const | 1694 | BOOL LLParcel::isBuyerAuthorized(const LLUUID& buyer_id) const |
1692 | { | 1695 | { |
1693 | if(mAuthBuyerID.isNull()) | 1696 | if(mAuthBuyerID.isNull()) |
1694 | { | 1697 | { |
1695 | return TRUE; | 1698 | return TRUE; |
1696 | } | 1699 | } |
1697 | return (mAuthBuyerID == buyer_id); | 1700 | return (mAuthBuyerID == buyer_id); |
1698 | } | 1701 | } |
1699 | 1702 | ||
1700 | void LLParcel::clearParcel() | 1703 | void LLParcel::clearParcel() |
1701 | { | 1704 | { |
1702 | overrideParcelFlags(PF_DEFAULT); | 1705 | overrideParcelFlags(PF_DEFAULT); |
1703 | setName(NULL); | 1706 | setName(NULL); |
1704 | setDesc(NULL); | 1707 | setDesc(NULL); |
1705 | setMusicURL(NULL); | 1708 | setMusicURL(NULL); |
1706 | setMediaURL(NULL); | 1709 | setMediaURL(NULL); |
1707 | setMediaID(LLUUID::null); | 1710 | setMediaID(LLUUID::null); |
1708 | setMediaAutoScale(0); | 1711 | setMediaAutoScale(0); |
1709 | setInEscrow(FALSE); | 1712 | setInEscrow(FALSE); |
1710 | setAuthorizedBuyerID(LLUUID::null); | 1713 | setAuthorizedBuyerID(LLUUID::null); |
1711 | setCategory(C_NONE); | 1714 | setCategory(C_NONE); |
1712 | setSnapshotID(LLUUID::null); | 1715 | setSnapshotID(LLUUID::null); |
1713 | setUserLocation(LLVector3::zero); | 1716 | setUserLocation(LLVector3::zero); |
1714 | setUserLookAt(LLVector3::x_axis); | 1717 | setUserLookAt(LLVector3::x_axis); |
1715 | setLandingType(L_LANDING_POINT); | 1718 | setLandingType(L_LANDING_POINT); |
1716 | setAuctionID(0); | 1719 | setAuctionID(0); |
1717 | setGroupID(LLUUID::null); | 1720 | setGroupID(LLUUID::null); |
1718 | setPassPrice(0); | 1721 | setPassPrice(0); |
1719 | setPassHours(0.f); | 1722 | setPassHours(0.f); |
1720 | mAccessList.clear(); | 1723 | mAccessList.clear(); |
1721 | mBanList.clear(); | 1724 | mBanList.clear(); |
1722 | //mRenterList.reset(); | 1725 | //mRenterList.reset(); |
1723 | } | 1726 | } |
1724 | 1727 | ||
1725 | void LLParcel::dump() | 1728 | void LLParcel::dump() |
1726 | { | 1729 | { |
1727 | llinfos << "parcel " << mLocalID << " area " << mArea << llendl; | 1730 | llinfos << "parcel " << mLocalID << " area " << mArea << llendl; |
1728 | llinfos << " name <" << mName << ">" << llendl; | 1731 | llinfos << " name <" << mName << ">" << llendl; |
1729 | llinfos << " desc <" << mDesc << ">" << llendl; | 1732 | llinfos << " desc <" << mDesc << ">" << llendl; |
1730 | } | 1733 | } |
1731 | 1734 | ||
1732 | const char* ownership_status_to_string(LLParcel::EOwnershipStatus status) | 1735 | const char* ownership_status_to_string(LLParcel::EOwnershipStatus status) |
1733 | { | 1736 | { |
1734 | if(status >= 0 && status < LLParcel::OS_COUNT) | 1737 | if(status >= 0 && status < LLParcel::OS_COUNT) |
1735 | { | 1738 | { |
1736 | return PARCEL_OWNERSHIP_STATUS_STRING[status]; | 1739 | return PARCEL_OWNERSHIP_STATUS_STRING[status]; |
1737 | } | 1740 | } |
1738 | return "none"; | 1741 | return "none"; |
1739 | } | 1742 | } |
1740 | 1743 | ||
1741 | LLParcel::EOwnershipStatus ownership_string_to_status(const char* s) | 1744 | LLParcel::EOwnershipStatus ownership_string_to_status(const char* s) |
1742 | { | 1745 | { |
1743 | for(S32 i = 0; i < LLParcel::OS_COUNT; ++i) | 1746 | for(S32 i = 0; i < LLParcel::OS_COUNT; ++i) |
1744 | { | 1747 | { |
1745 | if(0 == strcmp(s, PARCEL_OWNERSHIP_STATUS_STRING[i])) | 1748 | if(0 == strcmp(s, PARCEL_OWNERSHIP_STATUS_STRING[i])) |
1746 | { | 1749 | { |
1747 | return (LLParcel::EOwnershipStatus)i; | 1750 | return (LLParcel::EOwnershipStatus)i; |
1748 | } | 1751 | } |
1749 | } | 1752 | } |
1750 | return LLParcel::OS_NONE; | 1753 | return LLParcel::OS_NONE; |
1751 | } | 1754 | } |
1752 | 1755 | ||
1753 | //const char* revert_action_to_string(LLParcel::ESaleTimerExpireAction action) | 1756 | //const char* revert_action_to_string(LLParcel::ESaleTimerExpireAction action) |
1754 | //{ | 1757 | //{ |
1755 | // S32 index = 0; | 1758 | // S32 index = 0; |
1756 | // if(action >= 0 && action < LLParcel::STEA_COUNT) | 1759 | // if(action >= 0 && action < LLParcel::STEA_COUNT) |
1757 | // { | 1760 | // { |
1758 | // index = action; | 1761 | // index = action; |
1759 | // } | 1762 | // } |
1760 | // return PARCEL_SALE_TIMER_ACTION[index]; | 1763 | // return PARCEL_SALE_TIMER_ACTION[index]; |
1761 | //} | 1764 | //} |
1762 | 1765 | ||
1763 | //LLParcel::ESaleTimerExpireAction revert_string_to_action(const char* s) | 1766 | //LLParcel::ESaleTimerExpireAction revert_string_to_action(const char* s) |
1764 | //{ | 1767 | //{ |
1765 | // for(S32 i = 0; i < LLParcel::STEA_COUNT; ++i) | 1768 | // for(S32 i = 0; i < LLParcel::STEA_COUNT; ++i) |
1766 | // { | 1769 | // { |
1767 | // if(0 == strcmp(s, PARCEL_SALE_TIMER_ACTION[i])) | 1770 | // if(0 == strcmp(s, PARCEL_SALE_TIMER_ACTION[i])) |
1768 | // { | 1771 | // { |
1769 | // return (LLParcel::ESaleTimerExpireAction)i; | 1772 | // return (LLParcel::ESaleTimerExpireAction)i; |
1770 | // } | 1773 | // } |
1771 | // } | 1774 | // } |
1772 | // return LLParcel::STEA_REVERT; | 1775 | // return LLParcel::STEA_REVERT; |
1773 | //} | 1776 | //} |
1774 | 1777 | ||
1775 | const char* category_to_string(LLParcel::ECategory category) | 1778 | const char* category_to_string(LLParcel::ECategory category) |
1776 | { | 1779 | { |
1777 | S32 index = 0; | 1780 | S32 index = 0; |
1778 | if((category >= 0) && (category < LLParcel::C_COUNT)) | 1781 | if((category >= 0) && (category < LLParcel::C_COUNT)) |
1779 | { | 1782 | { |
1780 | index = category; | 1783 | index = category; |
1781 | } | 1784 | } |
1782 | return PARCEL_CATEGORY_STRING[index]; | 1785 | return PARCEL_CATEGORY_STRING[index]; |
1783 | } | 1786 | } |
1784 | 1787 | ||
1785 | const char* category_to_ui_string(LLParcel::ECategory category) | 1788 | const char* category_to_ui_string(LLParcel::ECategory category) |
1786 | { | 1789 | { |
1787 | S32 index = 0; | 1790 | S32 index = 0; |
1788 | if((category >= 0) && (category < LLParcel::C_COUNT)) | 1791 | if((category >= 0) && (category < LLParcel::C_COUNT)) |
1789 | { | 1792 | { |
1790 | index = category; | 1793 | index = category; |
1791 | } | 1794 | } |
1792 | else | 1795 | else |
1793 | { | 1796 | { |
1794 | // C_ANY = -1 , but the "Any" string is at the end of the list | 1797 | // C_ANY = -1 , but the "Any" string is at the end of the list |
1795 | index = ((S32) LLParcel::C_COUNT); | 1798 | index = ((S32) LLParcel::C_COUNT); |
1796 | } | 1799 | } |
1797 | return PARCEL_CATEGORY_UI_STRING[index]; | 1800 | return PARCEL_CATEGORY_UI_STRING[index]; |
1798 | } | 1801 | } |
1799 | 1802 | ||
1800 | LLParcel::ECategory category_string_to_category(const char* s) | 1803 | LLParcel::ECategory category_string_to_category(const char* s) |
1801 | { | 1804 | { |
1802 | for(S32 i = 0; i < LLParcel::C_COUNT; ++i) | 1805 | for(S32 i = 0; i < LLParcel::C_COUNT; ++i) |
1803 | { | 1806 | { |
1804 | if(0 == strcmp(s, PARCEL_CATEGORY_STRING[i])) | 1807 | if(0 == strcmp(s, PARCEL_CATEGORY_STRING[i])) |
1805 | { | 1808 | { |
1806 | return (LLParcel::ECategory)i; | 1809 | return (LLParcel::ECategory)i; |
1807 | } | 1810 | } |
1808 | } | 1811 | } |
1809 | llwarns << "Parcel category outside of possibilities " << s << llendl; | 1812 | llwarns << "Parcel category outside of possibilities " << s << llendl; |
1810 | return LLParcel::C_NONE; | 1813 | return LLParcel::C_NONE; |
1811 | } | 1814 | } |
1812 | 1815 | ||
1813 | LLParcel::ECategory category_ui_string_to_category(const char* s) | 1816 | LLParcel::ECategory category_ui_string_to_category(const char* s) |
1814 | { | 1817 | { |
1815 | for(S32 i = 0; i < LLParcel::C_COUNT; ++i) | 1818 | for(S32 i = 0; i < LLParcel::C_COUNT; ++i) |
1816 | { | 1819 | { |
1817 | if(0 == strcmp(s, PARCEL_CATEGORY_UI_STRING[i])) | 1820 | if(0 == strcmp(s, PARCEL_CATEGORY_UI_STRING[i])) |
1818 | { | 1821 | { |
1819 | return (LLParcel::ECategory)i; | 1822 | return (LLParcel::ECategory)i; |
1820 | } | 1823 | } |
1821 | } | 1824 | } |
1822 | // "Any" is a valid category for searches, and | 1825 | // "Any" is a valid category for searches, and |
1823 | // is a distinct option from "None" and "Other" | 1826 | // is a distinct option from "None" and "Other" |
1824 | return LLParcel::C_ANY; | 1827 | return LLParcel::C_ANY; |
1825 | } | 1828 | } |
1826 | 1829 | ||
1827 | 1830 | ||
1831 | |||
diff --git a/linden/indra/llinventory/llparcel.h b/linden/indra/llinventory/llparcel.h index 3af1824..a8143f2 100644 --- a/linden/indra/llinventory/llparcel.h +++ b/linden/indra/llinventory/llparcel.h | |||
@@ -253,8 +253,7 @@ public: | |||
253 | void setForSale(BOOL b) { setParcelFlag(PF_FOR_SALE, b); } | 253 | void setForSale(BOOL b) { setParcelFlag(PF_FOR_SALE, b); } |
254 | void setSoundOnly(BOOL b) { setParcelFlag(PF_SOUND_LOCAL, b); } | 254 | void setSoundOnly(BOOL b) { setParcelFlag(PF_SOUND_LOCAL, b); } |
255 | void setDenyAnonymous(BOOL b) { setParcelFlag(PF_DENY_ANONYMOUS, b); } | 255 | void setDenyAnonymous(BOOL b) { setParcelFlag(PF_DENY_ANONYMOUS, b); } |
256 | void setDenyIdentified(BOOL b) { setParcelFlag(PF_DENY_IDENTIFIED, b); } | 256 | void setDenyAgeUnverified(BOOL b) { setParcelFlag(PF_DENY_AGEUNVERIFIED, b); } |
257 | void setDenyTransacted(BOOL b) { setParcelFlag(PF_DENY_TRANSACTED, b); } | ||
258 | void setRestrictPushObject(BOOL b) { setParcelFlag(PF_RESTRICT_PUSHOBJECT, b); } | 257 | void setRestrictPushObject(BOOL b) { setParcelFlag(PF_RESTRICT_PUSHOBJECT, b); } |
259 | 258 | ||
260 | void setDrawDistance(F32 dist) { mDrawDistance = dist; } | 259 | void setDrawDistance(F32 dist) { mDrawDistance = dist; } |
@@ -444,10 +443,8 @@ public: | |||
444 | { return mRegionPushOverride; } | 443 | { return mRegionPushOverride; } |
445 | BOOL getRegionDenyAnonymousOverride() const | 444 | BOOL getRegionDenyAnonymousOverride() const |
446 | { return mRegionDenyAnonymousOverride; } | 445 | { return mRegionDenyAnonymousOverride; } |
447 | BOOL getRegionDenyIdentifiedOverride() const | 446 | BOOL getRegionDenyAgeUnverifiedOverride() const |
448 | { return mRegionDenyIdentifiedOverride; } | 447 | { return mRegionDenyAgeUnverifiedOverride; } |
449 | BOOL getRegionDenyTransactedOverride() const | ||
450 | { return mRegionDenyTransactedOverride; } | ||
451 | 448 | ||
452 | F32 getDrawDistance() const { return mDrawDistance; } | 449 | F32 getDrawDistance() const { return mDrawDistance; } |
453 | S32 getSalePrice() const { return mSalePrice; } | 450 | S32 getSalePrice() const { return mSalePrice; } |
@@ -471,7 +468,11 @@ public: | |||
471 | BOOL allowTerraformBy(const LLUUID &agent_id) const; | 468 | BOOL allowTerraformBy(const LLUUID &agent_id) const; |
472 | 469 | ||
473 | // Returns 0 if access is OK, otherwise a BA_ return code above. | 470 | // Returns 0 if access is OK, otherwise a BA_ return code above. |
474 | S32 blockAccess(const LLUUID& agent_id, const LLUUID& group_id, const BOOL is_agent_identified, const BOOL is_agent_transacted) const; | 471 | S32 blockAccess(const LLUUID& agent_id, |
472 | const LLUUID& group_id, | ||
473 | const BOOL is_agent_identified, | ||
474 | const BOOL is_agent_transacted, | ||
475 | const BOOL is_agent_ageverified) const; | ||
475 | 476 | ||
476 | // Only checks if the agent is explicitly banned from this parcel | 477 | // Only checks if the agent is explicitly banned from this parcel |
477 | BOOL isAgentBanned(const LLUUID& agent_id) const; | 478 | BOOL isAgentBanned(const LLUUID& agent_id) const; |
@@ -480,7 +481,8 @@ public: | |||
480 | const LLUUID& agent_id, | 481 | const LLUUID& agent_id, |
481 | const std::vector<LLUUID>& group_ids, | 482 | const std::vector<LLUUID>& group_ids, |
482 | const BOOL is_agent_identified, | 483 | const BOOL is_agent_identified, |
483 | const BOOL is_agent_transacted); | 484 | const BOOL is_agent_transacted, |
485 | const BOOL is_agent_ageverified); | ||
484 | 486 | ||
485 | bool operator==(const LLParcel &rhs) const; | 487 | bool operator==(const LLParcel &rhs) const; |
486 | 488 | ||
@@ -524,8 +526,7 @@ public: | |||
524 | void setCleanOtherTime(S32 time) { mCleanOtherTime = time; } | 526 | void setCleanOtherTime(S32 time) { mCleanOtherTime = time; } |
525 | void setRegionPushOverride(BOOL override) {mRegionPushOverride = override; } | 527 | void setRegionPushOverride(BOOL override) {mRegionPushOverride = override; } |
526 | void setRegionDenyAnonymousOverride(BOOL override) { mRegionDenyAnonymousOverride = override; } | 528 | void setRegionDenyAnonymousOverride(BOOL override) { mRegionDenyAnonymousOverride = override; } |
527 | void setRegionDenyIdentifiedOverride(BOOL override) { mRegionDenyIdentifiedOverride = override; } | 529 | void setRegionDenyAgeUnverifiedOverride(BOOL override) { mRegionDenyAgeUnverifiedOverride = override; } |
528 | void setRegionDenyTransactedOverride(BOOL override) { mRegionDenyTransactedOverride = override; } | ||
529 | 530 | ||
530 | // Accessors for parcel sellWithObjects | 531 | // Accessors for parcel sellWithObjects |
531 | void setPreviousOwnerID(LLUUID prev_owner) { mPreviousOwnerID = prev_owner; } | 532 | void setPreviousOwnerID(LLUUID prev_owner) { mPreviousOwnerID = prev_owner; } |
@@ -594,8 +595,7 @@ protected: | |||
594 | S32 mCleanOtherTime; | 595 | S32 mCleanOtherTime; |
595 | BOOL mRegionPushOverride; | 596 | BOOL mRegionPushOverride; |
596 | BOOL mRegionDenyAnonymousOverride; | 597 | BOOL mRegionDenyAnonymousOverride; |
597 | BOOL mRegionDenyIdentifiedOverride; | 598 | BOOL mRegionDenyAgeUnverifiedOverride; |
598 | BOOL mRegionDenyTransactedOverride; | ||
599 | 599 | ||
600 | 600 | ||
601 | public: | 601 | public: |
diff --git a/linden/indra/llinventory/llparcelflags.h b/linden/indra/llinventory/llparcelflags.h index d691d4d..1806142 100644 --- a/linden/indra/llinventory/llparcelflags.h +++ b/linden/indra/llinventory/llparcelflags.h | |||
@@ -58,16 +58,20 @@ const U32 PF_URL_WEB_PAGE = 1 << 19; // The "media URL" is an HTML page | |||
58 | const U32 PF_URL_RAW_HTML = 1 << 20; // The "media URL" is a raw HTML string like <H1>Foo</H1> | 58 | const U32 PF_URL_RAW_HTML = 1 << 20; // The "media URL" is a raw HTML string like <H1>Foo</H1> |
59 | const U32 PF_RESTRICT_PUSHOBJECT = 1 << 21; // Restrict push object to either on agent or on scripts owned by parcel owner | 59 | const U32 PF_RESTRICT_PUSHOBJECT = 1 << 21; // Restrict push object to either on agent or on scripts owned by parcel owner |
60 | const U32 PF_DENY_ANONYMOUS = 1 << 22; // Deny all non identified/transacted accounts | 60 | const U32 PF_DENY_ANONYMOUS = 1 << 22; // Deny all non identified/transacted accounts |
61 | const U32 PF_DENY_IDENTIFIED = 1 << 23; // Deny identified accounts | 61 | // const U32 PF_DENY_IDENTIFIED = 1 << 23; // Deny identified accounts |
62 | const U32 PF_DENY_TRANSACTED = 1 << 24; // Deny identified accounts | 62 | // const U32 PF_DENY_TRANSACTED = 1 << 24; // Deny identified accounts |
63 | const U32 PF_ALLOW_GROUP_SCRIPTS = 1 << 25; // Allow scripts owned by group | 63 | const U32 PF_ALLOW_GROUP_SCRIPTS = 1 << 25; // Allow scripts owned by group |
64 | const U32 PF_CREATE_GROUP_OBJECTS = 1 << 26; // Allow object creation by group members or objects | 64 | const U32 PF_CREATE_GROUP_OBJECTS = 1 << 26; // Allow object creation by group members or objects |
65 | const U32 PF_ALLOW_ALL_OBJECT_ENTRY = 1 << 27; // Allow all objects to enter a parcel | 65 | const U32 PF_ALLOW_ALL_OBJECT_ENTRY = 1 << 27; // Allow all objects to enter a parcel |
66 | const U32 PF_ALLOW_GROUP_OBJECT_ENTRY = 1 << 28; // Only allow group (and owner) objects to enter the parcel | 66 | const U32 PF_ALLOW_GROUP_OBJECT_ENTRY = 1 << 28; // Only allow group (and owner) objects to enter the parcel |
67 | const U32 PF_ALLOW_VOICE_CHAT = 1 << 29; // Allow residents to use voice chat on this parcel | 67 | const U32 PF_ALLOW_VOICE_CHAT = 1 << 29; // Allow residents to use voice chat on this parcel |
68 | const U32 PF_USE_ESTATE_VOICE_CHAN = 1 << 30; | 68 | const U32 PF_USE_ESTATE_VOICE_CHAN = 1 << 30; |
69 | const U32 PF_DENY_AGEUNVERIFIED = 1 << 31; // Prevent residents who aren't age-verified | ||
70 | // NOTE: At one point we have used all of the bits. | ||
71 | // We have deprecated two of them in 1.19.0 which *could* be reused, | ||
72 | // but only after we are certain there are no simstates using those bits. | ||
69 | 73 | ||
70 | const U32 PF_RESERVED = 1U << 31; | 74 | //const U32 PF_RESERVED = 1U << 31; |
71 | 75 | ||
72 | // If any of these are true the parcel is restricting access in some maner. | 76 | // If any of these are true the parcel is restricting access in some maner. |
73 | const U32 PF_USE_RESTRICTED_ACCESS = PF_USE_ACCESS_GROUP | 77 | const U32 PF_USE_RESTRICTED_ACCESS = PF_USE_ACCESS_GROUP |
@@ -75,8 +79,7 @@ const U32 PF_USE_RESTRICTED_ACCESS = PF_USE_ACCESS_GROUP | |||
75 | | PF_USE_BAN_LIST | 79 | | PF_USE_BAN_LIST |
76 | | PF_USE_PASS_LIST | 80 | | PF_USE_PASS_LIST |
77 | | PF_DENY_ANONYMOUS | 81 | | PF_DENY_ANONYMOUS |
78 | | PF_DENY_IDENTIFIED | 82 | | PF_DENY_AGEUNVERIFIED; |
79 | | PF_DENY_TRANSACTED; | ||
80 | const U32 PF_NONE = 0x00000000; | 83 | const U32 PF_NONE = 0x00000000; |
81 | const U32 PF_ALL = 0x7FFFFFFF; | 84 | const U32 PF_ALL = 0x7FFFFFFF; |
82 | const U32 PF_DEFAULT = PF_ALLOW_FLY | 85 | const U32 PF_DEFAULT = PF_ALLOW_FLY |
@@ -104,6 +107,7 @@ const S32 BA_NOT_IN_GROUP = 1; | |||
104 | const S32 BA_NOT_ON_LIST = 2; | 107 | const S32 BA_NOT_ON_LIST = 2; |
105 | const S32 BA_BANNED = 3; | 108 | const S32 BA_BANNED = 3; |
106 | const S32 BA_NO_ACCESS_LEVEL = 4; | 109 | const S32 BA_NO_ACCESS_LEVEL = 4; |
110 | const S32 BA_NOT_AGE_VERIFIED = 5; | ||
107 | 111 | ||
108 | // ParcelRelease flags | 112 | // ParcelRelease flags |
109 | const U32 PR_NONE = 0x0; | 113 | const U32 PR_NONE = 0x0; |
diff --git a/linden/indra/llmessage/llcircuit.cpp b/linden/indra/llmessage/llcircuit.cpp index 1d1be56..0db9f8e 100644 --- a/linden/indra/llmessage/llcircuit.cpp +++ b/linden/indra/llmessage/llcircuit.cpp | |||
@@ -1170,13 +1170,11 @@ std::ostream& operator<<(std::ostream& s, LLCircuitData& circuit) | |||
1170 | return s; | 1170 | return s; |
1171 | } | 1171 | } |
1172 | 1172 | ||
1173 | const LLString LLCircuitData::getInfoString() const | 1173 | void LLCircuitData::getInfo(LLSD& info) const |
1174 | { | 1174 | { |
1175 | std::ostringstream info; | 1175 | info["Host"] = mHost.getIPandPort(); |
1176 | info << "Circuit: " << mHost << std::endl | 1176 | info["Alive"] = mbAlive; |
1177 | << (mbAlive ? "Alive" : "Not Alive") << std::endl | 1177 | info["Age"] = mExistenceTimer.getElapsedTimeF32(); |
1178 | << "Age: " << mExistenceTimer.getElapsedTimeF32() << std::endl; | ||
1179 | return LLString(info.str()); | ||
1180 | } | 1178 | } |
1181 | 1179 | ||
1182 | void LLCircuitData::dumpResendCountAndReset() | 1180 | void LLCircuitData::dumpResendCountAndReset() |
@@ -1200,17 +1198,16 @@ std::ostream& operator<<(std::ostream& s, LLCircuit &circuit) | |||
1200 | return s; | 1198 | return s; |
1201 | } | 1199 | } |
1202 | 1200 | ||
1203 | const LLString LLCircuit::getInfoString() const | 1201 | void LLCircuit::getInfo(LLSD& info) const |
1204 | { | 1202 | { |
1205 | std::ostringstream info; | ||
1206 | info << "Circuit Info:" << std::endl; | ||
1207 | LLCircuit::circuit_data_map::const_iterator end = mCircuitData.end(); | 1203 | LLCircuit::circuit_data_map::const_iterator end = mCircuitData.end(); |
1208 | LLCircuit::circuit_data_map::const_iterator it; | 1204 | LLCircuit::circuit_data_map::const_iterator it; |
1205 | LLSD circuit_info; | ||
1209 | for(it = mCircuitData.begin(); it != end; ++it) | 1206 | for(it = mCircuitData.begin(); it != end; ++it) |
1210 | { | 1207 | { |
1211 | info << (*it).second->getInfoString() << std::endl; | 1208 | (*it).second->getInfo(circuit_info); |
1209 | info["Circuits"].append(circuit_info); | ||
1212 | } | 1210 | } |
1213 | return LLString(info.str()); | ||
1214 | } | 1211 | } |
1215 | 1212 | ||
1216 | void LLCircuit::getCircuitRange( | 1213 | void LLCircuit::getCircuitRange( |
diff --git a/linden/indra/llmessage/llcircuit.h b/linden/indra/llmessage/llcircuit.h index 128b1bc..1a6611f 100644 --- a/linden/indra/llmessage/llcircuit.h +++ b/linden/indra/llmessage/llcircuit.h | |||
@@ -75,6 +75,7 @@ const S32 LL_MAX_ACKED_PACKETS_PER_FRAME = 200; | |||
75 | // | 75 | // |
76 | class LLMessageSystem; | 76 | class LLMessageSystem; |
77 | class LLEncodedDatagramService; | 77 | class LLEncodedDatagramService; |
78 | class LLSD; | ||
78 | 79 | ||
79 | // | 80 | // |
80 | // Classes | 81 | // Classes |
@@ -158,7 +159,7 @@ public: | |||
158 | // | 159 | // |
159 | void checkPeriodTime(); // Reset per-period counters if necessary. | 160 | void checkPeriodTime(); // Reset per-period counters if necessary. |
160 | friend std::ostream& operator<<(std::ostream& s, LLCircuitData &circuit); | 161 | friend std::ostream& operator<<(std::ostream& s, LLCircuitData &circuit); |
161 | const LLString getInfoString() const; | 162 | void getInfo(LLSD& info) const; |
162 | 163 | ||
163 | friend class LLCircuit; | 164 | friend class LLCircuit; |
164 | friend class LLMessageSystem; | 165 | friend class LLMessageSystem; |
@@ -304,7 +305,7 @@ public: | |||
304 | void sendAcks(); | 305 | void sendAcks(); |
305 | 306 | ||
306 | friend std::ostream& operator<<(std::ostream& s, LLCircuit &circuit); | 307 | friend std::ostream& operator<<(std::ostream& s, LLCircuit &circuit); |
307 | const LLString getInfoString() const; | 308 | void getInfo(LLSD& info) const; |
308 | 309 | ||
309 | void dumpResends(); | 310 | void dumpResends(); |
310 | 311 | ||
diff --git a/linden/indra/llmessage/llcurl.cpp b/linden/indra/llmessage/llcurl.cpp index 01976b1..9b5e6cd 100644 --- a/linden/indra/llmessage/llcurl.cpp +++ b/linden/indra/llmessage/llcurl.cpp | |||
@@ -367,6 +367,11 @@ LLCurl::getByteRange(const std::string& url, S32 offset, S32 length, ResponderPt | |||
367 | mainMulti()->getByteRange(url, offset, length, responder); | 367 | mainMulti()->getByteRange(url, offset, length, responder); |
368 | } | 368 | } |
369 | 369 | ||
370 | void LLCurl::initClass() | ||
371 | { | ||
372 | curl_global_init(CURL_GLOBAL_ALL); | ||
373 | } | ||
374 | |||
370 | void | 375 | void |
371 | LLCurl::process() | 376 | LLCurl::process() |
372 | { | 377 | { |
diff --git a/linden/indra/llmessage/llcurl.h b/linden/indra/llmessage/llcurl.h index d21cdc4..53287c2 100644 --- a/linden/indra/llmessage/llcurl.h +++ b/linden/indra/llmessage/llcurl.h | |||
@@ -130,8 +130,9 @@ public: | |||
130 | static void get(const std::string& url, ResponderPtr); | 130 | static void get(const std::string& url, ResponderPtr); |
131 | static void getByteRange(const std::string& url, S32 offset, S32 length, ResponderPtr responder); | 131 | static void getByteRange(const std::string& url, S32 offset, S32 length, ResponderPtr responder); |
132 | 132 | ||
133 | static void initClass(); // *NOTE:Mani - not thread safe! | ||
133 | static void process(); | 134 | static void process(); |
134 | static void cleanup(); | 135 | static void cleanup(); // *NOTE:Mani - not thread safe! |
135 | }; | 136 | }; |
136 | 137 | ||
137 | namespace boost | 138 | namespace boost |
diff --git a/linden/indra/llmessage/llregionflags.h b/linden/indra/llmessage/llregionflags.h index 72272c0..5f3fad8 100644 --- a/linden/indra/llmessage/llregionflags.h +++ b/linden/indra/llmessage/llregionflags.h | |||
@@ -84,8 +84,8 @@ const U32 REGION_FLAGS_ESTATE_SKIP_SCRIPTS = (1 << 21); | |||
84 | const U32 REGION_FLAGS_RESTRICT_PUSHOBJECT = (1 << 22); | 84 | const U32 REGION_FLAGS_RESTRICT_PUSHOBJECT = (1 << 22); |
85 | 85 | ||
86 | const U32 REGION_FLAGS_DENY_ANONYMOUS = (1 << 23); | 86 | const U32 REGION_FLAGS_DENY_ANONYMOUS = (1 << 23); |
87 | const U32 REGION_FLAGS_DENY_IDENTIFIED = (1 << 24); | 87 | // const U32 REGION_FLAGS_DENY_IDENTIFIED = (1 << 24); |
88 | const U32 REGION_FLAGS_DENY_TRANSACTED = (1 << 25); | 88 | // const U32 REGION_FLAGS_DENY_TRANSACTED = (1 << 25); |
89 | 89 | ||
90 | const U32 REGION_FLAGS_ALLOW_PARCEL_CHANGES = (1 << 26); | 90 | const U32 REGION_FLAGS_ALLOW_PARCEL_CHANGES = (1 << 26); |
91 | 91 | ||
@@ -94,6 +94,7 @@ const U32 REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER = (1 << 27); | |||
94 | const U32 REGION_FLAGS_ALLOW_VOICE = (1 << 28); | 94 | const U32 REGION_FLAGS_ALLOW_VOICE = (1 << 28); |
95 | 95 | ||
96 | const U32 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29); | 96 | const U32 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29); |
97 | const U32 REGION_FLAGS_DENY_AGEUNVERIFIED = (1 << 30); | ||
97 | 98 | ||
98 | 99 | ||
99 | const U32 REGION_FLAGS_DEFAULT = REGION_FLAGS_ALLOW_LANDMARK | | 100 | const U32 REGION_FLAGS_DEFAULT = REGION_FLAGS_ALLOW_LANDMARK | |
@@ -110,8 +111,7 @@ const U32 REGION_FLAGS_ESTATE_MASK = REGION_FLAGS_EXTERNALLY_VISIBLE | |||
110 | | REGION_FLAGS_PUBLIC_ALLOWED | 111 | | REGION_FLAGS_PUBLIC_ALLOWED |
111 | | REGION_FLAGS_SUN_FIXED | 112 | | REGION_FLAGS_SUN_FIXED |
112 | | REGION_FLAGS_DENY_ANONYMOUS | 113 | | REGION_FLAGS_DENY_ANONYMOUS |
113 | | REGION_FLAGS_DENY_IDENTIFIED | 114 | | REGION_FLAGS_DENY_AGEUNVERIFIED; |
114 | | REGION_FLAGS_DENY_TRANSACTED; | ||
115 | 115 | ||
116 | inline BOOL is_prelude( U32 flags ) | 116 | inline BOOL is_prelude( U32 flags ) |
117 | { | 117 | { |
diff --git a/linden/indra/llmessage/message.cpp b/linden/indra/llmessage/message.cpp index e2cd19b..d446730 100644 --- a/linden/indra/llmessage/message.cpp +++ b/linden/indra/llmessage/message.cpp | |||
@@ -1562,12 +1562,9 @@ U32 LLMessageSystem::getOurCircuitCode() | |||
1562 | return mOurCircuitCode; | 1562 | return mOurCircuitCode; |
1563 | } | 1563 | } |
1564 | 1564 | ||
1565 | LLString LLMessageSystem::getCircuitInfoString() | 1565 | void LLMessageSystem::getCircuitInfo(LLSD& info) const |
1566 | { | 1566 | { |
1567 | LLString info_string; | 1567 | mCircuitInfo.getInfo(info); |
1568 | |||
1569 | info_string += mCircuitInfo.getInfoString(); | ||
1570 | return info_string; | ||
1571 | } | 1568 | } |
1572 | 1569 | ||
1573 | // returns whether the given host is on a trusted circuit | 1570 | // returns whether the given host is on a trusted circuit |
diff --git a/linden/indra/llmessage/message.h b/linden/indra/llmessage/message.h index 4454b40..3381ece 100644 --- a/linden/indra/llmessage/message.h +++ b/linden/indra/llmessage/message.h | |||
@@ -529,7 +529,7 @@ public: | |||
529 | bool isMatchingDigestForWindow(const char* digest, const S32 window) const; | 529 | bool isMatchingDigestForWindow(const char* digest, const S32 window) const; |
530 | 530 | ||
531 | void showCircuitInfo(); | 531 | void showCircuitInfo(); |
532 | LLString getCircuitInfoString(); | 532 | void getCircuitInfo(LLSD& info) const; |
533 | 533 | ||
534 | U32 getOurCircuitCode(); | 534 | U32 getOurCircuitCode(); |
535 | 535 | ||
diff --git a/linden/indra/llmessage/message_prehash.cpp b/linden/indra/llmessage/message_prehash.cpp index 0185c0f..0b614d8 100644 --- a/linden/indra/llmessage/message_prehash.cpp +++ b/linden/indra/llmessage/message_prehash.cpp | |||
@@ -1369,6 +1369,9 @@ char * _PREHASH_AvatarNotesReply; | |||
1369 | char * _PREHASH_CacheID; | 1369 | char * _PREHASH_CacheID; |
1370 | char * _PREHASH_OwnerMask; | 1370 | char * _PREHASH_OwnerMask; |
1371 | char * _PREHASH_TransferInventoryAck; | 1371 | char * _PREHASH_TransferInventoryAck; |
1372 | char * _PREHASH_RegionDenyAgeUnverified; | ||
1373 | char * _PREHASH_AgeVerificationBlock; | ||
1374 | |||
1372 | 1375 | ||
1373 | void init_prehash_data() | 1376 | void init_prehash_data() |
1374 | { | 1377 | { |
@@ -2702,4 +2705,6 @@ void init_prehash_data() | |||
2702 | _PREHASH_CacheID = gMessageStringTable.getString("CacheID"); | 2705 | _PREHASH_CacheID = gMessageStringTable.getString("CacheID"); |
2703 | _PREHASH_OwnerMask = gMessageStringTable.getString("OwnerMask"); | 2706 | _PREHASH_OwnerMask = gMessageStringTable.getString("OwnerMask"); |
2704 | _PREHASH_TransferInventoryAck = gMessageStringTable.getString("TransferInventoryAck"); | 2707 | _PREHASH_TransferInventoryAck = gMessageStringTable.getString("TransferInventoryAck"); |
2708 | _PREHASH_RegionDenyAgeUnverified = gMessageStringTable.getString("RegionDenyAgeUnverified"); | ||
2709 | _PREHASH_AgeVerificationBlock = gMessageStringTable.getString("AgeVerificationBlock"); | ||
2705 | } | 2710 | } |
diff --git a/linden/indra/llmessage/message_prehash.h b/linden/indra/llmessage/message_prehash.h index 2cea924..4210665 100644 --- a/linden/indra/llmessage/message_prehash.h +++ b/linden/indra/llmessage/message_prehash.h | |||
@@ -1369,6 +1369,8 @@ extern char * _PREHASH_AvatarNotesReply; | |||
1369 | extern char * _PREHASH_CacheID; | 1369 | extern char * _PREHASH_CacheID; |
1370 | extern char * _PREHASH_OwnerMask; | 1370 | extern char * _PREHASH_OwnerMask; |
1371 | extern char * _PREHASH_TransferInventoryAck; | 1371 | extern char * _PREHASH_TransferInventoryAck; |
1372 | extern char * _PREHASH_RegionDenyAgeUnverified; | ||
1373 | extern char * _PREHASH_AgeVerificationBlock; | ||
1372 | 1374 | ||
1373 | 1375 | ||
1374 | void init_prehash_data(); | 1376 | void init_prehash_data(); |
diff --git a/linden/indra/llui/llalertdialog.cpp b/linden/indra/llui/llalertdialog.cpp index 258b523..716fffd 100644 --- a/linden/indra/llui/llalertdialog.cpp +++ b/linden/indra/llui/llalertdialog.cpp | |||
@@ -58,6 +58,8 @@ const S32 MSG_PAD = 8; | |||
58 | /*static*/ LLAlertDialog::display_callback_t LLAlertDialog::sDisplayCallback; | 58 | /*static*/ LLAlertDialog::display_callback_t LLAlertDialog::sDisplayCallback; |
59 | /*static*/ LLString LLAlertDialog::sStringSkipNextTime("Skip this dialog next time"); | 59 | /*static*/ LLString LLAlertDialog::sStringSkipNextTime("Skip this dialog next time"); |
60 | /*static*/ LLString LLAlertDialog::sStringAlwaysChoose("Always choose this option"); | 60 | /*static*/ LLString LLAlertDialog::sStringAlwaysChoose("Always choose this option"); |
61 | /*static*/ LLAlertDialog::URLLoader* LLAlertDialog::sURLLoader; | ||
62 | |||
61 | 63 | ||
62 | //static | 64 | //static |
63 | LLAlertDialog* LLAlertDialog::createXml( const LLString& xml_desc, | 65 | LLAlertDialog* LLAlertDialog::createXml( const LLString& xml_desc, |
@@ -147,8 +149,11 @@ LLAlertDialog::LLAlertDialog( const LLAlertDialogTemplate* xml_template, | |||
147 | mIgnoreLabel(xml_template->mIgnoreLabel), | 149 | mIgnoreLabel(xml_template->mIgnoreLabel), |
148 | mButtonData(NULL), | 150 | mButtonData(NULL), |
149 | mLineEditor(NULL), | 151 | mLineEditor(NULL), |
150 | mTextCallback(NULL) | 152 | mTextCallback(NULL), |
153 | mURLOption(0) | ||
151 | { | 154 | { |
155 | mURL = xml_template->mURL; | ||
156 | mURLOption = xml_template->mURLOption; | ||
152 | createDialog(&(xml_template->mOptions), xml_template->mDefaultOption, | 157 | createDialog(&(xml_template->mOptions), xml_template->mDefaultOption, |
153 | xml_template->mMessage, args, | 158 | xml_template->mMessage, args, |
154 | xml_template->mEditLineText); | 159 | xml_template->mEditLineText); |
@@ -237,12 +242,12 @@ bool LLAlertDialog::show() | |||
237 | return true; | 242 | return true; |
238 | } | 243 | } |
239 | 244 | ||
240 | //static | ||
241 | void LLAlertDialog::format(LLString& msg, const LLString::format_map_t& args) | 245 | void LLAlertDialog::format(LLString& msg, const LLString::format_map_t& args) |
242 | { | 246 | { |
243 | // XUI:translate! | 247 | // XUI:translate! |
244 | LLString::format_map_t targs = args; | 248 | LLString::format_map_t targs = args; |
245 | targs["[SECOND_LIFE]"] = "Second Life"; | 249 | targs["[SECOND_LIFE]"] = "Second Life"; |
250 | targs["[_URL]"] = mURL; | ||
246 | LLString::format(msg, targs); | 251 | LLString::format(msg, targs); |
247 | } | 252 | } |
248 | 253 | ||
@@ -288,7 +293,7 @@ void LLAlertDialog::createDialog(const std::vector<LLString>* optionsp, S32 defa | |||
288 | // Message: create text box using raw string, as text has been structure deliberately | 293 | // Message: create text box using raw string, as text has been structure deliberately |
289 | // Use size of created text box to generate dialog box size | 294 | // Use size of created text box to generate dialog box size |
290 | LLString msg = msg_in; | 295 | LLString msg = msg_in; |
291 | LLAlertDialog::format( msg, args ); | 296 | format( msg, args ); |
292 | llwarns << "Alert: " << msg << llendl; | 297 | llwarns << "Alert: " << msg << llendl; |
293 | LLTextBox* msg_box = new LLTextBox( "Alert message", msg, (F32)MAX_ALLOWED_MSG_WIDTH, font ); | 298 | LLTextBox* msg_box = new LLTextBox( "Alert message", msg, (F32)MAX_ALLOWED_MSG_WIDTH, font ); |
294 | 299 | ||
@@ -424,6 +429,15 @@ LLAlertDialog::~LLAlertDialog() | |||
424 | mCallback(mOptionChosen, mUserData); | 429 | mCallback(mOptionChosen, mUserData); |
425 | } | 430 | } |
426 | 431 | ||
432 | // If we declared a URL and chose the URL option, go to the url | ||
433 | if (mOptionChosen == mURLOption) | ||
434 | { | ||
435 | if (!mURL.empty() && sURLLoader != NULL) | ||
436 | { | ||
437 | sURLLoader->load(mURL); | ||
438 | } | ||
439 | } | ||
440 | |||
427 | // Only change warn state if we actually warned. | 441 | // Only change warn state if we actually warned. |
428 | if (mCheck | 442 | if (mCheck |
429 | && sSettings->getWarning(mIgnoreLabel)) | 443 | && sSettings->getWarning(mIgnoreLabel)) |
@@ -547,7 +561,7 @@ void LLAlertDialog::setEditTextArgs(const LLString::format_map_t& edit_args) | |||
547 | if (mLineEditor) | 561 | if (mLineEditor) |
548 | { | 562 | { |
549 | LLString msg = mLineEditor->getText(); | 563 | LLString msg = mLineEditor->getText(); |
550 | LLAlertDialog::format(msg, edit_args); | 564 | format(msg, edit_args); |
551 | mLineEditor->setText(msg); | 565 | mLineEditor->setText(msg); |
552 | } | 566 | } |
553 | else | 567 | else |
@@ -790,6 +804,19 @@ bool LLAlertDialog::parseAlerts(const LLString& xml_filename, LLControlGroup* se | |||
790 | } | 804 | } |
791 | } | 805 | } |
792 | } | 806 | } |
807 | |||
808 | // <url> | ||
809 | if (child->hasName("url")) | ||
810 | { | ||
811 | S32 url_option = 0; | ||
812 | child->getAttributeS32("option", url_option); | ||
813 | if (xml_template) | ||
814 | { | ||
815 | xml_template->mURL = child->getTextContents(); | ||
816 | xml_template->mURLOption = url_option; | ||
817 | } | ||
818 | } | ||
819 | |||
793 | } | 820 | } |
794 | if (xml_template) | 821 | if (xml_template) |
795 | { | 822 | { |
diff --git a/linden/indra/llui/llalertdialog.h b/linden/indra/llui/llalertdialog.h index ddf4112..07d20dc 100644 --- a/linden/indra/llui/llalertdialog.h +++ b/linden/indra/llui/llalertdialog.h | |||
@@ -50,6 +50,18 @@ public: | |||
50 | typedef bool (*display_callback_t)(S32 modal); | 50 | typedef bool (*display_callback_t)(S32 modal); |
51 | enum { IGNORE_USE_DEFAULT=1, IGNORE_USE_SAVED=2, IGNORE_SHOW_AGAIN=3 }; | 51 | enum { IGNORE_USE_DEFAULT=1, IGNORE_USE_SAVED=2, IGNORE_SHOW_AGAIN=3 }; |
52 | 52 | ||
53 | class URLLoader | ||
54 | { | ||
55 | public: | ||
56 | virtual void load(const std::string& url) = 0; | ||
57 | virtual ~URLLoader() {} | ||
58 | }; | ||
59 | |||
60 | static void setURLLoader(URLLoader* loader) | ||
61 | { | ||
62 | sURLLoader = loader; | ||
63 | }; | ||
64 | |||
53 | protected: | 65 | protected: |
54 | struct ButtonData | 66 | struct ButtonData |
55 | { | 67 | { |
@@ -98,7 +110,7 @@ public: | |||
98 | LLAlertDialog( const LLAlertDialogTemplate* xml_template, const LLString::format_map_t& args, | 110 | LLAlertDialog( const LLAlertDialogTemplate* xml_template, const LLString::format_map_t& args, |
99 | alert_callback_t callback = NULL, void *user_data = NULL); | 111 | alert_callback_t callback = NULL, void *user_data = NULL); |
100 | 112 | ||
101 | static void format(LLString& msg, const LLString::format_map_t& args); | 113 | void format(LLString& msg, const LLString::format_map_t& args); |
102 | 114 | ||
103 | protected: | 115 | protected: |
104 | void createDialog(const std::vector<LLString>* options, S32 default_option, | 116 | void createDialog(const std::vector<LLString>* options, S32 default_option, |
@@ -126,6 +138,9 @@ protected: | |||
126 | // For Dialogs that take a line as text as input: | 138 | // For Dialogs that take a line as text as input: |
127 | LLLineEditor* mLineEditor; | 139 | LLLineEditor* mLineEditor; |
128 | alert_text_callback_t mTextCallback; | 140 | alert_text_callback_t mTextCallback; |
141 | // For Dialogs linked to a URL | ||
142 | LLString mURL; // Some alerts will direct the resident to a URL | ||
143 | S32 mURLOption; | ||
129 | 144 | ||
130 | public: | 145 | public: |
131 | // use LLPointer so they delete themselves when sTemplates is destroyed | 146 | // use LLPointer so they delete themselves when sTemplates is destroyed |
@@ -138,6 +153,9 @@ public: | |||
138 | 153 | ||
139 | static LLString sStringSkipNextTime; | 154 | static LLString sStringSkipNextTime; |
140 | static LLString sStringAlwaysChoose; | 155 | static LLString sStringAlwaysChoose; |
156 | |||
157 | private: | ||
158 | static URLLoader* sURLLoader; | ||
141 | }; | 159 | }; |
142 | 160 | ||
143 | //============================================================================ | 161 | //============================================================================ |
@@ -145,7 +163,7 @@ public: | |||
145 | class LLAlertDialogTemplate : public LLRefCount | 163 | class LLAlertDialogTemplate : public LLRefCount |
146 | { | 164 | { |
147 | public: | 165 | public: |
148 | LLAlertDialogTemplate() : mTitle(), mModal(FALSE), mUnique(FALSE), mIgnorable(0), mDefaultOption(0) {} | 166 | LLAlertDialogTemplate() : mTitle(), mURLOption(0), mModal(FALSE), mUnique(FALSE), mIgnorable(0), mDefaultOption(0) {} |
149 | 167 | ||
150 | void addOption(const LLString& label, const LLString& ignore_text, BOOL is_default = FALSE) | 168 | void addOption(const LLString& label, const LLString& ignore_text, BOOL is_default = FALSE) |
151 | { | 169 | { |
@@ -184,6 +202,8 @@ public: | |||
184 | LLString mMessage; // Message to display | 202 | LLString mMessage; // Message to display |
185 | LLString mIgnoreListText; // Text to display in enable/disable dialog (if mIgnorable == TRUE) | 203 | LLString mIgnoreListText; // Text to display in enable/disable dialog (if mIgnorable == TRUE) |
186 | LLString mIgnoreLabel; // Handle for ignore variable (may be shared by multiple templates) | 204 | LLString mIgnoreLabel; // Handle for ignore variable (may be shared by multiple templates) |
205 | LLString mURL; // Some alerts will direct the resident to a URL | ||
206 | S32 mURLOption; | ||
187 | BOOL mModal; | 207 | BOOL mModal; |
188 | BOOL mUnique; | 208 | BOOL mUnique; |
189 | S32 mIgnorable; // 0 = Never Ignore, 1 = Do default option, 2 = Do saved option | 209 | S32 mIgnorable; // 0 = Never Ignore, 1 = Do default option, 2 = Do saved option |
diff --git a/linden/indra/llui/llbutton.cpp b/linden/indra/llui/llbutton.cpp index 36ccc32..26ce473 100644 --- a/linden/indra/llui/llbutton.cpp +++ b/linden/indra/llui/llbutton.cpp | |||
@@ -368,9 +368,6 @@ BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask) | |||
368 | (*mClickedCallback)( mCallbackUserData ); | 368 | (*mClickedCallback)( mCallbackUserData ); |
369 | } | 369 | } |
370 | } | 370 | } |
371 | |||
372 | mMouseDownTimer.stop(); | ||
373 | mMouseDownTimer.reset(); | ||
374 | } | 371 | } |
375 | 372 | ||
376 | return TRUE; | 373 | return TRUE; |
diff --git a/linden/indra/llui/llfloater.cpp b/linden/indra/llui/llfloater.cpp index 41a67f2..ab6bc00 100644 --- a/linden/indra/llui/llfloater.cpp +++ b/linden/indra/llui/llfloater.cpp | |||
@@ -834,7 +834,7 @@ void LLFloater::setMinimized(BOOL minimize) | |||
834 | LLView* viewp = *child_it; | 834 | LLView* viewp = *child_it; |
835 | if (!viewp->getVisible()) | 835 | if (!viewp->getVisible()) |
836 | { | 836 | { |
837 | mMinimizedHiddenChildren.push_back(viewp); | 837 | mMinimizedHiddenChildren.push_back(viewp->mViewHandle); |
838 | } | 838 | } |
839 | viewp->setVisible(FALSE); | 839 | viewp->setVisible(FALSE); |
840 | } | 840 | } |
@@ -897,11 +897,14 @@ void LLFloater::setMinimized(BOOL minimize) | |||
897 | viewp->setVisible(TRUE); | 897 | viewp->setVisible(TRUE); |
898 | } | 898 | } |
899 | 899 | ||
900 | std::vector<LLView*>::iterator itor = mMinimizedHiddenChildren.begin(); | 900 | std::vector<LLViewHandle>::iterator itor = mMinimizedHiddenChildren.begin(); |
901 | while (itor != mMinimizedHiddenChildren.end()) | 901 | for ( ; itor != mMinimizedHiddenChildren.end(); ++itor) |
902 | { | 902 | { |
903 | (*itor)->setVisible(FALSE); | 903 | LLView* viewp = LLView::getViewByHandle(*itor); |
904 | ++itor; | 904 | if(viewp) |
905 | { | ||
906 | viewp->setVisible(FALSE); | ||
907 | } | ||
905 | } | 908 | } |
906 | mMinimizedHiddenChildren.clear(); | 909 | mMinimizedHiddenChildren.clear(); |
907 | 910 | ||
@@ -2220,7 +2223,6 @@ BOOL LLFloaterView::allChildrenClosed() | |||
2220 | { | 2223 | { |
2221 | // see if there are any visible floaters (some floaters "close" | 2224 | // see if there are any visible floaters (some floaters "close" |
2222 | // by setting themselves invisible) | 2225 | // by setting themselves invisible) |
2223 | S32 visible_count = 0; | ||
2224 | for (child_list_const_iter_t it = getChildList()->begin(); it != getChildList()->end(); ++it) | 2226 | for (child_list_const_iter_t it = getChildList()->begin(); it != getChildList()->end(); ++it) |
2225 | { | 2227 | { |
2226 | LLView* viewp = *it; | 2228 | LLView* viewp = *it; |
@@ -2228,11 +2230,10 @@ BOOL LLFloaterView::allChildrenClosed() | |||
2228 | 2230 | ||
2229 | if (floaterp->getVisible() && floaterp->canClose()) | 2231 | if (floaterp->getVisible() && floaterp->canClose()) |
2230 | { | 2232 | { |
2231 | visible_count++; | 2233 | return false; |
2232 | } | 2234 | } |
2233 | } | 2235 | } |
2234 | 2236 | return true; | |
2235 | return (visible_count == 0); | ||
2236 | } | 2237 | } |
2237 | 2238 | ||
2238 | 2239 | ||
@@ -2270,14 +2271,22 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out | |||
2270 | S32 min_height; | 2271 | S32 min_height; |
2271 | floater->getResizeLimits( &min_width, &min_height ); | 2272 | floater->getResizeLimits( &min_width, &min_height ); |
2272 | 2273 | ||
2274 | // Make sure floater isn't already smaller than its min height/width? | ||
2273 | S32 new_width = llmax( min_width, view_width ); | 2275 | S32 new_width = llmax( min_width, view_width ); |
2274 | S32 new_height = llmax( min_height, view_height ); | 2276 | S32 new_height = llmax( min_height, view_height ); |
2275 | 2277 | ||
2276 | if( (new_width > screen_width) || (new_height > screen_height) ) | 2278 | if( !allow_partial_outside |
2279 | && ( (new_width > screen_width) | ||
2280 | || (new_height > screen_height) ) ) | ||
2277 | { | 2281 | { |
2282 | // We have to force this window to be inside the screen. | ||
2278 | new_width = llmin(new_width, screen_width); | 2283 | new_width = llmin(new_width, screen_width); |
2279 | new_height = llmin(new_height, screen_height); | 2284 | new_height = llmin(new_height, screen_height); |
2280 | 2285 | ||
2286 | // Still respect minimum width/height | ||
2287 | new_width = llmax(new_width, min_width); | ||
2288 | new_height = llmax(new_height, min_height); | ||
2289 | |||
2281 | floater->reshape( new_width, new_height, TRUE ); | 2290 | floater->reshape( new_width, new_height, TRUE ); |
2282 | 2291 | ||
2283 | // Make sure the damn thing is actually onscreen. | 2292 | // Make sure the damn thing is actually onscreen. |
diff --git a/linden/indra/llui/llfloater.h b/linden/indra/llui/llfloater.h index d0494ea..1d88501 100644 --- a/linden/indra/llui/llfloater.h +++ b/linden/indra/llui/llfloater.h | |||
@@ -286,7 +286,7 @@ protected: | |||
286 | typedef std::map<LLViewHandle, LLFloater*>::iterator handle_map_iter_t; | 286 | typedef std::map<LLViewHandle, LLFloater*>::iterator handle_map_iter_t; |
287 | static handle_map_t sFloaterMap; | 287 | static handle_map_t sFloaterMap; |
288 | 288 | ||
289 | std::vector<LLView*> mMinimizedHiddenChildren; | 289 | std::vector<LLViewHandle> mMinimizedHiddenChildren; |
290 | 290 | ||
291 | BOOL mHasBeenDraggedWhileMinimized; | 291 | BOOL mHasBeenDraggedWhileMinimized; |
292 | S32 mPreviousMinimizedBottom; | 292 | S32 mPreviousMinimizedBottom; |
@@ -429,3 +429,4 @@ extern LLFloaterView* gFloaterView; | |||
429 | #endif // LL_FLOATER_H | 429 | #endif // LL_FLOATER_H |
430 | 430 | ||
431 | 431 | ||
432 | |||
diff --git a/linden/indra/llui/lllineeditor.cpp b/linden/indra/llui/lllineeditor.cpp index 78fe29c..420970a 100644 --- a/linden/indra/llui/lllineeditor.cpp +++ b/linden/indra/llui/lllineeditor.cpp | |||
@@ -158,8 +158,7 @@ LLLineEditor::LLLineEditor(const LLString& name, const LLRect& rect, | |||
158 | mHandleEditKeysDirectly( FALSE ), | 158 | mHandleEditKeysDirectly( FALSE ), |
159 | mSelectAllonFocusReceived( FALSE ), | 159 | mSelectAllonFocusReceived( FALSE ), |
160 | mPassDelete(FALSE), | 160 | mPassDelete(FALSE), |
161 | mReadOnly(FALSE), | 161 | mReadOnly(FALSE) |
162 | mLastIMEPosition( -1, -1 ) | ||
163 | { | 162 | { |
164 | llassert( max_length_bytes > 0 ); | 163 | llassert( max_length_bytes > 0 ); |
165 | 164 | ||
@@ -1638,15 +1637,10 @@ void LLLineEditor::draw() | |||
1638 | S32 pixels_after_scroll = findPixelNearestPos(); // RCalculcate for IME position | 1637 | S32 pixels_after_scroll = findPixelNearestPos(); // RCalculcate for IME position |
1639 | LLRect screen_pos = getScreenRect(); | 1638 | LLRect screen_pos = getScreenRect(); |
1640 | LLCoordGL ime_pos( screen_pos.mLeft + pixels_after_scroll, screen_pos.mTop - UI_LINEEDITOR_V_PAD ); | 1639 | LLCoordGL ime_pos( screen_pos.mLeft + pixels_after_scroll, screen_pos.mTop - UI_LINEEDITOR_V_PAD ); |
1641 | if ( ime_pos.mX != mLastIMEPosition.mX || ime_pos.mY != mLastIMEPosition.mY ) | ||
1642 | { | ||
1643 | mLastIMEPosition.mX = ime_pos.mX; | ||
1644 | mLastIMEPosition.mY = ime_pos.mY; | ||
1645 | 1640 | ||
1646 | ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); | 1641 | ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); |
1647 | ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]); | 1642 | ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]); |
1648 | getWindow()->setLanguageTextInput( ime_pos ); | 1643 | getWindow()->setLanguageTextInput( ime_pos ); |
1649 | } | ||
1650 | } | 1644 | } |
1651 | } | 1645 | } |
1652 | 1646 | ||
diff --git a/linden/indra/llui/lllineeditor.h b/linden/indra/llui/lllineeditor.h index 2cd2ebf..f1b9fbe 100644 --- a/linden/indra/llui/lllineeditor.h +++ b/linden/indra/llui/lllineeditor.h | |||
@@ -279,8 +279,6 @@ protected: | |||
279 | 279 | ||
280 | S32 mBorderThickness; | 280 | S32 mBorderThickness; |
281 | 281 | ||
282 | LLCoordGL mLastIMEPosition; // Last screen position used for the IME editor | ||
283 | |||
284 | BOOL mIgnoreArrowKeys; | 282 | BOOL mIgnoreArrowKeys; |
285 | BOOL mIgnoreTab; | 283 | BOOL mIgnoreTab; |
286 | BOOL mDrawAsterixes; | 284 | BOOL mDrawAsterixes; |
diff --git a/linden/indra/llui/llpanel.cpp b/linden/indra/llui/llpanel.cpp index 3a0ee9b..ca1bc9c 100644 --- a/linden/indra/llui/llpanel.cpp +++ b/linden/indra/llui/llpanel.cpp | |||
@@ -982,6 +982,16 @@ BOOL LLPanel::childSetLabelArg(const LLString& id, const LLString& key, const LL | |||
982 | return FALSE; | 982 | return FALSE; |
983 | } | 983 | } |
984 | 984 | ||
985 | BOOL LLPanel::childSetToolTipArg(const LLString& id, const LLString& key, const LLStringExplicit& text) | ||
986 | { | ||
987 | LLView* child = getChildByName(id, true); | ||
988 | if (child) | ||
989 | { | ||
990 | return child->setToolTipArg(key, text); | ||
991 | } | ||
992 | return FALSE; | ||
993 | } | ||
994 | |||
985 | void LLPanel::childSetMinValue(const LLString& id, LLSD min_value) | 995 | void LLPanel::childSetMinValue(const LLString& id, LLSD min_value) |
986 | { | 996 | { |
987 | LLUICtrl* child = (LLUICtrl*)getChildByName(id, true); | 997 | LLUICtrl* child = (LLUICtrl*)getChildByName(id, true); |
diff --git a/linden/indra/llui/llpanel.h b/linden/indra/llui/llpanel.h index dfd7a51..78aa7cf 100644 --- a/linden/indra/llui/llpanel.h +++ b/linden/indra/llui/llpanel.h | |||
@@ -194,6 +194,7 @@ public: | |||
194 | // Not implemented for all types, defaults to noop, returns FALSE if not applicaple | 194 | // Not implemented for all types, defaults to noop, returns FALSE if not applicaple |
195 | BOOL childSetTextArg(const LLString& id, const LLString& key, const LLStringExplicit& text); | 195 | BOOL childSetTextArg(const LLString& id, const LLString& key, const LLStringExplicit& text); |
196 | BOOL childSetLabelArg(const LLString& id, const LLString& key, const LLStringExplicit& text); | 196 | BOOL childSetLabelArg(const LLString& id, const LLString& key, const LLStringExplicit& text); |
197 | BOOL childSetToolTipArg(const LLString& id, const LLString& key, const LLStringExplicit& text); | ||
197 | 198 | ||
198 | // LLSlider / LLSpinCtrl | 199 | // LLSlider / LLSpinCtrl |
199 | void childSetMinValue(const LLString& id, LLSD min_value); | 200 | void childSetMinValue(const LLString& id, LLSD min_value); |
diff --git a/linden/indra/llui/llscrolllistctrl.cpp b/linden/indra/llui/llscrolllistctrl.cpp index f5eef29..96a7394 100644 --- a/linden/indra/llui/llscrolllistctrl.cpp +++ b/linden/indra/llui/llscrolllistctrl.cpp | |||
@@ -701,7 +701,7 @@ BOOL LLScrollListCtrl::addItem( LLScrollListItem* item, EAddPosition pos ) | |||
701 | break; | 701 | break; |
702 | } | 702 | } |
703 | 703 | ||
704 | updateLineHeight(); | 704 | updateLineHeightInsert(item); |
705 | mPageLines = mLineHeight ? mItemListRect.getHeight() / mLineHeight : 0; | 705 | mPageLines = mLineHeight ? mItemListRect.getHeight() / mLineHeight : 0; |
706 | BOOL scrollbar_visible = mPageLines < getItemCount(); | 706 | BOOL scrollbar_visible = mPageLines < getItemCount(); |
707 | 707 | ||
@@ -753,12 +753,11 @@ void LLScrollListCtrl::updateMaxContentWidth(LLScrollListItem* added_item) | |||
753 | } | 753 | } |
754 | } | 754 | } |
755 | 755 | ||
756 | const S32 SCROLL_LIST_ROW_PAD = 2; | ||
756 | 757 | ||
757 | // Line height is the max height of all the cells in all the items. | 758 | // Line height is the max height of all the cells in all the items. |
758 | void LLScrollListCtrl::updateLineHeight() | 759 | void LLScrollListCtrl::updateLineHeight() |
759 | { | 760 | { |
760 | const S32 ROW_PAD = 2; | ||
761 | |||
762 | mLineHeight = 0; | 761 | mLineHeight = 0; |
763 | item_list::iterator iter; | 762 | item_list::iterator iter; |
764 | for (iter = mItemList.begin(); iter != mItemList.end(); iter++) | 763 | for (iter = mItemList.begin(); iter != mItemList.end(); iter++) |
@@ -768,11 +767,23 @@ void LLScrollListCtrl::updateLineHeight() | |||
768 | S32 i = 0; | 767 | S32 i = 0; |
769 | for (const LLScrollListCell* cell = itemp->getColumn(i); i < num_cols; cell = itemp->getColumn(++i)) | 768 | for (const LLScrollListCell* cell = itemp->getColumn(i); i < num_cols; cell = itemp->getColumn(++i)) |
770 | { | 769 | { |
771 | mLineHeight = llmax( mLineHeight, cell->getHeight() + ROW_PAD ); | 770 | mLineHeight = llmax( mLineHeight, cell->getHeight() + SCROLL_LIST_ROW_PAD ); |
772 | } | 771 | } |
773 | } | 772 | } |
774 | } | 773 | } |
775 | 774 | ||
775 | // when the only change to line height is from an insert, we needn't scan the entire list | ||
776 | void LLScrollListCtrl::updateLineHeightInsert(LLScrollListItem* itemp) | ||
777 | { | ||
778 | S32 num_cols = itemp->getNumColumns(); | ||
779 | S32 i = 0; | ||
780 | for (const LLScrollListCell* cell = itemp->getColumn(i); i < num_cols; cell = itemp->getColumn(++i)) | ||
781 | { | ||
782 | mLineHeight = llmax( mLineHeight, cell->getHeight() + SCROLL_LIST_ROW_PAD ); | ||
783 | } | ||
784 | } | ||
785 | |||
786 | |||
776 | void LLScrollListCtrl::updateColumns() | 787 | void LLScrollListCtrl::updateColumns() |
777 | { | 788 | { |
778 | mColumnsIndexed.resize(mColumns.size()); | 789 | mColumnsIndexed.resize(mColumns.size()); |
diff --git a/linden/indra/llui/llscrolllistctrl.h b/linden/indra/llui/llscrolllistctrl.h index 5ceee2e..a98a411 100644 --- a/linden/indra/llui/llscrolllistctrl.h +++ b/linden/indra/llui/llscrolllistctrl.h | |||
@@ -589,6 +589,7 @@ protected: | |||
589 | void selectNextItem(BOOL extend_selection); | 589 | void selectNextItem(BOOL extend_selection); |
590 | void drawItems(); | 590 | void drawItems(); |
591 | void updateLineHeight(); | 591 | void updateLineHeight(); |
592 | void updateLineHeightInsert(LLScrollListItem* item); | ||
592 | void reportInvalidInput(); | 593 | void reportInvalidInput(); |
593 | BOOL isRepeatedChars(const LLWString& string) const; | 594 | BOOL isRepeatedChars(const LLWString& string) const; |
594 | void selectItem(LLScrollListItem* itemp, BOOL single_select = TRUE); | 595 | void selectItem(LLScrollListItem* itemp, BOOL single_select = TRUE); |
diff --git a/linden/indra/llui/lltextbox.cpp b/linden/indra/llui/lltextbox.cpp index c0b0788..efd4245 100644 --- a/linden/indra/llui/lltextbox.cpp +++ b/linden/indra/llui/lltextbox.cpp | |||
@@ -49,6 +49,9 @@ LLTextBox::LLTextBox(const LLString& name, const LLRect& rect, const LLString& t | |||
49 | mDisabledColor( LLUI::sColorsGroup->getColor( "LabelDisabledColor" ) ), | 49 | mDisabledColor( LLUI::sColorsGroup->getColor( "LabelDisabledColor" ) ), |
50 | mBackgroundColor( LLUI::sColorsGroup->getColor( "DefaultBackgroundColor" ) ), | 50 | mBackgroundColor( LLUI::sColorsGroup->getColor( "DefaultBackgroundColor" ) ), |
51 | mBorderColor( LLUI::sColorsGroup->getColor( "DefaultHighlightLight" ) ), | 51 | mBorderColor( LLUI::sColorsGroup->getColor( "DefaultHighlightLight" ) ), |
52 | mHoverColor( LLUI::sColorsGroup->getColor( "LabelSelectedColor" ) ), | ||
53 | mHoverActive( FALSE ), | ||
54 | mHasHover( FALSE ), | ||
52 | mBackgroundVisible( FALSE ), | 55 | mBackgroundVisible( FALSE ), |
53 | mBorderVisible( FALSE ), | 56 | mBorderVisible( FALSE ), |
54 | mFontStyle(LLFontGL::DROP_SHADOW_SOFT), | 57 | mFontStyle(LLFontGL::DROP_SHADOW_SOFT), |
@@ -74,6 +77,9 @@ LLTextBox::LLTextBox(const LLString& name, const LLString& text, F32 max_width, | |||
74 | mDisabledColor(LLUI::sColorsGroup->getColor("LabelDisabledColor")), | 77 | mDisabledColor(LLUI::sColorsGroup->getColor("LabelDisabledColor")), |
75 | mBackgroundColor(LLUI::sColorsGroup->getColor("DefaultBackgroundColor")), | 78 | mBackgroundColor(LLUI::sColorsGroup->getColor("DefaultBackgroundColor")), |
76 | mBorderColor(LLUI::sColorsGroup->getColor("DefaultHighlightLight")), | 79 | mBorderColor(LLUI::sColorsGroup->getColor("DefaultHighlightLight")), |
80 | mHoverColor( LLUI::sColorsGroup->getColor( "LabelSelectedColor" ) ), | ||
81 | mHoverActive( FALSE ), | ||
82 | mHasHover( FALSE ), | ||
77 | mBackgroundVisible(FALSE), | 83 | mBackgroundVisible(FALSE), |
78 | mBorderVisible(FALSE), | 84 | mBorderVisible(FALSE), |
79 | mFontStyle(LLFontGL::DROP_SHADOW_SOFT), | 85 | mFontStyle(LLFontGL::DROP_SHADOW_SOFT), |
@@ -161,6 +167,16 @@ BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask) | |||
161 | return handled; | 167 | return handled; |
162 | } | 168 | } |
163 | 169 | ||
170 | BOOL LLTextBox::handleHover(S32 x, S32 y, MASK mask) | ||
171 | { | ||
172 | if(mHoverActive) | ||
173 | { | ||
174 | mHasHover = TRUE; // This should be set every frame during a hover. | ||
175 | return TRUE; | ||
176 | } | ||
177 | return FALSE; | ||
178 | } | ||
179 | |||
164 | void LLTextBox::setText(const LLStringExplicit& text) | 180 | void LLTextBox::setText(const LLStringExplicit& text) |
165 | { | 181 | { |
166 | mText.assign(text); | 182 | mText.assign(text); |
@@ -334,7 +350,15 @@ void LLTextBox::draw() | |||
334 | 350 | ||
335 | if ( getEnabled() ) | 351 | if ( getEnabled() ) |
336 | { | 352 | { |
337 | drawText( text_x, text_y, mTextColor ); | 353 | if(mHasHover) |
354 | { | ||
355 | drawText( text_x, text_y, mHoverColor ); | ||
356 | } | ||
357 | else | ||
358 | { | ||
359 | drawText( text_x, text_y, mTextColor ); | ||
360 | } | ||
361 | |||
338 | } | 362 | } |
339 | else | 363 | else |
340 | { | 364 | { |
@@ -346,6 +370,8 @@ void LLTextBox::draw() | |||
346 | drawDebugRect(); | 370 | drawDebugRect(); |
347 | } | 371 | } |
348 | } | 372 | } |
373 | |||
374 | mHasHover = FALSE; // This is reset every frame. | ||
349 | } | 375 | } |
350 | 376 | ||
351 | void LLTextBox::reshape(S32 width, S32 height, BOOL called_from_parent) | 377 | void LLTextBox::reshape(S32 width, S32 height, BOOL called_from_parent) |
@@ -468,5 +494,20 @@ LLView* LLTextBox::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *f | |||
468 | text_box->setColor(color); | 494 | text_box->setColor(color); |
469 | } | 495 | } |
470 | 496 | ||
497 | if(node->hasAttribute("hover_color")) | ||
498 | { | ||
499 | LLColor4 color; | ||
500 | LLUICtrlFactory::getAttributeColor(node, "hover_color", color); | ||
501 | text_box->setHoverColor(color); | ||
502 | text_box->setHoverActive(true); | ||
503 | } | ||
504 | |||
505 | BOOL hover_active = FALSE; | ||
506 | if(node->getAttributeBOOL("hover", hover_active)) | ||
507 | { | ||
508 | text_box->setHoverActive(hover_active); | ||
509 | } | ||
510 | |||
511 | |||
471 | return text_box; | 512 | return text_box; |
472 | } | 513 | } |
diff --git a/linden/indra/llui/lltextbox.h b/linden/indra/llui/lltextbox.h index 7e7018a..c7c7946 100644 --- a/linden/indra/llui/lltextbox.h +++ b/linden/indra/llui/lltextbox.h | |||
@@ -66,11 +66,16 @@ public: | |||
66 | 66 | ||
67 | virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); | 67 | virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); |
68 | virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); | 68 | virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); |
69 | virtual BOOL handleHover(S32 x, S32 y, MASK mask); | ||
69 | 70 | ||
70 | void setColor( const LLColor4& c ) { mTextColor = c; } | 71 | void setColor( const LLColor4& c ) { mTextColor = c; } |
71 | void setDisabledColor( const LLColor4& c) { mDisabledColor = c; } | 72 | void setDisabledColor( const LLColor4& c) { mDisabledColor = c; } |
72 | void setBackgroundColor( const LLColor4& c) { mBackgroundColor = c; } | 73 | void setBackgroundColor( const LLColor4& c) { mBackgroundColor = c; } |
73 | void setBorderColor( const LLColor4& c) { mBorderColor = c; } | 74 | void setBorderColor( const LLColor4& c) { mBorderColor = c; } |
75 | |||
76 | void setHoverColor( const LLColor4& c ) { mHoverColor = c; } | ||
77 | void setHoverActive( BOOL active ) { mHoverActive = active; } | ||
78 | |||
74 | void setText( const LLStringExplicit& text ); | 79 | void setText( const LLStringExplicit& text ); |
75 | void setWrappedText(const LLStringExplicit& text, F32 max_width = -1.0); | 80 | void setWrappedText(const LLStringExplicit& text, F32 max_width = -1.0); |
76 | // default width means use existing control width | 81 | // default width means use existing control width |
@@ -108,10 +113,12 @@ protected: | |||
108 | const LLFontGL* mFontGL; | 113 | const LLFontGL* mFontGL; |
109 | LLColor4 mTextColor; | 114 | LLColor4 mTextColor; |
110 | LLColor4 mDisabledColor; | 115 | LLColor4 mDisabledColor; |
111 | |||
112 | LLColor4 mBackgroundColor; | 116 | LLColor4 mBackgroundColor; |
113 | LLColor4 mBorderColor; | 117 | LLColor4 mBorderColor; |
114 | 118 | LLColor4 mHoverColor; | |
119 | |||
120 | BOOL mHoverActive; | ||
121 | BOOL mHasHover; | ||
115 | BOOL mBackgroundVisible; | 122 | BOOL mBackgroundVisible; |
116 | BOOL mBorderVisible; | 123 | BOOL mBorderVisible; |
117 | 124 | ||
diff --git a/linden/indra/llui/lltexteditor.cpp b/linden/indra/llui/lltexteditor.cpp index 200cf29..d08997c 100644 --- a/linden/indra/llui/lltexteditor.cpp +++ b/linden/indra/llui/lltexteditor.cpp | |||
@@ -310,8 +310,7 @@ LLTextEditor::LLTextEditor( | |||
310 | mMouseDownX(0), | 310 | mMouseDownX(0), |
311 | mMouseDownY(0), | 311 | mMouseDownY(0), |
312 | mLastSelectionX(-1), | 312 | mLastSelectionX(-1), |
313 | mLastSelectionY(-1), | 313 | mLastSelectionY(-1) |
314 | mLastIMEPosition(-1,-1) | ||
315 | { | 314 | { |
316 | mSourceID.generate(); | 315 | mSourceID.generate(); |
317 | 316 | ||
@@ -2817,15 +2816,10 @@ void LLTextEditor::drawCursor() | |||
2817 | // Make sure the IME is in the right place | 2816 | // Make sure the IME is in the right place |
2818 | LLRect screen_pos = getScreenRect(); | 2817 | LLRect screen_pos = getScreenRect(); |
2819 | LLCoordGL ime_pos( screen_pos.mLeft + llfloor(cursor_left), screen_pos.mBottom + llfloor(cursor_top) ); | 2818 | LLCoordGL ime_pos( screen_pos.mLeft + llfloor(cursor_left), screen_pos.mBottom + llfloor(cursor_top) ); |
2820 | if ( ime_pos.mX != mLastIMEPosition.mX || ime_pos.mY != mLastIMEPosition.mY ) | ||
2821 | { | ||
2822 | mLastIMEPosition.mX = ime_pos.mX; | ||
2823 | mLastIMEPosition.mY = ime_pos.mY; | ||
2824 | 2819 | ||
2825 | ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); | 2820 | ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); |
2826 | ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]); | 2821 | ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]); |
2827 | getWindow()->setLanguageTextInput( ime_pos ); | 2822 | getWindow()->setLanguageTextInput( ime_pos ); |
2828 | } | ||
2829 | } | 2823 | } |
2830 | } | 2824 | } |
2831 | } | 2825 | } |
diff --git a/linden/indra/llui/lltexteditor.h b/linden/indra/llui/lltexteditor.h index 55aba57..d38accc 100644 --- a/linden/indra/llui/lltexteditor.h +++ b/linden/indra/llui/lltexteditor.h | |||
@@ -439,8 +439,6 @@ protected: | |||
439 | 439 | ||
440 | BOOL mParseHTML; | 440 | BOOL mParseHTML; |
441 | LLString mHTML; | 441 | LLString mHTML; |
442 | |||
443 | LLCoordGL mLastIMEPosition; // Last position of the IME editor | ||
444 | }; | 442 | }; |
445 | 443 | ||
446 | class LLTextSegment | 444 | class LLTextSegment |
diff --git a/linden/indra/llui/llview.cpp b/linden/indra/llui/llview.cpp index 9442a5c..a047f99 100644 --- a/linden/indra/llui/llview.cpp +++ b/linden/indra/llui/llview.cpp | |||
@@ -224,11 +224,17 @@ void LLView::setMouseOpaque(BOOL b) | |||
224 | mMouseOpaque = b; | 224 | mMouseOpaque = b; |
225 | } | 225 | } |
226 | 226 | ||
227 | void LLView::setToolTip(const LLString& msg) | 227 | void LLView::setToolTip(const LLStringExplicit& msg) |
228 | { | 228 | { |
229 | mToolTipMsg = msg; | 229 | mToolTipMsg = msg; |
230 | } | 230 | } |
231 | 231 | ||
232 | BOOL LLView::setToolTipArg(const LLStringExplicit& key, const LLStringExplicit& text) | ||
233 | { | ||
234 | mToolTipMsg.setArg(key, text); | ||
235 | return TRUE; | ||
236 | } | ||
237 | |||
232 | // virtual | 238 | // virtual |
233 | void LLView::setRect(const LLRect& rect) | 239 | void LLView::setRect(const LLRect& rect) |
234 | { | 240 | { |
@@ -288,7 +294,7 @@ void LLView::setSpanChildren( BOOL span_children ) | |||
288 | 294 | ||
289 | const LLString& LLView::getToolTip() | 295 | const LLString& LLView::getToolTip() |
290 | { | 296 | { |
291 | return mToolTipMsg; | 297 | return mToolTipMsg.getString(); |
292 | } | 298 | } |
293 | 299 | ||
294 | // virtual | 300 | // virtual |
@@ -884,18 +890,14 @@ BOOL LLView::handleToolTip(S32 x, S32 y, LLString& msg, LLRect* sticky_rect_scre | |||
884 | } | 890 | } |
885 | } | 891 | } |
886 | 892 | ||
887 | if (LLUI::sShowXUINames && (mToolTipMsg.find(".xml", 0) == LLString::npos) && | 893 | tool_tip = mToolTipMsg.getString(); |
894 | if (LLUI::sShowXUINames && (tool_tip.find(".xml", 0) == LLString::npos) && | ||
888 | (mName.find("Drag", 0) == LLString::npos)) | 895 | (mName.find("Drag", 0) == LLString::npos)) |
889 | { | 896 | { |
890 | tool_tip = getShowNamesToolTip(); | 897 | tool_tip = getShowNamesToolTip(); |
891 | } | 898 | } |
892 | else | ||
893 | { | ||
894 | tool_tip = mToolTipMsg; | ||
895 | } | ||
896 | 899 | ||
897 | 900 | ||
898 | |||
899 | BOOL showNamesTextBox = LLUI::sShowXUINames && (getWidgetType() == WIDGET_TYPE_TEXT_BOX); | 901 | BOOL showNamesTextBox = LLUI::sShowXUINames && (getWidgetType() == WIDGET_TYPE_TEXT_BOX); |
900 | 902 | ||
901 | if( !handled && (mMouseOpaque || showNamesTextBox) && pointInView( x, y ) && !tool_tip.empty()) | 903 | if( !handled && (mMouseOpaque || showNamesTextBox) && pointInView( x, y ) && !tool_tip.empty()) |
diff --git a/linden/indra/llui/llview.h b/linden/indra/llui/llview.h index 63c1efc..8248d50 100644 --- a/linden/indra/llui/llview.h +++ b/linden/indra/llui/llview.h | |||
@@ -45,6 +45,7 @@ | |||
45 | #include "llstring.h" | 45 | #include "llstring.h" |
46 | #include "llrect.h" | 46 | #include "llrect.h" |
47 | #include "llui.h" | 47 | #include "llui.h" |
48 | #include "lluistring.h" | ||
48 | #include "lluixmltags.h" | 49 | #include "lluixmltags.h" |
49 | #include "llviewquery.h" | 50 | #include "llviewquery.h" |
50 | #include "llxmlnode.h" | 51 | #include "llxmlnode.h" |
@@ -154,7 +155,7 @@ protected: | |||
154 | BOOL mEnabled; // Enabled means "accepts input that has an effect on the state of the application." | 155 | BOOL mEnabled; // Enabled means "accepts input that has an effect on the state of the application." |
155 | // A disabled view, for example, may still have a scrollbar that responds to mouse events. | 156 | // A disabled view, for example, may still have a scrollbar that responds to mouse events. |
156 | BOOL mMouseOpaque; // Opaque views handle all mouse events that are over their rect. | 157 | BOOL mMouseOpaque; // Opaque views handle all mouse events that are over their rect. |
157 | LLString mToolTipMsg; // isNull() is true if none. | 158 | LLUIString mToolTipMsg; // isNull() is true if none. |
158 | 159 | ||
159 | U8 mSoundFlags; | 160 | U8 mSoundFlags; |
160 | BOOL mSaveToXML; | 161 | BOOL mSaveToXML; |
@@ -214,7 +215,8 @@ public: | |||
214 | // MANIPULATORS | 215 | // MANIPULATORS |
215 | // | 216 | // |
216 | void setMouseOpaque( BOOL b ); | 217 | void setMouseOpaque( BOOL b ); |
217 | void setToolTip( const LLString& msg ); | 218 | void setToolTip( const LLStringExplicit& msg ); |
219 | BOOL setToolTipArg( const LLStringExplicit& key, const LLStringExplicit& text ); | ||
218 | 220 | ||
219 | virtual void setRect(const LLRect &rect); | 221 | virtual void setRect(const LLRect &rect); |
220 | void setFollows(U32 flags); | 222 | void setFollows(U32 flags); |
diff --git a/linden/indra/llvfs/lldir_win32.cpp b/linden/indra/llvfs/lldir_win32.cpp index b5db6ef..f415fe5 100644 --- a/linden/indra/llvfs/lldir_win32.cpp +++ b/linden/indra/llvfs/lldir_win32.cpp | |||
@@ -42,7 +42,6 @@ | |||
42 | #include <errno.h> | 42 | #include <errno.h> |
43 | #include <sys/types.h> | 43 | #include <sys/types.h> |
44 | #include <sys/stat.h> | 44 | #include <sys/stat.h> |
45 | #include <errno.h> | ||
46 | 45 | ||
47 | // Utility stuff to get versions of the sh | 46 | // Utility stuff to get versions of the sh |
48 | #define PACKVERSION(major,minor) MAKELONG(minor,major) | 47 | #define PACKVERSION(major,minor) MAKELONG(minor,major) |
diff --git a/linden/indra/llwindow/lldxhardware.cpp b/linden/indra/llwindow/lldxhardware.cpp index 1a39e68..2aff052 100644 --- a/linden/indra/llwindow/lldxhardware.cpp +++ b/linden/indra/llwindow/lldxhardware.cpp | |||
@@ -411,6 +411,7 @@ BOOL LLDXHardware::getInfo(BOOL vram_only) | |||
411 | } | 411 | } |
412 | 412 | ||
413 | std::string device_name = get_string(device_containerp, L"szDescription"); | 413 | std::string device_name = get_string(device_containerp, L"szDescription"); |
414 | |||
414 | std::string device_id = get_string(device_containerp, L"szDeviceID"); | 415 | std::string device_id = get_string(device_containerp, L"szDeviceID"); |
415 | 416 | ||
416 | LLDXDevice *dxdevicep = new LLDXDevice; | 417 | LLDXDevice *dxdevicep = new LLDXDevice; |
@@ -451,6 +452,8 @@ BOOL LLDXHardware::getInfo(BOOL vram_only) | |||
451 | } | 452 | } |
452 | 453 | ||
453 | 454 | ||
455 | |||
456 | |||
454 | // Now, iterate through the related drivers | 457 | // Now, iterate through the related drivers |
455 | hr = device_containerp->GetChildContainer(L"Drivers", &driver_containerp); | 458 | hr = device_containerp->GetChildContainer(L"Drivers", &driver_containerp); |
456 | if (FAILED(hr) || !driver_containerp) | 459 | if (FAILED(hr) || !driver_containerp) |
@@ -468,6 +471,7 @@ BOOL LLDXHardware::getInfo(BOOL vram_only) | |||
468 | S32 file_num = 0; | 471 | S32 file_num = 0; |
469 | for (file_num = 0; file_num < (S32)num_files; file_num++ ) | 472 | for (file_num = 0; file_num < (S32)num_files; file_num++ ) |
470 | { | 473 | { |
474 | |||
471 | hr = driver_containerp->EnumChildContainerNames(file_num, wszContainer, 256); | 475 | hr = driver_containerp->EnumChildContainerNames(file_num, wszContainer, 256); |
472 | if (FAILED(hr)) | 476 | if (FAILED(hr)) |
473 | { | 477 | { |
@@ -522,6 +526,104 @@ LCleanup: | |||
522 | return ok; | 526 | return ok; |
523 | } | 527 | } |
524 | 528 | ||
529 | LLSD LLDXHardware::getDisplayInfo() | ||
530 | { | ||
531 | LLTimer hw_timer; | ||
532 | HRESULT hr; | ||
533 | LLSD ret; | ||
534 | CoInitialize(NULL); | ||
535 | |||
536 | IDxDiagProvider *dx_diag_providerp = NULL; | ||
537 | IDxDiagContainer *dx_diag_rootp = NULL; | ||
538 | IDxDiagContainer *devices_containerp = NULL; | ||
539 | IDxDiagContainer *device_containerp = NULL; | ||
540 | IDxDiagContainer *file_containerp = NULL; | ||
541 | IDxDiagContainer *driver_containerp = NULL; | ||
542 | |||
543 | // CoCreate a IDxDiagProvider* | ||
544 | llinfos << "CoCreateInstance IID_IDxDiagProvider" << llendl; | ||
545 | hr = CoCreateInstance(CLSID_DxDiagProvider, | ||
546 | NULL, | ||
547 | CLSCTX_INPROC_SERVER, | ||
548 | IID_IDxDiagProvider, | ||
549 | (LPVOID*) &dx_diag_providerp); | ||
550 | |||
551 | if (FAILED(hr)) | ||
552 | { | ||
553 | llwarns << "No DXDiag provider found! DirectX 9 not installed!" << llendl; | ||
554 | gWriteDebug("No DXDiag provider found! DirectX 9 not installed!\n"); | ||
555 | goto LCleanup; | ||
556 | } | ||
557 | if (SUCCEEDED(hr)) // if FAILED(hr) then dx9 is not installed | ||
558 | { | ||
559 | // Fill out a DXDIAG_INIT_PARAMS struct and pass it to IDxDiagContainer::Initialize | ||
560 | // Passing in TRUE for bAllowWHQLChecks, allows dxdiag to check if drivers are | ||
561 | // digital signed as logo'd by WHQL which may connect via internet to update | ||
562 | // WHQL certificates. | ||
563 | DXDIAG_INIT_PARAMS dx_diag_init_params; | ||
564 | ZeroMemory(&dx_diag_init_params, sizeof(DXDIAG_INIT_PARAMS)); | ||
565 | |||
566 | dx_diag_init_params.dwSize = sizeof(DXDIAG_INIT_PARAMS); | ||
567 | dx_diag_init_params.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION; | ||
568 | dx_diag_init_params.bAllowWHQLChecks = TRUE; | ||
569 | dx_diag_init_params.pReserved = NULL; | ||
570 | |||
571 | llinfos << "dx_diag_providerp->Initialize" << llendl; | ||
572 | hr = dx_diag_providerp->Initialize(&dx_diag_init_params); | ||
573 | if(FAILED(hr)) | ||
574 | { | ||
575 | goto LCleanup; | ||
576 | } | ||
577 | |||
578 | llinfos << "dx_diag_providerp->GetRootContainer" << llendl; | ||
579 | hr = dx_diag_providerp->GetRootContainer( &dx_diag_rootp ); | ||
580 | if(FAILED(hr) || !dx_diag_rootp) | ||
581 | { | ||
582 | goto LCleanup; | ||
583 | } | ||
584 | |||
585 | HRESULT hr; | ||
586 | |||
587 | // Get display driver information | ||
588 | llinfos << "dx_diag_rootp->GetChildContainer" << llendl; | ||
589 | hr = dx_diag_rootp->GetChildContainer(L"DxDiag_DisplayDevices", &devices_containerp); | ||
590 | if(FAILED(hr) || !devices_containerp) | ||
591 | { | ||
592 | goto LCleanup; | ||
593 | } | ||
594 | |||
595 | // Get device 0 | ||
596 | llinfos << "devices_containerp->GetChildContainer" << llendl; | ||
597 | hr = devices_containerp->GetChildContainer(L"0", &device_containerp); | ||
598 | if(FAILED(hr) || !device_containerp) | ||
599 | { | ||
600 | goto LCleanup; | ||
601 | } | ||
602 | |||
603 | // Get the English VRAM string | ||
604 | std::string ram_str = get_string(device_containerp, L"szDisplayMemoryEnglish"); | ||
605 | |||
606 | |||
607 | // Dump the string as an int into the structure | ||
608 | char *stopstring; | ||
609 | ret["VRAM"] = strtol(ram_str.c_str(), &stopstring, 10); | ||
610 | std::string device_name = get_string(device_containerp, L"szDescription"); | ||
611 | ret["DeviceName"] = device_name; | ||
612 | std::string device_driver= get_string(device_containerp, L"szDriverVersion"); | ||
613 | ret["DriverVersion"] = device_driver; | ||
614 | } | ||
615 | LCleanup: | ||
616 | SAFE_RELEASE(file_containerp); | ||
617 | SAFE_RELEASE(driver_containerp); | ||
618 | SAFE_RELEASE(device_containerp); | ||
619 | SAFE_RELEASE(devices_containerp); | ||
620 | SAFE_RELEASE(dx_diag_rootp); | ||
621 | SAFE_RELEASE(dx_diag_providerp); | ||
622 | |||
623 | CoUninitialize(); | ||
624 | return ret; | ||
625 | } | ||
626 | |||
525 | void LLDXHardware::setWriteDebugFunc(void (*func)(const char*)) | 627 | void LLDXHardware::setWriteDebugFunc(void (*func)(const char*)) |
526 | { | 628 | { |
527 | gWriteDebug = func; | 629 | gWriteDebug = func; |
diff --git a/linden/indra/llwindow/lldxhardware.h b/linden/indra/llwindow/lldxhardware.h index 1d5d69d..e2a255d 100644 --- a/linden/indra/llwindow/lldxhardware.h +++ b/linden/indra/llwindow/lldxhardware.h | |||
@@ -36,6 +36,7 @@ | |||
36 | 36 | ||
37 | #include "stdtypes.h" | 37 | #include "stdtypes.h" |
38 | #include "llstring.h" | 38 | #include "llstring.h" |
39 | #include "llsd.h" | ||
39 | 40 | ||
40 | class LLVersion | 41 | class LLVersion |
41 | { | 42 | { |
@@ -93,6 +94,8 @@ public: | |||
93 | 94 | ||
94 | S32 getVRAM() const { return mVRAM; } | 95 | S32 getVRAM() const { return mVRAM; } |
95 | 96 | ||
97 | LLSD getDisplayInfo(); | ||
98 | |||
96 | // Find a particular device that matches the following specs. | 99 | // Find a particular device that matches the following specs. |
97 | // Empty strings indicate that you don't care. | 100 | // Empty strings indicate that you don't care. |
98 | // You can separate multiple devices with '|' chars to indicate you want | 101 | // You can separate multiple devices with '|' chars to indicate you want |
diff --git a/linden/indra/llwindow/llgl.cpp b/linden/indra/llwindow/llgl.cpp index 35f20d3..df87591 100644 --- a/linden/indra/llwindow/llgl.cpp +++ b/linden/indra/llwindow/llgl.cpp | |||
@@ -36,6 +36,8 @@ | |||
36 | 36 | ||
37 | #include "linden_common.h" | 37 | #include "linden_common.h" |
38 | 38 | ||
39 | #include "boost/tokenizer.hpp" | ||
40 | |||
39 | #include "llsys.h" | 41 | #include "llsys.h" |
40 | 42 | ||
41 | #include "llgl.h" | 43 | #include "llgl.h" |
@@ -459,6 +461,23 @@ bool LLGLManager::initGL() | |||
459 | return true; | 461 | return true; |
460 | } | 462 | } |
461 | 463 | ||
464 | void LLGLManager::getGLInfo(LLSD& info) | ||
465 | { | ||
466 | info["GLInfo"]["GLVendor"] = LLString((const char *)glGetString(GL_VENDOR)); | ||
467 | info["GLInfo"]["GLRenderer"] = LLString((const char *)glGetString(GL_RENDERER)); | ||
468 | info["GLInfo"]["GLVersion"] = LLString((const char *)glGetString(GL_VERSION)); | ||
469 | |||
470 | #if !LL_MESA_HEADLESS | ||
471 | LLString all_exts = (const char *)gGLHExts.mSysExts; | ||
472 | boost::char_separator<char> sep(" "); | ||
473 | boost::tokenizer<boost::char_separator<char> > tok(all_exts, sep); | ||
474 | for(boost::tokenizer<boost::char_separator<char> >::iterator i = tok.begin(); i != tok.end(); ++i) | ||
475 | { | ||
476 | info["GLInfo"]["GLExtensions"].append(*i); | ||
477 | } | ||
478 | #endif | ||
479 | } | ||
480 | |||
462 | LLString LLGLManager::getGLInfoString() | 481 | LLString LLGLManager::getGLInfoString() |
463 | { | 482 | { |
464 | LLString info_str; | 483 | LLString info_str; |
diff --git a/linden/indra/llwindow/llgl.h b/linden/indra/llwindow/llgl.h index 2a23a23..a8e14b7 100644 --- a/linden/indra/llwindow/llgl.h +++ b/linden/indra/llwindow/llgl.h | |||
@@ -48,6 +48,8 @@ | |||
48 | 48 | ||
49 | #define LL_GL_ERRS llerrs | 49 | #define LL_GL_ERRS llerrs |
50 | 50 | ||
51 | class LLSD; | ||
52 | |||
51 | // Manage GL extensions... | 53 | // Manage GL extensions... |
52 | class LLGLManager | 54 | class LLGLManager |
53 | { | 55 | { |
@@ -122,6 +124,7 @@ public: | |||
122 | void getPixelFormat(); // Get the best pixel format | 124 | void getPixelFormat(); // Get the best pixel format |
123 | 125 | ||
124 | LLString getGLInfoString(); | 126 | LLString getGLInfoString(); |
127 | void getGLInfo(LLSD& info); | ||
125 | 128 | ||
126 | // In ALL CAPS | 129 | // In ALL CAPS |
127 | LLString mGLVendor; | 130 | LLString mGLVendor; |
diff --git a/linden/indra/llwindow/llwindowwin32.cpp b/linden/indra/llwindow/llwindowwin32.cpp index c84611b..1fa50de 100644 --- a/linden/indra/llwindow/llwindowwin32.cpp +++ b/linden/indra/llwindow/llwindowwin32.cpp | |||
@@ -93,6 +93,7 @@ BOOL LLWindowWin32::sWinIMEOpened = FALSE; | |||
93 | HKL LLWindowWin32::sWinInputLocale = 0; | 93 | HKL LLWindowWin32::sWinInputLocale = 0; |
94 | DWORD LLWindowWin32::sWinIMEConversionMode = IME_CMODE_NATIVE; | 94 | DWORD LLWindowWin32::sWinIMEConversionMode = IME_CMODE_NATIVE; |
95 | DWORD LLWindowWin32::sWinIMESentenceMode = IME_SMODE_AUTOMATIC; | 95 | DWORD LLWindowWin32::sWinIMESentenceMode = IME_SMODE_AUTOMATIC; |
96 | LLCoordWindow LLWindowWin32::sWinIMEWindowPosition(-1,-1); | ||
96 | 97 | ||
97 | // The following class LLWinImm delegates Windows IMM APIs. | 98 | // The following class LLWinImm delegates Windows IMM APIs. |
98 | // We need this because some language versions of Windows, | 99 | // We need this because some language versions of Windows, |
@@ -3381,7 +3382,8 @@ void LLWindowWin32::setLanguageTextInput( const LLCoordGL & position ) | |||
3381 | LLCoordWindow win_pos; | 3382 | LLCoordWindow win_pos; |
3382 | convertCoords( position, &win_pos ); | 3383 | convertCoords( position, &win_pos ); |
3383 | 3384 | ||
3384 | if ( win_pos.mX >= 0 && win_pos.mY >= 0 ) | 3385 | if ( win_pos.mX >= 0 && win_pos.mY >= 0 && |
3386 | (win_pos.mX != sWinIMEWindowPosition.mX) || (win_pos.mY != sWinIMEWindowPosition.mY) ) | ||
3385 | { | 3387 | { |
3386 | COMPOSITIONFORM ime_form; | 3388 | COMPOSITIONFORM ime_form; |
3387 | memset( &ime_form, 0, sizeof(ime_form) ); | 3389 | memset( &ime_form, 0, sizeof(ime_form) ); |
@@ -3390,10 +3392,11 @@ void LLWindowWin32::setLanguageTextInput( const LLCoordGL & position ) | |||
3390 | ime_form.ptCurrentPos.y = win_pos.mY; | 3392 | ime_form.ptCurrentPos.y = win_pos.mY; |
3391 | 3393 | ||
3392 | LLWinImm::setCompositionWindow( himc, &ime_form ); | 3394 | LLWinImm::setCompositionWindow( himc, &ime_form ); |
3395 | |||
3396 | sWinIMEWindowPosition.set( win_pos.mX, win_pos.mY ); | ||
3393 | } | 3397 | } |
3394 | 3398 | ||
3395 | LLWinImm::releaseContext(mWindowHandle, himc); | 3399 | LLWinImm::releaseContext(mWindowHandle, himc); |
3396 | |||
3397 | } | 3400 | } |
3398 | } | 3401 | } |
3399 | 3402 | ||
diff --git a/linden/indra/llwindow/llwindowwin32.h b/linden/indra/llwindow/llwindowwin32.h index f1e977e..602e066 100644 --- a/linden/indra/llwindow/llwindowwin32.h +++ b/linden/indra/llwindow/llwindowwin32.h | |||
@@ -188,6 +188,7 @@ protected: | |||
188 | static HKL sWinInputLocale; | 188 | static HKL sWinInputLocale; |
189 | static DWORD sWinIMEConversionMode; | 189 | static DWORD sWinIMEConversionMode; |
190 | static DWORD sWinIMESentenceMode; | 190 | static DWORD sWinIMESentenceMode; |
191 | static LLCoordWindow sWinIMEWindowPosition; | ||
191 | 192 | ||
192 | friend class LLWindowManager; | 193 | friend class LLWindowManager; |
193 | }; | 194 | }; |
diff --git a/linden/indra/lscript/lscript_compile/indra.l b/linden/indra/lscript/lscript_compile/indra.l index 69e77fb..57aef07 100644 --- a/linden/indra/lscript/lscript_compile/indra.l +++ b/linden/indra/lscript/lscript_compile/indra.l | |||
@@ -651,14 +651,6 @@ int yyerror(const char *fmt, ...) | |||
651 | return 0; | 651 | return 0; |
652 | } | 652 | } |
653 | 653 | ||
654 | #define LL_MKS_YACC 0 | ||
655 | #if LL_WINDOWS && LL_MKS_YACC | ||
656 | int yyinput(void) | ||
657 | { | ||
658 | return input(); | ||
659 | } | ||
660 | #endif | ||
661 | |||
662 | //#define EMERGENCY_DEBUG_PRINTOUTS | 654 | //#define EMERGENCY_DEBUG_PRINTOUTS |
663 | //#define EMIT_CIL_ASSEMBLER | 655 | //#define EMIT_CIL_ASSEMBLER |
664 | 656 | ||
@@ -685,11 +677,9 @@ BOOL lscript_compile(const char* src_filename, const char* dst_filename, | |||
685 | yyout = LLFile::fopen(err_filename, "w"); | 677 | yyout = LLFile::fopen(err_filename, "w"); |
686 | 678 | ||
687 | // Reset the lexer's internal buffering. | 679 | // Reset the lexer's internal buffering. |
688 | #if LL_DARWIN || LL_LINUX || !LL_MKS_YACC | 680 | |
689 | yyrestart(yyin); | 681 | yyrestart(yyin); |
690 | #else | 682 | |
691 | yy_reset(); | ||
692 | #endif | ||
693 | b_parse_ok = !yyparse(); | 683 | b_parse_ok = !yyparse(); |
694 | 684 | ||
695 | if (b_parse_ok) | 685 | if (b_parse_ok) |
diff --git a/linden/indra/lscript/lscript_compile/lscript_compile.vcproj b/linden/indra/lscript/lscript_compile/lscript_compile.vcproj index fd03fa0..59822f2 100644 --- a/linden/indra/lscript/lscript_compile/lscript_compile.vcproj +++ b/linden/indra/lscript/lscript_compile/lscript_compile.vcproj | |||
@@ -30,7 +30,8 @@ | |||
30 | WarningLevel="3" | 30 | WarningLevel="3" |
31 | WarnAsError="FALSE" | 31 | WarnAsError="FALSE" |
32 | Detect64BitPortabilityProblems="FALSE" | 32 | Detect64BitPortabilityProblems="FALSE" |
33 | DebugInformationFormat="4"/> | 33 | DebugInformationFormat="4" |
34 | DisableSpecificWarnings="4065"/> | ||
34 | <Tool | 35 | <Tool |
35 | Name="VCCustomBuildTool"/> | 36 | Name="VCCustomBuildTool"/> |
36 | <Tool | 37 | <Tool |
@@ -72,7 +73,8 @@ | |||
72 | WarningLevel="3" | 73 | WarningLevel="3" |
73 | WarnAsError="FALSE" | 74 | WarnAsError="FALSE" |
74 | Detect64BitPortabilityProblems="FALSE" | 75 | Detect64BitPortabilityProblems="FALSE" |
75 | DebugInformationFormat="3"/> | 76 | DebugInformationFormat="3" |
77 | DisableSpecificWarnings="4065"/> | ||
76 | <Tool | 78 | <Tool |
77 | Name="VCCustomBuildTool"/> | 79 | Name="VCCustomBuildTool"/> |
78 | <Tool | 80 | <Tool |
@@ -115,7 +117,8 @@ | |||
115 | WarningLevel="3" | 117 | WarningLevel="3" |
116 | WarnAsError="FALSE" | 118 | WarnAsError="FALSE" |
117 | Detect64BitPortabilityProblems="FALSE" | 119 | Detect64BitPortabilityProblems="FALSE" |
118 | DebugInformationFormat="3"/> | 120 | DebugInformationFormat="3" |
121 | DisableSpecificWarnings="4065"/> | ||
119 | <Tool | 122 | <Tool |
120 | Name="VCCustomBuildTool"/> | 123 | Name="VCCustomBuildTool"/> |
121 | <Tool | 124 | <Tool |
diff --git a/linden/indra/lscript/lscript_compile/lscript_compile_fb.vcproj b/linden/indra/lscript/lscript_compile/lscript_compile_fb.vcproj index c61e6ec..e65b8cd 100755 --- a/linden/indra/lscript/lscript_compile/lscript_compile_fb.vcproj +++ b/linden/indra/lscript/lscript_compile/lscript_compile_fb.vcproj | |||
@@ -74,8 +74,7 @@ | |||
74 | <Tool | 74 | <Tool |
75 | Name="VCCustomBuildTool" | 75 | Name="VCCustomBuildTool" |
76 | Description="Building lex_yy.cpp" | 76 | Description="Building lex_yy.cpp" |
77 | CommandLine="C:\cygwin\bin\flex.exe -olex_yy.cpp indra.l | 77 | CommandLine="C:\cygwin\bin\flex.exe -olex_yy.cpp indra.l" |
78 | " | ||
79 | Outputs="lex_yy.cpp"/> | 78 | Outputs="lex_yy.cpp"/> |
80 | </FileConfiguration> | 79 | </FileConfiguration> |
81 | </File> | 80 | </File> |
@@ -86,7 +85,7 @@ | |||
86 | <Tool | 85 | <Tool |
87 | Name="VCCustomBuildTool" | 86 | Name="VCCustomBuildTool" |
88 | Description="Building ytab.cpp" | 87 | Description="Building ytab.cpp" |
89 | CommandLine="C:\cygwin\bin\bison.exe -o ytab.cpp -v -d indra.y | 88 | CommandLine="C:\cygwin\bin\bison.exe -y -d -v -o ytab.cpp indra.y |
90 | " | 89 | " |
91 | Outputs="ytab.cpp;ytab.h"/> | 90 | Outputs="ytab.cpp;ytab.h"/> |
92 | </FileConfiguration> | 91 | </FileConfiguration> |
@@ -95,7 +94,8 @@ | |||
95 | <Tool | 94 | <Tool |
96 | Name="VCCustomBuildTool" | 95 | Name="VCCustomBuildTool" |
97 | Description="Building ytab.cpp" | 96 | Description="Building ytab.cpp" |
98 | CommandLine="C:\cygwin\bin\bison.exe -y -d -v -o ytab.cpp indra.y | 97 | CommandLine="dir |
98 | C:\cygwin\bin\bison.exe -y -d -v -o ytab.cpp indra.y | ||
99 | C:\cygwin\bin\mv.exe ytab.hpp ytab.h" | 99 | C:\cygwin\bin\mv.exe ytab.hpp ytab.h" |
100 | Outputs="ytab.cpp;ytab.h"/> | 100 | Outputs="ytab.cpp;ytab.h"/> |
101 | </FileConfiguration> | 101 | </FileConfiguration> |
diff --git a/linden/indra/lscript/lscript_compile/lscript_compile_fb_vc8.vcproj b/linden/indra/lscript/lscript_compile/lscript_compile_fb_vc8.vcproj index c61e6ec..1b2e3b7 100644 --- a/linden/indra/lscript/lscript_compile/lscript_compile_fb_vc8.vcproj +++ b/linden/indra/lscript/lscript_compile/lscript_compile_fb_vc8.vcproj | |||
@@ -1,106 +1,131 @@ | |||
1 | <?xml version="1.0" encoding="Windows-1252"?> | 1 | <?xml version="1.0" encoding="Windows-1252"?> |
2 | <VisualStudioProject | 2 | <VisualStudioProject |
3 | ProjectType="Visual C++" | 3 | ProjectType="Visual C++" |
4 | Version="7.10" | 4 | Version="8.00" |
5 | Name="lscript_compile_fb" | 5 | Name="lscript_compile_fb_vc8" |
6 | ProjectGUID="{B771CF1B-E253-47BD-8B0A-6B0440CC9228}" | 6 | ProjectGUID="{B771CF1B-E253-47BD-8B0A-6B0440CC9228}" |
7 | RootNamespace="lscript_compile_fb" | 7 | RootNamespace="lscript_compile_fb" |
8 | Keyword="MakeFileProj"> | 8 | Keyword="MakeFileProj" |
9 | <Platforms> | 9 | > |
10 | <Platform | 10 | <Platforms> |
11 | Name="Win32"/> | 11 | <Platform |
12 | </Platforms> | 12 | Name="Win32" |
13 | <Configurations> | 13 | /> |
14 | <Configuration | 14 | </Platforms> |
15 | Name="Debug|Win32" | 15 | <ToolFiles> |
16 | OutputDirectory="." | 16 | </ToolFiles> |
17 | IntermediateDirectory="Debug_fb" | 17 | <Configurations> |
18 | ConfigurationType="10"> | 18 | <Configuration |
19 | <Tool | 19 | Name="Debug|Win32" |
20 | Name="VCCustomBuildTool"/> | 20 | OutputDirectory="." |
21 | <Tool | 21 | IntermediateDirectory="Debug_fb" |
22 | Name="VCMIDLTool"/> | 22 | ConfigurationType="10" |
23 | <Tool | 23 | InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" |
24 | Name="VCPostBuildEventTool"/> | 24 | > |
25 | <Tool | 25 | <Tool |
26 | Name="VCPreBuildEventTool"/> | 26 | Name="VCPreBuildEventTool" |
27 | </Configuration> | 27 | /> |
28 | <Configuration | 28 | <Tool |
29 | Name="Release|Win32" | 29 | Name="VCCustomBuildTool" |
30 | OutputDirectory="." | 30 | /> |
31 | IntermediateDirectory="Release_fb" | 31 | <Tool |
32 | ConfigurationType="10"> | 32 | Name="VCMIDLTool" |
33 | <Tool | 33 | /> |
34 | Name="VCCustomBuildTool"/> | 34 | <Tool |
35 | <Tool | 35 | Name="VCPostBuildEventTool" |
36 | Name="VCMIDLTool"/> | 36 | /> |
37 | <Tool | 37 | </Configuration> |
38 | Name="VCPostBuildEventTool"/> | 38 | <Configuration |
39 | <Tool | 39 | Name="Release|Win32" |
40 | Name="VCPreBuildEventTool"/> | 40 | OutputDirectory="." |
41 | </Configuration> | 41 | IntermediateDirectory="Release_fb" |
42 | </Configurations> | 42 | ConfigurationType="10" |
43 | <References> | 43 | InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" |
44 | </References> | 44 | > |
45 | <Files> | 45 | <Tool |
46 | <Filter | 46 | Name="VCPreBuildEventTool" |
47 | Name="Source Files" | 47 | /> |
48 | Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" | 48 | <Tool |
49 | UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> | 49 | Name="VCCustomBuildTool" |
50 | </Filter> | 50 | /> |
51 | <Filter | 51 | <Tool |
52 | Name="Header Files" | 52 | Name="VCMIDLTool" |
53 | Filter="h;hpp;hxx;hm;inl;inc;xsd" | 53 | /> |
54 | UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> | 54 | <Tool |
55 | </Filter> | 55 | Name="VCPostBuildEventTool" |
56 | <Filter | 56 | /> |
57 | Name="Resource Files" | 57 | </Configuration> |
58 | Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" | 58 | </Configurations> |
59 | UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> | 59 | <References> |
60 | </Filter> | 60 | </References> |
61 | <File | 61 | <Files> |
62 | RelativePath=".\indra.l"> | 62 | <Filter |
63 | <FileConfiguration | 63 | Name="Source Files" |
64 | Name="Debug|Win32"> | 64 | Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" |
65 | <Tool | 65 | UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
66 | Name="VCCustomBuildTool" | 66 | > |
67 | Description="Building lex_yy.cpp" | 67 | </Filter> |
68 | CommandLine="C:\cygwin\bin\flex.exe -olex_yy.cpp indra.l | 68 | <Filter |
69 | " | 69 | Name="Header Files" |
70 | Outputs="lex_yy.cpp"/> | 70 | Filter="h;hpp;hxx;hm;inl;inc;xsd" |
71 | </FileConfiguration> | 71 | UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
72 | <FileConfiguration | 72 | > |
73 | Name="Release|Win32"> | 73 | </Filter> |
74 | <Tool | 74 | <Filter |
75 | Name="VCCustomBuildTool" | 75 | Name="Resource Files" |
76 | Description="Building lex_yy.cpp" | 76 | Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" |
77 | CommandLine="C:\cygwin\bin\flex.exe -olex_yy.cpp indra.l | 77 | UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" |
78 | " | 78 | > |
79 | Outputs="lex_yy.cpp"/> | 79 | </Filter> |
80 | </FileConfiguration> | 80 | <File |
81 | </File> | 81 | RelativePath=".\indra.l" |
82 | <File | 82 | > |
83 | RelativePath=".\indra.y"> | 83 | <FileConfiguration |
84 | <FileConfiguration | 84 | Name="Debug|Win32" |
85 | Name="Debug|Win32"> | 85 | > |
86 | <Tool | 86 | <Tool |
87 | Name="VCCustomBuildTool" | 87 | Name="VCCustomBuildTool" |
88 | Description="Building ytab.cpp" | 88 | Description="Building lex_yy.cpp" |
89 | CommandLine="C:\cygwin\bin\bison.exe -o ytab.cpp -v -d indra.y | 89 | CommandLine="C:\cygwin\bin\flex.exe -olex_yy.cpp indra.l
" |
90 | " | 90 | Outputs="lex_yy.cpp" |
91 | Outputs="ytab.cpp;ytab.h"/> | 91 | /> |
92 | </FileConfiguration> | 92 | </FileConfiguration> |
93 | <FileConfiguration | 93 | <FileConfiguration |
94 | Name="Release|Win32"> | 94 | Name="Release|Win32" |
95 | <Tool | 95 | > |
96 | Name="VCCustomBuildTool" | 96 | <Tool |
97 | Description="Building ytab.cpp" | 97 | Name="VCCustomBuildTool" |
98 | CommandLine="C:\cygwin\bin\bison.exe -y -d -v -o ytab.cpp indra.y | 98 | Description="Building lex_yy.cpp" |
99 | C:\cygwin\bin\mv.exe ytab.hpp ytab.h" | 99 | CommandLine="C:\cygwin\bin\flex.exe -olex_yy.cpp indra.l
" |
100 | Outputs="ytab.cpp;ytab.h"/> | 100 | Outputs="lex_yy.cpp" |
101 | </FileConfiguration> | 101 | /> |
102 | </File> | 102 | </FileConfiguration> |
103 | </Files> | 103 | </File> |
104 | <Globals> | 104 | <File |
105 | </Globals> | 105 | RelativePath=".\indra.y" |
106 | </VisualStudioProject> | 106 | > |
107 | <FileConfiguration | ||
108 | Name="Debug|Win32" | ||
109 | > | ||
110 | <Tool | ||
111 | Name="VCCustomBuildTool" | ||
112 | Description="Building ytab.cpp" | ||
113 | CommandLine="C:\cygwin\bin\bison.exe -y -d -v -o ytab.cpp indra.y
" | ||
114 | Outputs="ytab.cpp;ytab.h" | ||
115 | /> | ||
116 | </FileConfiguration> | ||
117 | <FileConfiguration | ||
118 | Name="Release|Win32" | ||
119 | > | ||
120 | <Tool | ||
121 | Name="VCCustomBuildTool" | ||
122 | Description="Building ytab.cpp" | ||
123 | CommandLine="dir
C:\cygwin\bin\bison.exe -y -d -v -o ytab.cpp indra.y
C:\cygwin\bin\mv.exe ytab.hpp ytab.h
" | ||
124 | Outputs="ytab.cpp;ytab.h" | ||
125 | /> | ||
126 | </FileConfiguration> | ||
127 | </File> | ||
128 | </Files> | ||
129 | <Globals> | ||
130 | </Globals> | ||
131 | </VisualStudioProject> | ||
diff --git a/linden/indra/mac_crash_logger/llcrashloggermac.cpp b/linden/indra/mac_crash_logger/llcrashloggermac.cpp new file mode 100644 index 0000000..3d8abe5 --- /dev/null +++ b/linden/indra/mac_crash_logger/llcrashloggermac.cpp | |||
@@ -0,0 +1,342 @@ | |||
1 | /** | ||
2 | * @file llcrashloggermac.cpp | ||
3 | * @brief Mac OSX crash logger implementation | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2003&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2003-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | |||
33 | #include "llcrashloggermac.h" | ||
34 | |||
35 | #include <Carbon/Carbon.h> | ||
36 | #include <iostream> | ||
37 | #include <sstream> | ||
38 | |||
39 | #include "boost/tokenizer.hpp" | ||
40 | |||
41 | #include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME | ||
42 | #include "llerror.h" | ||
43 | #include "llfile.h" | ||
44 | #include "lltimer.h" | ||
45 | #include "llstring.h" | ||
46 | #include "lldir.h" | ||
47 | #include "llsdserialize.h" | ||
48 | |||
49 | #define MAX_LOADSTRING 100 | ||
50 | const char* const SETTINGS_FILE_HEADER = "version"; | ||
51 | const S32 SETTINGS_FILE_VERSION = 101; | ||
52 | |||
53 | // Windows Message Handlers | ||
54 | |||
55 | BOOL gFirstDialog = TRUE; // Are we currently handling the Send/Don't Send dialog? | ||
56 | FILE *gDebugFile = NULL; | ||
57 | |||
58 | WindowRef gWindow = NULL; | ||
59 | EventHandlerRef gEventHandler = NULL; | ||
60 | LLString gUserNotes = ""; | ||
61 | bool gSendReport = false; | ||
62 | bool gRememberChoice = false; | ||
63 | IBNibRef nib = NULL; | ||
64 | |||
65 | OSStatus dialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata) | ||
66 | { | ||
67 | OSStatus result = eventNotHandledErr; | ||
68 | OSStatus err; | ||
69 | UInt32 evtClass = GetEventClass(event); | ||
70 | UInt32 evtKind = GetEventKind(event); | ||
71 | if((evtClass == kEventClassCommand) && (evtKind == kEventCommandProcess)) | ||
72 | { | ||
73 | HICommand cmd; | ||
74 | err = GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(cmd), NULL, &cmd); | ||
75 | |||
76 | |||
77 | |||
78 | if(err == noErr) | ||
79 | { | ||
80 | //Get the value of the checkbox | ||
81 | ControlID id; | ||
82 | ControlRef checkBox = NULL; | ||
83 | id.signature = 'remb'; | ||
84 | id.id = 0; | ||
85 | err = GetControlByID(gWindow, &id, &checkBox); | ||
86 | |||
87 | if(err == noErr) | ||
88 | { | ||
89 | if(GetControl32BitValue(checkBox) == kControlCheckBoxCheckedValue) | ||
90 | { | ||
91 | gRememberChoice = true; | ||
92 | } | ||
93 | else | ||
94 | { | ||
95 | gRememberChoice = false; | ||
96 | } | ||
97 | } | ||
98 | switch(cmd.commandID) | ||
99 | { | ||
100 | case kHICommandOK: | ||
101 | { | ||
102 | char buffer[65535]; /* Flawfinder: ignore */ | ||
103 | Size size = sizeof(buffer) - 1; | ||
104 | ControlRef textField = NULL; | ||
105 | |||
106 | id.signature = 'text'; | ||
107 | id.id = 0; | ||
108 | |||
109 | err = GetControlByID(gWindow, &id, &textField); | ||
110 | if(err == noErr) | ||
111 | { | ||
112 | // Get the user response text | ||
113 | err = GetControlData(textField, kControlNoPart, kControlEditTextTextTag, size, (Ptr)buffer, &size); | ||
114 | } | ||
115 | if(err == noErr) | ||
116 | { | ||
117 | // Make sure the string is terminated. | ||
118 | buffer[size] = 0; | ||
119 | gUserNotes = buffer; | ||
120 | |||
121 | llinfos << buffer << llendl; | ||
122 | } | ||
123 | |||
124 | // Send the report. | ||
125 | |||
126 | QuitAppModalLoopForWindow(gWindow); | ||
127 | gSendReport = true; | ||
128 | result = noErr; | ||
129 | } | ||
130 | break; | ||
131 | |||
132 | case kHICommandCancel: | ||
133 | QuitAppModalLoopForWindow(gWindow); | ||
134 | result = noErr; | ||
135 | break; | ||
136 | } | ||
137 | } | ||
138 | } | ||
139 | |||
140 | return(result); | ||
141 | } | ||
142 | |||
143 | |||
144 | LLCrashLoggerMac::LLCrashLoggerMac(void) | ||
145 | { | ||
146 | } | ||
147 | |||
148 | LLCrashLoggerMac::~LLCrashLoggerMac(void) | ||
149 | { | ||
150 | } | ||
151 | |||
152 | bool LLCrashLoggerMac::init(void) | ||
153 | { | ||
154 | bool ok = LLCrashLogger::init(); | ||
155 | if(!ok) return false; | ||
156 | if(mCrashBehavior != CRASH_BEHAVIOR_ASK) return true; | ||
157 | |||
158 | // Real UI... | ||
159 | OSStatus err; | ||
160 | |||
161 | err = CreateNibReference(CFSTR("CrashReporter"), &nib); | ||
162 | |||
163 | if(err == noErr) | ||
164 | { | ||
165 | err = CreateWindowFromNib(nib, CFSTR("CrashReporter"), &gWindow); | ||
166 | } | ||
167 | |||
168 | if(err == noErr) | ||
169 | { | ||
170 | // Set focus to the edit text area | ||
171 | ControlRef textField = NULL; | ||
172 | ControlID id; | ||
173 | |||
174 | id.signature = 'text'; | ||
175 | id.id = 0; | ||
176 | |||
177 | // Don't set err if any of this fails, since it's non-critical. | ||
178 | if(GetControlByID(gWindow, &id, &textField) == noErr) | ||
179 | { | ||
180 | SetKeyboardFocus(gWindow, textField, kControlFocusNextPart); | ||
181 | } | ||
182 | } | ||
183 | |||
184 | if(err == noErr) | ||
185 | { | ||
186 | ShowWindow(gWindow); | ||
187 | } | ||
188 | |||
189 | if(err == noErr) | ||
190 | { | ||
191 | // Set up an event handler for the window. | ||
192 | EventTypeSpec handlerEvents[] = | ||
193 | { | ||
194 | { kEventClassCommand, kEventCommandProcess } | ||
195 | }; | ||
196 | |||
197 | InstallWindowEventHandler( | ||
198 | gWindow, | ||
199 | NewEventHandlerUPP(dialogHandler), | ||
200 | GetEventTypeCount (handlerEvents), | ||
201 | handlerEvents, | ||
202 | 0, | ||
203 | &gEventHandler); | ||
204 | } | ||
205 | return true; | ||
206 | } | ||
207 | |||
208 | void LLCrashLoggerMac::gatherPlatformSpecificFiles() | ||
209 | { | ||
210 | updateApplication("Gathering hardware information..."); | ||
211 | char path[MAX_PATH]; | ||
212 | FSRef folder; | ||
213 | |||
214 | if(FSFindFolder(kUserDomain, kLogsFolderType, false, &folder) == noErr) | ||
215 | { | ||
216 | // folder is an FSRef to ~/Library/Logs/ | ||
217 | if(FSRefMakePath(&folder, (UInt8*)&path, sizeof(path)) == noErr) | ||
218 | { | ||
219 | struct stat dw_stat; | ||
220 | LLString mBuf; | ||
221 | bool isLeopard = false; | ||
222 | // Try the 10.3 path first... | ||
223 | LLString dw_file_name = LLString(path) + LLString("/CrashReporter/Second Life.crash.log"); | ||
224 | int res = stat(dw_file_name.c_str(), &dw_stat); | ||
225 | |||
226 | if (res) | ||
227 | { | ||
228 | // Try the 10.2 one next... | ||
229 | dw_file_name = LLString(path) + LLString("/Second Life.crash.log"); | ||
230 | res = stat(dw_file_name.c_str(), &dw_stat); | ||
231 | } | ||
232 | |||
233 | if(res) | ||
234 | { | ||
235 | //10.5: Like 10.3+, except it puts the crash time in the file instead of dividing it up | ||
236 | //using asterisks. Get a directory listing, search for files starting with second life, | ||
237 | //use the last one found. | ||
238 | LLString old_file_name, current_file_name, pathname, mask; | ||
239 | pathname = LLString(path) + LLString("/CrashReporter/"); | ||
240 | mask = "Second Life*"; | ||
241 | while(gDirUtilp->getNextFileInDir(pathname, mask, current_file_name, false)) | ||
242 | { | ||
243 | old_file_name = current_file_name; | ||
244 | } | ||
245 | if(old_file_name != "") | ||
246 | { | ||
247 | dw_file_name = pathname + old_file_name; | ||
248 | res=stat(dw_file_name.c_str(), &dw_stat); | ||
249 | isLeopard = true; | ||
250 | } | ||
251 | } | ||
252 | |||
253 | if (!res) | ||
254 | { | ||
255 | std::ifstream fp(dw_file_name.c_str()); | ||
256 | std::stringstream str; | ||
257 | if(!fp.is_open()) return; | ||
258 | str << fp.rdbuf(); | ||
259 | mBuf = str.str(); | ||
260 | |||
261 | if(!isLeopard) | ||
262 | { | ||
263 | // Crash logs consist of a number of entries, one per crash. | ||
264 | // Each entry is preceeded by "**********" on a line by itself. | ||
265 | // We want only the most recent (i.e. last) one. | ||
266 | const char *sep = "**********"; | ||
267 | const char *start = mBuf.c_str(); | ||
268 | const char *cur = start; | ||
269 | const char *temp = strstr(cur, sep); | ||
270 | |||
271 | while(temp != NULL) | ||
272 | { | ||
273 | // Skip past the marker we just found | ||
274 | cur = temp + strlen(sep); /* Flawfinder: ignore */ | ||
275 | |||
276 | // and try to find another | ||
277 | temp = strstr(cur, sep); | ||
278 | } | ||
279 | |||
280 | // If there's more than one entry in the log file, strip all but the last one. | ||
281 | if(cur != start) | ||
282 | { | ||
283 | mBuf.erase(0, cur - start); | ||
284 | } | ||
285 | } | ||
286 | mCrashInfo["CrashLog"] = mBuf; | ||
287 | } | ||
288 | else | ||
289 | { | ||
290 | llwarns << "Couldn't find any CrashReporter files..." << llendl; | ||
291 | } | ||
292 | } | ||
293 | } | ||
294 | } | ||
295 | |||
296 | bool LLCrashLoggerMac::mainLoop() | ||
297 | { | ||
298 | OSStatus err = noErr; | ||
299 | |||
300 | if(err == noErr && mCrashBehavior == CRASH_BEHAVIOR_ASK) | ||
301 | { | ||
302 | RunAppModalLoopForWindow(gWindow); | ||
303 | } | ||
304 | else if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND) | ||
305 | { | ||
306 | gSendReport = true; | ||
307 | } | ||
308 | |||
309 | if(gRememberChoice) | ||
310 | { | ||
311 | if(gSendReport) saveCrashBehaviorSetting(CRASH_BEHAVIOR_ALWAYS_SEND); | ||
312 | else saveCrashBehaviorSetting(CRASH_BEHAVIOR_NEVER_SEND); | ||
313 | } | ||
314 | |||
315 | if(gSendReport) | ||
316 | { | ||
317 | setUserText(gUserNotes); | ||
318 | sendCrashLogs(); | ||
319 | } | ||
320 | |||
321 | if(gWindow != NULL) | ||
322 | { | ||
323 | DisposeWindow(gWindow); | ||
324 | } | ||
325 | |||
326 | if(nib != NULL) | ||
327 | { | ||
328 | DisposeNibReference(nib); | ||
329 | } | ||
330 | |||
331 | return true; | ||
332 | } | ||
333 | |||
334 | void LLCrashLoggerMac::updateApplication(LLString message) | ||
335 | { | ||
336 | LLCrashLogger::updateApplication(); | ||
337 | } | ||
338 | |||
339 | bool LLCrashLoggerMac::cleanup() | ||
340 | { | ||
341 | return true; | ||
342 | } | ||
diff --git a/linden/indra/mac_crash_logger/llcrashloggermac.h b/linden/indra/mac_crash_logger/llcrashloggermac.h new file mode 100644 index 0000000..cf4e766 --- /dev/null +++ b/linden/indra/mac_crash_logger/llcrashloggermac.h | |||
@@ -0,0 +1,51 @@ | |||
1 | /** | ||
2 | * @file llcrashloggermac.h | ||
3 | * @brief Mac OSX crash logger definition | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2003&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2003-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #ifndef LLCRASHLOGGERMAC_H | ||
33 | #define LLCRASHLOGGERMAC_H | ||
34 | |||
35 | #include "linden_common.h" | ||
36 | #include "llcrashlogger.h" | ||
37 | #include "llstring.h" | ||
38 | |||
39 | class LLCrashLoggerMac : public LLCrashLogger | ||
40 | { | ||
41 | public: | ||
42 | LLCrashLoggerMac(void); | ||
43 | ~LLCrashLoggerMac(void); | ||
44 | virtual bool init(); | ||
45 | virtual bool mainLoop(); | ||
46 | virtual void updateApplication(LLString message = ""); | ||
47 | virtual bool cleanup(); | ||
48 | virtual void gatherPlatformSpecificFiles(); | ||
49 | }; | ||
50 | |||
51 | #endif | ||
diff --git a/linden/indra/mac_crash_logger/mac_crash_logger.cpp b/linden/indra/mac_crash_logger/mac_crash_logger.cpp index 2501b4a..bf3151a 100644 --- a/linden/indra/mac_crash_logger/mac_crash_logger.cpp +++ b/linden/indra/mac_crash_logger/mac_crash_logger.cpp | |||
@@ -31,675 +31,21 @@ | |||
31 | 31 | ||
32 | #include "linden_common.h" | 32 | #include "linden_common.h" |
33 | 33 | ||
34 | #include <sys/types.h> | 34 | #include "llcrashloggermac.h" |
35 | #include <sys/stat.h> | ||
36 | #include <unistd.h> | ||
37 | |||
38 | #include <curl/curl.h> | ||
39 | |||
40 | #include "llerror.h" | ||
41 | #include "lltimer.h" | ||
42 | #include "lldir.h" | ||
43 | |||
44 | #include "llstring.h" | ||
45 | |||
46 | class LLFileEncoder | ||
47 | { | ||
48 | public: | ||
49 | LLFileEncoder(const char *formname, const char *filename, bool isCrashLog = false); | ||
50 | |||
51 | BOOL isValid() const { return mIsValid; } | ||
52 | LLString encodeURL(const S32 max_length = 0); | ||
53 | public: | ||
54 | BOOL mIsValid; | ||
55 | LLString mFilename; | ||
56 | LLString mFormname; | ||
57 | LLString mBuf; | ||
58 | }; | ||
59 | |||
60 | LLString encode_string(const char *formname, const LLString &str); | ||
61 | |||
62 | #include <Carbon/Carbon.h> | ||
63 | |||
64 | LLString gServerResponse; | ||
65 | BOOL gSendReport = FALSE; | ||
66 | LLString gUserserver; | ||
67 | LLString gUserText; | ||
68 | WindowRef gWindow = NULL; | ||
69 | EventHandlerRef gEventHandler = NULL; | ||
70 | BOOL gCrashInPreviousExec = FALSE; | ||
71 | time_t gLaunchTime; | ||
72 | |||
73 | size_t curl_download_callback(void *data, size_t size, size_t nmemb, | ||
74 | void *user_data) | ||
75 | { | ||
76 | S32 bytes = size * nmemb; | ||
77 | char *cdata = (char *) data; | ||
78 | for (int i =0; i < bytes; i += 1) | ||
79 | { | ||
80 | gServerResponse += (cdata[i]); | ||
81 | } | ||
82 | return bytes; | ||
83 | } | ||
84 | |||
85 | OSStatus dialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata) | ||
86 | { | ||
87 | OSStatus result = eventNotHandledErr; | ||
88 | OSStatus err; | ||
89 | UInt32 evtClass = GetEventClass(event); | ||
90 | UInt32 evtKind = GetEventKind(event); | ||
91 | |||
92 | if((evtClass == kEventClassCommand) && (evtKind == kEventCommandProcess)) | ||
93 | { | ||
94 | HICommand cmd; | ||
95 | err = GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(cmd), NULL, &cmd); | ||
96 | |||
97 | if(err == noErr) | ||
98 | { | ||
99 | switch(cmd.commandID) | ||
100 | { | ||
101 | case kHICommandOK: | ||
102 | { | ||
103 | char buffer[65535]; /* Flawfinder: ignore */ | ||
104 | Size size = sizeof(buffer) - 1; | ||
105 | ControlRef textField = NULL; | ||
106 | ControlID id; | ||
107 | |||
108 | id.signature = 'text'; | ||
109 | id.id = 0; | ||
110 | |||
111 | err = GetControlByID(gWindow, &id, &textField); | ||
112 | if(err == noErr) | ||
113 | { | ||
114 | // Get the user response text | ||
115 | err = GetControlData(textField, kControlNoPart, kControlEditTextTextTag, size, (Ptr)buffer, &size); | ||
116 | } | ||
117 | if(err == noErr) | ||
118 | { | ||
119 | // Make sure the string is terminated. | ||
120 | buffer[size] = 0; | ||
121 | gUserText = buffer; | ||
122 | llinfos << buffer << llendl; | ||
123 | } | ||
124 | |||
125 | // Send the report. | ||
126 | gSendReport = TRUE; | ||
127 | |||
128 | QuitAppModalLoopForWindow(gWindow); | ||
129 | result = noErr; | ||
130 | } | ||
131 | break; | ||
132 | |||
133 | case kHICommandCancel: | ||
134 | QuitAppModalLoopForWindow(gWindow); | ||
135 | result = noErr; | ||
136 | break; | ||
137 | } | ||
138 | } | ||
139 | } | ||
140 | |||
141 | return(result); | ||
142 | } | ||
143 | 35 | ||
144 | int main(int argc, char **argv) | 36 | int main(int argc, char **argv) |
145 | { | 37 | { |
146 | const S32 DW_MAX_SIZE = 100000; // Maximum size to transmit of the Dr. Watson log file | 38 | //time(&gLaunchTime); |
147 | const S32 SL_MAX_SIZE = 100000; // Maximum size of the Second Life log file. | ||
148 | int i; | ||
149 | |||
150 | time(&gLaunchTime); | ||
151 | 39 | ||
152 | llinfos << "Starting Second Life Viewer Crash Reporter" << llendl; | 40 | llinfos << "Starting Second Life Viewer Crash Reporter" << llendl; |
153 | |||
154 | for(i=1; i<argc; i++) | ||
155 | { | ||
156 | if(!strcmp(argv[i], "-previous")) | ||
157 | { | ||
158 | gCrashInPreviousExec = TRUE; | ||
159 | } | ||
160 | if(!strcmp(argv[i], "-user")) | ||
161 | { | ||
162 | if ((i + 1) < argc) | ||
163 | { | ||
164 | i++; | ||
165 | gUserserver = argv[i]; | ||
166 | llinfos << "Got userserver " << gUserserver << llendl; | ||
167 | } | ||
168 | } | ||
169 | } | ||
170 | |||
171 | if( gCrashInPreviousExec ) | ||
172 | { | ||
173 | llinfos << "Previous execution did not remove SecondLife.exec_marker" << llendl; | ||
174 | } | ||
175 | |||
176 | if(!gCrashInPreviousExec) | ||
177 | { | ||
178 | // Delay five seconds to let CrashReporter do its thing. | ||
179 | sleep(5); | ||
180 | } | ||
181 | |||
182 | #if 1 | ||
183 | // Real UI... | ||
184 | OSStatus err; | ||
185 | IBNibRef nib = NULL; | ||
186 | |||
187 | err = CreateNibReference(CFSTR("CrashReporter"), &nib); | ||
188 | |||
189 | if(err == noErr) | ||
190 | { | ||
191 | if(gCrashInPreviousExec) | ||
192 | { | ||
193 | err = CreateWindowFromNib(nib, CFSTR("CrashReporterDelayed"), &gWindow); | ||
194 | } | ||
195 | else | ||
196 | { | ||
197 | err = CreateWindowFromNib(nib, CFSTR("CrashReporter"), &gWindow); | ||
198 | } | ||
199 | } | ||
200 | |||
201 | if(err == noErr) | ||
202 | { | ||
203 | // Set focus to the edit text area | ||
204 | ControlRef textField = NULL; | ||
205 | ControlID id; | ||
206 | |||
207 | id.signature = 'text'; | ||
208 | id.id = 0; | ||
209 | |||
210 | // Don't set err if any of this fails, since it's non-critical. | ||
211 | if(GetControlByID(gWindow, &id, &textField) == noErr) | ||
212 | { | ||
213 | SetKeyboardFocus(gWindow, textField, kControlFocusNextPart); | ||
214 | } | ||
215 | } | ||
216 | |||
217 | if(err == noErr) | ||
218 | { | ||
219 | ShowWindow(gWindow); | ||
220 | } | ||
221 | |||
222 | if(err == noErr) | ||
223 | { | ||
224 | // Set up an event handler for the window. | ||
225 | EventTypeSpec handlerEvents[] = | ||
226 | { | ||
227 | { kEventClassCommand, kEventCommandProcess } | ||
228 | }; | ||
229 | |||
230 | InstallWindowEventHandler( | ||
231 | gWindow, | ||
232 | NewEventHandlerUPP(dialogHandler), | ||
233 | GetEventTypeCount (handlerEvents), | ||
234 | handlerEvents, | ||
235 | 0, | ||
236 | &gEventHandler); | ||
237 | } | ||
238 | |||
239 | if(err == noErr) | ||
240 | { | ||
241 | RunAppModalLoopForWindow(gWindow); | ||
242 | } | ||
243 | |||
244 | if(gWindow != NULL) | ||
245 | { | ||
246 | DisposeWindow(gWindow); | ||
247 | } | ||
248 | |||
249 | if(nib != NULL) | ||
250 | { | ||
251 | DisposeNibReference(nib); | ||
252 | } | ||
253 | #else | ||
254 | // Cheap version -- just use the standard system alert. | ||
255 | SInt16 itemHit = 0; | ||
256 | AlertStdCFStringAlertParamRec params; | ||
257 | OSStatus err = noErr; | ||
258 | DialogRef alert = NULL; | ||
259 | |||
260 | params.version = kStdCFStringAlertVersionOne; | ||
261 | params.movable = false; | ||
262 | params.helpButton = false; | ||
263 | params.defaultText = CFSTR("Send Report"); | ||
264 | params.cancelText = CFSTR("Don't Send Report"); | ||
265 | params.otherText = 0; | ||
266 | params.defaultButton = kAlertStdAlertOKButton; | ||
267 | params.cancelButton = kAlertStdAlertCancelButton; | ||
268 | params.position = kWindowDefaultPosition; | ||
269 | params.flags = 0; | ||
270 | |||
271 | err = CreateStandardAlert( | ||
272 | kAlertCautionAlert, | ||
273 | CFSTR("Second Life appears to have crashed."), | ||
274 | CFSTR( | ||
275 | "To help us debug the problem, you can send a crash report to Linden Lab. " | ||
276 | "The report contains information about your microprocessor type, graphics card, " | ||
277 | "memory, things that happened during the last run of the program, and the Crash Log " | ||
278 | "of where the crash occurred.\r" | ||
279 | "\r" | ||
280 | "You may also report crashes in the forums, or by sending e-mail to peter@lindenlab.com"), | ||
281 | ¶ms, | ||
282 | &alert); | ||
283 | |||
284 | if(err == noErr) | ||
285 | { | ||
286 | err = RunStandardAlert( | ||
287 | alert, | ||
288 | NULL, | ||
289 | &itemHit); | ||
290 | } | ||
291 | |||
292 | if(itemHit == kAlertStdAlertOKButton) | ||
293 | gSendReport = TRUE; | ||
294 | #endif | ||
295 | |||
296 | if(!gSendReport) | ||
297 | { | ||
298 | // Only send the report if the user agreed to it. | ||
299 | llinfos << "User cancelled, not sending report" << llendl; | ||
300 | |||
301 | return(0); | ||
302 | } | ||
303 | |||
304 | // We assume that all the logs we're looking for reside on the current drive | ||
305 | gDirUtilp->initAppDirs("SecondLife"); | ||
306 | |||
307 | int res; | ||
308 | |||
309 | // Lots of silly variable, replicated for each log file. | ||
310 | LLString db_file_name; | ||
311 | LLString sl_file_name; | ||
312 | LLString dw_file_name; // DW file name is a hack for now... | ||
313 | LLString st_file_name; // stats.log file | ||
314 | LLString si_file_name; // settings.ini file | ||
315 | |||
316 | LLFileEncoder *db_filep = NULL; | ||
317 | LLFileEncoder *sl_filep = NULL; | ||
318 | LLFileEncoder *st_filep = NULL; | ||
319 | LLFileEncoder *dw_filep = NULL; | ||
320 | LLFileEncoder *si_filep = NULL; | ||
321 | |||
322 | /////////////////////////////////// | ||
323 | // | ||
324 | // We do the parsing for the debug_info file first, as that will | ||
325 | // give us the location of the SecondLife.log file. | ||
326 | // | ||
327 | |||
328 | // Figure out the filename of the debug log | ||
329 | db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log").c_str(); | ||
330 | db_filep = new LLFileEncoder("DB", db_file_name.c_str()); | ||
331 | |||
332 | // Get the filename of the SecondLife.log file | ||
333 | |||
334 | // *NOTE: changing the size of either of these buffers will | ||
335 | // require changing the sscanf() format string to correctly | ||
336 | // account for it. | ||
337 | char tmp_sl_name[LL_MAX_PATH]; /* Flawfinder: ignore */ | ||
338 | tmp_sl_name[0] = '\0'; | ||
339 | char tmp_space[MAX_STRING]; /* Flawfinder: ignore */ | ||
340 | tmp_space[0] = '\0'; | ||
341 | |||
342 | // Look for it in the debug_info.log file | ||
343 | if (db_filep->isValid()) | ||
344 | { | ||
345 | // This was originally scanning for "SL Log: %[^\r\n]", which happily skipped to the next line | ||
346 | // on debug logs (which don't have anything after "SL Log:" and tried to open a nonsensical filename. | ||
347 | sscanf( | ||
348 | db_filep->mBuf.c_str(), | ||
349 | "SL Log:%254[ ]%1023[^\r\n]", | ||
350 | tmp_space, | ||
351 | tmp_sl_name); | ||
352 | } | ||
353 | else | ||
354 | { | ||
355 | delete db_filep; | ||
356 | db_filep = NULL; | ||
357 | } | ||
358 | |||
359 | // If we actually have a legitimate file name, use it. | ||
360 | if (tmp_sl_name[0]) | ||
361 | { | ||
362 | sl_file_name = tmp_sl_name; | ||
363 | llinfos << "Using log file from debug log " << sl_file_name << llendl; | ||
364 | } | ||
365 | else | ||
366 | { | ||
367 | // Figure out the filename of the second life log | ||
368 | sl_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.log").c_str(); | ||
369 | } | ||
370 | |||
371 | // Now we get the SecondLife.log file if it's there, and recent enough... | ||
372 | sl_filep = new LLFileEncoder("SL", sl_file_name.c_str()); | ||
373 | if (!sl_filep->isValid()) | ||
374 | { | ||
375 | delete sl_filep; | ||
376 | sl_filep = NULL; | ||
377 | } | ||
378 | |||
379 | st_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stats.log").c_str(); | ||
380 | st_filep = new LLFileEncoder("ST", st_file_name.c_str()); | ||
381 | if (!st_filep->isValid()) | ||
382 | { | ||
383 | delete st_filep; | ||
384 | st_filep = NULL; | ||
385 | } | ||
386 | |||
387 | si_file_name = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.ini").c_str(); | ||
388 | si_filep = new LLFileEncoder("SI", si_file_name.c_str()); | ||
389 | if (!si_filep->isValid()) | ||
390 | { | ||
391 | delete si_filep; | ||
392 | si_filep = NULL; | ||
393 | } | ||
394 | |||
395 | // MBW -- This needs to go find "~/Library/Logs/CrashReporter/Second Life.crash.log" on 10.3 | ||
396 | // or "~/Library/Logs/Second Life.crash.log" on 10.2. | ||
397 | { | ||
398 | char path[MAX_PATH]; /* Flawfinder: ignore */ | ||
399 | FSRef folder; | ||
400 | |||
401 | if(FSFindFolder(kUserDomain, kLogsFolderType, false, &folder) == noErr) | ||
402 | { | ||
403 | // folder is an FSRef to ~/Library/Logs/ | ||
404 | if(FSRefMakePath(&folder, (UInt8*)&path, sizeof(path)) == noErr) | ||
405 | { | ||
406 | struct stat dw_stat; | ||
407 | // printf("path is %s\n", path); | ||
408 | |||
409 | // Try the 10.3 path first... | ||
410 | dw_file_name = LLString(path) + LLString("/CrashReporter/Second Life.crash.log"); | ||
411 | res = stat(dw_file_name.c_str(), &dw_stat); | ||
412 | |||
413 | if (res) | ||
414 | { | ||
415 | // Try the 10.2 one next... | ||
416 | dw_file_name = LLString(path) + LLString("/Second Life.crash.log"); | ||
417 | res = stat(dw_file_name.c_str(), &dw_stat); | ||
418 | } | ||
419 | |||
420 | if (!res) | ||
421 | { | ||
422 | dw_filep = new LLFileEncoder("DW", dw_file_name.c_str(), true); | ||
423 | if (!dw_filep->isValid()) | ||
424 | { | ||
425 | delete dw_filep; | ||
426 | dw_filep = NULL; | ||
427 | } | ||
428 | } | ||
429 | else | ||
430 | { | ||
431 | llwarns << "Couldn't find any CrashReporter files..." << llendl; | ||
432 | } | ||
433 | } | ||
434 | } | ||
435 | } | ||
436 | |||
437 | LLString post_data; | ||
438 | LLString tmp_url_buf; | ||
439 | |||
440 | // Append the userserver | ||
441 | tmp_url_buf = encode_string("USER", gUserserver); | ||
442 | post_data += tmp_url_buf; | ||
443 | llinfos << "PostData:" << post_data << llendl; | ||
444 | |||
445 | if (gCrashInPreviousExec) | ||
446 | { | ||
447 | post_data.append("&"); | ||
448 | tmp_url_buf = encode_string("EF", "Y"); | ||
449 | post_data += tmp_url_buf; | ||
450 | } | ||
451 | |||
452 | if (db_filep) | ||
453 | { | ||
454 | post_data.append("&"); | ||
455 | tmp_url_buf = db_filep->encodeURL(); | ||
456 | post_data += tmp_url_buf; | ||
457 | llinfos << "Sending DB log file" << llendl; | ||
458 | } | ||
459 | else | ||
460 | { | ||
461 | llinfos << "Not sending DB log file" << llendl; | ||
462 | } | ||
463 | |||
464 | if (sl_filep) | ||
465 | { | ||
466 | post_data.append("&"); | ||
467 | tmp_url_buf = sl_filep->encodeURL(SL_MAX_SIZE); | ||
468 | post_data += tmp_url_buf; | ||
469 | llinfos << "Sending SL log file" << llendl; | ||
470 | } | ||
471 | else | ||
472 | { | ||
473 | llinfos << "Not sending SL log file" << llendl; | ||
474 | } | ||
475 | |||
476 | if (st_filep) | ||
477 | { | ||
478 | post_data.append("&"); | ||
479 | tmp_url_buf = st_filep->encodeURL(SL_MAX_SIZE); | ||
480 | post_data += tmp_url_buf; | ||
481 | llinfos << "Sending stats log file" << llendl; | ||
482 | } | ||
483 | else | ||
484 | { | ||
485 | llinfos << "Not sending stats log file" << llendl; | ||
486 | } | ||
487 | 41 | ||
488 | if (dw_filep) | 42 | LLCrashLoggerMac app; |
43 | app.parseCommandOptions(argc, argv); | ||
44 | if(!app.init()) | ||
489 | { | 45 | { |
490 | post_data.append("&"); | 46 | return 0; |
491 | tmp_url_buf = dw_filep->encodeURL(DW_MAX_SIZE); | ||
492 | post_data += tmp_url_buf; | ||
493 | } | 47 | } |
494 | else | 48 | app.mainLoop(); |
495 | { | ||
496 | llinfos << "Not sending crash log file" << llendl; | ||
497 | } | ||
498 | |||
499 | if (si_filep) | ||
500 | { | ||
501 | post_data.append("&"); | ||
502 | tmp_url_buf = si_filep->encodeURL(); | ||
503 | post_data += tmp_url_buf; | ||
504 | llinfos << "Sending settings log file" << llendl; | ||
505 | } | ||
506 | else | ||
507 | { | ||
508 | llinfos << "Not sending settings.ini file" << llendl; | ||
509 | } | ||
510 | |||
511 | if (gUserText.size()) | ||
512 | { | ||
513 | post_data.append("&"); | ||
514 | tmp_url_buf = encode_string("UN", gUserText); | ||
515 | post_data += tmp_url_buf; | ||
516 | } | ||
517 | |||
518 | delete db_filep; | ||
519 | db_filep = NULL; | ||
520 | delete sl_filep; | ||
521 | sl_filep = NULL; | ||
522 | delete dw_filep; | ||
523 | dw_filep = NULL; | ||
524 | |||
525 | // Debugging spam | ||
526 | #if 0 | ||
527 | printf("Crash report post data:\n--------\n"); | ||
528 | printf("%s", post_data.getString()); | ||
529 | printf("\n--------\n"); | ||
530 | #endif | ||
531 | |||
532 | // Send the report. Yes, it's this easy. | ||
533 | { | ||
534 | CURL *curl = curl_easy_init(); | ||
535 | |||
536 | curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); | ||
537 | curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curl_download_callback); | ||
538 | curl_easy_setopt(curl, CURLOPT_POST, 1); | ||
539 | curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data.c_str()); | ||
540 | curl_easy_setopt(curl, CURLOPT_URL, "http://secondlife.com/cgi-bin/viewer_crash_reporter2"); | ||
541 | |||
542 | llinfos << "Connecting to crash report server" << llendl; | ||
543 | CURLcode result = curl_easy_perform(curl); | ||
544 | |||
545 | curl_easy_cleanup(curl); | ||
546 | 49 | ||
547 | if(result != CURLE_OK) | ||
548 | { | ||
549 | llinfos << "Couldn't talk to crash report server" << llendl; | ||
550 | } | ||
551 | else | ||
552 | { | ||
553 | llinfos << "Response from crash report server:" << llendl; | ||
554 | llinfos << gServerResponse << llendl; | ||
555 | } | ||
556 | } | ||
557 | |||
558 | return 0; | 50 | return 0; |
559 | } | 51 | } |
560 | |||
561 | LLFileEncoder::LLFileEncoder(const char *form_name, const char *filename, bool isCrashLog) | ||
562 | { | ||
563 | mFormname = form_name; | ||
564 | mFilename = filename; | ||
565 | mIsValid = FALSE; | ||
566 | |||
567 | int res; | ||
568 | |||
569 | struct stat stat_data; | ||
570 | res = stat(mFilename.c_str(), &stat_data); | ||
571 | if (res) | ||
572 | { | ||
573 | llwarns << "File " << mFilename << " is missing!" << llendl; | ||
574 | return; | ||
575 | } | ||
576 | else | ||
577 | { | ||
578 | // Debugging spam | ||
579 | // llinfos << "File " << mFilename << " is present..." << llendl; | ||
580 | |||
581 | if(!gCrashInPreviousExec && isCrashLog) | ||
582 | { | ||
583 | // Make sure the file isn't too old. | ||
584 | double age = difftime(gLaunchTime, stat_data.st_mtimespec.tv_sec); | ||
585 | |||
586 | // llinfos << "age is " << age << llendl; | ||
587 | |||
588 | if(age > 60.0) | ||
589 | { | ||
590 | // The file was last modified more than 60 seconds before the crash reporter was launched. Assume it's stale. | ||
591 | llwarns << "File " << mFilename << " is too old!" << llendl; | ||
592 | return; | ||
593 | } | ||
594 | } | ||
595 | |||
596 | } | ||
597 | |||
598 | S32 buf_size = stat_data.st_size; | ||
599 | FILE* fp = fopen(mFilename.c_str(), "rb"); /* Flawfinder: ignore */ | ||
600 | U8 *buf = new U8[buf_size + 1]; | ||
601 | fread(buf, 1, buf_size, fp); | ||
602 | fclose(fp); | ||
603 | buf[buf_size] = 0; | ||
604 | |||
605 | mBuf = (char *)buf; | ||
606 | |||
607 | if(isCrashLog) | ||
608 | { | ||
609 | // Crash logs consist of a number of entries, one per crash. | ||
610 | // Each entry is preceeded by "**********" on a line by itself. | ||
611 | // We want only the most recent (i.e. last) one. | ||
612 | const char *sep = "**********"; | ||
613 | const char *start = mBuf.c_str(); | ||
614 | const char *cur = start; | ||
615 | const char *temp = strstr(cur, sep); | ||
616 | |||
617 | while(temp != NULL) | ||
618 | { | ||
619 | // Skip past the marker we just found | ||
620 | cur = temp + strlen(sep); /* Flawfinder: ignore */ | ||
621 | |||
622 | // and try to find another | ||
623 | temp = strstr(cur, sep); | ||
624 | } | ||
625 | |||
626 | // If there's more than one entry in the log file, strip all but the last one. | ||
627 | if(cur != start) | ||
628 | { | ||
629 | mBuf.erase(0, cur - start); | ||
630 | } | ||
631 | } | ||
632 | |||
633 | mIsValid = TRUE; | ||
634 | delete[] buf; | ||
635 | } | ||
636 | |||
637 | LLString LLFileEncoder::encodeURL(const S32 max_length) | ||
638 | { | ||
639 | LLString result = mFormname; | ||
640 | result.append("="); | ||
641 | |||
642 | S32 i = 0; | ||
643 | |||
644 | if (max_length) | ||
645 | { | ||
646 | if (mBuf.size() > max_length) | ||
647 | { | ||
648 | i = mBuf.size() - max_length; | ||
649 | } | ||
650 | } | ||
651 | |||
652 | #if 0 | ||
653 | // Plain text version for debugging | ||
654 | result.append(mBuf); | ||
655 | #else | ||
656 | // Not using LLString because of bad performance issues | ||
657 | S32 buf_size = mBuf.size(); | ||
658 | S32 url_buf_size = 3*mBuf.size() + 1; | ||
659 | char *url_buf = new char[url_buf_size]; | ||
660 | if (url_buf == NULL) | ||
661 | { | ||
662 | llerrs << "Memory Allocation Failed" << llendl; | ||
663 | return result; | ||
664 | } | ||
665 | S32 cur_pos = 0; | ||
666 | for (; i < buf_size; i++) | ||
667 | { | ||
668 | sprintf(url_buf + cur_pos, "%%%02x", mBuf[i]); /* Flawfinder: ignore */ | ||
669 | cur_pos += 3; | ||
670 | } | ||
671 | url_buf[i*3] = 0; | ||
672 | |||
673 | result.append(url_buf); | ||
674 | delete[] url_buf; | ||
675 | #endif | ||
676 | return result; | ||
677 | } | ||
678 | |||
679 | LLString encode_string(const char *formname, const LLString &str) | ||
680 | { | ||
681 | LLString result = formname; | ||
682 | result.append("="); | ||
683 | // Not using LLString because of bad performance issues | ||
684 | S32 buf_size = str.size(); | ||
685 | S32 url_buf_size = 3*str.size() + 1; | ||
686 | char *url_buf = new char[url_buf_size]; | ||
687 | if (url_buf == NULL) | ||
688 | { | ||
689 | llerrs << "Memory Allocation Failed" << llendl; | ||
690 | return result; | ||
691 | } | ||
692 | |||
693 | S32 cur_pos = 0; | ||
694 | S32 i; | ||
695 | for (i = 0; i < buf_size; i++) | ||
696 | { | ||
697 | sprintf(url_buf + cur_pos, "%%%02x", str[i]); /* Flawfinder: ignore */ | ||
698 | cur_pos += 3; | ||
699 | } | ||
700 | url_buf[i*3] = 0; | ||
701 | |||
702 | result.append(url_buf); | ||
703 | delete[] url_buf; | ||
704 | return result; | ||
705 | } | ||
diff --git a/linden/indra/mac_updater/AutoUpdater.nib/classes.nib b/linden/indra/mac_updater/AutoUpdater.nib/classes.nib new file mode 100644 index 0000000..ea58db1 --- /dev/null +++ b/linden/indra/mac_updater/AutoUpdater.nib/classes.nib | |||
@@ -0,0 +1,4 @@ | |||
1 | { | ||
2 | IBClasses = (); | ||
3 | IBVersion = 1; | ||
4 | } | ||
diff --git a/linden/indra/mac_updater/AutoUpdater.nib/info.nib b/linden/indra/mac_updater/AutoUpdater.nib/info.nib new file mode 100644 index 0000000..a49a923 --- /dev/null +++ b/linden/indra/mac_updater/AutoUpdater.nib/info.nib | |||
@@ -0,0 +1,14 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | ||
2 | <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
3 | <plist version="1.0"> | ||
4 | <dict> | ||
5 | <key>IBDocumentLocation</key> | ||
6 | <string>103 138 356 240 0 0 1280 1002 </string> | ||
7 | <key>IBFramework Version</key> | ||
8 | <string>362.0</string> | ||
9 | <key>IBSystem Version</key> | ||
10 | <string>7D24</string> | ||
11 | <key>targetFramework</key> | ||
12 | <string>IBCarbonFramework</string> | ||
13 | </dict> | ||
14 | </plist> | ||
diff --git a/linden/indra/mac_updater/AutoUpdater.nib/objects.xib b/linden/indra/mac_updater/AutoUpdater.nib/objects.xib new file mode 100644 index 0000000..310411b --- /dev/null +++ b/linden/indra/mac_updater/AutoUpdater.nib/objects.xib | |||
@@ -0,0 +1,56 @@ | |||
1 | <?xml version="1.0" standalone="yes"?> | ||
2 | <object class="NSIBObjectData"> | ||
3 | <string name="targetFramework">IBCarbonFramework</string> | ||
4 | <object name="rootObject" class="NSCustomObject" id="1"> | ||
5 | <string name="customClass">NSApplication</string> | ||
6 | </object> | ||
7 | <array count="5" name="allObjects"> | ||
8 | <object class="IBCarbonWindow" id="166"> | ||
9 | <string name="windowRect">405 222 533 663 </string> | ||
10 | <string name="title">Second Life Updater</string> | ||
11 | <object name="rootControl" class="IBCarbonRootControl" id="167"> | ||
12 | <string name="bounds">0 0 128 441 </string> | ||
13 | <array count="3" name="subviews"> | ||
14 | <object class="IBCarbonStaticText" id="181"> | ||
15 | <string name="bounds">20 20 44 421 </string> | ||
16 | <ostype name="controlSignature">what</ostype> | ||
17 | <string name="title">Initializing…</string> | ||
18 | </object> | ||
19 | <object class="IBCarbonButton" id="183"> | ||
20 | <string name="bounds">88 351 108 421 </string> | ||
21 | <string name="title">Cancel</string> | ||
22 | <ostype name="command">not!</ostype> | ||
23 | <int name="buttonType">2</int> | ||
24 | </object> | ||
25 | <object class="IBCarbonProgressBar" id="193"> | ||
26 | <string name="bounds">51 19 70 422 </string> | ||
27 | <ostype name="controlSignature">prog</ostype> | ||
28 | <int name="initialValue">50</int> | ||
29 | </object> | ||
30 | </array> | ||
31 | </object> | ||
32 | <boolean name="isResizable">FALSE</boolean> | ||
33 | <int name="carbonWindowClass">2</int> | ||
34 | <int name="themeBrush">3</int> | ||
35 | <int name="windowPosition">7</int> | ||
36 | </object> | ||
37 | <reference idRef="167"/> | ||
38 | <reference idRef="181"/> | ||
39 | <reference idRef="183"/> | ||
40 | <reference idRef="193"/> | ||
41 | </array> | ||
42 | <array count="5" name="allParents"> | ||
43 | <reference idRef="1"/> | ||
44 | <reference idRef="166"/> | ||
45 | <reference idRef="167"/> | ||
46 | <reference idRef="167"/> | ||
47 | <reference idRef="167"/> | ||
48 | </array> | ||
49 | <dictionary count="2" name="nameTable"> | ||
50 | <string>File's Owner</string> | ||
51 | <reference idRef="1"/> | ||
52 | <string>Updater</string> | ||
53 | <reference idRef="166"/> | ||
54 | </dictionary> | ||
55 | <unsigned_int name="nextObjectID">194</unsigned_int> | ||
56 | </object> | ||
diff --git a/linden/indra/newview/CrashReporter.nib/info.nib b/linden/indra/newview/CrashReporter.nib/info.nib index 62e9cee..8eba931 100644 --- a/linden/indra/newview/CrashReporter.nib/info.nib +++ b/linden/indra/newview/CrashReporter.nib/info.nib | |||
@@ -3,11 +3,15 @@ | |||
3 | <plist version="1.0"> | 3 | <plist version="1.0"> |
4 | <dict> | 4 | <dict> |
5 | <key>IBDocumentLocation</key> | 5 | <key>IBDocumentLocation</key> |
6 | <string>508 20 476 367 0 0 1680 1028 </string> | 6 | <string>791 275 476 367 0 0 1600 1178 </string> |
7 | <key>IBFramework Version</key> | 7 | <key>IBFramework Version</key> |
8 | <string>446.1</string> | 8 | <string>446.1</string> |
9 | <key>IBOpenObjects</key> | ||
10 | <array> | ||
11 | <integer>166</integer> | ||
12 | </array> | ||
9 | <key>IBSystem Version</key> | 13 | <key>IBSystem Version</key> |
10 | <string>8L2127</string> | 14 | <string>8R2218</string> |
11 | <key>targetFramework</key> | 15 | <key>targetFramework</key> |
12 | <string>IBCarbonFramework</string> | 16 | <string>IBCarbonFramework</string> |
13 | </dict> | 17 | </dict> |
diff --git a/linden/indra/newview/CrashReporter.nib/objects.xib b/linden/indra/newview/CrashReporter.nib/objects.xib index 7ff2838..f62b8d5 100644 --- a/linden/indra/newview/CrashReporter.nib/objects.xib +++ b/linden/indra/newview/CrashReporter.nib/objects.xib | |||
@@ -4,33 +4,38 @@ | |||
4 | <object name="rootObject" class="NSCustomObject" id="1"> | 4 | <object name="rootObject" class="NSCustomObject" id="1"> |
5 | <string name="customClass">NSApplication</string> | 5 | <string name="customClass">NSApplication</string> |
6 | </object> | 6 | </object> |
7 | <array count="12" name="allObjects"> | 7 | <array count="7" name="allObjects"> |
8 | <object class="IBCarbonWindow" id="166"> | 8 | <object class="IBCarbonWindow" id="166"> |
9 | <string name="windowRect">123 251 577 758 </string> | 9 | <string name="windowRect">257 653 711 1160 </string> |
10 | <string name="title">Second Life Crash Logger</string> | 10 | <string name="title">Second Life Crash Logger</string> |
11 | <object name="rootControl" class="IBCarbonRootControl" id="167"> | 11 | <object name="rootControl" class="IBCarbonRootControl" id="167"> |
12 | <string name="bounds">0 0 454 507 </string> | 12 | <string name="bounds">0 0 454 507 </string> |
13 | <array count="4" name="subviews"> | 13 | <array count="5" name="subviews"> |
14 | <object class="IBCarbonStaticText" id="181"> | 14 | <object class="IBCarbonStaticText" id="181"> |
15 | <string name="bounds">20 20 177 487 </string> | 15 | <string name="bounds">20 20 231 487 </string> |
16 | <string name="title">Second Life appears to have crashed. This crash reporter collects information about your computer's hardware configuration, operating system, and some Second Life logs. In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help! If you don't wish to send Linden Lab a crash report, press Cancel. </string> | 16 | <string name="title">Second Life appears to have crashed or frozen the last time it ran. This crash reporter collects information about your computer's hardware configuration, operating system, and some Second Life logs, all of which are used for debugging purposes only. In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help! This report is NOT read by Customer Support. If you have billing or other questions, please go to: http://www.secondlife.com/support/ If you don't wish to send Linden Lab a crash report, press Cancel. </string> |
17 | </object> | 17 | </object> |
18 | <object class="IBCarbonButton" id="182"> | 18 | <object class="IBCarbonButton" id="182"> |
19 | <string name="bounds">414 417 434 487 </string> | 19 | <string name="bounds">414 273 434 378 </string> |
20 | <string name="title">OK</string> | 20 | <string name="title">Send Report</string> |
21 | <ostype name="command">ok </ostype> | 21 | <ostype name="command">ok </ostype> |
22 | </object> | 22 | </object> |
23 | <object class="IBCarbonButton" id="183"> | 23 | <object class="IBCarbonButton" id="183"> |
24 | <string name="bounds">414 335 434 405 </string> | 24 | <string name="bounds">414 390 434 487 </string> |
25 | <string name="title">Cancel</string> | 25 | <string name="title">Don't Send</string> |
26 | <ostype name="command">not!</ostype> | 26 | <ostype name="command">not!</ostype> |
27 | <int name="buttonType">2</int> | 27 | <int name="buttonType">2</int> |
28 | </object> | 28 | </object> |
29 | <object class="IBCarbonEditText" id="185"> | 29 | <object class="IBCarbonEditText" id="185"> |
30 | <string name="bounds">188 23 391 484 </string> | 30 | <string name="bounds">242 23 391 484 </string> |
31 | <ostype name="controlSignature">text</ostype> | 31 | <ostype name="controlSignature">text</ostype> |
32 | <boolean name="isUnicode">TRUE</boolean> | 32 | <boolean name="isUnicode">TRUE</boolean> |
33 | </object> | 33 | </object> |
34 | <object class="IBCarbonCheckBox" id="193"> | ||
35 | <string name="bounds">415 20 433 186 </string> | ||
36 | <string name="title">Remember This Choice</string> | ||
37 | <ostype name="controlSignature">remb</ostype> | ||
38 | </object> | ||
34 | </array> | 39 | </array> |
35 | </object> | 40 | </object> |
36 | <int name="carbonWindowClass">2</int> | 41 | <int name="carbonWindowClass">2</int> |
@@ -42,65 +47,22 @@ | |||
42 | <reference idRef="182"/> | 47 | <reference idRef="182"/> |
43 | <reference idRef="183"/> | 48 | <reference idRef="183"/> |
44 | <reference idRef="185"/> | 49 | <reference idRef="185"/> |
45 | <object class="IBCarbonButton" id="187"> | 50 | <reference idRef="193"/> |
46 | <string name="bounds">414 335 434 405 </string> | ||
47 | <string name="title">Cancel</string> | ||
48 | <ostype name="command">not!</ostype> | ||
49 | <int name="buttonType">2</int> | ||
50 | </object> | ||
51 | <object class="IBCarbonButton" id="188"> | ||
52 | <string name="bounds">414 417 434 487 </string> | ||
53 | <string name="title">OK</string> | ||
54 | <ostype name="command">ok </ostype> | ||
55 | </object> | ||
56 | <object class="IBCarbonEditText" id="189"> | ||
57 | <string name="bounds">188 23 391 484 </string> | ||
58 | <ostype name="controlSignature">text</ostype> | ||
59 | <boolean name="isUnicode">TRUE</boolean> | ||
60 | </object> | ||
61 | <object class="IBCarbonWindow" id="190"> | ||
62 | <string name="windowRect">104 65 558 572 </string> | ||
63 | <string name="title">Second Life Crash Logger</string> | ||
64 | <object name="rootControl" class="IBCarbonRootControl" id="192"> | ||
65 | <string name="bounds">0 0 454 507 </string> | ||
66 | <array count="4" name="subviews"> | ||
67 | <object class="IBCarbonStaticText" id="191"> | ||
68 | <string name="bounds">20 20 177 487 </string> | ||
69 | <string name="title">Second Life appears to have crashed or frozen the last time it ran. This crash reporter collects information about your computer's hardware configuration, operating system, and some Second Life logs. In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help! If you don't wish to send Linden Lab a crash report, press Cancel. </string> | ||
70 | </object> | ||
71 | <reference idRef="188"/> | ||
72 | <reference idRef="187"/> | ||
73 | <reference idRef="189"/> | ||
74 | </array> | ||
75 | </object> | ||
76 | <int name="carbonWindowClass">2</int> | ||
77 | <int name="themeBrush">3</int> | ||
78 | <int name="windowPosition">7</int> | ||
79 | </object> | ||
80 | <reference idRef="191"/> | ||
81 | <reference idRef="192"/> | ||
82 | </array> | 51 | </array> |
83 | <array count="12" name="allParents"> | 52 | <array count="7" name="allParents"> |
84 | <reference idRef="1"/> | 53 | <reference idRef="1"/> |
85 | <reference idRef="166"/> | 54 | <reference idRef="166"/> |
86 | <reference idRef="167"/> | 55 | <reference idRef="167"/> |
87 | <reference idRef="167"/> | 56 | <reference idRef="167"/> |
88 | <reference idRef="167"/> | 57 | <reference idRef="167"/> |
89 | <reference idRef="167"/> | 58 | <reference idRef="167"/> |
90 | <reference idRef="192"/> | 59 | <reference idRef="167"/> |
91 | <reference idRef="192"/> | ||
92 | <reference idRef="192"/> | ||
93 | <reference idRef="1"/> | ||
94 | <reference idRef="192"/> | ||
95 | <reference idRef="190"/> | ||
96 | </array> | 60 | </array> |
97 | <dictionary count="3" name="nameTable"> | 61 | <dictionary count="2" name="nameTable"> |
98 | <string>CrashReporter</string> | 62 | <string>CrashReporter</string> |
99 | <reference idRef="166"/> | 63 | <reference idRef="166"/> |
100 | <string>CrashReporterDelayed</string> | ||
101 | <reference idRef="190"/> | ||
102 | <string>File's Owner</string> | 64 | <string>File's Owner</string> |
103 | <reference idRef="1"/> | 65 | <reference idRef="1"/> |
104 | </dictionary> | 66 | </dictionary> |
105 | <unsigned_int name="nextObjectID">193</unsigned_int> | 67 | <unsigned_int name="nextObjectID">194</unsigned_int> |
106 | </object> | 68 | </object> |
diff --git a/linden/indra/newview/English.lproj/InfoPlist.strings b/linden/indra/newview/English.lproj/InfoPlist.strings index da89514..85f7e25 100644 --- a/linden/indra/newview/English.lproj/InfoPlist.strings +++ b/linden/indra/newview/English.lproj/InfoPlist.strings | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Localized versions of Info.plist keys */ | 1 | /* Localized versions of Info.plist keys */ |
2 | 2 | ||
3 | CFBundleName = "Second Life"; | 3 | CFBundleName = "Second Life"; |
4 | CFBundleShortVersionString = "Second Life version 1.18.5.3"; | 4 | CFBundleShortVersionString = "Second Life version 1.18.6.0"; |
5 | CFBundleGetInfoString = "Second Life version 1.18.5.3, Copyright 2004-2007 Linden Research, Inc."; | 5 | CFBundleGetInfoString = "Second Life version 1.18.6.0, Copyright 2004-2007 Linden Research, Inc."; |
diff --git a/linden/indra/newview/Info-SecondLife.plist b/linden/indra/newview/Info-SecondLife.plist index 427651c..59822a1 100644 --- a/linden/indra/newview/Info-SecondLife.plist +++ b/linden/indra/newview/Info-SecondLife.plist | |||
@@ -32,7 +32,7 @@ | |||
32 | </dict> | 32 | </dict> |
33 | </array> | 33 | </array> |
34 | <key>CFBundleVersion</key> | 34 | <key>CFBundleVersion</key> |
35 | <string>1.18.5.3</string> | 35 | <string>1.18.6.0</string> |
36 | <key>CSResourcesFileMapped</key> | 36 | <key>CSResourcesFileMapped</key> |
37 | <true/> | 37 | <true/> |
38 | </dict> | 38 | </dict> |
diff --git a/linden/indra/newview/files.lst b/linden/indra/newview/files.lst index fe864a3..a13abb7 100644 --- a/linden/indra/newview/files.lst +++ b/linden/indra/newview/files.lst | |||
@@ -3,6 +3,8 @@ newview/llagent.cpp | |||
3 | newview/llagentdata.cpp | 3 | newview/llagentdata.cpp |
4 | newview/llagentpilot.cpp | 4 | newview/llagentpilot.cpp |
5 | newview/llanimalcontrols.cpp | 5 | newview/llanimalcontrols.cpp |
6 | newview/llappviewer.cpp | ||
7 | newview/llappviewerlinux.cpp | ||
6 | newview/llassetuploadresponders.cpp | 8 | newview/llassetuploadresponders.cpp |
7 | newview/llaudiosourcevo.cpp | 9 | newview/llaudiosourcevo.cpp |
8 | newview/llbbox.cpp | 10 | newview/llbbox.cpp |
@@ -269,9 +271,11 @@ newview/llurldispatcher.cpp | |||
269 | newview/llurlsimstring.cpp | 271 | newview/llurlsimstring.cpp |
270 | newview/llurlwhitelist.cpp | 272 | newview/llurlwhitelist.cpp |
271 | newview/lluserauth.cpp | 273 | newview/lluserauth.cpp |
274 | newview/llvectorperfoptions.cpp | ||
272 | newview/llvelocitybar.cpp | 275 | newview/llvelocitybar.cpp |
273 | newview/llviewchildren.cpp | 276 | newview/llviewchildren.cpp |
274 | newview/llviewerassetstorage.cpp | 277 | newview/llviewerassetstorage.cpp |
278 | newview/llvieweraudio.cpp | ||
275 | newview/llviewercamera.cpp | 279 | newview/llviewercamera.cpp |
276 | newview/llviewercontrol.cpp | 280 | newview/llviewercontrol.cpp |
277 | newview/llviewerdisplay.cpp | 281 | newview/llviewerdisplay.cpp |
@@ -341,7 +345,6 @@ newview/llxmlrpctransaction.cpp | |||
341 | newview/moviemaker.cpp | 345 | newview/moviemaker.cpp |
342 | newview/noise.cpp | 346 | newview/noise.cpp |
343 | newview/pipeline.cpp | 347 | newview/pipeline.cpp |
344 | newview/viewer.cpp | ||
345 | newview/llremoteparcelrequest.cpp | 348 | newview/llremoteparcelrequest.cpp |
346 | newview/llfloaterurldisplay.cpp | 349 | newview/llfloaterurldisplay.cpp |
347 | newview/llfloaterevent.cpp | 350 | newview/llfloaterevent.cpp |
diff --git a/linden/indra/newview/linux_tools/handle_secondlifeprotocol.sh b/linden/indra/newview/linux_tools/handle_secondlifeprotocol.sh new file mode 100755 index 0000000..7ff86d1 --- /dev/null +++ b/linden/indra/newview/linux_tools/handle_secondlifeprotocol.sh | |||
@@ -0,0 +1,17 @@ | |||
1 | #!/bin/bash | ||
2 | |||
3 | # Send a URL of the form secondlife://... to Second Life. | ||
4 | # | ||
5 | |||
6 | URL="$1" | ||
7 | |||
8 | if [ -z "$URL" ]; then | ||
9 | echo Usage: $0 secondlife://... | ||
10 | exit | ||
11 | fi | ||
12 | |||
13 | RUN_PATH=`dirname "$0" || echo .` | ||
14 | cd "${RUN_PATH}" | ||
15 | |||
16 | exec ./secondlife -url \'"${URL}"\' | ||
17 | |||
diff --git a/linden/indra/newview/linux_tools/register_secondlifeprotocol.sh b/linden/indra/newview/linux_tools/register_secondlifeprotocol.sh new file mode 100755 index 0000000..4ab96f9 --- /dev/null +++ b/linden/indra/newview/linux_tools/register_secondlifeprotocol.sh | |||
@@ -0,0 +1,46 @@ | |||
1 | #!/bin/bash | ||
2 | |||
3 | # Register a protocol handler (default: handle_secondlifeprotocol.sh) for | ||
4 | # URLs of the form secondlife://... | ||
5 | # | ||
6 | |||
7 | HANDLER="$1" | ||
8 | |||
9 | RUN_PATH=`dirname "$0" || echo .` | ||
10 | cd "${RUN_PATH}" | ||
11 | |||
12 | if [ -z "$HANDLER" ]; then | ||
13 | HANDLER=`pwd`/handle_secondlifeprotocol.sh | ||
14 | fi | ||
15 | |||
16 | # Register handler for GNOME-aware apps | ||
17 | LLGCONFTOOL2=gconftool-2 | ||
18 | if which ${LLGCONFTOOL2} >/dev/null; then | ||
19 | (${LLGCONFTOOL2} -s -t string /desktop/gnome/url-handlers/secondlife/command "${HANDLER} \"%s\"" && ${LLGCONFTOOL2} -s -t bool /desktop/gnome/url-handlers/secondlife/enabled true) || echo Warning: Did not register secondlife:// handler with GNOME: ${LLGCONFTOOL2} failed. | ||
20 | else | ||
21 | echo Warning: Did not register secondlife:// handler with GNOME: ${LLGCONFTOOL2} not found. | ||
22 | fi | ||
23 | |||
24 | # Register handler for KDE-aware apps | ||
25 | if [ -z "$KDEHOME" ]; then | ||
26 | KDEHOME=~/.kde | ||
27 | fi | ||
28 | LLKDEPROTDIR=${KDEHOME}/share/services | ||
29 | if [ -d "$LLKDEPROTDIR" ]; then | ||
30 | LLKDEPROTFILE=${LLKDEPROTDIR}/secondlife.protocol | ||
31 | cat > ${LLKDEPROTFILE} <<EOF || echo Warning: Did not register secondlife:// handler with KDE: Could not write ${LLKDEPROTFILE} | ||
32 | [Protocol] | ||
33 | exec=${HANDLER} '%u' | ||
34 | protocol=secondlife | ||
35 | input=none | ||
36 | output=none | ||
37 | helper=true | ||
38 | listing= | ||
39 | reading=false | ||
40 | writing=false | ||
41 | makedir=false | ||
42 | deleting=false | ||
43 | EOF | ||
44 | else | ||
45 | echo Warning: Did not register secondlife:// handler with KDE: Directory $LLKDEPROTDIR does not exist. | ||
46 | fi | ||
diff --git a/linden/indra/newview/linux_tools/wrapper.sh b/linden/indra/newview/linux_tools/wrapper.sh index 10041ee..638a0f0 100755 --- a/linden/indra/newview/linux_tools/wrapper.sh +++ b/linden/indra/newview/linux_tools/wrapper.sh | |||
@@ -61,6 +61,10 @@ fi | |||
61 | 61 | ||
62 | RUN_PATH=`dirname "$0" || echo .` | 62 | RUN_PATH=`dirname "$0" || echo .` |
63 | cd "${RUN_PATH}" | 63 | cd "${RUN_PATH}" |
64 | |||
65 | # Re-register the secondlife:// protocol handler every launch, for now. | ||
66 | ./register_secondlifeprotocol.sh | ||
67 | |||
64 | if [ -n "$LL_TCMALLOC" ]; then | 68 | if [ -n "$LL_TCMALLOC" ]; then |
65 | tcmalloc_libs='/usr/lib/libtcmalloc.so.0 /usr/lib/libstacktrace.so.0 /lib/libpthread.so.0' | 69 | tcmalloc_libs='/usr/lib/libtcmalloc.so.0 /usr/lib/libstacktrace.so.0 /lib/libpthread.so.0' |
66 | all=1 | 70 | all=1 |
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp index 8b49d54..39d4a3f 100644 --- a/linden/indra/newview/llagent.cpp +++ b/linden/indra/newview/llagent.cpp | |||
@@ -112,6 +112,7 @@ | |||
112 | #include "llviewerregion.h" | 112 | #include "llviewerregion.h" |
113 | #include "llviewerstats.h" | 113 | #include "llviewerstats.h" |
114 | #include "llviewerwindow.h" | 114 | #include "llviewerwindow.h" |
115 | #include "llviewerdisplay.h" | ||
115 | #include "llvoavatar.h" | 116 | #include "llvoavatar.h" |
116 | #include "llvoground.h" | 117 | #include "llvoground.h" |
117 | #include "llvosky.h" | 118 | #include "llvosky.h" |
@@ -121,7 +122,8 @@ | |||
121 | #include "llworldmap.h" | 122 | #include "llworldmap.h" |
122 | #include "pipeline.h" | 123 | #include "pipeline.h" |
123 | #include "roles_constants.h" | 124 | #include "roles_constants.h" |
124 | #include "viewer.h" | 125 | #include "llviewercontrol.h" |
126 | #include "llappviewer.h" | ||
125 | #include "llvoiceclient.h" | 127 | #include "llvoiceclient.h" |
126 | 128 | ||
127 | // Ventrella | 129 | // Ventrella |
@@ -130,7 +132,6 @@ | |||
130 | 132 | ||
131 | extern LLMenuBarGL* gMenuBarView; | 133 | extern LLMenuBarGL* gMenuBarView; |
132 | extern U8 gLastPickAlpha; | 134 | extern U8 gLastPickAlpha; |
133 | extern F32 gFrameDTClamped; | ||
134 | 135 | ||
135 | //drone wandering constants | 136 | //drone wandering constants |
136 | const F32 MAX_WANDER_TIME = 20.f; // seconds | 137 | const F32 MAX_WANDER_TIME = 20.f; // seconds |
@@ -222,6 +223,9 @@ const LLUUID BAKED_TEXTURE_HASH[BAKED_TEXTURE_COUNT] = | |||
222 | LLUUID("ea800387-ea1a-14e0-56cb-24f2022f969a") | 223 | LLUUID("ea800387-ea1a-14e0-56cb-24f2022f969a") |
223 | }; | 224 | }; |
224 | 225 | ||
226 | // The agent instance. | ||
227 | LLAgent gAgent; | ||
228 | |||
225 | // | 229 | // |
226 | // Statics | 230 | // Statics |
227 | // | 231 | // |
@@ -523,6 +527,21 @@ void LLAgent::resetView(BOOL reset_camera) | |||
523 | } | 527 | } |
524 | } | 528 | } |
525 | 529 | ||
530 | // Handle any actions that need to be performed when the main app gains focus | ||
531 | // (such as through alt-tab). | ||
532 | //----------------------------------------------------------------------------- | ||
533 | // onAppFocusGained() | ||
534 | //----------------------------------------------------------------------------- | ||
535 | void LLAgent::onAppFocusGained() | ||
536 | { | ||
537 | if (CAMERA_MODE_MOUSELOOK == mCameraMode) | ||
538 | { | ||
539 | changeCameraToDefault(); | ||
540 | gToolMgr->clearSavedTool(); | ||
541 | } | ||
542 | } | ||
543 | |||
544 | |||
526 | void LLAgent::ageChat() | 545 | void LLAgent::ageChat() |
527 | { | 546 | { |
528 | if (mAvatarObject) | 547 | if (mAvatarObject) |
@@ -2545,8 +2564,8 @@ void LLAgent::updateLookAt(const S32 mouse_x, const S32 mouse_y) | |||
2545 | LLVector3 headLookAxis; | 2564 | LLVector3 headLookAxis; |
2546 | LLCoordFrame frameCamera = *((LLCoordFrame*)gCamera); | 2565 | LLCoordFrame frameCamera = *((LLCoordFrame*)gCamera); |
2547 | 2566 | ||
2548 | F32 x_from_center = mouse_x_from_center( mouse_x ); // range from -0.5 to 0.5 | 2567 | F32 x_from_center = ((F32) mouse_x / (F32) gViewerWindow->getWindowWidth() ) - 0.5f; |
2549 | F32 y_from_center = mouse_y_from_center( mouse_y ); // range from -0.5 to 0.5 | 2568 | F32 y_from_center = ((F32) mouse_y / (F32) gViewerWindow->getWindowHeight() ) - 0.5f; |
2550 | 2569 | ||
2551 | if (cameraMouselook()) | 2570 | if (cameraMouselook()) |
2552 | { | 2571 | { |
@@ -2811,7 +2830,7 @@ void LLAgent::endAnimationUpdateUI() | |||
2811 | 2830 | ||
2812 | // HACK: If we're quitting, and we were in customize avatar, don't | 2831 | // HACK: If we're quitting, and we were in customize avatar, don't |
2813 | // let the mini-map go visible again. JC | 2832 | // let the mini-map go visible again. JC |
2814 | if (!gQuitRequested) | 2833 | if (!LLAppViewer::instance()->quitRequested()) |
2815 | { | 2834 | { |
2816 | gFloaterMap->popVisible(); | 2835 | gFloaterMap->popVisible(); |
2817 | } | 2836 | } |
@@ -5836,7 +5855,7 @@ void LLAgent::requestEnterGodMode() | |||
5836 | msg->addBOOLFast(_PREHASH_Godlike, TRUE); | 5855 | msg->addBOOLFast(_PREHASH_Godlike, TRUE); |
5837 | msg->addUUIDFast(_PREHASH_Token, LLUUID::null); | 5856 | msg->addUUIDFast(_PREHASH_Token, LLUUID::null); |
5838 | 5857 | ||
5839 | // simulator and userserver need to know about your request | 5858 | // simulators need to know about your request |
5840 | sendReliableMessage(); | 5859 | sendReliableMessage(); |
5841 | } | 5860 | } |
5842 | 5861 | ||
@@ -5851,7 +5870,7 @@ void LLAgent::requestLeaveGodMode() | |||
5851 | msg->addBOOLFast(_PREHASH_Godlike, FALSE); | 5870 | msg->addBOOLFast(_PREHASH_Godlike, FALSE); |
5852 | msg->addUUIDFast(_PREHASH_Token, LLUUID::null); | 5871 | msg->addUUIDFast(_PREHASH_Token, LLUUID::null); |
5853 | 5872 | ||
5854 | // simulator and userserver need to know about your request | 5873 | // simulator needs to know about your request |
5855 | sendReliableMessage(); | 5874 | sendReliableMessage(); |
5856 | } | 5875 | } |
5857 | 5876 | ||
diff --git a/linden/indra/newview/llagent.h b/linden/indra/newview/llagent.h index ad0606a..c6de97f 100644 --- a/linden/indra/newview/llagent.h +++ b/linden/indra/newview/llagent.h | |||
@@ -141,6 +141,8 @@ public: | |||
141 | // default position behind the avatar. | 141 | // default position behind the avatar. |
142 | void unlockView(); | 142 | void unlockView(); |
143 | 143 | ||
144 | void onAppFocusGained(); | ||
145 | |||
144 | void sendMessage(); // Send message to this agent's region. | 146 | void sendMessage(); // Send message to this agent's region. |
145 | void sendReliableMessage(); | 147 | void sendReliableMessage(); |
146 | 148 | ||
diff --git a/linden/indra/newview/llagentpilot.cpp b/linden/indra/newview/llagentpilot.cpp index 9637c54..f0bd452 100644 --- a/linden/indra/newview/llagentpilot.cpp +++ b/linden/indra/newview/llagentpilot.cpp | |||
@@ -38,7 +38,7 @@ | |||
38 | #include "llagentpilot.h" | 38 | #include "llagentpilot.h" |
39 | #include "llagent.h" | 39 | #include "llagent.h" |
40 | #include "llframestats.h" | 40 | #include "llframestats.h" |
41 | #include "viewer.h" | 41 | #include "llappviewer.h" |
42 | #include "llviewercontrol.h" | 42 | #include "llviewercontrol.h" |
43 | 43 | ||
44 | LLAgentPilot gAgentPilot; | 44 | LLAgentPilot gAgentPilot; |
@@ -221,7 +221,7 @@ void LLAgentPilot::updateTarget() | |||
221 | else if (mQuitAfterRuns) | 221 | else if (mQuitAfterRuns) |
222 | { | 222 | { |
223 | llinfos << "Done with all runs, quitting viewer!" << llendl; | 223 | llinfos << "Done with all runs, quitting viewer!" << llendl; |
224 | app_force_quit(NULL); | 224 | LLAppViewer::instance()->forceQuit(); |
225 | } | 225 | } |
226 | else | 226 | else |
227 | { | 227 | { |
diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp new file mode 100644 index 0000000..45eaaa9 --- /dev/null +++ b/linden/indra/newview/llappviewer.cpp | |||
@@ -0,0 +1,3894 @@ | |||
1 | /** | ||
2 | * @file llappviewer.cpp | ||
3 | * @brief The LLAppViewer class definitions | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2007&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | |||
33 | #include "llviewerprecompiledheaders.h" | ||
34 | #include "llappviewer.h" | ||
35 | |||
36 | #include "llversionviewer.h" | ||
37 | #include "llfeaturemanager.h" | ||
38 | #include "llvieweruictrlfactory.h" | ||
39 | #include "llalertdialog.h" | ||
40 | #include "llerrorcontrol.h" | ||
41 | #include "llviewerimagelist.h" | ||
42 | #include "llgroupmgr.h" | ||
43 | #include "llagent.h" | ||
44 | #include "llwindow.h" | ||
45 | #include "llviewerstats.h" | ||
46 | #include "llmd5.h" | ||
47 | #include "llpumpio.h" | ||
48 | #include "llfloateractivespeakers.h" | ||
49 | #include "llimpanel.h" | ||
50 | #include "llstartup.h" | ||
51 | #include "llfocusmgr.h" | ||
52 | #include "llviewerjoystick.h" | ||
53 | #include "llcurl.h" | ||
54 | #include "llfloatersnapshot.h" | ||
55 | #include "llviewerwindow.h" | ||
56 | #include "llviewerdisplay.h" | ||
57 | #include "llviewermessage.h" | ||
58 | #include "llviewerobjectlist.h" | ||
59 | #include "llworldmap.h" | ||
60 | #include "llmutelist.h" | ||
61 | #include "llurldispatcher.h" | ||
62 | |||
63 | #include "llweb.h" | ||
64 | #include "llsecondlifeurls.h" | ||
65 | |||
66 | #if LL_WINDOWS | ||
67 | #include "llwindebug.h" | ||
68 | #endif | ||
69 | |||
70 | #if LL_WINDOWS | ||
71 | # include <share.h> // For _SH_DENYWR in initMarkerFile | ||
72 | #else | ||
73 | # include <sys/file.h> // For initMarkerFile support | ||
74 | #endif | ||
75 | |||
76 | |||
77 | |||
78 | #include "llnotify.h" | ||
79 | #include "llmediaengine.h" | ||
80 | #include "llviewerkeyboard.h" | ||
81 | #include "lllfsthread.h" | ||
82 | #include "llworkerthread.h" | ||
83 | #include "lltexturecache.h" | ||
84 | #include "lltexturefetch.h" | ||
85 | #include "llimageworker.h" | ||
86 | |||
87 | // The files below handle dependencies from cleanup. | ||
88 | #include "llkeyframemotion.h" | ||
89 | #include "llworldmap.h" | ||
90 | #include "llhudmanager.h" | ||
91 | #include "lltoolmgr.h" | ||
92 | #include "llassetstorage.h" | ||
93 | #include "llpolymesh.h" | ||
94 | #include "lleconomy.h" | ||
95 | #include "llcachename.h" | ||
96 | #include "audioengine.h" | ||
97 | #include "llviewermenu.h" | ||
98 | #include "llselectmgr.h" | ||
99 | #include "lltracker.h" | ||
100 | #include "llmozlib.h" | ||
101 | #include "llviewerparcelmgr.h" | ||
102 | #include "llworldmapview.h" | ||
103 | |||
104 | #include "lldebugview.h" | ||
105 | #include "llconsole.h" | ||
106 | #include "llcontainerview.h" | ||
107 | #include "llhoverview.h" | ||
108 | |||
109 | #include "llsdserialize.h" | ||
110 | |||
111 | #include "llworld.h" | ||
112 | #include "llhudeffecttrail.h" | ||
113 | #include "llvectorperfoptions.h" | ||
114 | #include "llurlsimstring.h" | ||
115 | |||
116 | // Included so that constants/settings might be initialized | ||
117 | // in save_settings_to_globals() | ||
118 | #include "llbutton.h" | ||
119 | #include "llcombobox.h" | ||
120 | #include "llstatusbar.h" | ||
121 | #include "llsurface.h" | ||
122 | #include "llvosky.h" | ||
123 | #include "llvotree.h" | ||
124 | #include "llvoavatar.h" | ||
125 | #include "llfolderview.h" | ||
126 | #include "lltoolbar.h" | ||
127 | #include "llframestats.h" | ||
128 | #include "llagentpilot.h" | ||
129 | #include "llsrv.h" | ||
130 | |||
131 | // includes for idle() idleShutdown() | ||
132 | #include "llviewercontrol.h" | ||
133 | #include "lleventnotifier.h" | ||
134 | #include "llcallbacklist.h" | ||
135 | #include "pipeline.h" | ||
136 | #include "llgesturemgr.h" | ||
137 | #include "llsky.h" | ||
138 | #include "llvlmanager.h" | ||
139 | #include "llviewercamera.h" | ||
140 | #include "lldrawpoolbump.h" | ||
141 | #include "llvieweraudio.h" | ||
142 | #include "llimview.h" | ||
143 | #include "llviewerthrottle.h" | ||
144 | // | ||
145 | |||
146 | #include "llinventoryview.h" | ||
147 | |||
148 | // *FIX: Remove these once the command line params thing is figured out. | ||
149 | // Yuck! | ||
150 | static int gTempArgC = 0; | ||
151 | static char** gTempArgV; | ||
152 | |||
153 | // *FIX: These extern globals should be cleaned up. | ||
154 | // The globals either represent state/config/resource-storage of either | ||
155 | // this app, or another 'component' of the viewer. App globals should be | ||
156 | // moved into the app class, where as the other globals should be | ||
157 | // moved out of here. | ||
158 | // If a global symbol reference seems valid, it will be included | ||
159 | // via header files above. | ||
160 | |||
161 | //---------------------------------------------------------------------------- | ||
162 | // llviewernetwork.h | ||
163 | #include "llviewernetwork.h" | ||
164 | // extern EGridInfo gGridChoice; | ||
165 | |||
166 | |||
167 | ////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor | ||
168 | // | ||
169 | #if LL_WINDOWS && LL_LCD_COMPILE | ||
170 | #include "lllcd.h" | ||
171 | #endif | ||
172 | // | ||
173 | #if LL_QUICKTIME_ENABLED | ||
174 | #if LL_DARWIN | ||
175 | #include <QuickTime/QuickTime.h> | ||
176 | #else | ||
177 | // quicktime specific includes | ||
178 | #include "MacTypes.h" | ||
179 | #include "QTML.h" | ||
180 | #include "Movies.h" | ||
181 | #include "FixMath.h" | ||
182 | #endif | ||
183 | #endif | ||
184 | // | ||
185 | ////// | ||
186 | |||
187 | |||
188 | //---------------------------------------------------------------------------- | ||
189 | // viewer.cpp - these are only used in viewer, should be easily moved. | ||
190 | extern void disable_win_error_reporting(); | ||
191 | |||
192 | //#define APPLE_PREVIEW // Define this if you're doing a preview build on the Mac | ||
193 | #if LL_RELEASE_FOR_DOWNLOAD | ||
194 | // Default userserver for production builds is agni | ||
195 | #ifndef APPLE_PREVIEW | ||
196 | static EGridInfo GridDefaultChoice = GRID_INFO_AGNI; | ||
197 | #else | ||
198 | static EGridInfo GridDefaultChoice = GRID_INFO_ADITI; | ||
199 | #endif | ||
200 | #else | ||
201 | // Default userserver for development builds is dmz | ||
202 | static EGridInfo GridDefaultChoice = GRID_INFO_DMZ; | ||
203 | #endif | ||
204 | |||
205 | #if LL_WINDOWS | ||
206 | extern void create_console(); | ||
207 | #endif | ||
208 | |||
209 | |||
210 | #if LL_DARWIN | ||
211 | #include <Carbon/Carbon.h> | ||
212 | extern void init_apple_menu(const char* product); | ||
213 | extern OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn); | ||
214 | extern OSErr AEQuitHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn); | ||
215 | extern OSStatus simpleDialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata); | ||
216 | extern OSStatus DisplayReleaseNotes(void); | ||
217 | #include <boost/tokenizer.hpp> | ||
218 | #endif // LL_DARWIN | ||
219 | |||
220 | |||
221 | #include "moviemaker.h" | ||
222 | extern BOOL gbCapturing; | ||
223 | |||
224 | #if !LL_SOLARIS | ||
225 | extern MovieMaker gMovieMaker; | ||
226 | #endif | ||
227 | |||
228 | extern BOOL gRandomizeFramerate; | ||
229 | extern BOOL gPeriodicSlowFrame; | ||
230 | |||
231 | #if LL_GSTREAMER_ENABLED | ||
232 | void UnloadGStreamer(); | ||
233 | #endif | ||
234 | |||
235 | //////////////////////////////////////////////////////////// | ||
236 | // All from the last globals push... | ||
237 | bool gVerifySSLCert = true; | ||
238 | BOOL gHandleKeysAsync = FALSE; | ||
239 | |||
240 | BOOL gProbeHardware = TRUE; // Use DirectX 9 to probe for hardware | ||
241 | |||
242 | S32 gYieldMS = 0; // set in parse_args, used in mainLoop | ||
243 | BOOL gYieldTime = FALSE; | ||
244 | |||
245 | const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user flagged as Away From Keyboard | ||
246 | |||
247 | F32 gSimLastTime; // Used in LLAppViewer::init and send_stats() | ||
248 | F32 gSimFrames; | ||
249 | |||
250 | LLString gDisabledMessage; // Set in LLAppViewer::initConfiguration used in idle_startup | ||
251 | |||
252 | BOOL gHideLinks = FALSE; // Set in LLAppViewer::initConfiguration, used externally | ||
253 | |||
254 | BOOL gInProductionGrid = FALSE; | ||
255 | |||
256 | BOOL gAllowIdleAFK = TRUE; | ||
257 | F32 gAFKTimeout = DEFAULT_AFK_TIMEOUT; | ||
258 | BOOL gShowObjectUpdates = FALSE; | ||
259 | BOOL gLogMessages = FALSE; | ||
260 | std::string gChannelName = LL_CHANNEL; | ||
261 | BOOL gUseAudio = TRUE; | ||
262 | LLString gCmdLineFirstName; | ||
263 | LLString gCmdLineLastName; | ||
264 | LLString gCmdLinePassword; | ||
265 | |||
266 | BOOL gAutoLogin = FALSE; | ||
267 | |||
268 | const char* DEFAULT_SETTINGS_FILE = "settings.xml"; | ||
269 | BOOL gRequestInventoryLibrary = TRUE; | ||
270 | BOOL gGodConnect = FALSE; | ||
271 | BOOL gAcceptTOS = FALSE; | ||
272 | BOOL gAcceptCriticalMessage = FALSE; | ||
273 | |||
274 | LLUUID gViewerDigest; // MD5 digest of the viewer's executable file. | ||
275 | BOOL gLastExecFroze = FALSE; | ||
276 | |||
277 | LLSD gDebugInfo; | ||
278 | |||
279 | U32 gFrameCount = 0; | ||
280 | U32 gForegroundFrameCount = 0; // number of frames that app window was in foreground | ||
281 | LLPumpIO* gServicePump = NULL; | ||
282 | |||
283 | BOOL gPacificDaylightTime = FALSE; | ||
284 | |||
285 | U64 gFrameTime = 0; | ||
286 | F32 gFrameTimeSeconds = 0.f; | ||
287 | F32 gFrameIntervalSeconds = 0.f; | ||
288 | F32 gFPSClamped = 10.f; // Pretend we start at target rate. | ||
289 | F32 gFrameDTClamped = 0.f; // Time between adjacent checks to network for packets | ||
290 | U64 gStartTime = 0; // gStartTime is "private", used only to calculate gFrameTimeSeconds | ||
291 | |||
292 | LLTimer gRenderStartTime; | ||
293 | LLFrameTimer gForegroundTime; | ||
294 | LLTimer gLogoutTimer; | ||
295 | static const F32 LOGOUT_REQUEST_TIME = 6.f; // this will be cut short by the LogoutReply msg. | ||
296 | F32 gLogoutMaxTime = LOGOUT_REQUEST_TIME; | ||
297 | |||
298 | LLUUID gInventoryLibraryOwner; | ||
299 | LLUUID gInventoryLibraryRoot; | ||
300 | |||
301 | BOOL gDisableVoice = FALSE; | ||
302 | BOOL gDisconnected = FALSE; | ||
303 | |||
304 | // Map scale in pixels per region | ||
305 | F32 gMapScale = 128.f; | ||
306 | F32 gMiniMapScale = 128.f; | ||
307 | |||
308 | // used to restore texture state after a mode switch | ||
309 | LLFrameTimer gRestoreGLTimer; | ||
310 | BOOL gRestoreGL = FALSE; | ||
311 | BOOL gUseWireframe = FALSE; | ||
312 | |||
313 | F32 gMouseSensitivity = 3.f; | ||
314 | BOOL gInvertMouse = FALSE; | ||
315 | |||
316 | // VFS globals - see llappviewer.h | ||
317 | LLVFS* gStaticVFS = NULL; | ||
318 | |||
319 | LLMemoryInfo gSysMemory; | ||
320 | |||
321 | bool gPreloadImages = true; | ||
322 | bool gPreloadSounds = true; | ||
323 | |||
324 | LLString gLastVersionChannel; | ||
325 | |||
326 | LLVector3 gWindVec(3.0, 3.0, 0.0); | ||
327 | LLVector3 gRelativeWindVec(0.0, 0.0, 0.0); | ||
328 | |||
329 | U32 gPacketsIn = 0; | ||
330 | |||
331 | BOOL gPrintMessagesThisFrame = FALSE; | ||
332 | |||
333 | BOOL gUseConsole = TRUE; | ||
334 | |||
335 | BOOL gRandomizeFramerate = FALSE; | ||
336 | BOOL gPeriodicSlowFrame = FALSE; | ||
337 | |||
338 | BOOL gQAMode = FALSE; | ||
339 | |||
340 | //////////////////////////////////////////////////////////// | ||
341 | // Internal globals... that should be removed. | ||
342 | static F32 gQuitAfterSeconds = 0.f; | ||
343 | static BOOL gRotateRight = FALSE; | ||
344 | static BOOL gIgnorePixelDepth = FALSE; | ||
345 | |||
346 | // Allow multiple viewers in ReleaseForDownload | ||
347 | #if LL_RELEASE_FOR_DOWNLOAD | ||
348 | static BOOL gMultipleViewersOK = FALSE; | ||
349 | #else | ||
350 | static BOOL gMultipleViewersOK = TRUE; | ||
351 | #endif | ||
352 | |||
353 | static std::map<std::string, std::string> gCommandLineSettings; | ||
354 | static std::map<std::string, std::string> gCommandLineForcedSettings; | ||
355 | |||
356 | static LLString gArgs; | ||
357 | |||
358 | static LLString gOldSettingsFileName; | ||
359 | static const char* LEGACY_DEFAULT_SETTINGS_FILE = "settings.ini"; | ||
360 | static BOOL gDoDisconnect = FALSE; | ||
361 | static LLString gLaunchFileOnQuit; | ||
362 | |||
363 | //---------------------------------------------------------------------------- | ||
364 | // File scope definitons | ||
365 | const char *VFS_DATA_FILE_BASE = "data.db2.x."; | ||
366 | const char *VFS_INDEX_FILE_BASE = "index.db2.x."; | ||
367 | |||
368 | static LLString gSecondLife; | ||
369 | static LLString gWindowTitle; | ||
370 | #ifdef LL_WINDOWS | ||
371 | static char sWindowClass[] = "Second Life"; | ||
372 | #endif | ||
373 | |||
374 | std::vector<std::string> gLoginURIs; | ||
375 | static std::string gHelperURI; | ||
376 | |||
377 | static const char USAGE[] = "\n" | ||
378 | "usage:\tviewer [options]\n" | ||
379 | "options:\n" | ||
380 | " -login <first> <last> <password> log in as a user\n" | ||
381 | " -autologin log in as last saved user\n" | ||
382 | " -loginuri <URI> login server and CGI script to use\n" | ||
383 | " -helperuri <URI> helper web CGI prefix to use\n" | ||
384 | " -settings <filename> specify the filename of a\n" | ||
385 | " configuration file\n" | ||
386 | " default is settings.xml\n" | ||
387 | " -setdefault <variable> <value> specify the value of a particular\n" | ||
388 | " configuration variable which can be\n" | ||
389 | " overridden by settings.xml\n" | ||
390 | " -set <variable> <value> specify the value of a particular\n" | ||
391 | " configuration variable that\n" | ||
392 | " overrides all other settings\n" | ||
393 | " -user <user_server_ip> specify userserver in dotted quad\n" | ||
394 | #if !LL_RELEASE_FOR_DOWNLOAD | ||
395 | " -sim <simulator_ip> specify the simulator ip address\n" | ||
396 | #endif | ||
397 | " -god log in as god if you have god access\n" | ||
398 | " -purge delete files in cache\n" | ||
399 | " -safe reset preferences, run in safe mode\n" | ||
400 | " -noutc logs in local time, not UTC\n" | ||
401 | " -nothread run vfs in single thread\n" | ||
402 | " -noinvlib Do not request inventory library\n" | ||
403 | " -multiple allow multiple viewers\n" | ||
404 | " -nomultiple block multiple viewers\n" | ||
405 | " -novoice disable voice\n" | ||
406 | " -ignorepixeldepth ignore pixel depth settings\n" | ||
407 | " -cooperative [ms] yield some idle time to local host\n" | ||
408 | " -skin ui/branding skin folder to use\n" | ||
409 | #if LL_WINDOWS | ||
410 | " -noprobe disable hardware probe\n" | ||
411 | #endif | ||
412 | " -noquicktime disable QuickTime movies, speeds startup\n" | ||
413 | " -nopreload don't preload UI images or sounds, speeds startup\n" | ||
414 | // these seem to be unused | ||
415 | //" -noenv turn off environmental effects\n" | ||
416 | //" -proxy <proxy_ip> specify the proxy ip address\n" | ||
417 | "\n"; | ||
418 | |||
419 | void idle_afk_check() | ||
420 | { | ||
421 | // check idle timers | ||
422 | if (gAllowIdleAFK && (gAwayTriggerTimer.getElapsedTimeF32() > gAFKTimeout)) | ||
423 | { | ||
424 | gAgent.setAFK(); | ||
425 | } | ||
426 | } | ||
427 | |||
428 | // A callback set in LLAppViewer::init() | ||
429 | static void ui_audio_callback(const LLUUID& uuid) | ||
430 | { | ||
431 | if (gAudiop) | ||
432 | { | ||
433 | F32 volume = gSavedSettings.getF32("AudioLevelUI"); | ||
434 | gAudiop->triggerSound(uuid, gAgent.getID(), volume); | ||
435 | } | ||
436 | } | ||
437 | |||
438 | void request_initial_instant_messages() | ||
439 | { | ||
440 | static BOOL requested = FALSE; | ||
441 | if (!requested | ||
442 | && gMuteListp | ||
443 | && gMuteListp->isLoaded() | ||
444 | && gAgent.getAvatarObject()) | ||
445 | { | ||
446 | // Auto-accepted inventory items may require the avatar object | ||
447 | // to build a correct name. Likewise, inventory offers from | ||
448 | // muted avatars require the mute list to properly mute. | ||
449 | LLMessageSystem* msg = gMessageSystem; | ||
450 | msg->newMessageFast(_PREHASH_RetrieveInstantMessages); | ||
451 | msg->nextBlockFast(_PREHASH_AgentData); | ||
452 | msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); | ||
453 | msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); | ||
454 | gAgent.sendReliableMessage(); | ||
455 | requested = TRUE; | ||
456 | } | ||
457 | } | ||
458 | |||
459 | // Use these strictly for things that are constructed at startup, | ||
460 | // or for things that are performance critical. JC | ||
461 | static void saved_settings_to_globals() | ||
462 | { | ||
463 | LLBUTTON_H_PAD = gSavedSettings.getS32("ButtonHPad"); | ||
464 | LLBUTTON_V_PAD = gSavedSettings.getS32("ButtonVPad"); | ||
465 | BTN_HEIGHT_SMALL = gSavedSettings.getS32("ButtonHeightSmall"); | ||
466 | BTN_HEIGHT = gSavedSettings.getS32("ButtonHeight"); | ||
467 | |||
468 | MENU_BAR_HEIGHT = gSavedSettings.getS32("MenuBarHeight"); | ||
469 | MENU_BAR_WIDTH = gSavedSettings.getS32("MenuBarWidth"); | ||
470 | STATUS_BAR_HEIGHT = gSavedSettings.getS32("StatusBarHeight"); | ||
471 | |||
472 | LLCOMBOBOX_HEIGHT = BTN_HEIGHT - 2; | ||
473 | LLCOMBOBOX_WIDTH = 128; | ||
474 | |||
475 | LLSurface::setTextureSize(gSavedSettings.getU32("RegionTextureSize")); | ||
476 | |||
477 | LLVOSky::sNighttimeBrightness = gSavedSettings.getF32("RenderNightBrightness"); | ||
478 | |||
479 | LLImageGL::sGlobalUseAnisotropic = gSavedSettings.getBOOL("RenderAnisotropic"); | ||
480 | LLVOVolume::sLODFactor = gSavedSettings.getF32("RenderVolumeLODFactor"); | ||
481 | LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f; | ||
482 | LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor"); | ||
483 | LLVOTree::sTreeFactor = gSavedSettings.getF32("RenderTreeLODFactor"); | ||
484 | LLVOAvatar::sLODFactor = gSavedSettings.getF32("RenderAvatarLODFactor"); | ||
485 | LLVOAvatar::sMaxVisible = gSavedSettings.getS32("RenderAvatarMaxVisible"); | ||
486 | LLVOAvatar::sVisibleInFirstPerson = gSavedSettings.getBOOL("FirstPersonAvatarVisible"); | ||
487 | // clamp auto-open time to some minimum usable value | ||
488 | LLFolderView::sAutoOpenTime = llmax(0.25f, gSavedSettings.getF32("FolderAutoOpenDelay")); | ||
489 | LLToolBar::sInventoryAutoOpenTime = gSavedSettings.getF32("InventoryAutoOpenDelay"); | ||
490 | LLSelectMgr::sRectSelectInclusive = gSavedSettings.getBOOL("RectangleSelectInclusive"); | ||
491 | LLSelectMgr::sRenderHiddenSelections = gSavedSettings.getBOOL("RenderHiddenSelections"); | ||
492 | LLSelectMgr::sRenderLightRadius = gSavedSettings.getBOOL("RenderLightRadius"); | ||
493 | |||
494 | gFrameStats.setTrackStats(gSavedSettings.getBOOL("StatsSessionTrackFrameStats")); | ||
495 | gAgentPilot.mNumRuns = gSavedSettings.getS32("StatsNumRuns"); | ||
496 | gAgentPilot.mQuitAfterRuns = gSavedSettings.getBOOL("StatsQuitAfterRuns"); | ||
497 | gAgent.mHideGroupTitle = gSavedSettings.getBOOL("RenderHideGroupTitle"); | ||
498 | |||
499 | gDebugWindowProc = gSavedSettings.getBOOL("DebugWindowProc"); | ||
500 | gAllowIdleAFK = gSavedSettings.getBOOL("AllowIdleAFK"); | ||
501 | gAFKTimeout = gSavedSettings.getF32("AFKTimeout"); | ||
502 | gMouseSensitivity = gSavedSettings.getF32("MouseSensitivity"); | ||
503 | gInvertMouse = gSavedSettings.getBOOL("InvertMouse"); | ||
504 | gShowObjectUpdates = gSavedSettings.getBOOL("ShowObjectUpdates"); | ||
505 | gMapScale = gSavedSettings.getF32("MapScale"); | ||
506 | gMiniMapScale = gSavedSettings.getF32("MiniMapScale"); | ||
507 | gHandleKeysAsync = gSavedSettings.getBOOL("AsyncKeyboard"); | ||
508 | LLHoverView::sShowHoverTips = gSavedSettings.getBOOL("ShowHoverTips"); | ||
509 | |||
510 | #if LL_VECTORIZE | ||
511 | if (gSysCPU.hasAltivec()) | ||
512 | { | ||
513 | gSavedSettings.setBOOL("VectorizeEnable", TRUE ); | ||
514 | gSavedSettings.setU32("VectorizeProcessor", 0 ); | ||
515 | } | ||
516 | else | ||
517 | if (gSysCPU.hasSSE2()) | ||
518 | { | ||
519 | gSavedSettings.setBOOL("VectorizeEnable", TRUE ); | ||
520 | gSavedSettings.setU32("VectorizeProcessor", 2 ); | ||
521 | } | ||
522 | else | ||
523 | if (gSysCPU.hasSSE()) | ||
524 | { | ||
525 | gSavedSettings.setBOOL("VectorizeEnable", TRUE ); | ||
526 | gSavedSettings.setU32("VectorizeProcessor", 1 ); | ||
527 | } | ||
528 | else | ||
529 | { | ||
530 | // Don't bother testing or running if CPU doesn't support it. JC | ||
531 | gSavedSettings.setBOOL("VectorizePerfTest", FALSE ); | ||
532 | gSavedSettings.setBOOL("VectorizeEnable", FALSE ); | ||
533 | gSavedSettings.setU32("VectorizeProcessor", 0 ); | ||
534 | gSavedSettings.setBOOL("VectorizeSkin", FALSE); | ||
535 | } | ||
536 | #else | ||
537 | // This build target doesn't support SSE, don't test/run. | ||
538 | gSavedSettings.setBOOL("VectorizePerfTest", FALSE ); | ||
539 | gSavedSettings.setBOOL("VectorizeEnable", FALSE ); | ||
540 | gSavedSettings.setU32("VectorizeProcessor", 0 ); | ||
541 | gSavedSettings.setBOOL("VectorizeSkin", FALSE); | ||
542 | #endif | ||
543 | |||
544 | // propagate push to talk preference to current status | ||
545 | gSavedSettings.setBOOL("PTTCurrentlyEnabled", gSavedSettings.getBOOL("EnablePushToTalk")); | ||
546 | |||
547 | settings_setup_listeners(); | ||
548 | |||
549 | // gAgent.init() also loads from saved settings. | ||
550 | } | ||
551 | |||
552 | int parse_args(int argc, char **argv) | ||
553 | { | ||
554 | // Sometimes IP addresses passed in on the command line have leading | ||
555 | // or trailing white space. Use LLString to clean that up. | ||
556 | LLString ip_string; | ||
557 | S32 j; | ||
558 | |||
559 | for (j = 1; j < argc; j++) | ||
560 | { | ||
561 | gArgs += argv[j]; | ||
562 | gArgs += " "; | ||
563 | |||
564 | LLString argument = argv[j]; | ||
565 | if ((!strcmp(argv[j], "-port")) && (++j < argc)) | ||
566 | { | ||
567 | sscanf(argv[j], "%u", &(gAgent.mViewerPort)); | ||
568 | } | ||
569 | else if ((!strcmp(argv[j], "-drop")) && (++j < argc)) | ||
570 | { | ||
571 | sscanf(argv[j], "%f", &gPacketDropPercentage); | ||
572 | } | ||
573 | else if ((!strcmp(argv[j], "-inbw")) && (++j < argc)) | ||
574 | { | ||
575 | sscanf(argv[j], "%f", &gInBandwidth); | ||
576 | } | ||
577 | else if ((!strcmp(argv[j], "-outbw")) && (++j < argc)) | ||
578 | { | ||
579 | sscanf(argv[j], "%f", &gOutBandwidth); | ||
580 | } | ||
581 | else if (!strcmp(argv[j], "--aditi")) | ||
582 | { | ||
583 | gGridChoice = GRID_INFO_ADITI; | ||
584 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore | ||
585 | } | ||
586 | else if (!strcmp(argv[j], "--agni")) | ||
587 | { | ||
588 | gGridChoice = GRID_INFO_AGNI; | ||
589 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore | ||
590 | } | ||
591 | else if (!strcmp(argv[j], "--dmz")) | ||
592 | { | ||
593 | gGridChoice = GRID_INFO_DMZ; | ||
594 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore | ||
595 | } | ||
596 | else if (!strcmp(argv[j], "--siva")) | ||
597 | { | ||
598 | gGridChoice = GRID_INFO_SIVA; | ||
599 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore | ||
600 | } | ||
601 | else if (!strcmp(argv[j], "--shakti")) | ||
602 | { | ||
603 | gGridChoice = GRID_INFO_SHAKTI; | ||
604 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore | ||
605 | } | ||
606 | else if (!strcmp(argv[j], "--durga")) | ||
607 | { | ||
608 | gGridChoice = GRID_INFO_DURGA; | ||
609 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore | ||
610 | } | ||
611 | else if (!strcmp(argv[j], "--soma")) | ||
612 | { | ||
613 | gGridChoice = GRID_INFO_SOMA; | ||
614 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore | ||
615 | } | ||
616 | else if (!strcmp(argv[j], "--ganga")) | ||
617 | { | ||
618 | gGridChoice = GRID_INFO_GANGA; | ||
619 | sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName); | ||
620 | } | ||
621 | else if (!strcmp(argv[j], "--vaak")) | ||
622 | { | ||
623 | gGridChoice = GRID_INFO_VAAK; | ||
624 | sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName); | ||
625 | } | ||
626 | else if (!strcmp(argv[j], "--uma")) | ||
627 | { | ||
628 | gGridChoice = GRID_INFO_UMA; | ||
629 | sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName); | ||
630 | } | ||
631 | else if (!strcmp(argv[j], "-user") && (++j < argc)) | ||
632 | { | ||
633 | if (!strcmp(argv[j], "-")) | ||
634 | { | ||
635 | gGridChoice = GRID_INFO_LOCAL; | ||
636 | snprintf(gGridName, MAX_STRING, "%s", LOOPBACK_ADDRESS_STRING); // Flawfinder: ignore | ||
637 | } | ||
638 | else | ||
639 | { | ||
640 | gGridChoice = GRID_INFO_OTHER; | ||
641 | ip_string.assign( argv[j] ); | ||
642 | LLString::trim(ip_string); | ||
643 | snprintf(gGridName, MAX_STRING, "%s", ip_string.c_str()); // Flawfinder: ignore | ||
644 | } | ||
645 | } | ||
646 | else if (!strcmp(argv[j], "-loginuri") && (++j < argc)) | ||
647 | { | ||
648 | LLAppViewer::instance()->addLoginURI(utf8str_trim(argv[j])); | ||
649 | } | ||
650 | else if (!strcmp(argv[j], "-helperuri") && (++j < argc)) | ||
651 | { | ||
652 | LLAppViewer::instance()->setHelperURI(utf8str_trim(argv[j])); | ||
653 | } | ||
654 | else if (!strcmp(argv[j], "-debugviews")) | ||
655 | { | ||
656 | LLView::sDebugRects = TRUE; | ||
657 | } | ||
658 | else if (!strcmp(argv[j], "-skin") && (++j < argc)) | ||
659 | { | ||
660 | std::string folder(argv[j]); | ||
661 | gDirUtilp->setSkinFolder(folder); | ||
662 | } | ||
663 | else if (!strcmp(argv[j], "-autologin") || !strcmp(argv[j], "--autologin")) // keep --autologin for compatibility | ||
664 | { | ||
665 | gAutoLogin = TRUE; | ||
666 | } | ||
667 | else if (!strcmp(argv[j], "-quitafter") && (++j < argc)) | ||
668 | { | ||
669 | gQuitAfterSeconds = (F32)atof(argv[j]); | ||
670 | } | ||
671 | else if (!strcmp(argv[j], "-rotate")) | ||
672 | { | ||
673 | gRotateRight = TRUE; | ||
674 | } | ||
675 | // else if (!strcmp(argv[j], "-noenv")) | ||
676 | // { | ||
677 | //turn OFF environmental effects for slow machines/video cards | ||
678 | // gRequestParaboloidMap = FALSE; | ||
679 | // } | ||
680 | else if (!strcmp(argv[j], "-noaudio")) | ||
681 | { | ||
682 | gUseAudio = FALSE; | ||
683 | } | ||
684 | else if (!strcmp(argv[j], "-nosound")) // tends to be popular cmdline on Linux. | ||
685 | { | ||
686 | gUseAudio = FALSE; | ||
687 | } | ||
688 | else if (!strcmp(argv[j], "-noprobe")) | ||
689 | { | ||
690 | gProbeHardware = FALSE; | ||
691 | } | ||
692 | else if (!strcmp(argv[j], "-noquicktime")) | ||
693 | { | ||
694 | // Developers can log in faster if they don't load all the | ||
695 | // quicktime dlls. | ||
696 | gUseQuickTime = false; | ||
697 | } | ||
698 | else if (!strcmp(argv[j], "-nopreload")) | ||
699 | { | ||
700 | // Developers can log in faster if they don't decode sounds | ||
701 | // or images on startup, ~5 seconds faster. | ||
702 | gPreloadSounds = false; | ||
703 | gPreloadImages = false; | ||
704 | } | ||
705 | else if (!strcmp(argv[j], "-purge")) | ||
706 | { | ||
707 | LLAppViewer::instance()->purgeCache(); | ||
708 | } | ||
709 | else if(!strcmp(argv[j], "-noinvlib")) | ||
710 | { | ||
711 | gRequestInventoryLibrary = FALSE; | ||
712 | } | ||
713 | else if (!strcmp(argv[j], "-log")) | ||
714 | { | ||
715 | gLogMessages = TRUE; | ||
716 | continue; | ||
717 | } | ||
718 | else if (!strcmp(argv[j], "-logfile") && (++j < argc)) | ||
719 | { | ||
720 | // *NOTE: This buffer size is hard coded into scanf() below. | ||
721 | char logfile[256]; // Flawfinder: ignore | ||
722 | sscanf(argv[j], "%255s", logfile); // Flawfinder: ignore | ||
723 | llinfos << "Setting log file to " << logfile << llendl; | ||
724 | LLFile::remove(logfile); | ||
725 | LLError::logToFile(logfile); | ||
726 | } | ||
727 | else if (!strcmp(argv[j], "-settings") && (++j < argc)) | ||
728 | { | ||
729 | gSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, argv[j]); | ||
730 | } | ||
731 | else if (!strcmp(argv[j], "-setdefault") && (j + 2 < argc)) | ||
732 | { | ||
733 | std::string control_name; | ||
734 | std::string control_value; | ||
735 | |||
736 | j++; | ||
737 | if (argv[j]) control_name = std::string(argv[j]); | ||
738 | |||
739 | j++; | ||
740 | if (argv[j]) control_value = std::string(argv[j]); | ||
741 | |||
742 | // grab control name and value | ||
743 | if (!control_name.empty()) | ||
744 | { | ||
745 | gCommandLineSettings[control_name] = control_value; | ||
746 | } | ||
747 | } | ||
748 | else if (!strcmp(argv[j], "-set") && (j + 2 < argc)) | ||
749 | { | ||
750 | std::string control_name; | ||
751 | std::string control_value; | ||
752 | |||
753 | j++; | ||
754 | if (argv[j]) control_name = std::string(argv[j]); | ||
755 | |||
756 | j++; | ||
757 | if (argv[j]) control_value = std::string(argv[j]); | ||
758 | |||
759 | // grab control name and value | ||
760 | if (!control_name.empty()) | ||
761 | { | ||
762 | gCommandLineForcedSettings[control_name] = control_value; | ||
763 | } | ||
764 | } | ||
765 | else if (!strcmp(argv[j], "-login")) | ||
766 | { | ||
767 | if (j + 3 < argc) | ||
768 | { | ||
769 | j++; | ||
770 | gCmdLineFirstName = argv[j]; | ||
771 | j++; | ||
772 | gCmdLineLastName = argv[j]; | ||
773 | j++; | ||
774 | gCmdLinePassword = argv[j]; | ||
775 | } | ||
776 | else | ||
777 | { | ||
778 | // only works if -login is last parameter on command line | ||
779 | llerrs << "Not enough parameters to -login. Did you mean -loginuri?" << llendl; | ||
780 | } | ||
781 | } | ||
782 | else if (!strcmp(argv[j], "-god")) | ||
783 | { | ||
784 | gGodConnect = TRUE; | ||
785 | } | ||
786 | else if (!strcmp(argv[j], "-noconsole")) | ||
787 | { | ||
788 | gUseConsole = FALSE; | ||
789 | } | ||
790 | else if (!strcmp(argv[j], "-safe")) | ||
791 | { | ||
792 | llinfos << "Setting viewer feature table to run in safe mode, resetting prefs" << llendl; | ||
793 | gFeatureManagerp->setSafe(TRUE); | ||
794 | } | ||
795 | else if (!strcmp(argv[j], "-multiple")) | ||
796 | { | ||
797 | gMultipleViewersOK = TRUE; | ||
798 | } | ||
799 | else if (!strcmp(argv[j], "-nomultiple")) | ||
800 | { | ||
801 | gMultipleViewersOK = FALSE; | ||
802 | } | ||
803 | else if (!strcmp(argv[j], "-novoice")) | ||
804 | { | ||
805 | gDisableVoice = TRUE; | ||
806 | } | ||
807 | else if (!strcmp(argv[j], "-nothread")) | ||
808 | { | ||
809 | LLVFile::ALLOW_ASYNC = FALSE; | ||
810 | llinfos << "Running VFS in nothread mode" << llendl; | ||
811 | } | ||
812 | // some programs don't respect the command line options in protocol handlers (I'm looking at you, Opera) | ||
813 | // so this allows us to parse the URL straight off the command line without a "-url" paramater | ||
814 | else if (LLURLDispatcher::isSLURL(argv[j]) | ||
815 | || !strcmp(argv[j], "-url") && (++j < argc)) | ||
816 | { | ||
817 | std::string slurl = argv[j]; | ||
818 | if (LLURLDispatcher::isSLURLCommand(slurl)) | ||
819 | { | ||
820 | LLStartUp::sSLURLCommand = slurl; | ||
821 | } | ||
822 | else | ||
823 | { | ||
824 | LLURLSimString::setString(slurl); | ||
825 | } | ||
826 | // *NOTE: After setting the url, bail. What can happen is | ||
827 | // that someone can use IE (or potentially other browsers) | ||
828 | // and do the rough equivalent of command injection and | ||
829 | // steal passwords. Phoenix. SL-55321 | ||
830 | } | ||
831 | else if (!strcmp(argv[j], "-ignorepixeldepth")) | ||
832 | { | ||
833 | gIgnorePixelDepth = TRUE; | ||
834 | } | ||
835 | else if (!strcmp(argv[j], "-cooperative")) | ||
836 | { | ||
837 | S32 ms_to_yield = 0; | ||
838 | if(++j < argc) | ||
839 | { | ||
840 | S32 rv = sscanf(argv[j], "%d", &ms_to_yield); | ||
841 | if(0 == rv) | ||
842 | { | ||
843 | --j; | ||
844 | } | ||
845 | } | ||
846 | else | ||
847 | { | ||
848 | --j; | ||
849 | } | ||
850 | gYieldMS = ms_to_yield; | ||
851 | gYieldTime = TRUE; | ||
852 | } | ||
853 | else if (!strcmp(argv[j], "-no-verify-ssl-cert")) | ||
854 | { | ||
855 | gVerifySSLCert = false; | ||
856 | } | ||
857 | else if ( (!strcmp(argv[j], "--channel") || !strcmp(argv[j], "-channel")) && (++j < argc)) | ||
858 | { | ||
859 | gChannelName = argv[j]; | ||
860 | } | ||
861 | #if LL_DARWIN | ||
862 | else if (!strncmp(argv[j], "-psn_", 5)) | ||
863 | { | ||
864 | // this is the Finder passing the process session number | ||
865 | // we ignore this | ||
866 | } | ||
867 | #endif | ||
868 | else if(!strncmp(argv[j], "-qa", 3)) | ||
869 | { | ||
870 | gQAMode = TRUE; | ||
871 | } | ||
872 | else | ||
873 | { | ||
874 | |||
875 | // DBC - Mac OS X passes some stuff by default on the command line (e.g. psn). | ||
876 | // Second Life URLs are passed this way as well? | ||
877 | llwarns << "Possible unknown keyword " << argv[j] << llendl; | ||
878 | |||
879 | // print usage information | ||
880 | llinfos << USAGE << llendl; | ||
881 | // return 1; | ||
882 | } | ||
883 | } | ||
884 | return 0; | ||
885 | } | ||
886 | |||
887 | bool send_url_to_other_instance(const std::string& url) | ||
888 | { | ||
889 | #if LL_WINDOWS | ||
890 | wchar_t window_class[256]; /* Flawfinder: ignore */ // Assume max length < 255 chars. | ||
891 | mbstowcs(window_class, sWindowClass, 255); | ||
892 | window_class[255] = 0; | ||
893 | // Use the class instead of the window name. | ||
894 | HWND other_window = FindWindow(window_class, NULL); | ||
895 | if (other_window != NULL) | ||
896 | { | ||
897 | lldebugs << "Found other window with the name '" << gWindowTitle << "'" << llendl; | ||
898 | COPYDATASTRUCT cds; | ||
899 | const S32 SLURL_MESSAGE_TYPE = 0; | ||
900 | cds.dwData = SLURL_MESSAGE_TYPE; | ||
901 | cds.cbData = url.length() + 1; | ||
902 | cds.lpData = (void*)url.c_str(); | ||
903 | |||
904 | LRESULT msg_result = SendMessage(other_window, WM_COPYDATA, NULL, (LPARAM)&cds); | ||
905 | lldebugs << "SendMessage(WM_COPYDATA) to other window '" | ||
906 | << gWindowTitle << "' returned " << msg_result << llendl; | ||
907 | return true; | ||
908 | } | ||
909 | #endif | ||
910 | return false; | ||
911 | } | ||
912 | |||
913 | //---------------------------------------------------------------------------- | ||
914 | // LLAppViewer definition | ||
915 | |||
916 | // Static members. | ||
917 | // The single viewer app. | ||
918 | LLAppViewer* LLAppViewer::sInstance = NULL; | ||
919 | |||
920 | LLTextureCache* LLAppViewer::sTextureCache = NULL; | ||
921 | LLWorkerThread* LLAppViewer::sImageDecodeThread = NULL; | ||
922 | LLTextureFetch* LLAppViewer::sTextureFetch = NULL; | ||
923 | |||
924 | LLAppViewer::LLAppViewer() : | ||
925 | mMarkerFile(NULL), | ||
926 | mLastExecFroze(false), | ||
927 | mCrashBehavior(CRASH_BEHAVIOR_ASK), | ||
928 | mReportedCrash(false), | ||
929 | mNumSessions(0), | ||
930 | mPurgeCache(false), | ||
931 | mPurgeOnExit(false), | ||
932 | mSecondInstance(false), | ||
933 | mSavedFinalSnapshot(false), | ||
934 | mQuitRequested(false), | ||
935 | mLogoutRequestSent(false) | ||
936 | { | ||
937 | if(NULL != sInstance) | ||
938 | { | ||
939 | llerrs << "Oh no! An instance of LLAppViewer already exists! LLAppViewer is sort of like a singleton." << llendl; | ||
940 | } | ||
941 | |||
942 | sInstance = this; | ||
943 | } | ||
944 | |||
945 | LLAppViewer::~LLAppViewer() | ||
946 | { | ||
947 | // If we got to this destructor somehow, the app didn't hang. | ||
948 | removeMarkerFile(); | ||
949 | } | ||
950 | |||
951 | bool LLAppViewer::tempStoreCommandOptions(int argc, char** argv) | ||
952 | { | ||
953 | gTempArgC = argc; | ||
954 | gTempArgV = argv; | ||
955 | return true; | ||
956 | } | ||
957 | |||
958 | bool LLAppViewer::init() | ||
959 | { | ||
960 | // *NOTE:Mani - LLCurl::initClass is not thread safe. | ||
961 | // Called before threads are created. | ||
962 | LLCurl::initClass(); | ||
963 | |||
964 | initThreads(); | ||
965 | |||
966 | initEarlyConfiguration(); | ||
967 | |||
968 | // | ||
969 | // Start of the application | ||
970 | // | ||
971 | // IMPORTANT! Do NOT put anything that will write | ||
972 | // into the log files during normal startup until AFTER | ||
973 | // we run the "program crashed last time" error handler below. | ||
974 | // | ||
975 | |||
976 | // Need to do this initialization before we do anything else, since anything | ||
977 | // that touches files should really go through the lldir API | ||
978 | gDirUtilp->initAppDirs("SecondLife"); | ||
979 | |||
980 | |||
981 | initLogging(); | ||
982 | |||
983 | // | ||
984 | // OK to write stuff to logs now, we've now crash reported if necessary | ||
985 | // | ||
986 | |||
987 | // Set up some defaults... | ||
988 | gSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, DEFAULT_SETTINGS_FILE); | ||
989 | gOldSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, LEGACY_DEFAULT_SETTINGS_FILE); | ||
990 | |||
991 | if (!initConfiguration()) | ||
992 | return false; | ||
993 | |||
994 | ////////////////////////////////////////////////////////////////////////////// | ||
995 | ////////////////////////////////////////////////////////////////////////////// | ||
996 | ////////////////////////////////////////////////////////////////////////////// | ||
997 | ////////////////////////////////////////////////////////////////////////////// | ||
998 | // *FIX: The following code isn't grouped into functions yet. | ||
999 | |||
1000 | // | ||
1001 | // Write system information into the debug log (CPU, OS, etc.) | ||
1002 | // | ||
1003 | writeSystemInfo(); | ||
1004 | |||
1005 | // Build a string representing the current version number. | ||
1006 | gCurrentVersion = llformat("%d.%d.%d", LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH ); | ||
1007 | |||
1008 | // | ||
1009 | // Load the feature tables | ||
1010 | // | ||
1011 | llinfos << "Loading feature tables." << llendl; | ||
1012 | |||
1013 | gFeatureManagerp->loadFeatureTables(); | ||
1014 | gFeatureManagerp->initCPUFeatureMasks(); | ||
1015 | |||
1016 | // Merge with the command line overrides | ||
1017 | gSavedSettings.applyOverrides(gCommandLineSettings); | ||
1018 | |||
1019 | // Need to do this before calling parseAlerts | ||
1020 | gUICtrlFactory = new LLViewerUICtrlFactory(); | ||
1021 | |||
1022 | // Pre-load alerts.xml to define the warnings settings (always loads from skins/xui/en-us/) | ||
1023 | // Do this *before* loading the settings file | ||
1024 | LLAlertDialog::parseAlerts("alerts.xml", &gSavedSettings, TRUE); | ||
1025 | |||
1026 | // Overwrite default settings with user settings | ||
1027 | llinfos << "Loading configuration file " << gSettingsFileName << llendl; | ||
1028 | if (0 == gSavedSettings.loadFromFile(gSettingsFileName)) | ||
1029 | { | ||
1030 | llinfos << "Failed to load settings from " << gSettingsFileName << llendl; | ||
1031 | llinfos << "Loading legacy settings from " << gOldSettingsFileName << llendl; | ||
1032 | gSavedSettings.loadFromFileLegacy(gOldSettingsFileName); | ||
1033 | } | ||
1034 | |||
1035 | // need to do this here - need to have initialized global settings first | ||
1036 | LLString nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" ); | ||
1037 | if ( nextLoginLocation.length() ) | ||
1038 | { | ||
1039 | LLURLSimString::setString( nextLoginLocation.c_str() ); | ||
1040 | }; | ||
1041 | |||
1042 | // Merge with the command line overrides | ||
1043 | gSavedSettings.applyOverrides(gCommandLineForcedSettings); | ||
1044 | |||
1045 | gLastRunVersion = gSavedSettings.getString("LastRunVersion"); | ||
1046 | |||
1047 | fixup_settings(); | ||
1048 | |||
1049 | // Get the single value from the crash settings file, if it exists | ||
1050 | std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); | ||
1051 | gCrashSettings.loadFromFile(crash_settings_filename.c_str()); | ||
1052 | |||
1053 | ///////////////////////////////////////////////// | ||
1054 | // OS-specific login dialogs | ||
1055 | ///////////////////////////////////////////////// | ||
1056 | #if LL_WINDOWS | ||
1057 | /* | ||
1058 | // Display initial login screen, comes up quickly. JC | ||
1059 | { | ||
1060 | LLSplashScreen::hide(); | ||
1061 | |||
1062 | INT_PTR result = DialogBox(hInstance, L"CONNECTBOX", NULL, login_dialog_func); | ||
1063 | if (result < 0) | ||
1064 | { | ||
1065 | llwarns << "Connect dialog box failed, returned " << result << llendl; | ||
1066 | return 1; | ||
1067 | } | ||
1068 | // success, result contains which button user clicked | ||
1069 | llinfos << "Connect dialog box clicked " << result << llendl; | ||
1070 | |||
1071 | LLSplashScreen::show(); | ||
1072 | } | ||
1073 | */ | ||
1074 | #endif | ||
1075 | |||
1076 | // track number of times that app has run | ||
1077 | mNumSessions = gSavedSettings.getS32("NumSessions"); | ||
1078 | mNumSessions++; | ||
1079 | gSavedSettings.setS32("NumSessions", mNumSessions); | ||
1080 | |||
1081 | gSavedSettings.setString("HelpLastVisitedURL",gSavedSettings.getString("HelpHomeURL")); | ||
1082 | |||
1083 | if (gSavedSettings.getBOOL("VerboseLogs")) | ||
1084 | { | ||
1085 | LLError::setPrintLocation(true); | ||
1086 | } | ||
1087 | |||
1088 | #if !LL_RELEASE_FOR_DOWNLOAD | ||
1089 | if (gGridChoice == GRID_INFO_NONE) | ||
1090 | { | ||
1091 | // Development version: load last server choice by default (overridden by cmd line args) | ||
1092 | |||
1093 | S32 server = gSavedSettings.getS32("ServerChoice"); | ||
1094 | if (server != 0) | ||
1095 | gGridChoice = (EGridInfo)llclamp(server, 0, (S32)GRID_INFO_COUNT - 1); | ||
1096 | if (server == GRID_INFO_OTHER) | ||
1097 | { | ||
1098 | LLString custom_server = gSavedSettings.getString("CustomServer"); | ||
1099 | if (custom_server.empty()) | ||
1100 | { | ||
1101 | snprintf(gGridName, MAX_STRING, "none"); /* Flawfinder: ignore */ | ||
1102 | } | ||
1103 | else | ||
1104 | { | ||
1105 | snprintf(gGridName, MAX_STRING, "%s", custom_server.c_str()); /* Flawfinder: ignore */ | ||
1106 | } | ||
1107 | } | ||
1108 | } | ||
1109 | #endif | ||
1110 | |||
1111 | if (gGridChoice == GRID_INFO_NONE) | ||
1112 | { | ||
1113 | gGridChoice = GridDefaultChoice; | ||
1114 | } | ||
1115 | |||
1116 | // Load art UUID information, don't require these strings to be declared in code. | ||
1117 | LLString viewer_art_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"viewerart.xml"); | ||
1118 | llinfos << "Loading art table from " << viewer_art_filename << llendl; | ||
1119 | gViewerArt.loadFromFile(viewer_art_filename.c_str(), FALSE); | ||
1120 | LLString textures_filename = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, "textures", "textures.xml"); | ||
1121 | llinfos << "Loading art table from " << textures_filename << llendl; | ||
1122 | gViewerArt.loadFromFile(textures_filename.c_str(), FALSE); | ||
1123 | |||
1124 | LLString colors_base_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors_base.xml"); | ||
1125 | llinfos << "Loading base colors from " << colors_base_filename << llendl; | ||
1126 | gColors.loadFromFile(colors_base_filename.c_str(), FALSE, TYPE_COL4U); | ||
1127 | |||
1128 | // Load overrides from user colors file | ||
1129 | LLString user_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.xml"); | ||
1130 | llinfos << "Loading user colors from " << user_colors_filename << llendl; | ||
1131 | if (gColors.loadFromFile(user_colors_filename.c_str(), FALSE, TYPE_COL4U) == 0) | ||
1132 | { | ||
1133 | llinfos << "Failed to load user colors from " << user_colors_filename << llendl; | ||
1134 | LLString user_legacy_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.ini"); | ||
1135 | llinfos << "Loading legacy colors from " << user_legacy_colors_filename << llendl; | ||
1136 | gColors.loadFromFileLegacy(user_legacy_colors_filename.c_str(), FALSE, TYPE_COL4U); | ||
1137 | } | ||
1138 | |||
1139 | // Widget construction depends on LLUI being initialized | ||
1140 | LLUI::initClass(&gSavedSettings, | ||
1141 | &gColors, | ||
1142 | &gViewerArt, | ||
1143 | &gImageList, | ||
1144 | ui_audio_callback, | ||
1145 | &LLUI::sGLScaleFactor); | ||
1146 | |||
1147 | LLWeb::initClass(); // do this after LLUI | ||
1148 | gUICtrlFactory->setupPaths(); // update paths with correct language set | ||
1149 | |||
1150 | ///////////////////////////////////////////////// | ||
1151 | // | ||
1152 | // Load settings files | ||
1153 | // | ||
1154 | // | ||
1155 | LLGroupMgr::parseRoleActions("role_actions.xml"); | ||
1156 | |||
1157 | LLAgent::parseTeleportMessages("teleport_strings.xml"); | ||
1158 | |||
1159 | mCrashBehavior = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); | ||
1160 | |||
1161 | LLVectorPerformanceOptions::initClass(); | ||
1162 | |||
1163 | // Move certain saved settings into global variables for speed | ||
1164 | saved_settings_to_globals(); | ||
1165 | |||
1166 | |||
1167 | // Find partition serial number (Windows) or hardware serial (Mac) | ||
1168 | mSerialNumber = generateSerialNumber(); | ||
1169 | |||
1170 | if(false == initHardwareTest()) | ||
1171 | { | ||
1172 | // Early out from user choice. | ||
1173 | return false; | ||
1174 | } | ||
1175 | |||
1176 | // Always fetch the Ethernet MAC address, needed both for login | ||
1177 | // and password load. | ||
1178 | LLUUID::getNodeID(gMACAddress); | ||
1179 | |||
1180 | // Prepare for out-of-memory situations, during which we will crash on | ||
1181 | // purpose and save a dump. | ||
1182 | #if LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP | ||
1183 | MemSetErrorHandler(first_mem_error_handler); | ||
1184 | #endif // LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP | ||
1185 | |||
1186 | gViewerStats = new LLViewerStats(); | ||
1187 | |||
1188 | // | ||
1189 | // Initialize the VFS, and gracefully handle initialization errors | ||
1190 | // | ||
1191 | |||
1192 | if (!initCache()) | ||
1193 | { | ||
1194 | std::ostringstream msg; | ||
1195 | msg << | ||
1196 | gSecondLife << " is unable to access a file that it needs.\n" | ||
1197 | "\n" | ||
1198 | "This can be because you somehow have multiple copies running, " | ||
1199 | "or your system incorrectly thinks a file is open. " | ||
1200 | "If this message persists, restart your computer and try again. " | ||
1201 | "If it continues to persist, you may need to completely uninstall " << | ||
1202 | gSecondLife << " and reinstall it."; | ||
1203 | OSMessageBox( | ||
1204 | msg.str().c_str(), | ||
1205 | NULL, | ||
1206 | OSMB_OK); | ||
1207 | return 1; | ||
1208 | } | ||
1209 | |||
1210 | #if LL_DARWIN | ||
1211 | // Display the release notes for the current version | ||
1212 | if(!gHideLinks && gCurrentVersion != gLastRunVersion) | ||
1213 | { | ||
1214 | // Current version and last run version don't match exactly. Display the release notes. | ||
1215 | DisplayReleaseNotes(); | ||
1216 | } | ||
1217 | #endif | ||
1218 | |||
1219 | // | ||
1220 | // Initialize the window | ||
1221 | // | ||
1222 | initWindow(); | ||
1223 | |||
1224 | #if LL_WINDOWS && LL_LCD_COMPILE | ||
1225 | // start up an LCD window on a logitech keyboard, if there is one | ||
1226 | HINSTANCE hInstance = GetModuleHandle(NULL); | ||
1227 | gLcdScreen = new llLCD(hInstance); | ||
1228 | CreateLCDDebugWindows(); | ||
1229 | #endif | ||
1230 | |||
1231 | gGLManager.getGLInfo(gDebugInfo); | ||
1232 | llinfos << gGLManager.getGLInfoString() << llendl; | ||
1233 | |||
1234 | //load key settings | ||
1235 | bind_keyboard_functions(); | ||
1236 | |||
1237 | // Load Default bindings | ||
1238 | if (!gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"keys.ini").c_str())) | ||
1239 | { | ||
1240 | llerrs << "Unable to open keys.ini" << llendl; | ||
1241 | } | ||
1242 | // Load Custom bindings (override defaults) | ||
1243 | gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"custom_keys.ini").c_str()); | ||
1244 | |||
1245 | // Calculate the digest for the executable (takes < 90ms on a fast machine). | ||
1246 | FILE* app_file = LLFile::fopen( gDirUtilp->getExecutablePathAndName().c_str(), "rb" ); /* Flawfinder: ignore */ | ||
1247 | if( app_file ) | ||
1248 | { | ||
1249 | LLMD5 app_md5; | ||
1250 | app_md5.update( app_file ); // Automatically closes the file | ||
1251 | app_md5.finalize(); | ||
1252 | app_md5.raw_digest( gViewerDigest.mData ); | ||
1253 | } | ||
1254 | llinfos << "Viewer Digest: " << gViewerDigest << llendl; | ||
1255 | |||
1256 | // If we don't have the right GL requirements, exit. | ||
1257 | // BUG: This should just be changed to a generic GL "Not good enough" flag | ||
1258 | if (!gGLManager.mHasMultitexture && !gNoRender) | ||
1259 | { | ||
1260 | std::ostringstream msg; | ||
1261 | msg << | ||
1262 | "You do not appear to have the proper hardware requirements " | ||
1263 | "for " << gSecondLife << ". " << gSecondLife << " requires an OpenGL graphics " | ||
1264 | "card that has multitexture support. If this is the case, " | ||
1265 | "you may want to make sure that you have the latest drivers for " | ||
1266 | "your graphics card, and service packs and patches for your " | ||
1267 | "operating system.\n" | ||
1268 | "If you continue to have problems, please go to: " | ||
1269 | "www.secondlife.com/support "; | ||
1270 | OSMessageBox( | ||
1271 | msg.str().c_str(), | ||
1272 | NULL, | ||
1273 | OSMB_OK); | ||
1274 | return 0; | ||
1275 | } | ||
1276 | |||
1277 | // Save the current version to the prefs file | ||
1278 | gSavedSettings.setString("LastRunVersion", gCurrentVersion); | ||
1279 | |||
1280 | gSimLastTime = gRenderStartTime.getElapsedTimeF32(); | ||
1281 | gSimFrames = (F32)gFrameCount; | ||
1282 | |||
1283 | return true; | ||
1284 | } | ||
1285 | |||
1286 | bool LLAppViewer::mainLoop() | ||
1287 | { | ||
1288 | //------------------------------------------- | ||
1289 | // Run main loop until time to quit | ||
1290 | //------------------------------------------- | ||
1291 | |||
1292 | // Create IO Pump to use for HTTP Requests. | ||
1293 | gServicePump = new LLPumpIO(gAPRPoolp); | ||
1294 | LLHTTPClient::setPump(*gServicePump); | ||
1295 | LLHTTPClient::setCABundle(gDirUtilp->getCAFile()); | ||
1296 | |||
1297 | // initialize voice stuff here | ||
1298 | gLocalSpeakerMgr = new LLLocalSpeakerMgr(); | ||
1299 | gActiveChannelSpeakerMgr = new LLActiveSpeakerMgr(); | ||
1300 | |||
1301 | LLVoiceChannel::initClass(); | ||
1302 | LLVoiceClient::init(gServicePump); | ||
1303 | |||
1304 | LLMemType mt1(LLMemType::MTYPE_MAIN); | ||
1305 | LLTimer frameTimer,idleTimer; | ||
1306 | LLTimer debugTime; | ||
1307 | |||
1308 | // Handle messages | ||
1309 | while (!LLApp::isExiting()) | ||
1310 | { | ||
1311 | LLFastTimer::reset(); // Should be outside of any timer instances | ||
1312 | { | ||
1313 | LLFastTimer t(LLFastTimer::FTM_FRAME); | ||
1314 | |||
1315 | { | ||
1316 | LLFastTimer t2(LLFastTimer::FTM_MESSAGES); | ||
1317 | #if LL_WINDOWS | ||
1318 | if (!LLWinDebug::setupExceptionHandler()) | ||
1319 | { | ||
1320 | llwarns << " Someone took over my exception handler (post messagehandling)!" << llendl; | ||
1321 | } | ||
1322 | #endif | ||
1323 | |||
1324 | gViewerWindow->mWindow->gatherInput(); | ||
1325 | } | ||
1326 | |||
1327 | #if 1 && !RELEASE_FOR_DOWNLOAD | ||
1328 | // once per second debug info | ||
1329 | if (debugTime.getElapsedTimeF32() > 1.f) | ||
1330 | { | ||
1331 | debugTime.reset(); | ||
1332 | } | ||
1333 | #endif | ||
1334 | if (!LLApp::isExiting()) | ||
1335 | { | ||
1336 | // Scan keyboard for movement keys. Command keys and typing | ||
1337 | // are handled by windows callbacks. Don't do this until we're | ||
1338 | // done initializing. JC | ||
1339 | if (gViewerWindow->mWindow->getVisible() | ||
1340 | && gViewerWindow->getActive() | ||
1341 | && !gViewerWindow->mWindow->getMinimized() | ||
1342 | && LLStartUp::getStartupState() == STATE_STARTED | ||
1343 | && !gViewerWindow->getShowProgress() | ||
1344 | && !gFocusMgr.focusLocked()) | ||
1345 | { | ||
1346 | gKeyboard->scanKeyboard(); | ||
1347 | LLViewerJoystick::scanJoystick(); | ||
1348 | } | ||
1349 | |||
1350 | // Update state based on messages, user input, object idle. | ||
1351 | { | ||
1352 | LLFastTimer t3(LLFastTimer::FTM_IDLE); | ||
1353 | idle(); | ||
1354 | LLCurl::process(); | ||
1355 | // this pump is necessary to make the login screen show up | ||
1356 | gServicePump->pump(); | ||
1357 | gServicePump->callback(); | ||
1358 | } | ||
1359 | |||
1360 | if (gDoDisconnect && (LLStartUp::getStartupState() == STATE_STARTED)) | ||
1361 | { | ||
1362 | saveFinalSnapshot(); | ||
1363 | disconnectViewer(); | ||
1364 | } | ||
1365 | |||
1366 | // Render scene. | ||
1367 | if (!LLApp::isExiting()) | ||
1368 | { | ||
1369 | display(); | ||
1370 | |||
1371 | LLFloaterSnapshot::update(); // take snapshots | ||
1372 | |||
1373 | #if !LL_SOLARIS | ||
1374 | if (gbCapturing) | ||
1375 | { | ||
1376 | gMovieMaker.Snap(); | ||
1377 | } | ||
1378 | #endif | ||
1379 | #if LL_WINDOWS && LL_LCD_COMPILE | ||
1380 | // update LCD Screen | ||
1381 | gLcdScreen->UpdateDisplay(); | ||
1382 | #endif | ||
1383 | } | ||
1384 | |||
1385 | } | ||
1386 | |||
1387 | // Sleep and run background threads | ||
1388 | { | ||
1389 | LLFastTimer t2(LLFastTimer::FTM_SLEEP); | ||
1390 | bool run_multiple_threads = gSavedSettings.getBOOL("RunMultipleThreads"); | ||
1391 | |||
1392 | // yield some time to the os based on command line option | ||
1393 | if(gYieldTime) | ||
1394 | { | ||
1395 | ms_sleep(gYieldMS); | ||
1396 | } | ||
1397 | |||
1398 | // yield cooperatively when not running as foreground window | ||
1399 | if ( gNoRender | ||
1400 | || !gViewerWindow->mWindow->getVisible() | ||
1401 | || !gFocusMgr.getAppHasFocus()) | ||
1402 | { | ||
1403 | // Sleep if we're not rendering, or the window is minimized. | ||
1404 | S32 milliseconds_to_sleep = llclamp(gSavedSettings.getS32("BackgroundYieldTime"), 0, 1000); | ||
1405 | // don't sleep when BackgroundYieldTime set to 0, since this will still yield to other threads | ||
1406 | // of equal priority on Windows | ||
1407 | if (milliseconds_to_sleep > 0) | ||
1408 | { | ||
1409 | ms_sleep(milliseconds_to_sleep); | ||
1410 | // also pause worker threads during this wait period | ||
1411 | LLAppViewer::getTextureCache()->pause(); | ||
1412 | LLAppViewer::getImageDecodeThread()->pause(); | ||
1413 | } | ||
1414 | } | ||
1415 | |||
1416 | if (gRandomizeFramerate) | ||
1417 | { | ||
1418 | ms_sleep(rand() % 200); | ||
1419 | } | ||
1420 | |||
1421 | if (gPeriodicSlowFrame | ||
1422 | && (gFrameCount % 10 == 0)) | ||
1423 | { | ||
1424 | llinfos << "Periodic slow frame - sleeping 500 ms" << llendl; | ||
1425 | ms_sleep(500); | ||
1426 | } | ||
1427 | |||
1428 | |||
1429 | const F64 min_frame_time = 0.0; //(.0333 - .0010); // max video frame rate = 30 fps | ||
1430 | const F64 min_idle_time = 0.0; //(.0010); // min idle time = 1 ms | ||
1431 | const F64 max_idle_time = run_multiple_threads ? min_idle_time : .005; // 5 ms | ||
1432 | idleTimer.reset(); | ||
1433 | while(1) | ||
1434 | { | ||
1435 | S32 work_pending = 0; | ||
1436 | S32 io_pending = 0; | ||
1437 | work_pending += LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread | ||
1438 | work_pending += LLAppViewer::getImageDecodeThread()->update(1); // unpauses the image thread | ||
1439 | work_pending += LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread | ||
1440 | io_pending += LLVFSThread::updateClass(1); | ||
1441 | io_pending += LLLFSThread::updateClass(1); | ||
1442 | if (io_pending > 1000) | ||
1443 | { | ||
1444 | ms_sleep(llmin(io_pending/100,100)); // give the vfs some time to catch up | ||
1445 | } | ||
1446 | |||
1447 | F64 frame_time = frameTimer.getElapsedTimeF64(); | ||
1448 | F64 idle_time = idleTimer.getElapsedTimeF64(); | ||
1449 | if (frame_time >= min_frame_time && | ||
1450 | idle_time >= min_idle_time && | ||
1451 | (!work_pending || idle_time >= max_idle_time)) | ||
1452 | { | ||
1453 | break; | ||
1454 | } | ||
1455 | } | ||
1456 | frameTimer.reset(); | ||
1457 | |||
1458 | // Prevent the worker threads from running while rendering. | ||
1459 | // if (LLThread::processorCount()==1) //pause() should only be required when on a single processor client... | ||
1460 | if (run_multiple_threads == FALSE) | ||
1461 | { | ||
1462 | LLAppViewer::getTextureCache()->pause(); | ||
1463 | LLAppViewer::getImageDecodeThread()->pause(); | ||
1464 | // LLAppViewer::getTextureFetch()->pause(); // Don't pause the fetch (IO) thread | ||
1465 | } | ||
1466 | //LLVFSThread::sLocal->pause(); // Prevent the VFS thread from running while rendering. | ||
1467 | //LLLFSThread::sLocal->pause(); // Prevent the LFS thread from running while rendering. | ||
1468 | } | ||
1469 | |||
1470 | } | ||
1471 | } | ||
1472 | |||
1473 | // Save snapshot for next time, if we made it through initialization | ||
1474 | if (STATE_STARTED == LLStartUp::getStartupState()) | ||
1475 | { | ||
1476 | saveFinalSnapshot(); | ||
1477 | } | ||
1478 | |||
1479 | delete gServicePump; | ||
1480 | |||
1481 | llinfos << "Exiting main_loop" << llendflush; | ||
1482 | |||
1483 | return true; | ||
1484 | } | ||
1485 | |||
1486 | bool LLAppViewer::cleanup() | ||
1487 | { | ||
1488 | //flag all elements as needing to be destroyed immediately | ||
1489 | // to ensure shutdown order | ||
1490 | LLMortician::setZealous(TRUE); | ||
1491 | |||
1492 | LLVoiceClient::terminate(); | ||
1493 | |||
1494 | disconnectViewer(); | ||
1495 | |||
1496 | llinfos << "Viewer disconnected" << llendflush; | ||
1497 | |||
1498 | display_cleanup(); | ||
1499 | |||
1500 | release_start_screen(); // just in case | ||
1501 | |||
1502 | LLError::logToFixedBuffer(NULL); | ||
1503 | |||
1504 | llinfos << "Cleaning Up" << llendflush; | ||
1505 | |||
1506 | LLKeyframeDataCache::clear(); | ||
1507 | |||
1508 | // Must clean up texture references before viewer window is destroyed. | ||
1509 | LLHUDObject::cleanupHUDObjects(); | ||
1510 | llinfos << "HUD Objects cleaned up" << llendflush; | ||
1511 | |||
1512 | // End TransferManager before deleting systems it depends on (Audio, VFS, AssetStorage) | ||
1513 | #if 0 // this seems to get us stuck in an infinite loop... | ||
1514 | gTransferManager.cleanup(); | ||
1515 | #endif | ||
1516 | |||
1517 | // Clean up map data storage | ||
1518 | delete gWorldMap; | ||
1519 | gWorldMap = NULL; | ||
1520 | |||
1521 | delete gHUDManager; | ||
1522 | gHUDManager = NULL; | ||
1523 | |||
1524 | delete gToolMgr; | ||
1525 | gToolMgr = NULL; | ||
1526 | |||
1527 | delete gAssetStorage; | ||
1528 | gAssetStorage = NULL; | ||
1529 | |||
1530 | LLPolyMesh::freeAllMeshes(); | ||
1531 | |||
1532 | delete gCacheName; | ||
1533 | gCacheName = NULL; | ||
1534 | |||
1535 | delete gGlobalEconomy; | ||
1536 | gGlobalEconomy = NULL; | ||
1537 | |||
1538 | delete gLocalSpeakerMgr; | ||
1539 | gLocalSpeakerMgr = NULL; | ||
1540 | |||
1541 | LLNotifyBox::cleanup(); | ||
1542 | |||
1543 | llinfos << "Global stuff deleted" << llendflush; | ||
1544 | |||
1545 | #if !LL_RELEASE_FOR_DOWNLOAD | ||
1546 | if (gAudiop) | ||
1547 | { | ||
1548 | gAudiop->shutdown(); | ||
1549 | } | ||
1550 | #else | ||
1551 | // This hack exists because fmod likes to occasionally hang forever | ||
1552 | // when shutting down for no apparent reason. | ||
1553 | llwarns << "Hack, skipping audio engine cleanup" << llendflush; | ||
1554 | #endif | ||
1555 | |||
1556 | |||
1557 | // moved to main application shutdown for now because it's non-trivial and only needs to be done once | ||
1558 | // (even though it goes against the media framework design) | ||
1559 | |||
1560 | LLMediaEngine::cleanupClass(); | ||
1561 | |||
1562 | #if LL_QUICKTIME_ENABLED | ||
1563 | if (gQuickTimeInitialized) | ||
1564 | { | ||
1565 | // clean up media stuff | ||
1566 | llinfos << "Cleaning up QuickTime" << llendl; | ||
1567 | ExitMovies (); | ||
1568 | #if LL_WINDOWS | ||
1569 | // Only necessary/available on Windows. | ||
1570 | TerminateQTML (); | ||
1571 | #endif | ||
1572 | } | ||
1573 | llinfos << "Quicktime cleaned up" << llendflush; | ||
1574 | #endif | ||
1575 | |||
1576 | #if LL_GSTREAMER_ENABLED | ||
1577 | llinfos << "Cleaning up GStreamer" << llendl; | ||
1578 | UnloadGStreamer(); | ||
1579 | llinfos << "GStreamer cleaned up" << llendflush; | ||
1580 | #endif | ||
1581 | |||
1582 | llinfos << "Cleaning up feature manager" << llendflush; | ||
1583 | delete gFeatureManagerp; | ||
1584 | gFeatureManagerp = NULL; | ||
1585 | |||
1586 | // Patch up settings for next time | ||
1587 | // Must do this before we delete the viewer window, | ||
1588 | // such that we can suck rectangle information out of | ||
1589 | // it. | ||
1590 | cleanupSavedSettings(); | ||
1591 | llinfos << "Settings patched up" << llendflush; | ||
1592 | |||
1593 | delete gAudiop; | ||
1594 | gAudiop = NULL; | ||
1595 | |||
1596 | // delete some of the files left around in the cache. | ||
1597 | removeCacheFiles("*.wav"); | ||
1598 | removeCacheFiles("*.tmp"); | ||
1599 | removeCacheFiles("*.lso"); | ||
1600 | removeCacheFiles("*.out"); | ||
1601 | removeCacheFiles("*.dsf"); | ||
1602 | removeCacheFiles("*.bodypart"); | ||
1603 | removeCacheFiles("*.clothing"); | ||
1604 | |||
1605 | llinfos << "Cache files removed" << llendflush; | ||
1606 | |||
1607 | |||
1608 | cleanup_menus(); | ||
1609 | |||
1610 | // Wait for any pending VFS IO | ||
1611 | while (1) | ||
1612 | { | ||
1613 | S32 pending = LLVFSThread::updateClass(0); | ||
1614 | pending += LLLFSThread::updateClass(0); | ||
1615 | if (!pending) | ||
1616 | { | ||
1617 | break; | ||
1618 | } | ||
1619 | llinfos << "Waiting for pending IO to finish: " << pending << llendflush; | ||
1620 | ms_sleep(100); | ||
1621 | } | ||
1622 | llinfos << "Shutting down." << llendflush; | ||
1623 | |||
1624 | // Destroy Windows(R) window, and make sure we're not fullscreen | ||
1625 | // This may generate window reshape and activation events. | ||
1626 | // Therefore must do this before destroying the message system. | ||
1627 | delete gViewerWindow; | ||
1628 | gViewerWindow = NULL; | ||
1629 | llinfos << "ViewerWindow deleted" << llendflush; | ||
1630 | |||
1631 | // viewer UI relies on keyboard so keep it aound until viewer UI isa gone | ||
1632 | delete gKeyboard; | ||
1633 | gKeyboard = NULL; | ||
1634 | |||
1635 | // Clean up selection managers after UI is destroyed, as UI | ||
1636 | // may be observing them. | ||
1637 | LLSelectMgr::cleanupGlobals(); | ||
1638 | |||
1639 | LLViewerObject::cleanupVOClasses(); | ||
1640 | |||
1641 | LLTracker::cleanupInstance(); | ||
1642 | |||
1643 | #if LL_LIBXUL_ENABLED | ||
1644 | // this must be done after floater cleanup (delete gViewerWindow) since | ||
1645 | // floaters potentially need the manager to destroy their contents. | ||
1646 | LLMozLib::getInstance()->reset(); | ||
1647 | #endif | ||
1648 | |||
1649 | // *FIX: This is handled in LLAppViewerWin32::cleanup(). | ||
1650 | // I'm keeping the comment to remember its order in cleanup, | ||
1651 | // in case of unforseen dependency. | ||
1652 | //#if LL_WINDOWS | ||
1653 | // gDXHardware.cleanup(); | ||
1654 | //#endif // LL_WINDOWS | ||
1655 | |||
1656 | #if LL_WINDOWS && LL_LCD_COMPILE | ||
1657 | // shut down the LCD window on a logitech keyboard, if there is one | ||
1658 | delete gLcdScreen; | ||
1659 | gLcdScreen = NULL; | ||
1660 | #endif | ||
1661 | |||
1662 | if (!gVolumeMgr->cleanup()) | ||
1663 | { | ||
1664 | llwarns << "Remaining references in the volume manager!" << llendflush; | ||
1665 | } | ||
1666 | |||
1667 | LLViewerParcelMgr::cleanupGlobals(); | ||
1668 | |||
1669 | delete gViewerStats; | ||
1670 | gViewerStats = NULL; | ||
1671 | |||
1672 | //end_messaging_system(); | ||
1673 | |||
1674 | LLFollowCamMgr::cleanupClass(); | ||
1675 | LLVolumeMgr::cleanupClass(); | ||
1676 | LLWorldMapView::cleanupClass(); | ||
1677 | LLUI::cleanupClass(); | ||
1678 | |||
1679 | // | ||
1680 | // Shut down the VFS's AFTER the decode manager cleans up (since it cleans up vfiles). | ||
1681 | // Also after viewerwindow is deleted, since it may have image pointers (which have vfiles) | ||
1682 | // Also after shutting down the messaging system since it has VFS dependencies | ||
1683 | // | ||
1684 | LLVFile::cleanupClass(); | ||
1685 | llinfos << "VFS cleaned up" << llendflush; | ||
1686 | |||
1687 | // Store the time of our current logoff | ||
1688 | gSavedPerAccountSettings.setU32("LastLogoff", time_corrected()); | ||
1689 | |||
1690 | // Must do this after all panels have been deleted because panels that have persistent rects | ||
1691 | // save their rects on delete. | ||
1692 | gSavedSettings.saveToFile(gSettingsFileName, TRUE); | ||
1693 | if (!gPerAccountSettingsFileName.empty()) | ||
1694 | { | ||
1695 | gSavedPerAccountSettings.saveToFile(gPerAccountSettingsFileName, TRUE); | ||
1696 | } | ||
1697 | llinfos << "Saved settings" << llendflush; | ||
1698 | |||
1699 | std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); | ||
1700 | // save all settings, even if equals defaults | ||
1701 | gCrashSettings.saveToFile(crash_settings_filename.c_str(), FALSE); | ||
1702 | |||
1703 | delete gUICtrlFactory; | ||
1704 | gUICtrlFactory = NULL; | ||
1705 | |||
1706 | gSavedSettings.cleanup(); | ||
1707 | gViewerArt.cleanup(); | ||
1708 | gColors.cleanup(); | ||
1709 | gCrashSettings.cleanup(); | ||
1710 | |||
1711 | if (gMuteListp) | ||
1712 | { | ||
1713 | // save mute list | ||
1714 | gMuteListp->cache(gAgent.getID()); | ||
1715 | |||
1716 | delete gMuteListp; | ||
1717 | gMuteListp = NULL; | ||
1718 | } | ||
1719 | |||
1720 | if (mPurgeOnExit) | ||
1721 | { | ||
1722 | llinfos << "Purging all cache files on exit" << llendflush; | ||
1723 | char mask[LL_MAX_PATH]; /* Flawfinder: ignore */ | ||
1724 | snprintf(mask, LL_MAX_PATH, "%s*.*", gDirUtilp->getDirDelimiter().c_str()); /* Flawfinder: ignore */ | ||
1725 | gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"").c_str(),mask); | ||
1726 | } | ||
1727 | |||
1728 | removeMarkerFile(); // Any crashes from here on we'll just have to ignore | ||
1729 | |||
1730 | closeDebug(); | ||
1731 | |||
1732 | // Let threads finish | ||
1733 | LLTimer idleTimer; | ||
1734 | idleTimer.reset(); | ||
1735 | const F64 max_idle_time = 5.f; // 5 seconds | ||
1736 | while(1) | ||
1737 | { | ||
1738 | S32 pending = 0; | ||
1739 | pending += LLAppViewer::getTextureCache()->update(1); // unpauses the worker thread | ||
1740 | pending += LLAppViewer::getImageDecodeThread()->update(1); // unpauses the image thread | ||
1741 | pending += LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread | ||
1742 | pending += LLVFSThread::updateClass(0); | ||
1743 | pending += LLLFSThread::updateClass(0); | ||
1744 | F64 idle_time = idleTimer.getElapsedTimeF64(); | ||
1745 | if (!pending || idle_time >= max_idle_time) | ||
1746 | { | ||
1747 | llwarns << "Quitting with pending background tasks." << llendl; | ||
1748 | break; | ||
1749 | } | ||
1750 | } | ||
1751 | |||
1752 | // Delete workers first | ||
1753 | // shotdown all worker threads before deleting them in case of co-dependencies | ||
1754 | sTextureCache->shutdown(); | ||
1755 | sTextureFetch->shutdown(); | ||
1756 | sImageDecodeThread->shutdown(); | ||
1757 | delete sTextureCache; | ||
1758 | sTextureCache = NULL; | ||
1759 | delete sTextureFetch; | ||
1760 | sTextureFetch = NULL; | ||
1761 | delete sImageDecodeThread; | ||
1762 | sImageDecodeThread = NULL; | ||
1763 | |||
1764 | gImageList.shutdown(); // shutdown again in case a callback added something | ||
1765 | |||
1766 | // This should eventually be done in LLAppViewer | ||
1767 | LLImageJ2C::closeDSO(); | ||
1768 | LLImageFormatted::cleanupClass(); | ||
1769 | LLVFSThread::cleanupClass(); | ||
1770 | LLLFSThread::cleanupClass(); | ||
1771 | |||
1772 | llinfos << "VFS Thread finished" << llendflush; | ||
1773 | |||
1774 | #ifndef LL_RELEASE_FOR_DOWNLOAD | ||
1775 | llinfos << "Auditing VFS" << llendl; | ||
1776 | gVFS->audit(); | ||
1777 | #endif | ||
1778 | |||
1779 | // For safety, the LLVFS has to be deleted *after* LLVFSThread. This should be cleaned up. | ||
1780 | // (LLVFS doesn't know about LLVFSThread so can't kill pending requests) -Steve | ||
1781 | delete gStaticVFS; | ||
1782 | gStaticVFS = NULL; | ||
1783 | delete gVFS; | ||
1784 | gVFS = NULL; | ||
1785 | |||
1786 | end_messaging_system(); | ||
1787 | |||
1788 | // *NOTE:Mani - The following call is not thread safe. | ||
1789 | LLCurl::cleanup(); | ||
1790 | |||
1791 | // If we're exiting to launch an URL, do that here so the screen | ||
1792 | // is at the right resolution before we launch IE. | ||
1793 | if (!gLaunchFileOnQuit.empty()) | ||
1794 | { | ||
1795 | #if LL_WINDOWS | ||
1796 | // Indicate an application is starting. | ||
1797 | SetCursor(LoadCursor(NULL, IDC_WAIT)); | ||
1798 | #endif | ||
1799 | |||
1800 | // HACK: Attempt to wait until the screen res. switch is complete. | ||
1801 | ms_sleep(1000); | ||
1802 | |||
1803 | LLWeb::loadURLExternal( gLaunchFileOnQuit ); | ||
1804 | } | ||
1805 | |||
1806 | |||
1807 | llinfos << "Goodbye" << llendflush; | ||
1808 | // return 0; | ||
1809 | return true; | ||
1810 | } | ||
1811 | |||
1812 | bool LLAppViewer::initEarlyConfiguration() | ||
1813 | { | ||
1814 | // *FIX: globals - This method sets a bunch of globals early in the init process. | ||
1815 | int argc = gTempArgC; | ||
1816 | char** argv = gTempArgV; | ||
1817 | |||
1818 | // HACK! We REALLY want to know what grid they were trying to connect to if they | ||
1819 | // crashed hard. | ||
1820 | // So we walk through the command line args ONLY looking for the | ||
1821 | // userserver arguments first. And we don't do ANYTHING but set | ||
1822 | // the gGridName (which gets passed to the crash reporter). | ||
1823 | // We're assuming that they're trying to log into the same grid as last | ||
1824 | // time, which seems fairly reasonable. | ||
1825 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GridDefaultChoice].mName); // Flawfinder: ignore | ||
1826 | S32 j; | ||
1827 | for (j = 1; j < argc; j++) | ||
1828 | { | ||
1829 | if (!strcmp(argv[j], "--aditi")) | ||
1830 | { | ||
1831 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_ADITI].mName); // Flawfinder: ignore | ||
1832 | } | ||
1833 | else if (!strcmp(argv[j], "--agni")) | ||
1834 | { | ||
1835 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_AGNI].mName); // Flawfinder: ignore | ||
1836 | } | ||
1837 | else if (!strcmp(argv[j], "--dmz")) | ||
1838 | { | ||
1839 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_DMZ].mName); // Flawfinder: ignore | ||
1840 | } | ||
1841 | else if (!strcmp(argv[j], "--siva")) | ||
1842 | { | ||
1843 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_SIVA].mName); // Flawfinder: ignore | ||
1844 | } | ||
1845 | else if (!strcmp(argv[j], "--shakti")) | ||
1846 | { | ||
1847 | sprintf(gGridName,"%s", gGridInfo[GRID_INFO_SHAKTI].mName); | ||
1848 | } | ||
1849 | else if (!strcmp(argv[j], "--durga")) | ||
1850 | { | ||
1851 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_DURGA].mName); // Flawfinder: ignore | ||
1852 | } | ||
1853 | else if (!strcmp(argv[j], "--soma")) | ||
1854 | { | ||
1855 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_SOMA].mName); // Flawfinder: ignore | ||
1856 | } | ||
1857 | else if (!strcmp(argv[j], "--ganga")) | ||
1858 | { | ||
1859 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_GANGA].mName); // Flawfinder: ignore | ||
1860 | } | ||
1861 | else if (!strcmp(argv[j], "--vaak")) | ||
1862 | { | ||
1863 | sprintf(gGridName,"%s", gGridInfo[GRID_INFO_VAAK].mName); | ||
1864 | } | ||
1865 | else if (!strcmp(argv[j], "--uma")) | ||
1866 | { | ||
1867 | sprintf(gGridName,"%s", gGridInfo[GRID_INFO_UMA].mName); | ||
1868 | } | ||
1869 | else if (!strcmp(argv[j], "-user") && (++j < argc)) | ||
1870 | { | ||
1871 | if (!strcmp(argv[j], "-")) | ||
1872 | { | ||
1873 | snprintf(gGridName, MAX_STRING, "%s", LOOPBACK_ADDRESS_STRING); // Flawfinder: ignore | ||
1874 | } | ||
1875 | else | ||
1876 | { | ||
1877 | snprintf(gGridName, MAX_STRING, "%s", argv[j]); // Flawfinder: ignore | ||
1878 | } | ||
1879 | } | ||
1880 | else if (!strcmp(argv[j], "-multiple")) | ||
1881 | { | ||
1882 | // Hack to detect -multiple so we can disable the marker file check (which will always fail) | ||
1883 | gMultipleViewersOK = TRUE; | ||
1884 | } | ||
1885 | else if (!strcmp(argv[j], "-novoice")) | ||
1886 | { | ||
1887 | // May need to know this early also | ||
1888 | gDisableVoice = TRUE; | ||
1889 | } | ||
1890 | else if (!strcmp(argv[j], "-url") && (++j < argc)) | ||
1891 | { | ||
1892 | LLURLSimString::setString(argv[j]); | ||
1893 | } | ||
1894 | } | ||
1895 | |||
1896 | return true; | ||
1897 | } | ||
1898 | |||
1899 | bool LLAppViewer::initThreads() | ||
1900 | { | ||
1901 | #if MEM_TRACK_MEM | ||
1902 | static const bool enable_threads = false; | ||
1903 | #else | ||
1904 | static const bool enable_threads = true; | ||
1905 | #endif | ||
1906 | LLVFSThread::initClass(enable_threads && true); | ||
1907 | LLLFSThread::initClass(enable_threads && true); | ||
1908 | |||
1909 | // Image decoding | ||
1910 | LLAppViewer::sImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true); | ||
1911 | LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true); | ||
1912 | LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), enable_threads && false); | ||
1913 | LLImageWorker::initClass(LLAppViewer::getImageDecodeThread()); | ||
1914 | LLImageJ2C::openDSO(); | ||
1915 | |||
1916 | // *FIX: no error handling here! | ||
1917 | return true; | ||
1918 | } | ||
1919 | |||
1920 | void errorCallback(const std::string &error_string) | ||
1921 | { | ||
1922 | #ifndef LL_RELEASE_FOR_DOWNLOAD | ||
1923 | OSMessageBox(error_string.c_str(), "Fatal Error", OSMB_OK); | ||
1924 | #endif | ||
1925 | LLError::crashAndLoop(error_string); | ||
1926 | } | ||
1927 | |||
1928 | bool LLAppViewer::initLogging() | ||
1929 | { | ||
1930 | // | ||
1931 | // Set up logging defaults for the viewer | ||
1932 | // | ||
1933 | LLError::initForApplication( | ||
1934 | gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); | ||
1935 | LLError::setFatalFunction(errorCallback); | ||
1936 | |||
1937 | // Remove the last ".old" log file. | ||
1938 | std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, | ||
1939 | "SecondLife.old"); | ||
1940 | LLFile::remove(old_log_file.c_str()); | ||
1941 | |||
1942 | // Rename current log file to ".old" | ||
1943 | std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, | ||
1944 | "SecondLife.log"); | ||
1945 | LLFile::rename(log_file.c_str(), old_log_file.c_str()); | ||
1946 | |||
1947 | // Set the log file to SecondLife.log | ||
1948 | |||
1949 | LLError::logToFile(log_file); | ||
1950 | |||
1951 | // *FIX:Mani no error handling here! | ||
1952 | return true; | ||
1953 | } | ||
1954 | |||
1955 | bool LLAppViewer::initConfiguration() | ||
1956 | { | ||
1957 | // Ye olde parse_args()... | ||
1958 | if(!doConfigFromCommandLine()) | ||
1959 | { | ||
1960 | return false; | ||
1961 | } | ||
1962 | |||
1963 | // XUI:translate | ||
1964 | gSecondLife = "Second Life"; | ||
1965 | |||
1966 | // Read skin/branding settings if specified. | ||
1967 | if (! gDirUtilp->getSkinDir().empty() ) | ||
1968 | { | ||
1969 | std::string skin_def_file = gDirUtilp->getExpandedFilename(LL_PATH_TOP_SKIN, "skin.xml"); | ||
1970 | LLXmlTree skin_def_tree; | ||
1971 | |||
1972 | if (!skin_def_tree.parseFile(skin_def_file)) | ||
1973 | { | ||
1974 | llerrs << "Failed to parse skin definition." << llendl; | ||
1975 | } | ||
1976 | |||
1977 | LLXmlTreeNode* rootp = skin_def_tree.getRoot(); | ||
1978 | LLXmlTreeNode* disabled_message_node = rootp->getChildByName("disabled_message"); | ||
1979 | if (disabled_message_node) | ||
1980 | { | ||
1981 | gDisabledMessage = disabled_message_node->getContents(); | ||
1982 | } | ||
1983 | |||
1984 | static LLStdStringHandle hide_links_string = LLXmlTree::addAttributeString("hide_links"); | ||
1985 | rootp->getFastAttributeBOOL(hide_links_string, gHideLinks); | ||
1986 | |||
1987 | // Legacy string. This flag really meant we didn't want to expose references to "Second Life". | ||
1988 | // Just set gHideLinks instead. | ||
1989 | static LLStdStringHandle silent_string = LLXmlTree::addAttributeString("silent_update"); | ||
1990 | BOOL silent_update; | ||
1991 | rootp->getFastAttributeBOOL(silent_string, silent_update); | ||
1992 | gHideLinks = (gHideLinks || silent_update); | ||
1993 | } | ||
1994 | |||
1995 | #if LL_DARWIN | ||
1996 | // Initialize apple menubar and various callbacks | ||
1997 | init_apple_menu(gSecondLife.c_str()); | ||
1998 | |||
1999 | #if __ppc__ | ||
2000 | // If the CPU doesn't have Altivec (i.e. it's not at least a G4), don't go any further. | ||
2001 | // Only test PowerPC - all Intel Macs have SSE. | ||
2002 | if(!gSysCPU.hasAltivec()) | ||
2003 | { | ||
2004 | std::ostringstream msg; | ||
2005 | msg << gSecondLife << " requires a processor with AltiVec (G4 or later)."; | ||
2006 | OSMessageBox( | ||
2007 | msg.str().c_str(), | ||
2008 | NULL, | ||
2009 | OSMB_OK); | ||
2010 | removeMarkerFile(); | ||
2011 | return false; | ||
2012 | } | ||
2013 | #endif | ||
2014 | |||
2015 | #endif // LL_DARWIN | ||
2016 | |||
2017 | // Display splash screen. Must be after above check for previous | ||
2018 | // crash as this dialog is always frontmost. | ||
2019 | std::ostringstream splash_msg; | ||
2020 | splash_msg << "Loading " << gSecondLife << "..."; | ||
2021 | LLSplashScreen::show(); | ||
2022 | LLSplashScreen::update(splash_msg.str().c_str()); | ||
2023 | |||
2024 | LLVolumeMgr::initClass(); | ||
2025 | |||
2026 | // Initialize the feature manager | ||
2027 | // The feature manager is responsible for determining what features | ||
2028 | // are turned on/off in the app. | ||
2029 | gFeatureManagerp = new LLFeatureManager; | ||
2030 | |||
2031 | gStartTime = totalTime(); | ||
2032 | |||
2033 | //////////////////////////////////////// | ||
2034 | // | ||
2035 | // Process ini files | ||
2036 | // | ||
2037 | |||
2038 | // declare all possible setting variables | ||
2039 | declare_settings(); | ||
2040 | |||
2041 | #if !LL_RELEASE_FOR_DOWNLOAD | ||
2042 | // only write the defaults for non-release builds! | ||
2043 | gSavedSettings.saveToFile(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings_default.xml").c_str(), FALSE); | ||
2044 | #endif | ||
2045 | |||
2046 | // | ||
2047 | // Set the name of the window | ||
2048 | // | ||
2049 | #if LL_RELEASE_FOR_DOWNLOAD | ||
2050 | gWindowTitle = gSecondLife; | ||
2051 | #elif LL_DEBUG | ||
2052 | gWindowTitle = gSecondLife + LLString(" [DEBUG] ") + gArgs; | ||
2053 | #else | ||
2054 | gWindowTitle = gSecondLife + LLString(" ") + gArgs; | ||
2055 | #endif | ||
2056 | LLString::truncate(gWindowTitle, 255); | ||
2057 | |||
2058 | if (!gMultipleViewersOK) | ||
2059 | { | ||
2060 | // | ||
2061 | // Check for another instance of the app running | ||
2062 | // | ||
2063 | //RN: if we received a URL, hand it off to the existing instance | ||
2064 | // don't call anotherInstanceRunning() when doing URL handoff, as | ||
2065 | // it relies on checking a marker file which will not work when running | ||
2066 | // out of different directories | ||
2067 | std::string slurl; | ||
2068 | if (!LLStartUp::sSLURLCommand.empty()) | ||
2069 | { | ||
2070 | slurl = LLStartUp::sSLURLCommand; | ||
2071 | } | ||
2072 | else if (LLURLSimString::parse()) | ||
2073 | { | ||
2074 | slurl = LLURLSimString::getURL(); | ||
2075 | } | ||
2076 | if (!slurl.empty()) | ||
2077 | { | ||
2078 | if (send_url_to_other_instance(slurl)) | ||
2079 | { | ||
2080 | // successfully handed off URL to existing instance, exit | ||
2081 | return false; | ||
2082 | } | ||
2083 | } | ||
2084 | |||
2085 | mSecondInstance = anotherInstanceRunning(); | ||
2086 | |||
2087 | if (mSecondInstance) | ||
2088 | { | ||
2089 | std::ostringstream msg; | ||
2090 | msg << | ||
2091 | gSecondLife << " is already running.\n" | ||
2092 | "\n" | ||
2093 | "Check your task bar for a minimized copy of the program.\n" | ||
2094 | "If this message persists, restart your computer.", | ||
2095 | OSMessageBox( | ||
2096 | msg.str().c_str(), | ||
2097 | NULL, | ||
2098 | OSMB_OK); | ||
2099 | return false; | ||
2100 | } | ||
2101 | |||
2102 | initMarkerFile(); | ||
2103 | |||
2104 | #if LL_SEND_CRASH_REPORTS | ||
2105 | if (gLastExecFroze) | ||
2106 | { | ||
2107 | llinfos << "Last execution froze, requesting to send crash report." << llendl; | ||
2108 | // | ||
2109 | // Pop up a freeze or crash warning dialog | ||
2110 | // | ||
2111 | std::ostringstream msg; | ||
2112 | msg << gSecondLife | ||
2113 | << " appears to have frozen or crashed on the previous run.\n" | ||
2114 | << "Would you like to send a crash report?"; | ||
2115 | std::string alert; | ||
2116 | alert = gSecondLife; | ||
2117 | alert += " Alert"; | ||
2118 | S32 choice = OSMessageBox(msg.str().c_str(), | ||
2119 | alert.c_str(), | ||
2120 | OSMB_YESNO); | ||
2121 | if (OSBTN_YES == choice) | ||
2122 | { | ||
2123 | llinfos << "Sending crash report." << llendl; | ||
2124 | |||
2125 | removeMarkerFile(); | ||
2126 | #if LL_WINDOWS | ||
2127 | std::string exe_path = gDirUtilp->getAppRODataDir(); | ||
2128 | exe_path += gDirUtilp->getDirDelimiter(); | ||
2129 | exe_path += "win_crash_logger.exe"; | ||
2130 | |||
2131 | std::string arg_string = "-previous -user "; | ||
2132 | arg_string += gGridName; | ||
2133 | arg_string += " -name \""; | ||
2134 | arg_string += gSecondLife; | ||
2135 | arg_string += "\""; | ||
2136 | // Spawn crash logger. | ||
2137 | // NEEDS to wait until completion, otherwise log files will get smashed. | ||
2138 | _spawnl(_P_WAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL); | ||
2139 | #elif LL_DARWIN | ||
2140 | std::string command_str; | ||
2141 | command_str = "crashreporter.app/Contents/MacOS/crashreporter "; | ||
2142 | command_str += "-previous -user "; | ||
2143 | command_str += gGridName; | ||
2144 | // XXX -- We need to exit fullscreen mode for this to work. | ||
2145 | // XXX -- system() also doesn't wait for completion. Hmm... | ||
2146 | system(command_str.c_str()); /* Flawfinder: Ignore */ | ||
2147 | #elif LL_LINUX || LL_SOLARIS | ||
2148 | std::string cmd =gDirUtilp->getAppRODataDir(); | ||
2149 | cmd += gDirUtilp->getDirDelimiter(); | ||
2150 | #if LL_LINUX | ||
2151 | cmd += "linux-crash-logger.bin"; | ||
2152 | #else // LL_SOLARIS | ||
2153 | cmd += "bin/solaris-crash-logger"; | ||
2154 | #endif | ||
2155 | char* const cmdargv[] = | ||
2156 | {(char*)cmd.c_str(), | ||
2157 | (char*)"-previous", | ||
2158 | (char*)"-user", | ||
2159 | (char*)gGridName, | ||
2160 | (char*)"-name", | ||
2161 | (char*)gSecondLife.c_str(), | ||
2162 | NULL}; | ||
2163 | pid_t pid = fork(); | ||
2164 | if (pid == 0) | ||
2165 | { // child | ||
2166 | execv(cmd.c_str(), cmdargv); /* Flawfinder: Ignore */ | ||
2167 | llwarns << "execv failure when trying to start " << cmd << llendl; | ||
2168 | _exit(1); // avoid atexit() | ||
2169 | } else { | ||
2170 | if (pid > 0) | ||
2171 | { | ||
2172 | // wait for child proc to die | ||
2173 | int childExitStatus; | ||
2174 | waitpid(pid, &childExitStatus, 0); | ||
2175 | } else { | ||
2176 | llwarns << "fork failure." << llendl; | ||
2177 | } | ||
2178 | } | ||
2179 | #endif | ||
2180 | } | ||
2181 | else | ||
2182 | { | ||
2183 | llinfos << "Not sending crash report." << llendl; | ||
2184 | } | ||
2185 | } | ||
2186 | #endif // #if LL_SEND_CRASH_REPORTS | ||
2187 | } | ||
2188 | else | ||
2189 | { | ||
2190 | mSecondInstance = anotherInstanceRunning(); | ||
2191 | |||
2192 | if (mSecondInstance) | ||
2193 | { | ||
2194 | gDisableVoice = TRUE; | ||
2195 | /* Don't start another instance if using -multiple | ||
2196 | //RN: if we received a URL, hand it off to the existing instance | ||
2197 | if (LLURLSimString::parse()) | ||
2198 | { | ||
2199 | LLURLSimString::send_to_other_instance(); | ||
2200 | return 1; | ||
2201 | } | ||
2202 | */ | ||
2203 | } | ||
2204 | |||
2205 | initMarkerFile(); | ||
2206 | } | ||
2207 | |||
2208 | return true; // Config was successful. | ||
2209 | } | ||
2210 | |||
2211 | bool LLAppViewer::doConfigFromCommandLine() | ||
2212 | { | ||
2213 | // *FIX: This is what parse args used to do, minus the arg reading part. | ||
2214 | // Now the arg parsing is handled by LLApp::parseCommandOptions() and this | ||
2215 | // method need only interpret settings. Perhaps some day interested parties | ||
2216 | // can ask an app about a setting rather than have the app set | ||
2217 | // a gazzillion globals. | ||
2218 | |||
2219 | ///////////////////////////////////////// | ||
2220 | // | ||
2221 | // Process command line arguments | ||
2222 | // | ||
2223 | S32 args_result = 0; | ||
2224 | |||
2225 | #if LL_DARWIN | ||
2226 | { | ||
2227 | // On the Mac, read in arguments.txt (if it exists) and process it for additional arguments. | ||
2228 | LLString args; | ||
2229 | if(_read_file_into_string(args, "arguments.txt")) /* Flawfinder: ignore*/ | ||
2230 | { | ||
2231 | // The arguments file exists. | ||
2232 | // It should consist of command line arguments separated by newlines. | ||
2233 | // Split it into individual arguments and build a fake argv[] to pass to parse_args. | ||
2234 | std::vector<std::string> arglist; | ||
2235 | |||
2236 | arglist.push_back("newview"); | ||
2237 | |||
2238 | llinfos << "Reading additional command line arguments from arguments.txt..." << llendl; | ||
2239 | |||
2240 | typedef boost::tokenizer<boost::escaped_list_separator<char> > tokenizer; | ||
2241 | boost::escaped_list_separator<char> sep("\\", "\r\n ", "\"'"); | ||
2242 | tokenizer tokens(args, sep); | ||
2243 | tokenizer::iterator token_iter; | ||
2244 | |||
2245 | for(token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter) | ||
2246 | { | ||
2247 | llinfos << "argument: '" << (token_iter->c_str()) << "'" << llendl; | ||
2248 | |||
2249 | arglist.push_back(*token_iter); | ||
2250 | } | ||
2251 | |||
2252 | char **fakeargv = new char*[arglist.size()]; | ||
2253 | int i; | ||
2254 | for(i=0; i < arglist.size(); i++) | ||
2255 | fakeargv[i] = const_cast<char*>(arglist[i].c_str()); | ||
2256 | |||
2257 | args_result = parse_args(arglist.size(), fakeargv); | ||
2258 | delete[] fakeargv; | ||
2259 | } | ||
2260 | |||
2261 | // Get the user's preferred language string based on the Mac OS localization mechanism. | ||
2262 | // To add a new localization: | ||
2263 | // go to the "Resources" section of the project | ||
2264 | // get info on "language.txt" | ||
2265 | // in the "General" tab, click the "Add Localization" button | ||
2266 | // create a new localization for the language you're adding | ||
2267 | // set the contents of the new localization of the file to the string corresponding to our localization | ||
2268 | // (i.e. "en-us", "ja", etc. Use the existing ones as a guide.) | ||
2269 | CFURLRef url = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("language"), CFSTR("txt"), NULL); | ||
2270 | char path[MAX_PATH]; | ||
2271 | if(CFURLGetFileSystemRepresentation(url, false, (UInt8 *)path, sizeof(path))) | ||
2272 | { | ||
2273 | LLString lang; | ||
2274 | if(_read_file_into_string(lang, path)) /* Flawfinder: ignore*/ | ||
2275 | { | ||
2276 | gCommandLineForcedSettings["SystemLanguage"] = lang; | ||
2277 | } | ||
2278 | } | ||
2279 | CFRelease(url); | ||
2280 | } | ||
2281 | #endif | ||
2282 | |||
2283 | int argc = gTempArgC; | ||
2284 | char** argv = gTempArgV; | ||
2285 | |||
2286 | // | ||
2287 | // Parse the command line arguments | ||
2288 | // | ||
2289 | args_result |= parse_args(argc, argv); | ||
2290 | if (args_result) | ||
2291 | { | ||
2292 | removeMarkerFile(); | ||
2293 | return false; | ||
2294 | } | ||
2295 | |||
2296 | if (!strcmp(gGridName, gGridInfo[GRID_INFO_AGNI].mName)) | ||
2297 | { | ||
2298 | gInProductionGrid = TRUE; | ||
2299 | } | ||
2300 | |||
2301 | return true; | ||
2302 | } | ||
2303 | |||
2304 | bool LLAppViewer::initWindow() | ||
2305 | { | ||
2306 | llinfos << "Initializing window..." << llendl; | ||
2307 | |||
2308 | // store setting in a global for easy access and modification | ||
2309 | gNoRender = gSavedSettings.getBOOL("DisableRendering"); | ||
2310 | |||
2311 | // Hide the splash screen | ||
2312 | LLSplashScreen::hide(); | ||
2313 | |||
2314 | // HACK: Need a non-const char * for stupid window name (propagated deep down) | ||
2315 | char window_title_str[256]; /* Flawfinder: ignore */ | ||
2316 | strncpy(window_title_str, gWindowTitle.c_str(), sizeof(window_title_str) - 1); /* Flawfinder: ignore */ | ||
2317 | window_title_str[sizeof(window_title_str) - 1] = '\0'; | ||
2318 | |||
2319 | // always start windowed | ||
2320 | gViewerWindow = new LLViewerWindow(window_title_str, "Second Life", | ||
2321 | gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"), | ||
2322 | gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"), | ||
2323 | FALSE, gIgnorePixelDepth); | ||
2324 | |||
2325 | if (gSavedSettings.getBOOL("FullScreen")) | ||
2326 | { | ||
2327 | gViewerWindow->toggleFullscreen(FALSE); | ||
2328 | // request to go full screen... which will be delayed until login | ||
2329 | } | ||
2330 | |||
2331 | if (gSavedSettings.getBOOL("WindowMaximized")) | ||
2332 | { | ||
2333 | gViewerWindow->mWindow->maximize(); | ||
2334 | gViewerWindow->getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio")); | ||
2335 | } | ||
2336 | |||
2337 | LLUI::sWindow = gViewerWindow->getWindow(); | ||
2338 | |||
2339 | LLAlertDialog::parseAlerts("alerts.xml"); | ||
2340 | LLNotifyBox::parseNotify("notify.xml"); | ||
2341 | |||
2342 | LLMediaEngine::initClass(); | ||
2343 | |||
2344 | // | ||
2345 | // Clean up the feature manager lookup table - settings were updated | ||
2346 | // in the LLViewerWindow constructor | ||
2347 | // | ||
2348 | gFeatureManagerp->cleanupFeatureTables(); | ||
2349 | |||
2350 | // Show watch cursor | ||
2351 | gViewerWindow->setCursor(UI_CURSOR_WAIT); | ||
2352 | |||
2353 | // Finish view initialization | ||
2354 | gViewerWindow->initBase(); | ||
2355 | |||
2356 | // show viewer window | ||
2357 | gViewerWindow->mWindow->show(); | ||
2358 | |||
2359 | return true; | ||
2360 | } | ||
2361 | |||
2362 | void LLAppViewer::closeDebug() | ||
2363 | { | ||
2364 | std::string debug_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log"); | ||
2365 | llinfos << "Opening debug file " << debug_filename << llendl; | ||
2366 | std::ofstream out_file(debug_filename.c_str()); | ||
2367 | LLSDSerialize::toPrettyXML(gDebugInfo, out_file); | ||
2368 | out_file.close(); | ||
2369 | } | ||
2370 | |||
2371 | void LLAppViewer::cleanupSavedSettings() | ||
2372 | { | ||
2373 | gSavedSettings.setBOOL("MouseSun", FALSE); | ||
2374 | |||
2375 | gSavedSettings.setBOOL("FlyBtnState", FALSE); | ||
2376 | |||
2377 | gSavedSettings.setBOOL("FirstPersonBtnState", FALSE); | ||
2378 | gSavedSettings.setBOOL("ThirdPersonBtnState", TRUE); | ||
2379 | gSavedSettings.setBOOL("BuildBtnState", FALSE); | ||
2380 | |||
2381 | gSavedSettings.setBOOL("UseEnergy", TRUE); // force toggle to turn off, since sends message to simulator | ||
2382 | |||
2383 | gSavedSettings.setBOOL("DebugWindowProc", gDebugWindowProc); | ||
2384 | |||
2385 | gSavedSettings.setBOOL("AllowIdleAFK", gAllowIdleAFK); | ||
2386 | gSavedSettings.setBOOL("ShowObjectUpdates", gShowObjectUpdates); | ||
2387 | |||
2388 | if (!gNoRender) | ||
2389 | { | ||
2390 | if (gDebugView) | ||
2391 | { | ||
2392 | gSavedSettings.setBOOL("ShowDebugConsole", gDebugView->mDebugConsolep->getVisible()); | ||
2393 | gSavedSettings.setBOOL("ShowDebugStats", gDebugView->mStatViewp->getVisible()); | ||
2394 | } | ||
2395 | } | ||
2396 | |||
2397 | // save window position if not fullscreen | ||
2398 | // as we don't track it in callbacks | ||
2399 | BOOL fullscreen = gViewerWindow->mWindow->getFullscreen(); | ||
2400 | BOOL maximized = gViewerWindow->mWindow->getMaximized(); | ||
2401 | if (!fullscreen && !maximized) | ||
2402 | { | ||
2403 | LLCoordScreen window_pos; | ||
2404 | |||
2405 | if (gViewerWindow->mWindow->getPosition(&window_pos)) | ||
2406 | { | ||
2407 | gSavedSettings.setS32("WindowX", window_pos.mX); | ||
2408 | gSavedSettings.setS32("WindowY", window_pos.mY); | ||
2409 | } | ||
2410 | } | ||
2411 | |||
2412 | gSavedSettings.setF32("MapScale", gMapScale ); | ||
2413 | gSavedSettings.setF32("MiniMapScale", gMiniMapScale ); | ||
2414 | gSavedSettings.setBOOL("AsyncKeyboard", gHandleKeysAsync); | ||
2415 | gSavedSettings.setBOOL("ShowHoverTips", LLHoverView::sShowHoverTips); | ||
2416 | |||
2417 | // Some things are cached in LLAgent. | ||
2418 | if (gAgent.mInitialized) | ||
2419 | { | ||
2420 | gSavedSettings.setF32("RenderFarClip", gAgent.mDrawDistance); | ||
2421 | } | ||
2422 | |||
2423 | // *REMOVE: This is now done via LLAppViewer::setCrashBehavior() | ||
2424 | // Left vestigially in case I borked it. | ||
2425 | // gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, gCrashBehavior); | ||
2426 | } | ||
2427 | |||
2428 | void LLAppViewer::removeCacheFiles(const char* file_mask) | ||
2429 | { | ||
2430 | char mask[LL_MAX_PATH]; /* Flawfinder: ignore */ | ||
2431 | snprintf(mask, LL_MAX_PATH, "%s%s", gDirUtilp->getDirDelimiter().c_str(), file_mask); /* Flawfinder: ignore */ | ||
2432 | gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "").c_str(), mask); | ||
2433 | } | ||
2434 | |||
2435 | void LLAppViewer::writeSystemInfo() | ||
2436 | { | ||
2437 | gDebugInfo["SLLog"] = LLError::logFileName(); | ||
2438 | |||
2439 | gDebugInfo["ClientInfo"]["Name"] = gSecondLife; | ||
2440 | gDebugInfo["ClientInfo"]["MajorVersion"] = LL_VERSION_MAJOR; | ||
2441 | gDebugInfo["ClientInfo"]["MinorVersion"] = LL_VERSION_MINOR; | ||
2442 | gDebugInfo["ClientInfo"]["PatchVersion"] = LL_VERSION_PATCH; | ||
2443 | gDebugInfo["ClientInfo"]["BuildVersion"] = LL_VERSION_BUILD; | ||
2444 | |||
2445 | gDebugInfo["CPUInfo"]["CPUFamily"] = gSysCPU.getFamily(); | ||
2446 | gDebugInfo["CPUInfo"]["CPUMhz"] = gSysCPU.getMhz(); | ||
2447 | gDebugInfo["CPUInfo"]["CPUAltivec"] = gSysCPU.hasAltivec(); | ||
2448 | gDebugInfo["CPUInfo"]["CPUSSE"] = gSysCPU.hasSSE(); | ||
2449 | gDebugInfo["CPUInfo"]["CPUSSE2"] = gSysCPU.hasSSE2(); | ||
2450 | |||
2451 | gDebugInfo["RAMInfo"] = llformat("%u", gSysMemory.getPhysicalMemoryKB()); | ||
2452 | gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple(); | ||
2453 | |||
2454 | // Dump some debugging info | ||
2455 | llinfos << gSecondLife | ||
2456 | << " version " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH | ||
2457 | << llendl; | ||
2458 | |||
2459 | // Dump the local time and time zone | ||
2460 | time_t now; | ||
2461 | time(&now); | ||
2462 | char tbuffer[256]; /* Flawfinder: ignore */ | ||
2463 | strftime(tbuffer, 256, "%Y-%m-%dT%H:%M:%S %Z", localtime(&now)); | ||
2464 | llinfos << "Local time: " << tbuffer << llendl; | ||
2465 | |||
2466 | // query some system information | ||
2467 | llinfos << "CPU info:\n" << gSysCPU << llendl; | ||
2468 | llinfos << "Memory info:\n" << gSysMemory << llendl; | ||
2469 | llinfos << "OS: " << getOSInfo().getOSStringSimple() << llendl; | ||
2470 | llinfos << "OS info: " << getOSInfo() << llendl; | ||
2471 | } | ||
2472 | |||
2473 | void LLAppViewer::handleViewerCrash() | ||
2474 | { | ||
2475 | LLAppViewer* pApp = LLAppViewer::instance(); | ||
2476 | if (pApp->beingDebugged()) | ||
2477 | { | ||
2478 | // This will drop us into the debugger. | ||
2479 | abort(); | ||
2480 | } | ||
2481 | |||
2482 | // Returns whether a dialog was shown. | ||
2483 | // Only do the logic in here once | ||
2484 | if (pApp->mReportedCrash) | ||
2485 | { | ||
2486 | return; | ||
2487 | } | ||
2488 | pApp->mReportedCrash = TRUE; | ||
2489 | |||
2490 | gDebugInfo["SettingsFilename"] = gSettingsFileName; | ||
2491 | gDebugInfo["CAFilename"] = gDirUtilp->getCAFile(); | ||
2492 | gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName().c_str(); | ||
2493 | gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath().c_str(); | ||
2494 | gDebugInfo["CurrentSimHost"] = gAgent.getRegionHost().getHostName(); | ||
2495 | |||
2496 | if (gMessageSystem && gDirUtilp) | ||
2497 | { | ||
2498 | std::string filename; | ||
2499 | filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "stats.log"); | ||
2500 | llofstream file(filename.c_str(), llofstream::binary); | ||
2501 | if(file.good()) | ||
2502 | { | ||
2503 | gMessageSystem->summarizeLogs(file); | ||
2504 | file.close(); | ||
2505 | } | ||
2506 | } | ||
2507 | |||
2508 | if (gMessageSystem) | ||
2509 | { | ||
2510 | gMessageSystem->getCircuitInfo(gDebugInfo["CircuitInfo"]); | ||
2511 | gMessageSystem->stopLogging(); | ||
2512 | } | ||
2513 | if (gWorldp) | ||
2514 | { | ||
2515 | gWorldp->getInfo(gDebugInfo); | ||
2516 | } | ||
2517 | |||
2518 | // Close the debug file | ||
2519 | pApp->closeDebug(); | ||
2520 | LLError::logToFile(""); | ||
2521 | |||
2522 | // Call to pure virtual, handled by platform specifc llappviewer instance. | ||
2523 | pApp->handleCrashReporting(); | ||
2524 | |||
2525 | return; | ||
2526 | } | ||
2527 | |||
2528 | void LLAppViewer::setCrashBehavior(S32 cb) | ||
2529 | { | ||
2530 | mCrashBehavior = cb; | ||
2531 | gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, mCrashBehavior); | ||
2532 | } | ||
2533 | |||
2534 | bool LLAppViewer::anotherInstanceRunning() | ||
2535 | { | ||
2536 | // We create a marker file when the program starts and remove the file when it finishes. | ||
2537 | // If the file is currently locked, that means another process is already running. | ||
2538 | |||
2539 | std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker"); | ||
2540 | llinfos << "Checking marker file for lock..." << llendl; | ||
2541 | |||
2542 | // If file doesn't exist, we create it | ||
2543 | // If file does exist, try to get writing privilages | ||
2544 | FILE* fMarker = LLFile::fopen(marker_file.c_str(), "rb"); // Flawfinder: ignore | ||
2545 | if (fMarker != NULL) | ||
2546 | { | ||
2547 | // File exists, try opening with write permissions | ||
2548 | fclose(fMarker); | ||
2549 | fMarker = LLFile::fopen(marker_file.c_str(), "wb"); // Flawfinder: ignore | ||
2550 | if (fMarker == NULL) | ||
2551 | { | ||
2552 | llinfos << "Marker file is locked." << llendl; | ||
2553 | return TRUE; | ||
2554 | } | ||
2555 | |||
2556 | // *FIX:Mani - rather than have this exception here, | ||
2557 | // LLFile::fopen() have consistent behavior across platforms? | ||
2558 | #if LL_DARWIN | ||
2559 | // Try to lock it. On Mac, this is the only way to test if it's actually locked. | ||
2560 | if (flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1) | ||
2561 | { | ||
2562 | // Lock failed - somebody else has it. | ||
2563 | fclose(fMarker); | ||
2564 | llinfos << "Marker file is locked." << llendl; | ||
2565 | return TRUE; | ||
2566 | } | ||
2567 | #endif | ||
2568 | fclose(fMarker); | ||
2569 | } | ||
2570 | llinfos << "Marker file isn't locked." << llendl; | ||
2571 | return FALSE; | ||
2572 | |||
2573 | } | ||
2574 | |||
2575 | void LLAppViewer::initMarkerFile() | ||
2576 | { | ||
2577 | // *FIX:Mani - an actually cross platform LLFile lib would be nice. | ||
2578 | |||
2579 | #if LL_SOLARIS | ||
2580 | struct flock fl; | ||
2581 | fl.l_whence = SEEK_SET; | ||
2582 | fl.l_start = 0; | ||
2583 | fl.l_len = 1; | ||
2584 | #endif | ||
2585 | // We create a marker file when the program starts and remove the file when it finishes. | ||
2586 | // If the file is currently locked, that means another process is already running. | ||
2587 | // If the file exists and isn't locked, we crashed on the last run. | ||
2588 | |||
2589 | std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker"); | ||
2590 | llinfos << "Checking marker file for lock..." << llendl; | ||
2591 | |||
2592 | FILE* fMarker = LLFile::fopen(marker_file.c_str(), "rb"); // Flawfinder: ignore | ||
2593 | if (fMarker != NULL) | ||
2594 | { | ||
2595 | // File exists, try opening with write permissions | ||
2596 | fclose(fMarker); | ||
2597 | fMarker = LLFile::fopen(marker_file.c_str(), "wb"); // Flawfinder: ignxore | ||
2598 | if (fMarker == NULL) | ||
2599 | { | ||
2600 | // Another instance is running. Skip the rest of these operations. | ||
2601 | llinfos << "Marker file is locked." << llendl; | ||
2602 | return; | ||
2603 | } | ||
2604 | #if LL_DARWIN | ||
2605 | // Try to lock it. On Mac, this is the only way to test if it's actually locked. | ||
2606 | if (flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1) | ||
2607 | { | ||
2608 | // Lock failed - somebody else has it. | ||
2609 | fclose(fMarker); | ||
2610 | llinfos << "Marker file is locked." << llendl; | ||
2611 | return; | ||
2612 | } | ||
2613 | #endif | ||
2614 | |||
2615 | // No other instances; we'll lock this file now & delete on quit. | ||
2616 | fclose(fMarker); | ||
2617 | gLastExecFroze = TRUE; | ||
2618 | llinfos << "Exec marker found: program froze on previous execution" << llendl; | ||
2619 | } | ||
2620 | |||
2621 | // Create the marker file for this execution & lock it | ||
2622 | // FILE *fp_executing_marker; | ||
2623 | #if LL_WINDOWS | ||
2624 | mMarkerFile = LLFile::_fsopen(marker_file.c_str(), "w", _SH_DENYWR); | ||
2625 | #else | ||
2626 | mMarkerFile = LLFile::fopen(marker_file.c_str(), "w"); // Flawfinder: ignore | ||
2627 | if (mMarkerFile) | ||
2628 | { | ||
2629 | int fd = fileno(mMarkerFile); | ||
2630 | // Attempt to lock | ||
2631 | #if LL_SOLARIS | ||
2632 | fl.l_type = F_WRLCK; | ||
2633 | if (fcntl(fd, F_SETLK, &fl) == -1) | ||
2634 | #else | ||
2635 | if (flock(fd, LOCK_EX | LOCK_NB) == -1) | ||
2636 | #endif | ||
2637 | { | ||
2638 | llinfos << "Failed to lock file." << llendl; | ||
2639 | } | ||
2640 | } | ||
2641 | #endif | ||
2642 | if (mMarkerFile) | ||
2643 | { | ||
2644 | llinfos << "Marker file created." << llendl; | ||
2645 | } | ||
2646 | else | ||
2647 | { | ||
2648 | llinfos << "Failed to create marker file." << llendl; | ||
2649 | } | ||
2650 | |||
2651 | #if LL_WINDOWS | ||
2652 | // Clean up SecondLife.dmp files, to avoid confusion | ||
2653 | llinfos << "Removing SecondLife.dmp" << llendl; | ||
2654 | std::string dmp_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.dmp"); | ||
2655 | LLFile::remove(dmp_filename.c_str()); | ||
2656 | #endif | ||
2657 | |||
2658 | // This is to keep the crash reporter from constantly sending stale message logs | ||
2659 | // We wipe the message file now. | ||
2660 | llinfos << "Removing message.log" << llendl; | ||
2661 | std::string message_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "message.log"); | ||
2662 | LLFile::remove(message_filename.c_str()); | ||
2663 | |||
2664 | llinfos << "Exiting initMarkerFile()." << llendl; | ||
2665 | } | ||
2666 | |||
2667 | void LLAppViewer::removeMarkerFile() | ||
2668 | { | ||
2669 | llinfos << "removeMarkerFile()" << llendl; | ||
2670 | if (mMarkerFile != NULL) | ||
2671 | { | ||
2672 | fclose(mMarkerFile); | ||
2673 | mMarkerFile = NULL; | ||
2674 | } | ||
2675 | if( gDirUtilp ) | ||
2676 | { | ||
2677 | LLString marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker"); | ||
2678 | ll_apr_file_remove( marker_file ); | ||
2679 | } | ||
2680 | } | ||
2681 | |||
2682 | void LLAppViewer::forceQuit() | ||
2683 | { | ||
2684 | LLApp::setQuitting(); | ||
2685 | } | ||
2686 | |||
2687 | void LLAppViewer::requestQuit() | ||
2688 | { | ||
2689 | llinfos << "requestQuit" << llendl; | ||
2690 | |||
2691 | LLViewerRegion* region = gAgent.getRegion(); | ||
2692 | |||
2693 | if( (LLStartUp::getStartupState() < STATE_STARTED) || !region ) | ||
2694 | { | ||
2695 | // Quit immediately | ||
2696 | forceQuit(); | ||
2697 | return; | ||
2698 | } | ||
2699 | |||
2700 | if (gHUDManager) | ||
2701 | { | ||
2702 | LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral*)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); | ||
2703 | effectp->setPositionGlobal(gAgent.getPositionGlobal()); | ||
2704 | effectp->setColor(LLColor4U(gAgent.getEffectColor())); | ||
2705 | gHUDManager->sendEffects(); | ||
2706 | } | ||
2707 | |||
2708 | // Attempt to close all floaters that might be | ||
2709 | // editing things. | ||
2710 | if (gFloaterView) | ||
2711 | { | ||
2712 | // application is quitting | ||
2713 | gFloaterView->closeAllChildren(true); | ||
2714 | } | ||
2715 | |||
2716 | send_stats(); | ||
2717 | |||
2718 | gLogoutTimer.reset(); | ||
2719 | mQuitRequested = true; | ||
2720 | } | ||
2721 | |||
2722 | static void finish_quit(S32 option, void *userdata) | ||
2723 | { | ||
2724 | if (option == 0) | ||
2725 | { | ||
2726 | LLAppViewer::instance()->requestQuit(); | ||
2727 | } | ||
2728 | } | ||
2729 | |||
2730 | void LLAppViewer::userQuit() | ||
2731 | { | ||
2732 | gViewerWindow->alertXml("ConfirmQuit", finish_quit, NULL); | ||
2733 | } | ||
2734 | |||
2735 | static void finish_early_exit(S32 option, void* userdata) | ||
2736 | { | ||
2737 | LLAppViewer::instance()->forceQuit(); | ||
2738 | } | ||
2739 | |||
2740 | void LLAppViewer::earlyExit(const LLString& msg) | ||
2741 | { | ||
2742 | llwarns << "app_early_exit: " << msg << llendl; | ||
2743 | gDoDisconnect = TRUE; | ||
2744 | // LLStringBase<char>::format_map_t args; | ||
2745 | // args["[MESSAGE]"] = mesg; | ||
2746 | // gViewerWindow->alertXml("AppEarlyExit", args, finish_early_exit); | ||
2747 | LLAlertDialog::showCritical(msg, finish_early_exit, NULL); | ||
2748 | } | ||
2749 | |||
2750 | void LLAppViewer::forceExit(S32 arg) | ||
2751 | { | ||
2752 | removeMarkerFile(); | ||
2753 | |||
2754 | // *FIX:Mani - This kind of exit hardly seems appropriate. | ||
2755 | exit(arg); | ||
2756 | } | ||
2757 | |||
2758 | void LLAppViewer::abortQuit() | ||
2759 | { | ||
2760 | llinfos << "abortQuit()" << llendl; | ||
2761 | mQuitRequested = false; | ||
2762 | } | ||
2763 | |||
2764 | bool LLAppViewer::initCache() | ||
2765 | { | ||
2766 | mPurgeCache = false; | ||
2767 | // Purge cache if user requested it | ||
2768 | if (gSavedSettings.getBOOL("PurgeCacheOnStartup") || | ||
2769 | gSavedSettings.getBOOL("PurgeCacheOnNextStartup")) | ||
2770 | { | ||
2771 | gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false); | ||
2772 | mPurgeCache = true; | ||
2773 | } | ||
2774 | // Purge cache if it belongs to an old version | ||
2775 | else | ||
2776 | { | ||
2777 | static const S32 cache_version = 5; | ||
2778 | if (gSavedSettings.getS32("LocalCacheVersion") != cache_version) | ||
2779 | { | ||
2780 | mPurgeCache = true; | ||
2781 | gSavedSettings.setS32("LocalCacheVersion", cache_version); | ||
2782 | } | ||
2783 | } | ||
2784 | |||
2785 | // Setup and verify the cache location | ||
2786 | LLString cache_location = gSavedSettings.getString("CacheLocation"); | ||
2787 | LLString new_cache_location = gSavedSettings.getString("NewCacheLocation"); | ||
2788 | if (new_cache_location != cache_location) | ||
2789 | { | ||
2790 | gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation")); | ||
2791 | purgeCache(); // purge old cache | ||
2792 | gSavedSettings.setString("CacheLocation", new_cache_location); | ||
2793 | } | ||
2794 | |||
2795 | if (!gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation"))) | ||
2796 | { | ||
2797 | llwarns << "Unable to set cache location" << llendl; | ||
2798 | gSavedSettings.setString("CacheLocation", ""); | ||
2799 | } | ||
2800 | |||
2801 | if (mPurgeCache) | ||
2802 | { | ||
2803 | LLSplashScreen::update("Clearing cache..."); | ||
2804 | purgeCache(); | ||
2805 | } | ||
2806 | |||
2807 | LLSplashScreen::update("Initializing Texture Cache..."); | ||
2808 | |||
2809 | // Init the texture cache | ||
2810 | // Allocate 80% of the cache size for textures | ||
2811 | BOOL read_only = mSecondInstance ? true : false; | ||
2812 | const S32 MB = 1024*1024; | ||
2813 | S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB; | ||
2814 | const S64 MAX_CACHE_SIZE = 1024*MB; | ||
2815 | cache_size = llmin(cache_size, MAX_CACHE_SIZE); | ||
2816 | S64 texture_cache_size = ((cache_size * 8)/10); | ||
2817 | S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, read_only); | ||
2818 | texture_cache_size -= extra; | ||
2819 | |||
2820 | LLSplashScreen::update("Initializing VFS..."); | ||
2821 | |||
2822 | // Init the VFS | ||
2823 | S64 vfs_size = cache_size - texture_cache_size; | ||
2824 | const S64 MAX_VFS_SIZE = 1024 * MB; // 1 GB | ||
2825 | vfs_size = llmin(vfs_size, MAX_VFS_SIZE); | ||
2826 | vfs_size = (vfs_size / MB) * MB; // make sure it is MB aligned | ||
2827 | U32 vfs_size_u32 = (U32)vfs_size; | ||
2828 | U32 old_vfs_size = gSavedSettings.getU32("VFSOldSize") * MB; | ||
2829 | bool resize_vfs = (vfs_size_u32 != old_vfs_size); | ||
2830 | if (resize_vfs) | ||
2831 | { | ||
2832 | gSavedSettings.setU32("VFSOldSize", vfs_size_u32/MB); | ||
2833 | } | ||
2834 | llinfos << "VFS CACHE SIZE: " << vfs_size/(1024*1024) << " MB" << llendl; | ||
2835 | |||
2836 | // This has to happen BEFORE starting the vfs | ||
2837 | //time_t ltime; | ||
2838 | srand(time(NULL)); // Flawfinder: ignore | ||
2839 | U32 old_salt = gSavedSettings.getU32("VFSSalt"); | ||
2840 | U32 new_salt; | ||
2841 | char old_vfs_data_file[LL_MAX_PATH]; // Flawfinder: ignore | ||
2842 | char old_vfs_index_file[LL_MAX_PATH]; // Flawfinder: ignore | ||
2843 | char new_vfs_data_file[LL_MAX_PATH]; // Flawfinder: ignore | ||
2844 | char new_vfs_index_file[LL_MAX_PATH]; // Flawfinder: ignore | ||
2845 | char static_vfs_index_file[LL_MAX_PATH]; // Flawfinder: ignore | ||
2846 | char static_vfs_data_file[LL_MAX_PATH]; // Flawfinder: ignore | ||
2847 | |||
2848 | if (gMultipleViewersOK) | ||
2849 | { | ||
2850 | // don't mess with renaming the VFS in this case | ||
2851 | new_salt = old_salt; | ||
2852 | } | ||
2853 | else | ||
2854 | { | ||
2855 | do | ||
2856 | { | ||
2857 | new_salt = rand(); | ||
2858 | } while( new_salt == old_salt ); | ||
2859 | } | ||
2860 | |||
2861 | snprintf(old_vfs_data_file, LL_MAX_PATH, "%s%u", // Flawfinder: ignore | ||
2862 | gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE).c_str(), | ||
2863 | old_salt); | ||
2864 | |||
2865 | // make sure this file exists | ||
2866 | llstat s; | ||
2867 | S32 stat_result = LLFile::stat(old_vfs_data_file, &s); | ||
2868 | if (stat_result) | ||
2869 | { | ||
2870 | // doesn't exist, look for a data file | ||
2871 | std::string mask; | ||
2872 | mask = gDirUtilp->getDirDelimiter(); | ||
2873 | mask += VFS_DATA_FILE_BASE; | ||
2874 | mask += "*"; | ||
2875 | |||
2876 | std::string dir; | ||
2877 | dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""); | ||
2878 | |||
2879 | std::string found_file; | ||
2880 | if (gDirUtilp->getNextFileInDir(dir, mask, found_file, false)) | ||
2881 | { | ||
2882 | snprintf(old_vfs_data_file, LL_MAX_PATH, "%s%s%s", dir.c_str(), gDirUtilp->getDirDelimiter().c_str(), found_file.c_str()); // Flawfinder: ignore | ||
2883 | |||
2884 | S32 start_pos; | ||
2885 | S32 length = strlen(found_file.c_str()); /* Flawfinder: ignore*/ | ||
2886 | for (start_pos = length - 1; start_pos >= 0; start_pos--) | ||
2887 | { | ||
2888 | if (found_file[start_pos] == '.') | ||
2889 | { | ||
2890 | start_pos++; | ||
2891 | break; | ||
2892 | } | ||
2893 | } | ||
2894 | if (start_pos > 0) | ||
2895 | { | ||
2896 | sscanf(found_file.c_str() + start_pos, "%d", &old_salt); | ||
2897 | } | ||
2898 | llinfos << "Default vfs data file not present, found " << old_vfs_data_file << llendl; | ||
2899 | llinfos << "Old salt: " << old_salt << llendl; | ||
2900 | } | ||
2901 | } | ||
2902 | |||
2903 | snprintf(old_vfs_index_file, LL_MAX_PATH, "%s%u", // Flawfinder: ignore | ||
2904 | gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_INDEX_FILE_BASE).c_str(), | ||
2905 | old_salt); | ||
2906 | |||
2907 | stat_result = LLFile::stat(old_vfs_index_file, &s); | ||
2908 | if (stat_result) | ||
2909 | { | ||
2910 | // We've got a bad/missing index file, nukem! | ||
2911 | llwarns << "Bad or missing vfx index file " << old_vfs_index_file << llendl; | ||
2912 | llwarns << "Removing old vfs data file " << old_vfs_data_file << llendl; | ||
2913 | LLFile::remove(old_vfs_data_file); | ||
2914 | LLFile::remove(old_vfs_index_file); | ||
2915 | |||
2916 | // Just in case, nuke any other old cache files in the directory. | ||
2917 | std::string dir; | ||
2918 | dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""); | ||
2919 | |||
2920 | std::string mask; | ||
2921 | mask = gDirUtilp->getDirDelimiter(); | ||
2922 | mask += VFS_DATA_FILE_BASE; | ||
2923 | mask += "*"; | ||
2924 | |||
2925 | gDirUtilp->deleteFilesInDir(dir, mask); | ||
2926 | |||
2927 | mask = gDirUtilp->getDirDelimiter(); | ||
2928 | mask += VFS_INDEX_FILE_BASE; | ||
2929 | mask += "*"; | ||
2930 | |||
2931 | gDirUtilp->deleteFilesInDir(dir, mask); | ||
2932 | } | ||
2933 | |||
2934 | snprintf(new_vfs_data_file, LL_MAX_PATH, "%s%u", // Flawfinder: ignore | ||
2935 | gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE).c_str(), | ||
2936 | new_salt); | ||
2937 | |||
2938 | snprintf(new_vfs_index_file, LL_MAX_PATH, "%s%u", gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_INDEX_FILE_BASE).c_str(), // Flawfinder: ignore | ||
2939 | new_salt); | ||
2940 | |||
2941 | |||
2942 | strncpy(static_vfs_data_file, gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_data.db2").c_str(), LL_MAX_PATH -1); // Flawfinder: ignore | ||
2943 | static_vfs_data_file[LL_MAX_PATH -1] = '\0'; | ||
2944 | strncpy(static_vfs_index_file, gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_index.db2").c_str(), LL_MAX_PATH -1); // Flawfinder: ignore | ||
2945 | static_vfs_index_file[LL_MAX_PATH -1] = '\0'; | ||
2946 | |||
2947 | if (resize_vfs) | ||
2948 | { | ||
2949 | llinfos << "Removing old vfs and re-sizing" << llendl; | ||
2950 | |||
2951 | LLFile::remove(old_vfs_data_file); | ||
2952 | LLFile::remove(old_vfs_index_file); | ||
2953 | } | ||
2954 | else if (old_salt != new_salt) | ||
2955 | { | ||
2956 | // move the vfs files to a new name before opening | ||
2957 | llinfos << "Renaming " << old_vfs_data_file << " to " << new_vfs_data_file << llendl; | ||
2958 | llinfos << "Renaming " << old_vfs_index_file << " to " << new_vfs_index_file << llendl; | ||
2959 | LLFile::rename(old_vfs_data_file, new_vfs_data_file); | ||
2960 | LLFile::rename(old_vfs_index_file, new_vfs_index_file); | ||
2961 | } | ||
2962 | |||
2963 | // Startup the VFS... | ||
2964 | gSavedSettings.setU32("VFSSalt", new_salt); | ||
2965 | |||
2966 | // Don't remove VFS after viewer crashes. If user has corrupt data, they can reinstall. JC | ||
2967 | gVFS = new LLVFS(new_vfs_index_file, new_vfs_data_file, false, vfs_size_u32, false); | ||
2968 | if( VFSVALID_BAD_CORRUPT == gVFS->getValidState() ) | ||
2969 | { | ||
2970 | // Try again with fresh files | ||
2971 | // (The constructor deletes corrupt files when it finds them.) | ||
2972 | llwarns << "VFS corrupt, deleted. Making new VFS." << llendl; | ||
2973 | delete gVFS; | ||
2974 | gVFS = new LLVFS(new_vfs_index_file, new_vfs_data_file, false, vfs_size_u32, false); | ||
2975 | } | ||
2976 | |||
2977 | gStaticVFS = new LLVFS(static_vfs_index_file, static_vfs_data_file, true, 0, false); | ||
2978 | |||
2979 | BOOL success = gVFS->isValid() && gStaticVFS->isValid(); | ||
2980 | if( !success ) | ||
2981 | { | ||
2982 | return false; | ||
2983 | } | ||
2984 | else | ||
2985 | { | ||
2986 | LLVFile::initClass(); | ||
2987 | return true; | ||
2988 | } | ||
2989 | } | ||
2990 | |||
2991 | void LLAppViewer::purgeCache() | ||
2992 | { | ||
2993 | llinfos << "Purging Texture Cache..." << llendl; | ||
2994 | LLAppViewer::getTextureCache()->purgeCache(LL_PATH_CACHE); | ||
2995 | llinfos << "Purging Cache..." << llendl; | ||
2996 | std::string mask = gDirUtilp->getDirDelimiter() + "*.*"; | ||
2997 | gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"").c_str(),mask); | ||
2998 | } | ||
2999 | |||
3000 | const LLString& LLAppViewer::getSecondLifeTitle() const | ||
3001 | { | ||
3002 | return gSecondLife; | ||
3003 | } | ||
3004 | |||
3005 | const LLString& LLAppViewer::getWindowTitle() const | ||
3006 | { | ||
3007 | return gWindowTitle; | ||
3008 | } | ||
3009 | |||
3010 | void LLAppViewer::resetURIs() const | ||
3011 | { | ||
3012 | // Clear URIs when picking a new server | ||
3013 | gLoginURIs.clear(); | ||
3014 | gHelperURI.clear(); | ||
3015 | } | ||
3016 | |||
3017 | const std::vector<std::string>& LLAppViewer::getLoginURIs() const | ||
3018 | { | ||
3019 | if (gLoginURIs.empty()) | ||
3020 | { | ||
3021 | // not specified on the command line, use value from table | ||
3022 | gLoginURIs = LLSRV::rewriteURI(gGridInfo[gGridChoice].mLoginURI); | ||
3023 | } | ||
3024 | return gLoginURIs; | ||
3025 | } | ||
3026 | |||
3027 | const std::string& LLAppViewer::getHelperURI() const | ||
3028 | { | ||
3029 | if (gHelperURI.empty()) | ||
3030 | { | ||
3031 | // not specified on the command line, use value from table | ||
3032 | gHelperURI = gGridInfo[gGridChoice].mHelperURI; | ||
3033 | } | ||
3034 | return gHelperURI; | ||
3035 | } | ||
3036 | |||
3037 | void LLAppViewer::addLoginURI(const std::string& uri) | ||
3038 | { | ||
3039 | gLoginURIs.push_back(uri); | ||
3040 | } | ||
3041 | |||
3042 | void LLAppViewer::setHelperURI(const std::string& uri) | ||
3043 | { | ||
3044 | gHelperURI = uri; | ||
3045 | } | ||
3046 | |||
3047 | // Callback from a dialog indicating user was logged out. | ||
3048 | void finish_disconnect(S32 option, void* userdata) | ||
3049 | { | ||
3050 | if (1 == option) | ||
3051 | { | ||
3052 | LLAppViewer::instance()->forceQuit(); | ||
3053 | } | ||
3054 | } | ||
3055 | |||
3056 | // Callback from an early disconnect dialog, force an exit | ||
3057 | void finish_forced_disconnect(S32 /* option */, void* /* userdata */) | ||
3058 | { | ||
3059 | LLAppViewer::instance()->forceQuit(); | ||
3060 | } | ||
3061 | |||
3062 | |||
3063 | void LLAppViewer::forceDisconnect(const LLString& mesg) | ||
3064 | { | ||
3065 | if (gDoDisconnect) | ||
3066 | { | ||
3067 | // Already popped up one of these dialogs, don't | ||
3068 | // do this again. | ||
3069 | return; | ||
3070 | } | ||
3071 | |||
3072 | // Translate the message if possible | ||
3073 | LLString big_reason = LLAgent::sTeleportErrorMessages[mesg]; | ||
3074 | if ( big_reason.size() == 0 ) | ||
3075 | { | ||
3076 | big_reason = mesg; | ||
3077 | } | ||
3078 | |||
3079 | LLStringBase<char>::format_map_t args; | ||
3080 | gDoDisconnect = TRUE; | ||
3081 | |||
3082 | if (LLStartUp::getStartupState() < STATE_STARTED) | ||
3083 | { | ||
3084 | // Tell users what happened | ||
3085 | args["[ERROR_MESSAGE]"] = big_reason; | ||
3086 | gViewerWindow->alertXml("ErrorMessage", args, finish_forced_disconnect); | ||
3087 | } | ||
3088 | else | ||
3089 | { | ||
3090 | args["[MESSAGE]"] = big_reason; | ||
3091 | gViewerWindow->alertXml("YouHaveBeenLoggedOut", args, finish_disconnect ); | ||
3092 | } | ||
3093 | } | ||
3094 | |||
3095 | void LLAppViewer::badNetworkHandler() | ||
3096 | { | ||
3097 | // Dump the packet | ||
3098 | gMessageSystem->dumpPacketToLog(); | ||
3099 | |||
3100 | // Flush all of our caches on exit in the case of disconnect due to | ||
3101 | // invalid packets. | ||
3102 | |||
3103 | mPurgeOnExit = TRUE; | ||
3104 | |||
3105 | #if LL_WINDOWS | ||
3106 | // Generates the minidump. | ||
3107 | LLWinDebug::handleException(NULL); | ||
3108 | #endif | ||
3109 | LLAppViewer::handleViewerCrash(); | ||
3110 | |||
3111 | std::ostringstream message; | ||
3112 | message << | ||
3113 | "The viewer has detected mangled network data indicative\n" | ||
3114 | "of a bad upstream network connection or an incomplete\n" | ||
3115 | "local installation of " << LLAppViewer::instance()->getSecondLifeTitle() << ". \n" | ||
3116 | " \n" | ||
3117 | "Try uninstalling and reinstalling to see if this resolves \n" | ||
3118 | "the issue. \n" | ||
3119 | " \n" | ||
3120 | "If the problem continues, see the Tech Support FAQ at: \n" | ||
3121 | "www.secondlife.com/support"; | ||
3122 | forceDisconnect(message.str()); | ||
3123 | } | ||
3124 | |||
3125 | // This routine may get called more than once during the shutdown process. | ||
3126 | // This can happen because we need to get the screenshot before the window | ||
3127 | // is destroyed. | ||
3128 | void LLAppViewer::saveFinalSnapshot() | ||
3129 | { | ||
3130 | if (!mSavedFinalSnapshot && !gNoRender) | ||
3131 | { | ||
3132 | gSavedSettings.setVector3d("FocusPosOnLogout", gAgent.calcFocusPositionTargetGlobal()); | ||
3133 | gSavedSettings.setVector3d("CameraPosOnLogout", gAgent.calcCameraPositionTargetGlobal()); | ||
3134 | gViewerWindow->setCursor(UI_CURSOR_WAIT); | ||
3135 | gAgent.changeCameraToThirdPerson( FALSE ); // don't animate, need immediate switch | ||
3136 | gSavedSettings.setBOOL("ShowParcelOwners", FALSE); | ||
3137 | idle(); | ||
3138 | |||
3139 | LLString snap_filename = gDirUtilp->getLindenUserDir(); | ||
3140 | snap_filename += gDirUtilp->getDirDelimiter(); | ||
3141 | snap_filename += SCREEN_LAST_FILENAME; | ||
3142 | gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidth(), gViewerWindow->getWindowHeight(), FALSE, TRUE); | ||
3143 | mSavedFinalSnapshot = TRUE; | ||
3144 | } | ||
3145 | } | ||
3146 | |||
3147 | void LLAppViewer::loadNameCache() | ||
3148 | { | ||
3149 | if (!gCacheName) return; | ||
3150 | |||
3151 | std::string name_cache; | ||
3152 | name_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "name.cache"); | ||
3153 | FILE* name_cache_fp = LLFile::fopen(name_cache.c_str(), "r"); // Flawfinder: ignore | ||
3154 | if (name_cache_fp) | ||
3155 | { | ||
3156 | gCacheName->importFile(name_cache_fp); | ||
3157 | fclose(name_cache_fp); | ||
3158 | } | ||
3159 | } | ||
3160 | |||
3161 | void LLAppViewer::saveNameCache() | ||
3162 | { | ||
3163 | if (!gCacheName) return; | ||
3164 | |||
3165 | std::string name_cache; | ||
3166 | name_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "name.cache"); | ||
3167 | FILE* name_cache_fp = LLFile::fopen(name_cache.c_str(), "w"); // Flawfinder: ignore | ||
3168 | if (name_cache_fp) | ||
3169 | { | ||
3170 | gCacheName->exportFile(name_cache_fp); | ||
3171 | fclose(name_cache_fp); | ||
3172 | } | ||
3173 | } | ||
3174 | |||
3175 | /*! @brief This class is an LLFrameTimer that can be created with | ||
3176 | an elapsed time that starts counting up from the given value | ||
3177 | rather than 0.0. | ||
3178 | |||
3179 | Otherwise it behaves the same way as LLFrameTimer. | ||
3180 | */ | ||
3181 | class LLFrameStatsTimer : public LLFrameTimer | ||
3182 | { | ||
3183 | public: | ||
3184 | LLFrameStatsTimer(F64 elapsed_already = 0.0) | ||
3185 | : LLFrameTimer() | ||
3186 | { | ||
3187 | mStartTime -= elapsed_already; | ||
3188 | } | ||
3189 | }; | ||
3190 | |||
3191 | /////////////////////////////////////////////////////// | ||
3192 | // idle() | ||
3193 | // | ||
3194 | // Called every time the window is not doing anything. | ||
3195 | // Receive packets, update statistics, and schedule a redisplay. | ||
3196 | /////////////////////////////////////////////////////// | ||
3197 | void LLAppViewer::idle() | ||
3198 | { | ||
3199 | // Update frame timers | ||
3200 | static LLTimer idle_timer; | ||
3201 | |||
3202 | LLControlBase::updateAllListeners(); | ||
3203 | |||
3204 | LLFrameTimer::updateFrameTime(); | ||
3205 | LLEventTimer::updateClass(); | ||
3206 | LLCriticalDamp::updateInterpolants(); | ||
3207 | LLMortician::updateClass(); | ||
3208 | F32 dt_raw = idle_timer.getElapsedTimeAndResetF32(); | ||
3209 | |||
3210 | // Cap out-of-control frame times | ||
3211 | // Too low because in menus, swapping, debugger, etc. | ||
3212 | // Too high because idle called with no objects in view, etc. | ||
3213 | const F32 MIN_FRAME_RATE = 1.f; | ||
3214 | const F32 MAX_FRAME_RATE = 200.f; | ||
3215 | |||
3216 | F32 frame_rate_clamped = 1.f / dt_raw; | ||
3217 | frame_rate_clamped = llclamp(frame_rate_clamped, MIN_FRAME_RATE, MAX_FRAME_RATE); | ||
3218 | gFrameDTClamped = 1.f / frame_rate_clamped; | ||
3219 | |||
3220 | // Global frame timer | ||
3221 | // Smoothly weight toward current frame | ||
3222 | gFPSClamped = (frame_rate_clamped + (4.f * gFPSClamped)) / 5.f; | ||
3223 | |||
3224 | if (gQuitAfterSeconds > 0.f) | ||
3225 | { | ||
3226 | if (gRenderStartTime.getElapsedTimeF32() > gQuitAfterSeconds) | ||
3227 | { | ||
3228 | LLAppViewer::instance()->forceQuit(); | ||
3229 | } | ||
3230 | } | ||
3231 | |||
3232 | // Must wait until both have avatar object and mute list, so poll | ||
3233 | // here. | ||
3234 | request_initial_instant_messages(); | ||
3235 | |||
3236 | /////////////////////////////////// | ||
3237 | // | ||
3238 | // Special case idle if still starting up | ||
3239 | // | ||
3240 | |||
3241 | if (LLStartUp::getStartupState() < STATE_STARTED) | ||
3242 | { | ||
3243 | // Skip rest if idle startup returns false (essentially, no world yet) | ||
3244 | if (!idle_startup()) | ||
3245 | { | ||
3246 | return; | ||
3247 | } | ||
3248 | } | ||
3249 | |||
3250 | |||
3251 | F32 yaw = 0.f; // radians | ||
3252 | |||
3253 | if (!gDisconnected) | ||
3254 | { | ||
3255 | LLFastTimer t(LLFastTimer::FTM_NETWORK); | ||
3256 | |||
3257 | // Update spaceserver timeinfo | ||
3258 | gWorldp->setSpaceTimeUSec(gWorldp->getSpaceTimeUSec() + (U32)(dt_raw * SEC_TO_MICROSEC)); | ||
3259 | |||
3260 | |||
3261 | ////////////////////////////////////// | ||
3262 | // | ||
3263 | // Update simulator agent state | ||
3264 | // | ||
3265 | |||
3266 | if (gRotateRight) | ||
3267 | { | ||
3268 | gAgent.moveYaw(-1.f); | ||
3269 | } | ||
3270 | |||
3271 | // Handle automatic walking towards points | ||
3272 | gAgentPilot.updateTarget(); | ||
3273 | gAgent.autoPilot(&yaw); | ||
3274 | |||
3275 | static LLFrameTimer agent_update_timer; | ||
3276 | static U32 last_control_flags; | ||
3277 | |||
3278 | // When appropriate, update agent location to the simulator. | ||
3279 | F32 agent_update_time = agent_update_timer.getElapsedTimeF32(); | ||
3280 | BOOL flags_changed = gAgent.controlFlagsDirty() || (last_control_flags != gAgent.getControlFlags()); | ||
3281 | |||
3282 | if (flags_changed || (agent_update_time > (1.0f / (F32) AGENT_UPDATES_PER_SECOND))) | ||
3283 | { | ||
3284 | // Send avatar and camera info | ||
3285 | last_control_flags = gAgent.getControlFlags(); | ||
3286 | send_agent_update(TRUE); | ||
3287 | agent_update_timer.reset(); | ||
3288 | } | ||
3289 | } | ||
3290 | |||
3291 | ////////////////////////////////////// | ||
3292 | // | ||
3293 | // Manage statistics | ||
3294 | // | ||
3295 | // | ||
3296 | |||
3297 | { | ||
3298 | // Initialize the viewer_stats_timer with an already elapsed time | ||
3299 | // of SEND_STATS_PERIOD so that the initial stats report will | ||
3300 | // be sent immediately. | ||
3301 | static LLFrameStatsTimer viewer_stats_timer(SEND_STATS_PERIOD); | ||
3302 | reset_statistics(); | ||
3303 | |||
3304 | // Update session stats every large chunk of time | ||
3305 | // *FIX: (???) SAMANTHA | ||
3306 | if (viewer_stats_timer.getElapsedTimeF32() >= SEND_STATS_PERIOD && !gDisconnected) | ||
3307 | { | ||
3308 | llinfos << "Transmitting sessions stats" << llendl; | ||
3309 | send_stats(); | ||
3310 | viewer_stats_timer.reset(); | ||
3311 | } | ||
3312 | |||
3313 | // Print the object debugging stats | ||
3314 | static LLFrameTimer object_debug_timer; | ||
3315 | if (object_debug_timer.getElapsedTimeF32() > 5.f) | ||
3316 | { | ||
3317 | object_debug_timer.reset(); | ||
3318 | if (gObjectList.mNumDeadObjectUpdates) | ||
3319 | { | ||
3320 | llinfos << "Dead object updates: " << gObjectList.mNumDeadObjectUpdates << llendl; | ||
3321 | gObjectList.mNumDeadObjectUpdates = 0; | ||
3322 | } | ||
3323 | if (gObjectList.mNumUnknownKills) | ||
3324 | { | ||
3325 | llinfos << "Kills on unknown objects: " << gObjectList.mNumUnknownKills << llendl; | ||
3326 | gObjectList.mNumUnknownKills = 0; | ||
3327 | } | ||
3328 | if (gObjectList.mNumUnknownUpdates) | ||
3329 | { | ||
3330 | llinfos << "Unknown object updates: " << gObjectList.mNumUnknownUpdates << llendl; | ||
3331 | gObjectList.mNumUnknownUpdates = 0; | ||
3332 | } | ||
3333 | } | ||
3334 | gFrameStats.addFrameData(); | ||
3335 | } | ||
3336 | |||
3337 | if (!gDisconnected) | ||
3338 | { | ||
3339 | LLFastTimer t(LLFastTimer::FTM_NETWORK); | ||
3340 | |||
3341 | //////////////////////////////////////////////// | ||
3342 | // | ||
3343 | // Network processing | ||
3344 | // | ||
3345 | // NOTE: Starting at this point, we may still have pointers to "dead" objects | ||
3346 | // floating throughout the various object lists. | ||
3347 | // | ||
3348 | |||
3349 | gFrameStats.start(LLFrameStats::IDLE_NETWORK); | ||
3350 | idleNetwork(); | ||
3351 | stop_glerror(); | ||
3352 | |||
3353 | gFrameStats.start(LLFrameStats::AGENT_MISC); | ||
3354 | |||
3355 | // Check for away from keyboard, kick idle agents. | ||
3356 | idle_afk_check(); | ||
3357 | |||
3358 | // Update statistics for this frame | ||
3359 | update_statistics(gFrameCount); | ||
3360 | |||
3361 | gViewerWindow->updateDebugText(); | ||
3362 | } | ||
3363 | |||
3364 | //////////////////////////////////////// | ||
3365 | // | ||
3366 | // Handle the regular UI idle callbacks as well as | ||
3367 | // hover callbacks | ||
3368 | // | ||
3369 | |||
3370 | { | ||
3371 | // LLFastTimer t(LLFastTimer::FTM_IDLE_CB); | ||
3372 | |||
3373 | // Do event notifications if necessary. Yes, we may want to move this elsewhere. | ||
3374 | gEventNotifier.update(); | ||
3375 | |||
3376 | gIdleCallbacks.callFunctions(); | ||
3377 | } | ||
3378 | |||
3379 | if (gDisconnected) | ||
3380 | { | ||
3381 | return; | ||
3382 | } | ||
3383 | |||
3384 | gViewerWindow->handlePerFrameHover(); | ||
3385 | |||
3386 | /////////////////////////////////////// | ||
3387 | // Agent and camera movement | ||
3388 | // | ||
3389 | LLCoordGL current_mouse = gViewerWindow->getCurrentMouse(); | ||
3390 | |||
3391 | // BOOL was_in_prelude = gAgent.inPrelude(); | ||
3392 | |||
3393 | { | ||
3394 | //LLFastTimer t(LLFastTimer::FTM_TEMP1); | ||
3395 | |||
3396 | // After agent and camera moved, figure out if we need to | ||
3397 | // deselect objects. | ||
3398 | gSelectMgr->deselectAllIfTooFar(); | ||
3399 | |||
3400 | } | ||
3401 | |||
3402 | { | ||
3403 | LLFastTimer t(LLFastTimer::FTM_RESET_DRAWORDER); | ||
3404 | |||
3405 | ////////////////////////////////////////////// | ||
3406 | // | ||
3407 | // Clear draw orders | ||
3408 | // | ||
3409 | // Should actually be done after render, but handlePerFrameHover actually does a "render" | ||
3410 | // to do its selection. | ||
3411 | // | ||
3412 | |||
3413 | gPipeline.resetDrawOrders(); | ||
3414 | } | ||
3415 | { | ||
3416 | // Handle pending gesture processing | ||
3417 | gGestureManager.update(); | ||
3418 | |||
3419 | gAgent.updateAgentPosition(gFrameDTClamped, yaw, current_mouse.mX, current_mouse.mY); | ||
3420 | } | ||
3421 | |||
3422 | { | ||
3423 | LLFastTimer t(LLFastTimer::FTM_OBJECTLIST_UPDATE); // Actually "object update" | ||
3424 | gFrameStats.start(LLFrameStats::OBJECT_UPDATE); | ||
3425 | |||
3426 | if (!(logoutRequestSent() && hasSavedFinalSnapshot())) | ||
3427 | { | ||
3428 | gObjectList.update(gAgent, *gWorldp); | ||
3429 | } | ||
3430 | } | ||
3431 | |||
3432 | { | ||
3433 | LLFastTimer t(LLFastTimer::FTM_UPDATE_SKY); | ||
3434 | gSky.updateSky(); | ||
3435 | } | ||
3436 | |||
3437 | ////////////////////////////////////// | ||
3438 | // | ||
3439 | // Deletes objects... | ||
3440 | // Has to be done after doing idleUpdates (which can kill objects) | ||
3441 | // | ||
3442 | |||
3443 | { | ||
3444 | LLFastTimer t(LLFastTimer::FTM_CLEANUP); | ||
3445 | gFrameStats.start(LLFrameStats::CLEAN_DEAD); | ||
3446 | gObjectList.cleanDeadObjects(); | ||
3447 | LLDrawable::cleanupDeadDrawables(); | ||
3448 | } | ||
3449 | |||
3450 | // | ||
3451 | // After this point, in theory we should never see a dead object | ||
3452 | // in the various object/drawable lists. | ||
3453 | // | ||
3454 | |||
3455 | ////////////////////////////////////// | ||
3456 | // | ||
3457 | // Update/send HUD effects | ||
3458 | // | ||
3459 | // At this point, HUD effects may clean up some references to | ||
3460 | // dead objects. | ||
3461 | // | ||
3462 | |||
3463 | { | ||
3464 | //LLFastTimer t(LLFastTimer::FTM_TEMP3); | ||
3465 | |||
3466 | gFrameStats.start(LLFrameStats::UPDATE_EFFECTS); | ||
3467 | gSelectMgr->updateEffects(); | ||
3468 | gHUDManager->cleanupEffects(); | ||
3469 | gHUDManager->sendEffects(); | ||
3470 | } | ||
3471 | |||
3472 | stop_glerror(); | ||
3473 | |||
3474 | //////////////////////////////////////// | ||
3475 | // | ||
3476 | // Unpack layer data that we've received | ||
3477 | // | ||
3478 | |||
3479 | { | ||
3480 | LLFastTimer t(LLFastTimer::FTM_NETWORK); | ||
3481 | gVLManager.unpackData(); | ||
3482 | } | ||
3483 | |||
3484 | ///////////////////////// | ||
3485 | // | ||
3486 | // Update surfaces, and surface textures as well. | ||
3487 | // | ||
3488 | |||
3489 | gWorldp->updateVisibilities(); | ||
3490 | { | ||
3491 | const F32 max_region_update_time = .001f; // 1ms | ||
3492 | LLFastTimer t(LLFastTimer::FTM_REGION_UPDATE); | ||
3493 | gWorldp->updateRegions(max_region_update_time); | ||
3494 | } | ||
3495 | |||
3496 | ///////////////////////// | ||
3497 | // | ||
3498 | // Update weather effects | ||
3499 | // | ||
3500 | |||
3501 | if (!gNoRender) | ||
3502 | { | ||
3503 | gWorldp->updateClouds(gFrameDTClamped); | ||
3504 | gSky.propagateHeavenlyBodies(gFrameDTClamped); // moves sun, moon, and planets | ||
3505 | |||
3506 | // Update wind vector | ||
3507 | LLVector3 wind_position_region; | ||
3508 | static LLVector3 average_wind; | ||
3509 | |||
3510 | LLViewerRegion *regionp; | ||
3511 | regionp = gWorldp->resolveRegionGlobal(wind_position_region, gAgent.getPositionGlobal()); // puts agent's local coords into wind_position | ||
3512 | if (regionp) | ||
3513 | { | ||
3514 | gWindVec = regionp->mWind.getVelocity(wind_position_region); | ||
3515 | |||
3516 | // Compute average wind and use to drive motion of water | ||
3517 | |||
3518 | average_wind = regionp->mWind.getAverage(); | ||
3519 | F32 cloud_density = regionp->mCloudLayer.getDensityRegion(wind_position_region); | ||
3520 | |||
3521 | gSky.setCloudDensityAtAgent(cloud_density); | ||
3522 | gSky.setWind(average_wind); | ||
3523 | //LLVOWater::setWind(average_wind); | ||
3524 | } | ||
3525 | else | ||
3526 | { | ||
3527 | gWindVec.setVec(0.0f, 0.0f, 0.0f); | ||
3528 | } | ||
3529 | } | ||
3530 | stop_glerror(); | ||
3531 | |||
3532 | ////////////////////////////////////// | ||
3533 | // | ||
3534 | // Update images, using the image stats generated during object update/culling | ||
3535 | // | ||
3536 | // Can put objects onto the retextured list. | ||
3537 | // | ||
3538 | gFrameStats.start(LLFrameStats::IMAGE_UPDATE); | ||
3539 | |||
3540 | LLFastTimer t(LLFastTimer::FTM_IMAGE_UPDATE); | ||
3541 | |||
3542 | LLViewerImage::updateClass(gCamera->getVelocityStat()->getMean(), | ||
3543 | gCamera->getAngularVelocityStat()->getMean()); | ||
3544 | |||
3545 | gBumpImageList.updateImages(); // must be called before gImageList version so that it's textures are thrown out first. | ||
3546 | |||
3547 | const F32 max_image_decode_time = 0.005f; // 5 ms decode time | ||
3548 | gImageList.updateImages(max_image_decode_time); | ||
3549 | stop_glerror(); | ||
3550 | |||
3551 | ////////////////////////////////////// | ||
3552 | // | ||
3553 | // Sort and cull in the new renderer are moved to pipeline.cpp | ||
3554 | // Here, particles are updated and drawables are moved. | ||
3555 | // | ||
3556 | |||
3557 | if (!gNoRender) | ||
3558 | { | ||
3559 | gFrameStats.start(LLFrameStats::UPDATE_MOVE); | ||
3560 | gPipeline.updateMove(); | ||
3561 | |||
3562 | gFrameStats.start(LLFrameStats::UPDATE_PARTICLES); | ||
3563 | gWorldp->updateParticles(); | ||
3564 | } | ||
3565 | stop_glerror(); | ||
3566 | |||
3567 | if (!LLViewerJoystick::sOverrideCamera) | ||
3568 | { | ||
3569 | gAgent.updateCamera(); | ||
3570 | } | ||
3571 | else | ||
3572 | { | ||
3573 | LLViewerJoystick::updateCamera(); | ||
3574 | } | ||
3575 | |||
3576 | // objects and camera should be in sync, do LOD calculations now | ||
3577 | { | ||
3578 | LLFastTimer t(LLFastTimer::FTM_LOD_UPDATE); | ||
3579 | gObjectList.updateApparentAngles(gAgent); | ||
3580 | } | ||
3581 | |||
3582 | { | ||
3583 | gFrameStats.start(LLFrameStats::AUDIO); | ||
3584 | LLFastTimer t(LLFastTimer::FTM_AUDIO_UPDATE); | ||
3585 | |||
3586 | if (gAudiop) | ||
3587 | { | ||
3588 | audio_update_volume(false); | ||
3589 | audio_update_listener(); | ||
3590 | audio_update_wind(false); | ||
3591 | |||
3592 | // this line actually commits the changes we've made to source positions, etc. | ||
3593 | const F32 max_audio_decode_time = 0.002f; // 2 ms decode time | ||
3594 | gAudiop->idle(max_audio_decode_time); | ||
3595 | } | ||
3596 | } | ||
3597 | |||
3598 | // Handle shutdown process, for example, | ||
3599 | // wait for floaters to close, send quit message, | ||
3600 | // forcibly quit if it has taken too long | ||
3601 | if (mQuitRequested) | ||
3602 | { | ||
3603 | idleShutdown(); | ||
3604 | } | ||
3605 | |||
3606 | stop_glerror(); | ||
3607 | } | ||
3608 | |||
3609 | void LLAppViewer::idleShutdown() | ||
3610 | { | ||
3611 | // Wait for all modal alerts to get resolved | ||
3612 | if (LLModalDialog::activeCount() > 0) | ||
3613 | { | ||
3614 | return; | ||
3615 | } | ||
3616 | |||
3617 | // close IM interface | ||
3618 | if(gIMMgr) | ||
3619 | { | ||
3620 | gIMMgr->disconnectAllSessions(); | ||
3621 | } | ||
3622 | |||
3623 | // Wait for all floaters to get resolved | ||
3624 | if (gFloaterView | ||
3625 | && !gFloaterView->allChildrenClosed()) | ||
3626 | { | ||
3627 | return; | ||
3628 | } | ||
3629 | |||
3630 | static bool saved_snapshot = false; | ||
3631 | if (!saved_snapshot) | ||
3632 | { | ||
3633 | saved_snapshot = true; | ||
3634 | saveFinalSnapshot(); | ||
3635 | return; | ||
3636 | } | ||
3637 | |||
3638 | const F32 SHUTDOWN_UPLOAD_SAVE_TIME = 5.f; | ||
3639 | |||
3640 | S32 pending_uploads = gAssetStorage->getNumPendingUploads(); | ||
3641 | if (pending_uploads > 0 | ||
3642 | && gLogoutTimer.getElapsedTimeF32() < SHUTDOWN_UPLOAD_SAVE_TIME | ||
3643 | && !logoutRequestSent()) | ||
3644 | { | ||
3645 | static S32 total_uploads = 0; | ||
3646 | // Sometimes total upload count can change during logout. | ||
3647 | total_uploads = llmax(total_uploads, pending_uploads); | ||
3648 | gViewerWindow->setShowProgress(TRUE); | ||
3649 | S32 finished_uploads = total_uploads - pending_uploads; | ||
3650 | F32 percent = 100.f * finished_uploads / total_uploads; | ||
3651 | gViewerWindow->setProgressPercent(percent); | ||
3652 | char buffer[MAX_STRING]; // Flawfinder: ignore | ||
3653 | snprintf(buffer, MAX_STRING, "Saving final data..."); // Flawfinder: ignore | ||
3654 | gViewerWindow->setProgressString(buffer); | ||
3655 | return; | ||
3656 | } | ||
3657 | |||
3658 | // All floaters are closed. Tell server we want to quit. | ||
3659 | if( !logoutRequestSent() ) | ||
3660 | { | ||
3661 | sendLogoutRequest(); | ||
3662 | |||
3663 | // Wait for a LogoutReply message | ||
3664 | gViewerWindow->setShowProgress(TRUE); | ||
3665 | gViewerWindow->setProgressPercent(100.f); | ||
3666 | gViewerWindow->setProgressString("Logging out..."); | ||
3667 | return; | ||
3668 | } | ||
3669 | |||
3670 | // Make sure that we quit if we haven't received a reply from the server. | ||
3671 | if( logoutRequestSent() | ||
3672 | && gLogoutTimer.getElapsedTimeF32() > gLogoutMaxTime ) | ||
3673 | { | ||
3674 | forceQuit(); | ||
3675 | return; | ||
3676 | } | ||
3677 | } | ||
3678 | |||
3679 | void LLAppViewer::sendLogoutRequest() | ||
3680 | { | ||
3681 | if(!mLogoutRequestSent) | ||
3682 | { | ||
3683 | LLMessageSystem* msg = gMessageSystem; | ||
3684 | msg->newMessageFast(_PREHASH_LogoutRequest); | ||
3685 | msg->nextBlockFast(_PREHASH_AgentData); | ||
3686 | msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); | ||
3687 | msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); | ||
3688 | gAgent.sendReliableMessage(); | ||
3689 | |||
3690 | gLogoutTimer.reset(); | ||
3691 | gLogoutMaxTime = LOGOUT_REQUEST_TIME; | ||
3692 | mLogoutRequestSent = TRUE; | ||
3693 | |||
3694 | gVoiceClient->leaveChannel(); | ||
3695 | } | ||
3696 | } | ||
3697 | |||
3698 | // | ||
3699 | // Handle messages, and all message related stuff | ||
3700 | // | ||
3701 | |||
3702 | #define TIME_THROTTLE_MESSAGES | ||
3703 | |||
3704 | #ifdef TIME_THROTTLE_MESSAGES | ||
3705 | #define CHECK_MESSAGES_DEFAULT_MAX_TIME .020f // 50 ms = 50 fps (just for messages!) | ||
3706 | static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME; | ||
3707 | #endif | ||
3708 | |||
3709 | void LLAppViewer::idleNetwork() | ||
3710 | { | ||
3711 | gObjectList.mNumNewObjects = 0; | ||
3712 | S32 total_decoded = 0; | ||
3713 | |||
3714 | if (!gSavedSettings.getBOOL("SpeedTest")) | ||
3715 | { | ||
3716 | LLFastTimer t(LLFastTimer::FTM_IDLE_NETWORK); // decode | ||
3717 | |||
3718 | // deal with any queued name requests and replies. | ||
3719 | gCacheName->processPending(); | ||
3720 | |||
3721 | LLTimer check_message_timer; | ||
3722 | // Read all available packets from network | ||
3723 | stop_glerror(); | ||
3724 | const S64 frame_count = gFrameCount; // U32->S64 | ||
3725 | F32 total_time = 0.0f; | ||
3726 | while (gMessageSystem->checkAllMessages(frame_count, gServicePump)) | ||
3727 | { | ||
3728 | if (gDoDisconnect) | ||
3729 | { | ||
3730 | // We're disconnecting, don't process any more messages from the server | ||
3731 | // We're usually disconnecting due to either network corruption or a | ||
3732 | // server going down, so this is OK. | ||
3733 | break; | ||
3734 | } | ||
3735 | stop_glerror(); | ||
3736 | |||
3737 | total_decoded++; | ||
3738 | gPacketsIn++; | ||
3739 | |||
3740 | if (total_decoded > MESSAGE_MAX_PER_FRAME) | ||
3741 | { | ||
3742 | break; | ||
3743 | } | ||
3744 | |||
3745 | #ifdef TIME_THROTTLE_MESSAGES | ||
3746 | // Prevent slow packets from completely destroying the frame rate. | ||
3747 | // This usually happens due to clumps of avatars taking huge amount | ||
3748 | // of network processing time (which needs to be fixed, but this is | ||
3749 | // a good limit anyway). | ||
3750 | total_time = check_message_timer.getElapsedTimeF32(); | ||
3751 | if (total_time >= CheckMessagesMaxTime) | ||
3752 | break; | ||
3753 | #endif | ||
3754 | } | ||
3755 | // Handle per-frame message system processing. | ||
3756 | gMessageSystem->processAcks(); | ||
3757 | |||
3758 | #ifdef TIME_THROTTLE_MESSAGES | ||
3759 | if (total_time >= CheckMessagesMaxTime) | ||
3760 | { | ||
3761 | // Increase CheckMessagesMaxTime so that we will eventually catch up | ||
3762 | CheckMessagesMaxTime *= 1.035f; // 3.5% ~= x2 in 20 frames, ~8x in 60 frames | ||
3763 | } | ||
3764 | else | ||
3765 | { | ||
3766 | // Reset CheckMessagesMaxTime to default value | ||
3767 | CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME; | ||
3768 | } | ||
3769 | #endif | ||
3770 | |||
3771 | |||
3772 | |||
3773 | // we want to clear the control after sending out all necessary agent updates | ||
3774 | gAgent.resetControlFlags(); | ||
3775 | stop_glerror(); | ||
3776 | |||
3777 | |||
3778 | // Decode enqueued messages... | ||
3779 | S32 remaining_possible_decodes = MESSAGE_MAX_PER_FRAME - total_decoded; | ||
3780 | |||
3781 | if( remaining_possible_decodes <= 0 ) | ||
3782 | { | ||
3783 | llinfos << "Maxed out number of messages per frame at " << MESSAGE_MAX_PER_FRAME << llendl; | ||
3784 | } | ||
3785 | |||
3786 | if (gPrintMessagesThisFrame) | ||
3787 | { | ||
3788 | llinfos << "Decoded " << total_decoded << " msgs this frame!" << llendl; | ||
3789 | gPrintMessagesThisFrame = FALSE; | ||
3790 | } | ||
3791 | } | ||
3792 | |||
3793 | gObjectList.mNumNewObjectsStat.addValue(gObjectList.mNumNewObjects); | ||
3794 | |||
3795 | // Retransmit unacknowledged packets. | ||
3796 | gXferManager->retransmitUnackedPackets(); | ||
3797 | gAssetStorage->checkForTimeouts(); | ||
3798 | |||
3799 | gViewerThrottle.updateDynamicThrottle(); | ||
3800 | } | ||
3801 | |||
3802 | void LLAppViewer::disconnectViewer() | ||
3803 | { | ||
3804 | if (gDisconnected) | ||
3805 | { | ||
3806 | return; | ||
3807 | } | ||
3808 | // | ||
3809 | // Cleanup after quitting. | ||
3810 | // | ||
3811 | // Save snapshot for next time, if we made it through initialization | ||
3812 | |||
3813 | llinfos << "Disconnecting viewer!" << llendl; | ||
3814 | |||
3815 | // Dump our frame statistics | ||
3816 | gFrameStats.dump(); | ||
3817 | |||
3818 | // Remember if we were flying | ||
3819 | gSavedSettings.setBOOL("FlyingAtExit", gAgent.getFlying() ); | ||
3820 | |||
3821 | // Un-minimize all windows so they don't get saved minimized | ||
3822 | if (!gNoRender) | ||
3823 | { | ||
3824 | if (gFloaterView) | ||
3825 | { | ||
3826 | gFloaterView->restoreAll(); | ||
3827 | } | ||
3828 | } | ||
3829 | |||
3830 | if (gSelectMgr) | ||
3831 | { | ||
3832 | gSelectMgr->deselectAll(); | ||
3833 | } | ||
3834 | |||
3835 | if (!gNoRender) | ||
3836 | { | ||
3837 | // save inventory if appropriate | ||
3838 | gInventory.cache(gAgent.getInventoryRootID(), gAgent.getID()); | ||
3839 | if(gInventoryLibraryRoot.notNull() && gInventoryLibraryOwner.notNull()) | ||
3840 | { | ||
3841 | gInventory.cache(gInventoryLibraryRoot, gInventoryLibraryOwner); | ||
3842 | } | ||
3843 | } | ||
3844 | |||
3845 | saveNameCache(); | ||
3846 | |||
3847 | // close inventory interface, close all windows | ||
3848 | LLInventoryView::cleanup(); | ||
3849 | |||
3850 | // Also writes cached agent settings to gSavedSettings | ||
3851 | gAgent.cleanup(); | ||
3852 | |||
3853 | gObjectList.destroy(); | ||
3854 | delete gWorldp; | ||
3855 | gWorldp = NULL; | ||
3856 | |||
3857 | cleanup_xfer_manager(); | ||
3858 | gDisconnected = TRUE; | ||
3859 | } | ||
3860 | |||
3861 | void LLAppViewer::forceErrorLLError() | ||
3862 | { | ||
3863 | llerrs << "This is an llerror" << llendl; | ||
3864 | } | ||
3865 | |||
3866 | void LLAppViewer::forceErrorBreakpoint() | ||
3867 | { | ||
3868 | #ifdef LL_WINDOWS | ||
3869 | DebugBreak(); | ||
3870 | #endif | ||
3871 | return; | ||
3872 | } | ||
3873 | |||
3874 | void LLAppViewer::forceErrorBadMemoryAccess() | ||
3875 | { | ||
3876 | S32* crash = NULL; | ||
3877 | *crash = 0xDEADBEEF; | ||
3878 | return; | ||
3879 | } | ||
3880 | |||
3881 | void LLAppViewer::forceErrorInifiniteLoop() | ||
3882 | { | ||
3883 | while(true) | ||
3884 | { | ||
3885 | ; | ||
3886 | } | ||
3887 | return; | ||
3888 | } | ||
3889 | |||
3890 | void LLAppViewer::forceErrorSoftwareException() | ||
3891 | { | ||
3892 | // *FIX: Any way to insure it won't be handled? | ||
3893 | throw; | ||
3894 | } | ||
diff --git a/linden/indra/newview/llappviewer.h b/linden/indra/newview/llappviewer.h new file mode 100644 index 0000000..e97aead --- /dev/null +++ b/linden/indra/newview/llappviewer.h | |||
@@ -0,0 +1,294 @@ | |||
1 | /** | ||
2 | * @file llappviewer.h | ||
3 | * @brief The LLAppViewer class declaration | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2007&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #ifndef LL_LLAPPVIEWER_H | ||
33 | #define LL_LLAPPVIEWER_H | ||
34 | |||
35 | class LLTextureCache; | ||
36 | class LLWorkerThread; | ||
37 | class LLTextureFetch; | ||
38 | |||
39 | class LLAppViewer : public LLApp | ||
40 | { | ||
41 | public: | ||
42 | LLAppViewer(); | ||
43 | virtual ~LLAppViewer(); | ||
44 | |||
45 | // *NOTE:Mani - Don't use this! | ||
46 | // Having | ||
47 | static LLAppViewer* instance() {return sInstance; } | ||
48 | |||
49 | // | ||
50 | // Main application logic | ||
51 | // | ||
52 | virtual bool init(); // Override to do application initialization | ||
53 | virtual bool cleanup(); // Override to do application cleanup | ||
54 | virtual bool mainLoop(); // Override for the application main loop. Needs to at least gracefully notice the QUITTING state and exit. | ||
55 | |||
56 | // Application control | ||
57 | void forceQuit(); // Puts the viewer into 'shutting down without error' mode. | ||
58 | void requestQuit(); // Request a quit. A kinder, gentler quit. | ||
59 | void userQuit(); // The users asks to quit. Confirm, then requestQuit() | ||
60 | void earlyExit(const LLString& msg); // Display an error dialog and forcibly quit. | ||
61 | void forceExit(S32 arg); // exit() immediately (after some cleanup). | ||
62 | void abortQuit(); // Called to abort a quit request. | ||
63 | |||
64 | bool quitRequested() { return mQuitRequested; } | ||
65 | bool logoutRequestSent() { return mLogoutRequestSent; } | ||
66 | |||
67 | // *FIX: This is meant to stay only until the command line issues are hashed out with repect to LLApp::parseCommandLine | ||
68 | // This version stores the argc and argv for later usage, make sure the params passed in last as long as this class. | ||
69 | bool tempStoreCommandOptions(int argc, char** argv); | ||
70 | |||
71 | void closeDebug(); | ||
72 | |||
73 | const LLOSInfo& getOSInfo() const { return mSysOSInfo; } | ||
74 | |||
75 | // Report true if under the control of a debugger. A null-op default. | ||
76 | virtual bool beingDebugged() { return false; } | ||
77 | |||
78 | S32 getCrashBehavior() const { return mCrashBehavior; } | ||
79 | void setCrashBehavior(S32 cb); | ||
80 | virtual void handleCrashReporting() = 0; // What to do with crash report? | ||
81 | static void handleViewerCrash(); // Hey! The viewer crashed. Do this. | ||
82 | |||
83 | // Thread accessors | ||
84 | static LLTextureCache* getTextureCache() { return sTextureCache; } | ||
85 | static LLWorkerThread* getImageDecodeThread() { return sImageDecodeThread; } | ||
86 | static LLTextureFetch* getTextureFetch() { return sTextureFetch; } | ||
87 | |||
88 | const std::string& getSerialNumber() { return mSerialNumber; } | ||
89 | |||
90 | // *FIX:Mani purgeCache was made public for parse_args(). | ||
91 | // If that beast is gone, make it private. | ||
92 | void purgeCache(); // Clear the local cache. | ||
93 | bool getPurgeCache() const { return mPurgeCache; } | ||
94 | |||
95 | const LLString& getSecondLifeTitle() const; // The Second Life title. | ||
96 | const LLString& getWindowTitle() const; // The window display name. | ||
97 | |||
98 | // Helpers for URIs | ||
99 | void addLoginURI(const std::string& uri); | ||
100 | void setHelperURI(const std::string& uri); | ||
101 | const std::vector<std::string>& getLoginURIs() const; | ||
102 | const std::string& getHelperURI() const; | ||
103 | void resetURIs() const; | ||
104 | |||
105 | void forceDisconnect(const LLString& msg); // Force disconnection, with a message to the user. | ||
106 | void badNetworkHandler(); // Cause a crash state due to bad network packet. | ||
107 | |||
108 | bool hasSavedFinalSnapshot() { return mSavedFinalSnapshot; } | ||
109 | void saveFinalSnapshot(); | ||
110 | |||
111 | void loadNameCache(); | ||
112 | void saveNameCache(); | ||
113 | |||
114 | // LLAppViewer testing helpers. | ||
115 | // *NOTE: These will potentially crash the viewer. Only for debugging. | ||
116 | virtual void forceErrorLLError(); | ||
117 | virtual void forceErrorBreakpoint(); | ||
118 | virtual void forceErrorBadMemoryAccess(); | ||
119 | virtual void forceErrorInifiniteLoop(); | ||
120 | virtual void forceErrorSoftwareException(); | ||
121 | |||
122 | protected: | ||
123 | virtual bool initWindow(); // Initialize the viewer's window. | ||
124 | virtual bool initLogging(); // Initialize log files, logging system, return false on failure. | ||
125 | virtual bool initHardwareTest() { return true; } // A false result indicates the app should quit. | ||
126 | |||
127 | virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this. | ||
128 | |||
129 | |||
130 | private: | ||
131 | |||
132 | bool initEarlyConfiguration(); // Initialize setting needed by crash reporting. | ||
133 | bool initThreads(); // Initialize viewer threads, return false on failure. | ||
134 | bool initConfiguration(); // Initialize settings from the command line/config file. | ||
135 | |||
136 | bool initCache(); // Initialize local client cache. | ||
137 | |||
138 | bool doConfigFromCommandLine(); // calls parse args. | ||
139 | |||
140 | void cleanupSavedSettings(); // Sets some config data to current or default values during cleanup. | ||
141 | void removeCacheFiles(const char *filemask); // Deletes cached files the match the given wildcard. | ||
142 | |||
143 | void writeSystemInfo(); // Write system info to "debug_info.log" | ||
144 | |||
145 | bool anotherInstanceRunning(); | ||
146 | void initMarkerFile(); | ||
147 | void removeMarkerFile(); | ||
148 | |||
149 | void idle(); | ||
150 | void idleShutdown(); | ||
151 | void idleNetwork(); | ||
152 | |||
153 | void sendLogoutRequest(); | ||
154 | void disconnectViewer(); | ||
155 | |||
156 | // *FIX: the app viewer class should be some sort of singleton, no? | ||
157 | // Perhaps its child class is the singleton and this should be an abstract base. | ||
158 | static LLAppViewer* sInstance; | ||
159 | |||
160 | bool mSecondInstance; // Is this a second instance of the app? | ||
161 | |||
162 | FILE *mMarkerFile; // A file created to indicate the app is running. | ||
163 | bool mLastExecFroze; // Set on init if the marker file was found. | ||
164 | |||
165 | LLOSInfo mSysOSInfo; | ||
166 | S32 mCrashBehavior; | ||
167 | bool mReportedCrash; | ||
168 | |||
169 | // Thread objects. | ||
170 | static LLTextureCache* sTextureCache; | ||
171 | static LLWorkerThread* sImageDecodeThread; | ||
172 | static LLTextureFetch* sTextureFetch; | ||
173 | |||
174 | S32 mNumSessions; | ||
175 | |||
176 | std::string mSerialNumber; | ||
177 | bool mPurgeCache; | ||
178 | bool mPurgeOnExit; | ||
179 | |||
180 | bool mSavedFinalSnapshot; | ||
181 | |||
182 | bool mQuitRequested; // User wants to quit, may have modified documents open. | ||
183 | bool mLogoutRequestSent; // Disconnect message sent to simulator, no longer safe to send messages to the sim. | ||
184 | }; | ||
185 | |||
186 | // consts from viewer.h | ||
187 | const S32 AGENT_UPDATES_PER_SECOND = 10; | ||
188 | |||
189 | // Globals with external linkage. From viewer.h | ||
190 | // *NOTE:Mani - These will be removed as the Viewer App Cleanup project continues. | ||
191 | // | ||
192 | // "// llstartup" indicates that llstartup is the only client for this global. | ||
193 | |||
194 | extern bool gVerifySSLCert; // parse_args setting used by llxmlrpctransaction.cpp | ||
195 | extern BOOL gHandleKeysAsync; // gSavedSettings used by llviewerdisplay.cpp & llviewermenu.cpp | ||
196 | extern BOOL gProbeHardware; | ||
197 | extern LLString gDisabledMessage; // llstartup | ||
198 | extern BOOL gHideLinks; // used by llpanellogin, lllfloaterbuycurrency, llstartup | ||
199 | extern BOOL gInProductionGrid; | ||
200 | extern LLSD gDebugInfo; | ||
201 | |||
202 | extern BOOL gAllowIdleAFK; | ||
203 | extern F32 gAFKTimeout; | ||
204 | extern BOOL gShowObjectUpdates; | ||
205 | |||
206 | extern BOOL gLogMessages; // llstartup | ||
207 | extern std::string gChannelName; | ||
208 | extern BOOL gUseAudio; // llstartup | ||
209 | |||
210 | extern LLString gCmdLineFirstName; // llstartup | ||
211 | extern LLString gCmdLineLastName; | ||
212 | extern LLString gCmdLinePassword; | ||
213 | |||
214 | extern BOOL gAutoLogin; // llstartup | ||
215 | extern const char* DEFAULT_SETTINGS_FILE; // llstartup | ||
216 | |||
217 | extern BOOL gRequestInventoryLibrary; // llstartup | ||
218 | extern BOOL gGodConnect; // llstartup | ||
219 | |||
220 | extern BOOL gAcceptTOS; | ||
221 | extern BOOL gAcceptCriticalMessage; | ||
222 | |||
223 | extern LLUUID gViewerDigest; // MD5 digest of the viewer's executable file. | ||
224 | extern BOOL gLastExecFroze; // llstartup | ||
225 | |||
226 | extern U32 gFrameCount; | ||
227 | extern U32 gForegroundFrameCount; | ||
228 | |||
229 | extern LLPumpIO* gServicePump; | ||
230 | |||
231 | // Is the Pacific time zone (aka server time zone) | ||
232 | // currently in daylight savings time? | ||
233 | extern BOOL gPacificDaylightTime; | ||
234 | |||
235 | extern U64 gFrameTime; // The timestamp of the most-recently-processed frame | ||
236 | extern F32 gFrameTimeSeconds; // Loses msec precision after ~4.5 hours... | ||
237 | extern F32 gFrameIntervalSeconds; // Elapsed time between current and previous gFrameTimeSeconds | ||
238 | extern F32 gFPSClamped; // Frames per second, smoothed, weighted toward last frame | ||
239 | extern F32 gFrameDTClamped; | ||
240 | extern U64 gStartTime; | ||
241 | |||
242 | extern LLTimer gRenderStartTime; | ||
243 | extern LLFrameTimer gForegroundTime; | ||
244 | |||
245 | extern F32 gLogoutMaxTime; | ||
246 | extern LLTimer gLogoutTimer; | ||
247 | |||
248 | extern F32 gSimLastTime; | ||
249 | extern F32 gSimFrames; | ||
250 | |||
251 | extern LLUUID gInventoryLibraryOwner; | ||
252 | extern LLUUID gInventoryLibraryRoot; | ||
253 | |||
254 | extern BOOL gDisconnected; | ||
255 | extern BOOL gDisableVoice; | ||
256 | |||
257 | // Map scale in pixels per region | ||
258 | extern F32 gMapScale; | ||
259 | extern F32 gMiniMapScale; | ||
260 | |||
261 | extern LLFrameTimer gRestoreGLTimer; | ||
262 | extern BOOL gRestoreGL; | ||
263 | extern BOOL gUseWireframe; | ||
264 | |||
265 | extern F32 gMouseSensitivity; | ||
266 | extern BOOL gInvertMouse; | ||
267 | |||
268 | // VFS globals - gVFS is for general use | ||
269 | // gStaticVFS is read-only and is shipped w/ the viewer | ||
270 | // it has pre-cache data like the UI .TGAs | ||
271 | extern LLVFS *gStaticVFS; | ||
272 | |||
273 | extern LLMemoryInfo gSysMemory; | ||
274 | |||
275 | extern bool gPreloadImages; | ||
276 | extern bool gPreloadSounds; | ||
277 | |||
278 | extern LLString gLastVersionChannel; | ||
279 | |||
280 | extern LLVector3 gWindVec; | ||
281 | extern LLVector3 gRelativeWindVec; | ||
282 | extern U32 gPacketsIn; | ||
283 | extern BOOL gPrintMessagesThisFrame; | ||
284 | |||
285 | extern LLUUID gSunTextureID; | ||
286 | extern LLUUID gMoonTextureID; | ||
287 | |||
288 | extern BOOL gUseConsole; | ||
289 | |||
290 | extern BOOL gRandomizeFramerate; | ||
291 | extern BOOL gPeriodicSlowFrame; | ||
292 | |||
293 | extern BOOL gQAMode; | ||
294 | #endif // LL_LLAPPVIEWER_H | ||
diff --git a/linden/indra/newview/llappviewerlinux.cpp b/linden/indra/newview/llappviewerlinux.cpp new file mode 100644 index 0000000..1993fd0 --- /dev/null +++ b/linden/indra/newview/llappviewerlinux.cpp | |||
@@ -0,0 +1,414 @@ | |||
1 | /** | ||
2 | * @file llappviewerlinux.cpp | ||
3 | * @brief The LLAppViewerWin32 class definitions | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2007&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #include "llviewerprecompiledheaders.h" | ||
33 | |||
34 | #include "llmemtype.h" | ||
35 | #include "llappviewerlinux.h" | ||
36 | |||
37 | #include "llviewernetwork.h" | ||
38 | #include "llmd5.h" | ||
39 | |||
40 | #if LL_LINUX | ||
41 | # include <dlfcn.h> // RTLD_LAZY | ||
42 | # include <execinfo.h> // backtrace - glibc only | ||
43 | # ifndef LL_ELFBIN | ||
44 | #define LL_ELFBIN 1 | ||
45 | # endif // LL_ELFBIN | ||
46 | # if LL_ELFBIN | ||
47 | # include <cxxabi.h> // for symbol demangling | ||
48 | # include "ELFIO.h" // for better backtraces | ||
49 | # endif // LL_ELFBIN | ||
50 | #elif LL_SOLARIS | ||
51 | # include <sys/types.h> | ||
52 | # include <unistd.h> | ||
53 | # include <fcntl.h> | ||
54 | # include <ucontext.h> | ||
55 | #endif | ||
56 | |||
57 | int main( int argc, char **argv ) | ||
58 | { | ||
59 | LLMemType mt1(LLMemType::MTYPE_STARTUP); | ||
60 | |||
61 | #if LL_SOLARIS && defined(__sparc) | ||
62 | asm ("ta\t6"); // NOTE: Make sure memory alignment is enforced on SPARC | ||
63 | #endif | ||
64 | |||
65 | LLAppViewer* viewer_app_ptr = new LLAppViewerLinux(); | ||
66 | |||
67 | viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash); | ||
68 | |||
69 | bool ok = viewer_app_ptr->tempStoreCommandOptions(argc, argv); | ||
70 | if(!ok) | ||
71 | { | ||
72 | llwarns << "Unable to parse command line." << llendl; | ||
73 | return -1; | ||
74 | } | ||
75 | |||
76 | ok = viewer_app_ptr->init(); | ||
77 | if(!ok) | ||
78 | { | ||
79 | llwarns << "Application init failed." << llendl; | ||
80 | return -1; | ||
81 | } | ||
82 | |||
83 | // Run the application main loop | ||
84 | if(!LLApp::isQuitting()) | ||
85 | { | ||
86 | viewer_app_ptr->mainLoop(); | ||
87 | } | ||
88 | |||
89 | if (!LLApp::isError()) | ||
90 | { | ||
91 | // | ||
92 | // We don't want to do cleanup here if the error handler got called - | ||
93 | // the assumption is that the error handler is responsible for doing | ||
94 | // app cleanup if there was a problem. | ||
95 | // | ||
96 | viewer_app_ptr->cleanup(); | ||
97 | } | ||
98 | delete viewer_app_ptr; | ||
99 | viewer_app_ptr = NULL; | ||
100 | return 0; | ||
101 | } | ||
102 | |||
103 | #ifdef LL_SOLARIS | ||
104 | static inline BOOL do_basic_glibc_backtrace() | ||
105 | { | ||
106 | BOOL success = FALSE; | ||
107 | |||
108 | std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); | ||
109 | llinfos << "Opening stack trace file " << strace_filename << llendl; | ||
110 | FILE* StraceFile = LLFile::fopen(strace_filename.c_str(), "w"); | ||
111 | if (!StraceFile) | ||
112 | { | ||
113 | llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl; | ||
114 | StraceFile = stderr; | ||
115 | } | ||
116 | |||
117 | printstack(fileno(StraceFile)); | ||
118 | |||
119 | if (StraceFile != stderr) | ||
120 | fclose(StraceFile); | ||
121 | |||
122 | return success; | ||
123 | } | ||
124 | #else | ||
125 | #define MAX_STACK_TRACE_DEPTH 40 | ||
126 | // This uses glibc's basic built-in stack-trace functions for a not very | ||
127 | // amazing backtrace. | ||
128 | static inline BOOL do_basic_glibc_backtrace() | ||
129 | { | ||
130 | void *array[MAX_STACK_TRACE_DEPTH]; | ||
131 | size_t size; | ||
132 | char **strings; | ||
133 | size_t i; | ||
134 | BOOL success = FALSE; | ||
135 | |||
136 | size = backtrace(array, MAX_STACK_TRACE_DEPTH); | ||
137 | strings = backtrace_symbols(array, size); | ||
138 | |||
139 | std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); | ||
140 | llinfos << "Opening stack trace file " << strace_filename << llendl; | ||
141 | FILE* StraceFile = LLFile::fopen(strace_filename.c_str(), "w"); // Flawfinder: ignore | ||
142 | if (!StraceFile) | ||
143 | { | ||
144 | llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl; | ||
145 | StraceFile = stderr; | ||
146 | } | ||
147 | |||
148 | if (size) | ||
149 | { | ||
150 | for (i = 0; i < size; i++) | ||
151 | fputs((std::string(strings[i])+"\n").c_str(), | ||
152 | StraceFile); | ||
153 | |||
154 | success = TRUE; | ||
155 | } | ||
156 | |||
157 | if (StraceFile != stderr) | ||
158 | fclose(StraceFile); | ||
159 | |||
160 | free (strings); | ||
161 | return success; | ||
162 | } | ||
163 | |||
164 | #if LL_ELFBIN | ||
165 | // This uses glibc's basic built-in stack-trace functions together with | ||
166 | // ELFIO's ability to parse the .symtab ELF section for better symbol | ||
167 | // extraction without exporting symbols (which'd cause subtle, fatal bugs). | ||
168 | static inline BOOL do_elfio_glibc_backtrace() | ||
169 | { | ||
170 | void *array[MAX_STACK_TRACE_DEPTH]; | ||
171 | size_t btsize; | ||
172 | char **strings; | ||
173 | BOOL success = FALSE; | ||
174 | |||
175 | std::string appfilename = gDirUtilp->getExecutablePathAndName(); | ||
176 | |||
177 | std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); | ||
178 | llinfos << "Opening stack trace file " << strace_filename << llendl; | ||
179 | FILE* StraceFile = LLFile::fopen(strace_filename.c_str(), "w"); // Flawfinder: ignore | ||
180 | if (!StraceFile) | ||
181 | { | ||
182 | llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl; | ||
183 | StraceFile = stderr; | ||
184 | } | ||
185 | |||
186 | // get backtrace address list and basic symbol info | ||
187 | btsize = backtrace(array, MAX_STACK_TRACE_DEPTH); | ||
188 | strings = backtrace_symbols(array, btsize); | ||
189 | |||
190 | // create ELF reader for our app binary | ||
191 | IELFI* pReader; | ||
192 | const IELFISection* pSec = NULL; | ||
193 | IELFISymbolTable* pSymTbl = 0; | ||
194 | if (ERR_ELFIO_NO_ERROR != ELFIO::GetInstance()->CreateELFI(&pReader) || | ||
195 | ERR_ELFIO_NO_ERROR != pReader->Load(appfilename.c_str()) || | ||
196 | // find symbol table, create reader-object | ||
197 | NULL == (pSec = pReader->GetSection( ".symtab" )) || | ||
198 | ERR_ELFIO_NO_ERROR != pReader->CreateSectionReader(IELFI::ELFI_SYMBOL, pSec, (void**)&pSymTbl) ) | ||
199 | { | ||
200 | // Failed to open our binary and read its symbol table somehow | ||
201 | llinfos << "Could not initialize ELF symbol reading - doing basic backtrace." << llendl; | ||
202 | if (StraceFile != stderr) | ||
203 | fclose(StraceFile); | ||
204 | // note that we may be leaking some of the above ELFIO | ||
205 | // objects now, but it's expected that we'll be dead soon | ||
206 | // and we want to tread delicately until we get *some* kind | ||
207 | // of useful backtrace. | ||
208 | return do_basic_glibc_backtrace(); | ||
209 | } | ||
210 | |||
211 | // iterate over trace and symtab, looking for plausible symbols | ||
212 | std::string name; | ||
213 | Elf32_Addr value; | ||
214 | Elf32_Word ssize; | ||
215 | unsigned char bind; | ||
216 | unsigned char type; | ||
217 | Elf32_Half section; | ||
218 | int nSymNo = pSymTbl->GetSymbolNum(); | ||
219 | size_t btpos; | ||
220 | for (btpos = 0; btpos < btsize; ++btpos) | ||
221 | { | ||
222 | fprintf(StraceFile, "%d:\t", btpos); | ||
223 | int symidx; | ||
224 | for (symidx = 0; symidx < nSymNo; ++symidx) | ||
225 | { | ||
226 | if (ERR_ELFIO_NO_ERROR == | ||
227 | pSymTbl->GetSymbol(symidx, name, value, ssize, | ||
228 | bind, type, section)) | ||
229 | { | ||
230 | // check if trace address within symbol range | ||
231 | if (uintptr_t(array[btpos]) >= value && | ||
232 | uintptr_t(array[btpos]) < value+ssize) | ||
233 | { | ||
234 | char *demangled_str = NULL; | ||
235 | int demangle_result = 1; | ||
236 | demangled_str = | ||
237 | abi::__cxa_demangle | ||
238 | (name.c_str(), NULL, NULL, | ||
239 | &demangle_result); | ||
240 | if (0 == demangle_result && | ||
241 | NULL != demangled_str) { | ||
242 | fprintf(StraceFile, | ||
243 | "ELF(%s", demangled_str); | ||
244 | free(demangled_str); | ||
245 | } | ||
246 | else // failed demangle; print it raw | ||
247 | { | ||
248 | fprintf(StraceFile, | ||
249 | "ELF(%s", name.c_str()); | ||
250 | } | ||
251 | // print offset from symbol start | ||
252 | fprintf(StraceFile, | ||
253 | "+0x%lx) [%p]\n", | ||
254 | uintptr_t(array[btpos]) - | ||
255 | value, | ||
256 | array[btpos]); | ||
257 | goto got_sym; // early escape | ||
258 | } | ||
259 | } | ||
260 | } | ||
261 | // Fallback: | ||
262 | // Didn't find a suitable symbol in the binary - it's probably | ||
263 | // a symbol in a DSO; use glibc's idea of what it should be. | ||
264 | fprintf(StraceFile, "%s\n", strings[btpos]); | ||
265 | got_sym:; | ||
266 | } | ||
267 | |||
268 | if (StraceFile != stderr) | ||
269 | fclose(StraceFile); | ||
270 | |||
271 | pSymTbl->Release(); | ||
272 | pSec->Release(); | ||
273 | pReader->Release(); | ||
274 | |||
275 | free(strings); | ||
276 | |||
277 | llinfos << "Finished generating stack trace." << llendl; | ||
278 | |||
279 | success = TRUE; | ||
280 | return success; | ||
281 | } | ||
282 | #endif // LL_ELFBIN | ||
283 | |||
284 | #endif // LL_SOLARIS | ||
285 | |||
286 | |||
287 | LLAppViewerLinux::LLAppViewerLinux() | ||
288 | { | ||
289 | } | ||
290 | |||
291 | LLAppViewerLinux::~LLAppViewerLinux() | ||
292 | { | ||
293 | } | ||
294 | |||
295 | bool LLAppViewerLinux::init() | ||
296 | { | ||
297 | return LLAppViewer::init(); | ||
298 | } | ||
299 | |||
300 | void LLAppViewerLinux::handleCrashReporting() | ||
301 | { | ||
302 | |||
303 | // Always generate the report, have the logger do the asking, and | ||
304 | // don't wait for the logger before exiting (-> total cleanup). | ||
305 | if (CRASH_BEHAVIOR_NEVER_SEND != LLAppViewer::instance()->getCrashBehavior()) | ||
306 | { | ||
307 | // This backtrace writes into stack_trace.log | ||
308 | # if LL_ELFBIN | ||
309 | do_elfio_glibc_backtrace(); // more useful backtrace | ||
310 | # else | ||
311 | do_basic_glibc_backtrace(); // only slightly useful backtrace | ||
312 | # endif // LL_ELFBIN | ||
313 | // launch the actual crash logger | ||
314 | char* ask_dialog = "-dialog"; | ||
315 | if (CRASH_BEHAVIOR_ASK != LLAppViewer::instance()->getCrashBehavior()) | ||
316 | ask_dialog = ""; // omit '-dialog' option | ||
317 | std::string cmd =gDirUtilp->getAppRODataDir(); | ||
318 | cmd += gDirUtilp->getDirDelimiter(); | ||
319 | cmd += "linux-crash-logger.bin"; | ||
320 | char* const cmdargv[] = | ||
321 | {(char*)cmd.c_str(), | ||
322 | ask_dialog, | ||
323 | (char*)"-user", | ||
324 | (char*)gGridName, | ||
325 | (char*)"-name", | ||
326 | (char*)LLAppViewer::instance()->getSecondLifeTitle().c_str(), | ||
327 | NULL}; | ||
328 | pid_t pid = fork(); | ||
329 | if (pid == 0) | ||
330 | { // child | ||
331 | execv(cmd.c_str(), cmdargv); /* Flawfinder: ignore */ | ||
332 | llwarns << "execv failure when trying to start " << cmd << llendl; | ||
333 | _exit(1); // avoid atexit() | ||
334 | } | ||
335 | else | ||
336 | { | ||
337 | if (pid > 0) | ||
338 | { | ||
339 | // DO NOT wait for child proc to die; we want | ||
340 | // the logger to outlive us while we quit to | ||
341 | // free up the screen/keyboard/etc. | ||
342 | ////int childExitStatus; | ||
343 | ////waitpid(pid, &childExitStatus, 0); | ||
344 | } | ||
345 | else | ||
346 | { | ||
347 | llwarns << "fork failure." << llendl; | ||
348 | } | ||
349 | } | ||
350 | } | ||
351 | // Sometimes signals don't seem to quit the viewer. | ||
352 | // Make sure we exit so as to not totally confuse the user. | ||
353 | exit(1); | ||
354 | } | ||
355 | |||
356 | bool LLAppViewerLinux::beingDebugged() | ||
357 | { | ||
358 | static enum {unknown, no, yes} debugged = unknown; | ||
359 | |||
360 | if (debugged == unknown) | ||
361 | { | ||
362 | pid_t ppid = getppid(); | ||
363 | char *name; | ||
364 | int ret; | ||
365 | |||
366 | ret = asprintf(&name, "/proc/%d/exe", ppid); | ||
367 | if (ret != -1) | ||
368 | { | ||
369 | char buf[1024]; | ||
370 | ssize_t n; | ||
371 | |||
372 | n = readlink(name, buf, sizeof(buf) - 1); | ||
373 | if (n != -1) | ||
374 | { | ||
375 | char *base = strrchr(buf, '/'); | ||
376 | buf[n + 1] = '\0'; | ||
377 | if (base == NULL) | ||
378 | { | ||
379 | base = buf; | ||
380 | } else { | ||
381 | base += 1; | ||
382 | } | ||
383 | |||
384 | if (strcmp(base, "gdb") == 0) | ||
385 | { | ||
386 | debugged = yes; | ||
387 | } | ||
388 | } | ||
389 | free(name); | ||
390 | } | ||
391 | } | ||
392 | |||
393 | return debugged == yes; | ||
394 | } | ||
395 | |||
396 | bool LLAppViewerLinux::initLogging() | ||
397 | { | ||
398 | // Remove the last stack trace, if any | ||
399 | std::string old_stack_file = | ||
400 | gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); | ||
401 | LLFile::remove(old_stack_file.c_str()); | ||
402 | |||
403 | return LLAppViewer::initLogging(); | ||
404 | } | ||
405 | |||
406 | std::string LLAppViewerLinux::generateSerialNumber() | ||
407 | { | ||
408 | char serial_md5[MD5HEX_STR_SIZE]; | ||
409 | serial_md5[0] = 0; | ||
410 | |||
411 | // TODO | ||
412 | |||
413 | return serial_md5; | ||
414 | } | ||
diff --git a/linden/indra/newview/llappviewerlinux.h b/linden/indra/newview/llappviewerlinux.h new file mode 100644 index 0000000..f38a64a --- /dev/null +++ b/linden/indra/newview/llappviewerlinux.h | |||
@@ -0,0 +1,59 @@ | |||
1 | /** | ||
2 | * @file llappviewerlinux.h | ||
3 | * @brief The LLAppViewerLinux class declaration | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2007&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #ifndef LL_LLAPPVIEWERLINUX_H | ||
33 | #define LL_LLAPPVIEWERLINUX_H | ||
34 | |||
35 | #ifndef LL_LLAPPVIEWER_H | ||
36 | #include "llappviewer.h" | ||
37 | #endif | ||
38 | |||
39 | class LLAppViewerLinux : public LLAppViewer | ||
40 | { | ||
41 | public: | ||
42 | LLAppViewerLinux(); | ||
43 | virtual ~LLAppViewerLinux(); | ||
44 | |||
45 | // | ||
46 | // Main application logic | ||
47 | // | ||
48 | virtual bool init(); // Override to do application initialization | ||
49 | std::string generateSerialNumber(); | ||
50 | |||
51 | protected: | ||
52 | virtual bool beingDebugged(); | ||
53 | |||
54 | virtual void handleCrashReporting(); | ||
55 | |||
56 | virtual bool initLogging(); | ||
57 | }; | ||
58 | |||
59 | #endif // LL_LLAPPVIEWERLINUX_H | ||
diff --git a/linden/indra/newview/llappviewermacosx.cpp b/linden/indra/newview/llappviewermacosx.cpp new file mode 100644 index 0000000..e80491e --- /dev/null +++ b/linden/indra/newview/llappviewermacosx.cpp | |||
@@ -0,0 +1,373 @@ | |||
1 | /** | ||
2 | * @file llappviewermacosx.cpp | ||
3 | * @brief The LLAppViewerWin32 class definitions | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2007&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #include "llviewerprecompiledheaders.h" | ||
33 | |||
34 | #if !defined LL_DARWIN | ||
35 | #error "Use only with Mac OS X" | ||
36 | #endif | ||
37 | |||
38 | #include "llappviewermacosx.h" | ||
39 | #include "llmemtype.h" | ||
40 | |||
41 | #include "llviewernetwork.h" | ||
42 | #include "llmd5.h" | ||
43 | #include "llurlsimstring.h" | ||
44 | #include "llfloaterworldmap.h" | ||
45 | #include "llurldispatcher.h" | ||
46 | #include <Carbon/Carbon.h> | ||
47 | |||
48 | |||
49 | int main( int argc, char **argv ) | ||
50 | { | ||
51 | LLMemType mt1(LLMemType::MTYPE_STARTUP); | ||
52 | |||
53 | #if LL_SOLARIS && defined(__sparc) | ||
54 | asm ("ta\t6"); // NOTE: Make sure memory alignment is enforced on SPARC | ||
55 | #endif | ||
56 | |||
57 | // Set the working dir to <bundle>/Contents/Resources | ||
58 | (void) chdir(gDirUtilp->getAppRODataDir().c_str()); | ||
59 | |||
60 | LLAppViewerMacOSX* viewer_app_ptr = new LLAppViewerMacOSX(); | ||
61 | |||
62 | viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash); | ||
63 | |||
64 | bool ok = viewer_app_ptr->tempStoreCommandOptions(argc, argv); | ||
65 | if(!ok) | ||
66 | { | ||
67 | llwarns << "Unable to parse command line." << llendl; | ||
68 | return -1; | ||
69 | } | ||
70 | |||
71 | ok = viewer_app_ptr->init(); | ||
72 | if(!ok) | ||
73 | { | ||
74 | llwarns << "Application init failed." << llendl; | ||
75 | return -1; | ||
76 | } | ||
77 | |||
78 | // Run the application main loop | ||
79 | if(!LLApp::isQuitting()) | ||
80 | { | ||
81 | viewer_app_ptr->mainLoop(); | ||
82 | } | ||
83 | |||
84 | if (!LLApp::isError()) | ||
85 | { | ||
86 | // | ||
87 | // We don't want to do cleanup here if the error handler got called - | ||
88 | // the assumption is that the error handler is responsible for doing | ||
89 | // app cleanup if there was a problem. | ||
90 | // | ||
91 | viewer_app_ptr->cleanup(); | ||
92 | } | ||
93 | delete viewer_app_ptr; | ||
94 | viewer_app_ptr = NULL; | ||
95 | return 0; | ||
96 | } | ||
97 | |||
98 | LLAppViewerMacOSX::LLAppViewerMacOSX() | ||
99 | { | ||
100 | } | ||
101 | |||
102 | LLAppViewerMacOSX::~LLAppViewerMacOSX() | ||
103 | { | ||
104 | } | ||
105 | |||
106 | bool LLAppViewerMacOSX::init() | ||
107 | { | ||
108 | return LLAppViewer::init(); | ||
109 | } | ||
110 | |||
111 | void LLAppViewerMacOSX::handleCrashReporting() | ||
112 | { | ||
113 | // Macintosh | ||
114 | LLString command_str; | ||
115 | command_str = "crashreporter.app/Contents/MacOS/crashreporter "; | ||
116 | command_str += "-user "; | ||
117 | command_str += gGridName; | ||
118 | command_str += " &"; // This backgrounds the command so system() doesn't block until the crashreporter exits. | ||
119 | system(command_str.c_str()); /* Flawfinder: ignore */ | ||
120 | |||
121 | // Sometimes signals don't seem to quit the viewer. | ||
122 | // Make sure we exit so as to not totally confuse the user. | ||
123 | exit(1); | ||
124 | } | ||
125 | |||
126 | std::string LLAppViewerMacOSX::generateSerialNumber() | ||
127 | { | ||
128 | char serial_md5[MD5HEX_STR_SIZE]; // Flawfinder: ignore | ||
129 | serial_md5[0] = 0; | ||
130 | |||
131 | // JC: Sample code from http://developer.apple.com/technotes/tn/tn1103.html | ||
132 | CFStringRef serialNumber = NULL; | ||
133 | io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, | ||
134 | IOServiceMatching("IOPlatformExpertDevice")); | ||
135 | if (platformExpert) { | ||
136 | serialNumber = (CFStringRef) IORegistryEntryCreateCFProperty(platformExpert, | ||
137 | CFSTR(kIOPlatformSerialNumberKey), | ||
138 | kCFAllocatorDefault, 0); | ||
139 | IOObjectRelease(platformExpert); | ||
140 | } | ||
141 | |||
142 | if (serialNumber) | ||
143 | { | ||
144 | char buffer[MAX_STRING]; // Flawfinder: ignore | ||
145 | if (CFStringGetCString(serialNumber, buffer, MAX_STRING, kCFStringEncodingASCII)) | ||
146 | { | ||
147 | LLMD5 md5( (unsigned char*)buffer ); | ||
148 | md5.hex_digest(serial_md5); | ||
149 | } | ||
150 | CFRelease(serialNumber); | ||
151 | } | ||
152 | |||
153 | return serial_md5; | ||
154 | } | ||
155 | |||
156 | OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn) | ||
157 | { | ||
158 | OSErr result = noErr; | ||
159 | DescType actualType; | ||
160 | char buffer[1024]; // Flawfinder: ignore | ||
161 | Size size; | ||
162 | |||
163 | result = AEGetParamPtr ( | ||
164 | messagein, | ||
165 | keyDirectObject, | ||
166 | typeCString, | ||
167 | &actualType, | ||
168 | (Ptr)buffer, | ||
169 | sizeof(buffer), | ||
170 | &size); | ||
171 | |||
172 | if(result == noErr) | ||
173 | { | ||
174 | std::string url = buffer; | ||
175 | LLURLDispatcher::dispatch(url); | ||
176 | } | ||
177 | |||
178 | return(result); | ||
179 | } | ||
180 | |||
181 | OSErr AEQuitHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn) | ||
182 | { | ||
183 | OSErr result = noErr; | ||
184 | |||
185 | LLAppViewer::instance()->userQuit(); | ||
186 | |||
187 | return(result); | ||
188 | } | ||
189 | |||
190 | OSStatus simpleDialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata) | ||
191 | { | ||
192 | OSStatus result = eventNotHandledErr; | ||
193 | OSStatus err; | ||
194 | UInt32 evtClass = GetEventClass(event); | ||
195 | UInt32 evtKind = GetEventKind(event); | ||
196 | WindowRef window = (WindowRef)userdata; | ||
197 | |||
198 | if((evtClass == kEventClassCommand) && (evtKind == kEventCommandProcess)) | ||
199 | { | ||
200 | HICommand cmd; | ||
201 | err = GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(cmd), NULL, &cmd); | ||
202 | |||
203 | if(err == noErr) | ||
204 | { | ||
205 | switch(cmd.commandID) | ||
206 | { | ||
207 | case kHICommandOK: | ||
208 | QuitAppModalLoopForWindow(window); | ||
209 | result = noErr; | ||
210 | break; | ||
211 | |||
212 | case kHICommandCancel: | ||
213 | QuitAppModalLoopForWindow(window); | ||
214 | result = userCanceledErr; | ||
215 | break; | ||
216 | } | ||
217 | } | ||
218 | } | ||
219 | |||
220 | return(result); | ||
221 | } | ||
222 | |||
223 | OSStatus DisplayReleaseNotes(void) | ||
224 | { | ||
225 | OSStatus err; | ||
226 | IBNibRef nib = NULL; | ||
227 | WindowRef window = NULL; | ||
228 | |||
229 | err = CreateNibReference(CFSTR("SecondLife"), &nib); | ||
230 | |||
231 | if(err == noErr) | ||
232 | { | ||
233 | CreateWindowFromNib(nib, CFSTR("Release Notes"), &window); | ||
234 | } | ||
235 | |||
236 | if(err == noErr) | ||
237 | { | ||
238 | // Get the text view control | ||
239 | HIViewRef textView; | ||
240 | ControlID id; | ||
241 | |||
242 | id.signature = 'text'; | ||
243 | id.id = 0; | ||
244 | |||
245 | LLString releaseNotesText; | ||
246 | |||
247 | _read_file_into_string(releaseNotesText, "releasenotes.txt"); // Flawfinder: ignore | ||
248 | |||
249 | err = HIViewFindByID(HIViewGetRoot(window), id, &textView); | ||
250 | |||
251 | if(err == noErr) | ||
252 | { | ||
253 | // Convert from the encoding used in the release notes. | ||
254 | CFStringRef str = CFStringCreateWithBytes( | ||
255 | NULL, | ||
256 | (const UInt8*)releaseNotesText.c_str(), | ||
257 | releaseNotesText.size(), | ||
258 | kCFStringEncodingWindowsLatin1, // This matches the way the Windows version displays the release notes. | ||
259 | FALSE); | ||
260 | |||
261 | if(str != NULL) | ||
262 | { | ||
263 | int size = CFStringGetLength(str); | ||
264 | |||
265 | if(size > 0) | ||
266 | { | ||
267 | UniChar *chars = new UniChar[size + 1]; | ||
268 | CFStringGetCharacters(str, CFRangeMake(0, size), chars); | ||
269 | |||
270 | err = TXNSetData(HITextViewGetTXNObject(textView), kTXNUnicodeTextData, chars, size * sizeof(UniChar), kTXNStartOffset, kTXNStartOffset); | ||
271 | |||
272 | delete[] chars; | ||
273 | } | ||
274 | |||
275 | CFRelease(str); | ||
276 | } | ||
277 | else | ||
278 | { | ||
279 | // Creating the string failed. Probably an encoding problem. Display SOMETHING... | ||
280 | err = TXNSetData(HITextViewGetTXNObject(textView), kTXNTextData, releaseNotesText.c_str(), releaseNotesText.size(), kTXNStartOffset, kTXNStartOffset); | ||
281 | } | ||
282 | } | ||
283 | |||
284 | // Set the selection to the beginning of the text and scroll it into view. | ||
285 | if(err == noErr) | ||
286 | { | ||
287 | err = TXNSetSelection(HITextViewGetTXNObject(textView), kTXNStartOffset, kTXNStartOffset); | ||
288 | } | ||
289 | |||
290 | if(err == noErr) | ||
291 | { | ||
292 | // This function returns void. | ||
293 | TXNShowSelection(HITextViewGetTXNObject(textView), false); | ||
294 | } | ||
295 | } | ||
296 | |||
297 | if(err == noErr) | ||
298 | { | ||
299 | ShowWindow(window); | ||
300 | } | ||
301 | |||
302 | if(err == noErr) | ||
303 | { | ||
304 | // Set up an event handler for the window. | ||
305 | EventHandlerRef handler = NULL; | ||
306 | EventTypeSpec handlerEvents[] = | ||
307 | { | ||
308 | { kEventClassCommand, kEventCommandProcess } | ||
309 | }; | ||
310 | |||
311 | InstallWindowEventHandler( | ||
312 | window, | ||
313 | NewEventHandlerUPP(simpleDialogHandler), | ||
314 | GetEventTypeCount (handlerEvents), | ||
315 | handlerEvents, | ||
316 | (void*)window, | ||
317 | &handler); | ||
318 | } | ||
319 | |||
320 | if(err == noErr) | ||
321 | { | ||
322 | RunAppModalLoopForWindow(window); | ||
323 | } | ||
324 | |||
325 | if(window != NULL) | ||
326 | { | ||
327 | DisposeWindow(window); | ||
328 | } | ||
329 | |||
330 | if(nib != NULL) | ||
331 | { | ||
332 | DisposeNibReference(nib); | ||
333 | } | ||
334 | |||
335 | return(err); | ||
336 | } | ||
337 | |||
338 | void init_apple_menu(const char* product) | ||
339 | { | ||
340 | // Load up a proper menu bar. | ||
341 | { | ||
342 | OSStatus err; | ||
343 | IBNibRef nib = NULL; | ||
344 | // NOTE: DO NOT translate or brand this string. It's an internal name in the .nib file, and MUST match exactly. | ||
345 | err = CreateNibReference(CFSTR("SecondLife"), &nib); | ||
346 | |||
347 | if(err == noErr) | ||
348 | { | ||
349 | // NOTE: DO NOT translate or brand this string. It's an internal name in the .nib file, and MUST match exactly. | ||
350 | SetMenuBarFromNib(nib, CFSTR("MenuBar")); | ||
351 | } | ||
352 | |||
353 | if(nib != NULL) | ||
354 | { | ||
355 | DisposeNibReference(nib); | ||
356 | } | ||
357 | } | ||
358 | |||
359 | // Install a handler for 'gurl' AppleEvents. This is how secondlife:// URLs get passed to the viewer. | ||
360 | |||
361 | if(AEInstallEventHandler('GURL', 'GURL', NewAEEventHandlerUPP(AEGURLHandler),0, false) != noErr) | ||
362 | { | ||
363 | // Couldn't install AppleEvent handler. This error shouldn't be fatal. | ||
364 | llinfos << "Couldn't install 'GURL' AppleEvent handler. Continuing..." << llendl; | ||
365 | } | ||
366 | |||
367 | // Install a handler for 'quit' AppleEvents. This makes quitting the application from the dock work. | ||
368 | if(AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP(AEQuitHandler),0, false) != noErr) | ||
369 | { | ||
370 | // Couldn't install AppleEvent handler. This error shouldn't be fatal. | ||
371 | llinfos << "Couldn't install Quit AppleEvent handler. Continuing..." << llendl; | ||
372 | } | ||
373 | } | ||
diff --git a/linden/indra/newview/llappviewermacosx.h b/linden/indra/newview/llappviewermacosx.h new file mode 100644 index 0000000..2c61e5a --- /dev/null +++ b/linden/indra/newview/llappviewermacosx.h | |||
@@ -0,0 +1,56 @@ | |||
1 | /** | ||
2 | * @file llappviewermacosx.h | ||
3 | * @brief The LLAppViewerMacOSX class declaration | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2007&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #ifndef LL_LLAPPVIEWERMACOSX_H | ||
33 | #define LL_LLAPPVIEWERMACOSX_H | ||
34 | |||
35 | #ifndef LL_LLAPPVIEWER_H | ||
36 | #include "llappviewer.h" | ||
37 | #endif | ||
38 | |||
39 | class LLAppViewerMacOSX : public LLAppViewer | ||
40 | { | ||
41 | public: | ||
42 | LLAppViewerMacOSX(); | ||
43 | virtual ~LLAppViewerMacOSX(); | ||
44 | |||
45 | // | ||
46 | // Main application logic | ||
47 | // | ||
48 | virtual bool init(); // Override to do application initialization | ||
49 | |||
50 | |||
51 | protected: | ||
52 | virtual void handleCrashReporting(); | ||
53 | std::string generateSerialNumber(); | ||
54 | }; | ||
55 | |||
56 | #endif // LL_LLAPPVIEWERMACOSX_H | ||
diff --git a/linden/indra/newview/llappviewerwin32.cpp b/linden/indra/newview/llappviewerwin32.cpp new file mode 100644 index 0000000..814c209 --- /dev/null +++ b/linden/indra/newview/llappviewerwin32.cpp | |||
@@ -0,0 +1,461 @@ | |||
1 | /** | ||
2 | * @file llappviewerwin32.cpp | ||
3 | * @brief The LLAppViewerWin32 class definitions | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2007&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #include "llviewerprecompiledheaders.h" | ||
33 | |||
34 | #include "llappviewerwin32.h" | ||
35 | |||
36 | #include "llmemtype.h" | ||
37 | |||
38 | #include "llwindowwin32.cpp" // *FIX: for setting gIconResource. | ||
39 | #include "res/resource.h" // *FIX: for setting gIconResource. | ||
40 | |||
41 | #include <fcntl.h> //_O_APPEND | ||
42 | #include <io.h> //_open_osfhandle() | ||
43 | #include <errorrep.h> // for AddERExcludedApplicationA() | ||
44 | #include <process.h> // _spawnl() | ||
45 | #include <tchar.h> // For TCHAR support | ||
46 | |||
47 | #include "llviewercontrol.h" | ||
48 | #include "lldxhardware.h" | ||
49 | |||
50 | #include "llweb.h" | ||
51 | #include "llsecondlifeurls.h" | ||
52 | |||
53 | #include "llwindebug.h" | ||
54 | |||
55 | #include "llviewernetwork.h" | ||
56 | #include "llmd5.h" | ||
57 | |||
58 | void fill_args(int& argc, char** argv, const S32 max_args, LPSTR cmd_line) | ||
59 | { | ||
60 | char *token = NULL; | ||
61 | if( cmd_line[0] == '\"' ) | ||
62 | { | ||
63 | // Exe name is enclosed in quotes | ||
64 | token = strtok( cmd_line, "\"" ); | ||
65 | argv[argc++] = token; | ||
66 | token = strtok( NULL, " \t," ); | ||
67 | } | ||
68 | else | ||
69 | { | ||
70 | // Exe name is not enclosed in quotes | ||
71 | token = strtok( cmd_line, " \t," ); | ||
72 | } | ||
73 | |||
74 | while( (token != NULL) && (argc < max_args) ) | ||
75 | { | ||
76 | argv[argc++] = token; | ||
77 | /* Get next token: */ | ||
78 | if (*(token + strlen(token) + 1) == '\"') /* Flawfinder: ignore*/ | ||
79 | { | ||
80 | token = strtok( NULL, "\""); | ||
81 | } | ||
82 | else | ||
83 | { | ||
84 | token = strtok( NULL, " \t," ); | ||
85 | } | ||
86 | } | ||
87 | } | ||
88 | |||
89 | // *NOTE:Mani - this code is stolen from LLApp, where its never actually used. | ||
90 | LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop) | ||
91 | { | ||
92 | // Translate the signals/exceptions into cross-platform stuff | ||
93 | // Windows implementation | ||
94 | llinfos << "Entering Windows Exception Handler..." << llendl; | ||
95 | |||
96 | // Make sure the user sees something to indicate that the app crashed. | ||
97 | LONG retval; | ||
98 | |||
99 | if (LLApp::isError()) | ||
100 | { | ||
101 | llwarns << "Got another fatal signal while in the error handler, die now!" << llendl; | ||
102 | retval = EXCEPTION_EXECUTE_HANDLER; | ||
103 | return retval; | ||
104 | } | ||
105 | |||
106 | // Generate a minidump if we can. | ||
107 | // Before we wake the error thread... | ||
108 | // Which will start the crash reporting. | ||
109 | LLWinDebug::handleException(exception_infop); | ||
110 | |||
111 | // Flag status to error, so thread_error starts its work | ||
112 | LLApp::setError(); | ||
113 | |||
114 | // Block in the exception handler until the app has stopped | ||
115 | // This is pretty sketchy, but appears to work just fine | ||
116 | while (!LLApp::isStopped()) | ||
117 | { | ||
118 | ms_sleep(10); | ||
119 | } | ||
120 | |||
121 | // | ||
122 | // At this point, we always want to exit the app. There's no graceful | ||
123 | // recovery for an unhandled exception. | ||
124 | // | ||
125 | // Just kill the process. | ||
126 | retval = EXCEPTION_EXECUTE_HANDLER; | ||
127 | return retval; | ||
128 | } | ||
129 | |||
130 | int APIENTRY WinMain(HINSTANCE hInstance, | ||
131 | HINSTANCE hPrevInstance, | ||
132 | LPSTR lpCmdLine, | ||
133 | int nCmdShow) | ||
134 | { | ||
135 | LLMemType mt1(LLMemType::MTYPE_STARTUP); | ||
136 | |||
137 | // *FIX: global | ||
138 | gIconResource = MAKEINTRESOURCE(IDI_LL_ICON); | ||
139 | |||
140 | // In Win32, we need to generate argc and argv ourselves... | ||
141 | // Note: GetCommandLine() returns a potentially return a LPTSTR | ||
142 | // which can resolve to a LPWSTR (unicode string). | ||
143 | // (That's why it's different from lpCmdLine which is a LPSTR.) | ||
144 | // We don't currently do unicode, so call the non-unicode version | ||
145 | // directly. | ||
146 | LPSTR cmd_line_including_exe_name = GetCommandLineA(); | ||
147 | |||
148 | const S32 MAX_ARGS = 100; | ||
149 | int argc = 0; | ||
150 | char* argv[MAX_ARGS]; /* Flawfinder: ignore */ | ||
151 | |||
152 | fill_args(argc, argv, MAX_ARGS, cmd_line_including_exe_name); | ||
153 | |||
154 | LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32(); | ||
155 | |||
156 | // *FIX:Mani This method is poorly named, since the exception | ||
157 | // is now handled by LLApp. | ||
158 | bool ok = LLWinDebug::setupExceptionHandler(); | ||
159 | |||
160 | // Actually here's the exception setup. | ||
161 | LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; | ||
162 | prev_filter = SetUnhandledExceptionFilter(viewer_windows_exception_handler); | ||
163 | if (!prev_filter) | ||
164 | { | ||
165 | llwarns << "Our exception handler (" << (void *)LLWinDebug::handleException << ") replaced with NULL!" << llendl; | ||
166 | ok = FALSE; | ||
167 | } | ||
168 | if (prev_filter != LLWinDebug::handleException) | ||
169 | { | ||
170 | llwarns << "Our exception handler (" << (void *)LLWinDebug::handleException << ") replaced with " << prev_filter << "!" << llendl; | ||
171 | ok = FALSE; | ||
172 | } | ||
173 | |||
174 | viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash); | ||
175 | |||
176 | ok = viewer_app_ptr->tempStoreCommandOptions(argc, argv); | ||
177 | if(!ok) | ||
178 | { | ||
179 | llwarns << "Unable to parse command line." << llendl; | ||
180 | return -1; | ||
181 | } | ||
182 | |||
183 | ok = viewer_app_ptr->init(); | ||
184 | if(!ok) | ||
185 | { | ||
186 | llwarns << "Application init failed." << llendl; | ||
187 | return -1; | ||
188 | } | ||
189 | |||
190 | // Run the application main loop | ||
191 | if(!LLApp::isQuitting()) | ||
192 | { | ||
193 | viewer_app_ptr->mainLoop(); | ||
194 | } | ||
195 | |||
196 | if (!LLApp::isError()) | ||
197 | { | ||
198 | // | ||
199 | // We don't want to do cleanup here if the error handler got called - | ||
200 | // the assumption is that the error handler is responsible for doing | ||
201 | // app cleanup if there was a problem. | ||
202 | // | ||
203 | viewer_app_ptr->cleanup(); | ||
204 | } | ||
205 | delete viewer_app_ptr; | ||
206 | viewer_app_ptr = NULL; | ||
207 | return 0; | ||
208 | } | ||
209 | |||
210 | void LLAppViewerWin32::disableWinErrorReporting() | ||
211 | { | ||
212 | const char win_xp_string[] = "Microsoft Windows XP"; | ||
213 | BOOL is_win_xp = ( getOSInfo().getOSString().substr(0, strlen(win_xp_string) ) == win_xp_string ); /* Flawfinder: ignore*/ | ||
214 | if( is_win_xp ) | ||
215 | { | ||
216 | // Note: we need to use run-time dynamic linking, because load-time dynamic linking will fail | ||
217 | // on systems that don't have the library installed (all non-Windows XP systems) | ||
218 | HINSTANCE fault_rep_dll_handle = LoadLibrary(L"faultrep.dll"); /* Flawfinder: ignore */ | ||
219 | if( fault_rep_dll_handle ) | ||
220 | { | ||
221 | pfn_ADDEREXCLUDEDAPPLICATIONA pAddERExcludedApplicationA = (pfn_ADDEREXCLUDEDAPPLICATIONA) GetProcAddress(fault_rep_dll_handle, "AddERExcludedApplicationA"); | ||
222 | if( pAddERExcludedApplicationA ) | ||
223 | { | ||
224 | |||
225 | // Strip the path off the name | ||
226 | const char* executable_name = gDirUtilp->getExecutableFilename().c_str(); | ||
227 | |||
228 | if( 0 == pAddERExcludedApplicationA( executable_name ) ) | ||
229 | { | ||
230 | U32 error_code = GetLastError(); | ||
231 | llinfos << "AddERExcludedApplication() failed with error code " << error_code << llendl; | ||
232 | } | ||
233 | else | ||
234 | { | ||
235 | llinfos << "AddERExcludedApplication() success for " << executable_name << llendl; | ||
236 | } | ||
237 | } | ||
238 | FreeLibrary( fault_rep_dll_handle ); | ||
239 | } | ||
240 | } | ||
241 | } | ||
242 | |||
243 | const S32 MAX_CONSOLE_LINES = 500; | ||
244 | |||
245 | void create_console() | ||
246 | { | ||
247 | int h_con_handle; | ||
248 | long l_std_handle; | ||
249 | |||
250 | CONSOLE_SCREEN_BUFFER_INFO coninfo; | ||
251 | FILE *fp; | ||
252 | |||
253 | // allocate a console for this app | ||
254 | AllocConsole(); | ||
255 | |||
256 | // set the screen buffer to be big enough to let us scroll text | ||
257 | GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); | ||
258 | coninfo.dwSize.Y = MAX_CONSOLE_LINES; | ||
259 | SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); | ||
260 | |||
261 | // redirect unbuffered STDOUT to the console | ||
262 | l_std_handle = (long)GetStdHandle(STD_OUTPUT_HANDLE); | ||
263 | h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); | ||
264 | fp = _fdopen( h_con_handle, "w" ); | ||
265 | *stdout = *fp; | ||
266 | setvbuf( stdout, NULL, _IONBF, 0 ); | ||
267 | |||
268 | // redirect unbuffered STDIN to the console | ||
269 | l_std_handle = (long)GetStdHandle(STD_INPUT_HANDLE); | ||
270 | h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); | ||
271 | fp = _fdopen( h_con_handle, "r" ); | ||
272 | *stdin = *fp; | ||
273 | setvbuf( stdin, NULL, _IONBF, 0 ); | ||
274 | |||
275 | // redirect unbuffered STDERR to the console | ||
276 | l_std_handle = (long)GetStdHandle(STD_ERROR_HANDLE); | ||
277 | h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); | ||
278 | fp = _fdopen( h_con_handle, "w" ); | ||
279 | *stderr = *fp; | ||
280 | setvbuf( stderr, NULL, _IONBF, 0 ); | ||
281 | } | ||
282 | |||
283 | LLAppViewerWin32::LLAppViewerWin32() | ||
284 | { | ||
285 | } | ||
286 | |||
287 | LLAppViewerWin32::~LLAppViewerWin32() | ||
288 | { | ||
289 | } | ||
290 | |||
291 | bool LLAppViewerWin32::init() | ||
292 | { | ||
293 | // Platform specific initialization. | ||
294 | |||
295 | // Turn off Windows XP Error Reporting | ||
296 | // (Don't send our data to Microsoft--at least until we are Logo approved and have a way | ||
297 | // of getting the data back from them.) | ||
298 | // | ||
299 | llinfos << "Turning off Windows error reporting." << llendl; | ||
300 | disableWinErrorReporting(); | ||
301 | |||
302 | return LLAppViewer::init(); | ||
303 | } | ||
304 | |||
305 | bool LLAppViewerWin32::cleanup() | ||
306 | { | ||
307 | bool result = LLAppViewer::cleanup(); | ||
308 | |||
309 | gDXHardware.cleanup(); | ||
310 | |||
311 | return result; | ||
312 | } | ||
313 | |||
314 | bool LLAppViewerWin32::initWindow() | ||
315 | { | ||
316 | // pop up debug console if necessary | ||
317 | if (gUseConsole && gSavedSettings.getBOOL("ShowConsoleWindow")) | ||
318 | { | ||
319 | create_console(); | ||
320 | } | ||
321 | |||
322 | return LLAppViewer::initWindow(); | ||
323 | } | ||
324 | |||
325 | void write_debug_dx(const char* str) | ||
326 | { | ||
327 | LLString value = gDebugInfo["DXInfo"].asString(); | ||
328 | value += str; | ||
329 | gDebugInfo["DXInfo"] = value; | ||
330 | } | ||
331 | |||
332 | void write_debug_dx(const std::string& str) | ||
333 | { | ||
334 | write_debug_dx(str.c_str()); | ||
335 | } | ||
336 | |||
337 | bool LLAppViewerWin32::initHardwareTest() | ||
338 | { | ||
339 | // | ||
340 | // Do driver verification and initialization based on DirectX | ||
341 | // hardware polling and driver versions | ||
342 | // | ||
343 | if (gProbeHardware) | ||
344 | { | ||
345 | BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup"); | ||
346 | |||
347 | LLSplashScreen::update("Detecting hardware..."); | ||
348 | |||
349 | llinfos << "Attempting to poll DirectX for hardware info" << llendl; | ||
350 | gDXHardware.setWriteDebugFunc(write_debug_dx); | ||
351 | BOOL probe_ok = gDXHardware.getInfo(vram_only); | ||
352 | |||
353 | if (!probe_ok | ||
354 | && gSavedSettings.getWarning("AboutDirectX9")) | ||
355 | { | ||
356 | llinfos << "DirectX probe failed, alerting user." << llendl; | ||
357 | |||
358 | // Warn them that runnin without DirectX 9 will | ||
359 | // not allow us to tell them about driver issues | ||
360 | std::ostringstream msg; | ||
361 | msg << | ||
362 | LLAppViewer::instance()->getSecondLifeTitle() << " is unable to detect DirectX 9.0b or greater.\n" | ||
363 | "\n" << | ||
364 | LLAppViewer::instance()->getSecondLifeTitle() << " uses DirectX to detect hardware and/or\n" | ||
365 | "outdated drivers that can cause stability problems,\n" | ||
366 | "poor performance and crashes. While you can run\n" << | ||
367 | LLAppViewer::instance()->getSecondLifeTitle() << " without it, we highly recommend running\n" | ||
368 | "with DirectX 9.0b\n" | ||
369 | "\n" | ||
370 | "Do you wish to continue?\n"; | ||
371 | S32 button = OSMessageBox( | ||
372 | msg.str().c_str(), | ||
373 | "Warning", | ||
374 | OSMB_YESNO); | ||
375 | if (OSBTN_NO== button) | ||
376 | { | ||
377 | llinfos << "User quitting after failed DirectX 9 detection" << llendl; | ||
378 | LLWeb::loadURLExternal(DIRECTX_9_URL); | ||
379 | return false; | ||
380 | } | ||
381 | gSavedSettings.setWarning("AboutDirectX9", FALSE); | ||
382 | } | ||
383 | llinfos << "Done polling DirectX for hardware info" << llendl; | ||
384 | |||
385 | // Only probe once after installation | ||
386 | gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE); | ||
387 | |||
388 | // Disable so debugger can work | ||
389 | std::ostringstream splash_msg; | ||
390 | splash_msg << "Loading " << LLAppViewer::instance()->getSecondLifeTitle() << "..."; | ||
391 | |||
392 | LLSplashScreen::update(splash_msg.str().c_str()); | ||
393 | } | ||
394 | |||
395 | if (!LLWinDebug::setupExceptionHandler()) | ||
396 | { | ||
397 | llwarns << " Someone took over my exception handler (post hardware probe)!" << llendl; | ||
398 | } | ||
399 | |||
400 | gGLManager.mVRAM = gDXHardware.getVRAM(); | ||
401 | llinfos << "Detected VRAM: " << gGLManager.mVRAM << llendl; | ||
402 | |||
403 | return true; | ||
404 | } | ||
405 | |||
406 | void LLAppViewerWin32::handleCrashReporting() | ||
407 | { | ||
408 | // Windows only behaivor. Spawn win crash reporter. | ||
409 | std::string exe_path = gDirUtilp->getAppRODataDir(); | ||
410 | exe_path += gDirUtilp->getDirDelimiter(); | ||
411 | exe_path += "win_crash_logger.exe"; | ||
412 | |||
413 | std::string arg_string = "-user "; | ||
414 | arg_string += gGridName; | ||
415 | |||
416 | switch(getCrashBehavior()) | ||
417 | { | ||
418 | case CRASH_BEHAVIOR_ASK: | ||
419 | default: | ||
420 | arg_string += " -dialog "; | ||
421 | _spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL); | ||
422 | break; | ||
423 | |||
424 | case CRASH_BEHAVIOR_ALWAYS_SEND: | ||
425 | _spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL); | ||
426 | break; | ||
427 | |||
428 | case CRASH_BEHAVIOR_NEVER_SEND: | ||
429 | break; | ||
430 | } | ||
431 | } | ||
432 | |||
433 | std::string LLAppViewerWin32::generateSerialNumber() | ||
434 | { | ||
435 | char serial_md5[MD5HEX_STR_SIZE]; // Flawfinder: ignore | ||
436 | serial_md5[0] = 0; | ||
437 | |||
438 | DWORD serial = 0; | ||
439 | DWORD flags = 0; | ||
440 | BOOL success = GetVolumeInformation( | ||
441 | L"C:\\", | ||
442 | NULL, // volume name buffer | ||
443 | 0, // volume name buffer size | ||
444 | &serial, // volume serial | ||
445 | NULL, // max component length | ||
446 | &flags, // file system flags | ||
447 | NULL, // file system name buffer | ||
448 | 0); // file system name buffer size | ||
449 | if (success) | ||
450 | { | ||
451 | LLMD5 md5; | ||
452 | md5.update( (unsigned char*)&serial, sizeof(DWORD)); | ||
453 | md5.finalize(); | ||
454 | md5.hex_digest(serial_md5); | ||
455 | } | ||
456 | else | ||
457 | { | ||
458 | llwarns << "GetVolumeInformation failed" << llendl; | ||
459 | } | ||
460 | return serial_md5; | ||
461 | } \ No newline at end of file | ||
diff --git a/linden/indra/newview/llappviewerwin32.h b/linden/indra/newview/llappviewerwin32.h new file mode 100644 index 0000000..23e7337 --- /dev/null +++ b/linden/indra/newview/llappviewerwin32.h | |||
@@ -0,0 +1,63 @@ | |||
1 | /** | ||
2 | * @file llappviewerwin32.h | ||
3 | * @brief The LLAppViewerWin32 class declaration | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2007&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #ifndef LL_LLAPPVIEWERWIN32_H | ||
33 | #define LL_LLAPPVIEWERWIN32_H | ||
34 | |||
35 | #ifndef LL_LLAPPVIEWER_H | ||
36 | #include "llappviewer.h" | ||
37 | #endif | ||
38 | |||
39 | class LLAppViewerWin32 : public LLAppViewer | ||
40 | { | ||
41 | public: | ||
42 | LLAppViewerWin32(); | ||
43 | virtual ~LLAppViewerWin32(); | ||
44 | |||
45 | // | ||
46 | // Main application logic | ||
47 | // | ||
48 | virtual bool init(); // Override to do application initialization | ||
49 | virtual bool cleanup(); | ||
50 | |||
51 | protected: | ||
52 | virtual bool initWindow(); // Initialize the viewer's window. | ||
53 | virtual bool initHardwareTest(); // Win32 uses DX9 to test hardware. | ||
54 | virtual void handleCrashReporting(); | ||
55 | |||
56 | std::string generateSerialNumber(); | ||
57 | |||
58 | private: | ||
59 | void disableWinErrorReporting(); | ||
60 | |||
61 | }; | ||
62 | |||
63 | #endif // LL_LLAPPVIEWERWIN32_H | ||
diff --git a/linden/indra/newview/llassetuploadresponders.cpp b/linden/indra/newview/llassetuploadresponders.cpp index 866fa34..c3c892a 100644 --- a/linden/indra/newview/llassetuploadresponders.cpp +++ b/linden/indra/newview/llassetuploadresponders.cpp | |||
@@ -52,7 +52,6 @@ | |||
52 | #include "llviewerobjectlist.h" | 52 | #include "llviewerobjectlist.h" |
53 | #include "llviewermenufile.h" | 53 | #include "llviewermenufile.h" |
54 | #include "llviewerwindow.h" | 54 | #include "llviewerwindow.h" |
55 | #include "viewer.h" | ||
56 | 55 | ||
57 | void dialog_refresh_all(); | 56 | void dialog_refresh_all(); |
58 | 57 | ||
diff --git a/linden/indra/newview/llcallingcard.cpp b/linden/indra/newview/llcallingcard.cpp index b80c2bb..6d0244e 100644 --- a/linden/indra/newview/llcallingcard.cpp +++ b/linden/indra/newview/llcallingcard.cpp | |||
@@ -466,7 +466,7 @@ void LLAvatarTracker::findAgent() | |||
466 | msg->nextBlockFast(_PREHASH_AgentBlock); | 466 | msg->nextBlockFast(_PREHASH_AgentBlock); |
467 | msg->addUUIDFast(_PREHASH_Hunter, gAgentID); | 467 | msg->addUUIDFast(_PREHASH_Hunter, gAgentID); |
468 | msg->addUUIDFast(_PREHASH_Prey, mTrackingData->mAvatarID); | 468 | msg->addUUIDFast(_PREHASH_Prey, mTrackingData->mAvatarID); |
469 | msg->addU32Fast(_PREHASH_SpaceIP, 0); // will get filled in by userserver | 469 | msg->addU32Fast(_PREHASH_SpaceIP, 0); // will get filled in by simulator |
470 | msg->nextBlockFast(_PREHASH_LocationBlock); | 470 | msg->nextBlockFast(_PREHASH_LocationBlock); |
471 | const F64 NO_LOCATION = 0.0; | 471 | const F64 NO_LOCATION = 0.0; |
472 | msg->addF64Fast(_PREHASH_GlobalX, NO_LOCATION); | 472 | msg->addF64Fast(_PREHASH_GlobalX, NO_LOCATION); |
diff --git a/linden/indra/newview/llcameraview.cpp b/linden/indra/newview/llcameraview.cpp index 6db0f20..405e4f1 100644 --- a/linden/indra/newview/llcameraview.cpp +++ b/linden/indra/newview/llcameraview.cpp | |||
@@ -42,7 +42,7 @@ | |||
42 | #include "lljoystickbutton.h" | 42 | #include "lljoystickbutton.h" |
43 | #include "llviewercontrol.h" | 43 | #include "llviewercontrol.h" |
44 | #include "llviewerwindow.h" | 44 | #include "llviewerwindow.h" |
45 | #include "viewer.h" | 45 | #include "llappviewer.h" |
46 | 46 | ||
47 | // Constants | 47 | // Constants |
48 | const char *CAMERA_TITLE = ""; | 48 | const char *CAMERA_TITLE = ""; |
@@ -73,7 +73,7 @@ LLFloaterCamera::LLFloaterCamera(const std::string& name) | |||
73 | "cam_rotate_in.tga" ); | 73 | "cam_rotate_in.tga" ); |
74 | mRotate->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); | 74 | mRotate->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); |
75 | mRotate->setHeldDownDelay(CAMERA_BUTTON_DELAY); | 75 | mRotate->setHeldDownDelay(CAMERA_BUTTON_DELAY); |
76 | mRotate->setToolTip( "Rotate Camera Around Focus" ); | 76 | mRotate->setToolTip( LLString("Rotate Camera Around Focus" )); // *TODO: Translate |
77 | mRotate->setSoundFlags(MOUSE_DOWN | MOUSE_UP); | 77 | mRotate->setSoundFlags(MOUSE_DOWN | MOUSE_UP); |
78 | addChild(mRotate); | 78 | addChild(mRotate); |
79 | 79 | ||
@@ -88,7 +88,7 @@ LLFloaterCamera::LLFloaterCamera(const std::string& name) | |||
88 | "cam_zoom_minus_in.tga"); | 88 | "cam_zoom_minus_in.tga"); |
89 | mZoom->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); | 89 | mZoom->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); |
90 | mZoom->setHeldDownDelay(CAMERA_BUTTON_DELAY); | 90 | mZoom->setHeldDownDelay(CAMERA_BUTTON_DELAY); |
91 | mZoom->setToolTip( "Zoom Camera Towards Focus" ); | 91 | mZoom->setToolTip( LLString("Zoom Camera Towards Focus" )); // *TODO: Translate |
92 | mZoom->setSoundFlags(MOUSE_DOWN | MOUSE_UP); | 92 | mZoom->setSoundFlags(MOUSE_DOWN | MOUSE_UP); |
93 | addChild(mZoom); | 93 | addChild(mZoom); |
94 | 94 | ||
@@ -101,7 +101,7 @@ LLFloaterCamera::LLFloaterCamera(const std::string& name) | |||
101 | "cam_tracking_in.tga"); | 101 | "cam_tracking_in.tga"); |
102 | mTrack->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); | 102 | mTrack->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); |
103 | mTrack->setHeldDownDelay(CAMERA_BUTTON_DELAY); | 103 | mTrack->setHeldDownDelay(CAMERA_BUTTON_DELAY); |
104 | mTrack->setToolTip( "Move Camera Up and Down, Left and Right" ); | 104 | mTrack->setToolTip( LLString("Move Camera Up and Down, Left and Right" )); // *TODO: Translate |
105 | mTrack->setSoundFlags(MOUSE_DOWN | MOUSE_UP); | 105 | mTrack->setSoundFlags(MOUSE_DOWN | MOUSE_UP); |
106 | addChild(mTrack); | 106 | addChild(mTrack); |
107 | } | 107 | } |
diff --git a/linden/indra/newview/llclassifiedinfo.cpp b/linden/indra/newview/llclassifiedinfo.cpp index a49af23..28d5f50 100644 --- a/linden/indra/newview/llclassifiedinfo.cpp +++ b/linden/indra/newview/llclassifiedinfo.cpp | |||
@@ -32,7 +32,6 @@ | |||
32 | #include "llviewerprecompiledheaders.h" | 32 | #include "llviewerprecompiledheaders.h" |
33 | #include "llclassifiedinfo.h" | 33 | #include "llclassifiedinfo.h" |
34 | 34 | ||
35 | #include "viewer.h" // for gPacificDaylightTime | ||
36 | #include "lluuid.h" | 35 | #include "lluuid.h" |
37 | 36 | ||
38 | LLClassifiedInfo::cat_map LLClassifiedInfo::sCategories; | 37 | LLClassifiedInfo::cat_map LLClassifiedInfo::sCategories; |
diff --git a/linden/indra/newview/llcommandhandler.cpp b/linden/indra/newview/llcommandhandler.cpp index fd3aef9..95a30e8 100644 --- a/linden/indra/newview/llcommandhandler.cpp +++ b/linden/indra/newview/llcommandhandler.cpp | |||
@@ -46,7 +46,7 @@ class LLCommandHandlerRegistry | |||
46 | public: | 46 | public: |
47 | static LLCommandHandlerRegistry& instance(); | 47 | static LLCommandHandlerRegistry& instance(); |
48 | void add(const char* cmd, LLCommandHandler* handler); | 48 | void add(const char* cmd, LLCommandHandler* handler); |
49 | bool dispatch(const std::string& cmd, const std::vector<std::string>& params); | 49 | bool dispatch(const std::string& cmd, const LLSD& params, const LLSD& queryMap); |
50 | 50 | ||
51 | private: | 51 | private: |
52 | std::map<std::string, LLCommandHandler*> mMap; | 52 | std::map<std::string, LLCommandHandler*> mMap; |
@@ -68,13 +68,14 @@ void LLCommandHandlerRegistry::add(const char* cmd, LLCommandHandler* handler) | |||
68 | } | 68 | } |
69 | 69 | ||
70 | bool LLCommandHandlerRegistry::dispatch(const std::string& cmd, | 70 | bool LLCommandHandlerRegistry::dispatch(const std::string& cmd, |
71 | const std::vector<std::string>& params) | 71 | const LLSD& params, |
72 | const LLSD& queryMap) | ||
72 | { | 73 | { |
73 | std::map<std::string, LLCommandHandler*>::iterator it = mMap.find(cmd); | 74 | std::map<std::string, LLCommandHandler*>::iterator it = mMap.find(cmd); |
74 | if (it == mMap.end()) return false; | 75 | if (it == mMap.end()) return false; |
75 | LLCommandHandler* handler = it->second; | 76 | LLCommandHandler* handler = it->second; |
76 | if (!handler) return false; | 77 | if (!handler) return false; |
77 | return handler->handle(params); | 78 | return handler->handle(params, queryMap); |
78 | } | 79 | } |
79 | 80 | ||
80 | //--------------------------------------------------------------------------- | 81 | //--------------------------------------------------------------------------- |
@@ -97,7 +98,7 @@ LLCommandHandler::~LLCommandHandler() | |||
97 | //--------------------------------------------------------------------------- | 98 | //--------------------------------------------------------------------------- |
98 | 99 | ||
99 | // static | 100 | // static |
100 | bool LLCommandDispatcher::dispatch(const std::string& cmd, const std::vector<std::string>& params) | 101 | bool LLCommandDispatcher::dispatch(const std::string& cmd, const LLSD& params, const LLSD& queryMap) |
101 | { | 102 | { |
102 | return LLCommandHandlerRegistry::instance().dispatch(cmd, params); | 103 | return LLCommandHandlerRegistry::instance().dispatch(cmd, params, queryMap); |
103 | } | 104 | } |
diff --git a/linden/indra/newview/llcommandhandler.h b/linden/indra/newview/llcommandhandler.h index 50928e2..0cb9d12 100644 --- a/linden/indra/newview/llcommandhandler.h +++ b/linden/indra/newview/llcommandhandler.h | |||
@@ -44,7 +44,7 @@ public: | |||
44 | LLFooHandler() : LLCommandHandler("foo") { } | 44 | LLFooHandler() : LLCommandHandler("foo") { } |
45 | 45 | ||
46 | // Your code here | 46 | // Your code here |
47 | bool handle(const std::vector<std::string>& tokens) | 47 | bool handle(const LLSD& tokens, const LLSD& queryMap) |
48 | { | 48 | { |
49 | if (tokens.size() < 1) return false; | 49 | if (tokens.size() < 1) return false; |
50 | LLUUID id( tokens[0] ); | 50 | LLUUID id( tokens[0] ); |
@@ -65,7 +65,8 @@ public: | |||
65 | 65 | ||
66 | virtual ~LLCommandHandler(); | 66 | virtual ~LLCommandHandler(); |
67 | 67 | ||
68 | virtual bool handle(const std::vector<std::string>& params) = 0; | 68 | virtual bool handle(const LLSD& params, |
69 | const LLSD& queryMap) = 0; | ||
69 | // Execute the command with a provided (possibly empty) | 70 | // Execute the command with a provided (possibly empty) |
70 | // list of parameters. | 71 | // list of parameters. |
71 | // Return true if you did something, false if the parameters | 72 | // Return true if you did something, false if the parameters |
@@ -76,7 +77,9 @@ public: | |||
76 | class LLCommandDispatcher | 77 | class LLCommandDispatcher |
77 | { | 78 | { |
78 | public: | 79 | public: |
79 | static bool dispatch(const std::string& cmd, const std::vector<std::string>& params); | 80 | static bool dispatch(const std::string& cmd, |
81 | const LLSD& params, | ||
82 | const LLSD& queryMap); | ||
80 | // Execute a command registered via the above mechanism, | 83 | // Execute a command registered via the above mechanism, |
81 | // passing string parameters. | 84 | // passing string parameters. |
82 | // Returns true if command was found and executed correctly. | 85 | // Returns true if command was found and executed correctly. |
diff --git a/linden/indra/newview/llcompass.cpp b/linden/indra/newview/llcompass.cpp index b9e1d0e..f6df741 100644 --- a/linden/indra/newview/llcompass.cpp +++ b/linden/indra/newview/llcompass.cpp | |||
@@ -43,7 +43,6 @@ | |||
43 | #include "llagent.h" | 43 | #include "llagent.h" |
44 | #include "llcompass.h" | 44 | #include "llcompass.h" |
45 | 45 | ||
46 | #include "viewer.h" | ||
47 | #include "llviewerimage.h" | 46 | #include "llviewerimage.h" |
48 | #include "llviewerimagelist.h" | 47 | #include "llviewerimagelist.h" |
49 | #include "llviewercontrol.h" | 48 | #include "llviewercontrol.h" |
diff --git a/linden/indra/newview/llconsole.cpp b/linden/indra/newview/llconsole.cpp index 51ee1f6..5b1e88e 100644 --- a/linden/indra/newview/llconsole.cpp +++ b/linden/indra/newview/llconsole.cpp | |||
@@ -47,7 +47,6 @@ | |||
47 | #include "llmath.h" | 47 | #include "llmath.h" |
48 | 48 | ||
49 | #include "llstartup.h" | 49 | #include "llstartup.h" |
50 | #include "viewer.h" | ||
51 | 50 | ||
52 | // Used for LCD display | 51 | // Used for LCD display |
53 | extern void AddNewDebugConsoleToLCD(const LLWString &newLine); | 52 | extern void AddNewDebugConsoleToLCD(const LLWString &newLine); |
diff --git a/linden/indra/newview/llcontroldef.cpp b/linden/indra/newview/llcontroldef.cpp index 929dfe4..66b5b92 100644 --- a/linden/indra/newview/llcontroldef.cpp +++ b/linden/indra/newview/llcontroldef.cpp | |||
@@ -58,6 +58,7 @@ | |||
58 | #include "llpanelgeneral.h" | 58 | #include "llpanelgeneral.h" |
59 | #include "llpanelinput.h" | 59 | #include "llpanelinput.h" |
60 | #include "llsky.h" | 60 | #include "llsky.h" |
61 | #include "llvieweraudio.h" | ||
61 | #include "llviewerimagelist.h" | 62 | #include "llviewerimagelist.h" |
62 | #include "llviewerthrottle.h" | 63 | #include "llviewerthrottle.h" |
63 | #include "llviewerwindow.h" | 64 | #include "llviewerwindow.h" |
@@ -67,7 +68,6 @@ | |||
67 | #include "llvovolume.h" | 68 | #include "llvovolume.h" |
68 | #include "llworld.h" | 69 | #include "llworld.h" |
69 | #include "pipeline.h" | 70 | #include "pipeline.h" |
70 | #include "viewer.h" | ||
71 | #include "llviewerjoystick.h" | 71 | #include "llviewerjoystick.h" |
72 | #include "llviewerparcelmgr.h" | 72 | #include "llviewerparcelmgr.h" |
73 | #include "llparcel.h" | 73 | #include "llparcel.h" |
@@ -683,7 +683,6 @@ void declare_settings() | |||
683 | gSavedSettings.declareF32("SelectionHighlightVAnim", 0.5f, "Rate at which texture animates along V direction in selection highlight line (fraction of texture per second)"); | 683 | gSavedSettings.declareF32("SelectionHighlightVAnim", 0.5f, "Rate at which texture animates along V direction in selection highlight line (fraction of texture per second)"); |
684 | 684 | ||
685 | gSavedSettings.declareBOOL("LogMessages", FALSE, "Log network traffic"); | 685 | gSavedSettings.declareBOOL("LogMessages", FALSE, "Log network traffic"); |
686 | gSavedSettings.declareBOOL("LoggedIn", FALSE, "Login status at end of last session"); | ||
687 | gSavedSettings.declareBOOL("MouseSun", FALSE, "", NO_PERSIST); | 686 | gSavedSettings.declareBOOL("MouseSun", FALSE, "", NO_PERSIST); |
688 | 687 | ||
689 | gSavedSettings.declareBOOL("ShowAxes", FALSE, "Render coordinate frame at your position"); | 688 | gSavedSettings.declareBOOL("ShowAxes", FALSE, "Render coordinate frame at your position"); |
@@ -1111,6 +1110,7 @@ void declare_settings() | |||
1111 | gSavedSettings.declareBOOL("LoginLastLocation", TRUE, "Login at same location you last logged out"); | 1110 | gSavedSettings.declareBOOL("LoginLastLocation", TRUE, "Login at same location you last logged out"); |
1112 | gSavedSettings.declareBOOL("ShowStartLocation", FALSE, "Display starting location menu on login screen"); | 1111 | gSavedSettings.declareBOOL("ShowStartLocation", FALSE, "Display starting location menu on login screen"); |
1113 | gSavedSettings.declareBOOL("FlyingAtExit", FALSE, "Was flying when last logged out, so fly when logging in"); | 1112 | gSavedSettings.declareBOOL("FlyingAtExit", FALSE, "Was flying when last logged out, so fly when logging in"); |
1113 | gSavedSettings.declareBOOL("ForceShowGrid", FALSE, "Always show grid dropdown on login screen"); | ||
1114 | 1114 | ||
1115 | // gSavedSettings.declareString("AvatarTexture", "be20de2d-7812-4e0e-80f2-33aadf185a9f"); | 1115 | // gSavedSettings.declareString("AvatarTexture", "be20de2d-7812-4e0e-80f2-33aadf185a9f"); |
1116 | gSavedSettings.declareU32("RegionTextureSize", 256, "Terrain texture dimensions (power of 2)"); | 1116 | gSavedSettings.declareU32("RegionTextureSize", 256, "Terrain texture dimensions (power of 2)"); |
@@ -1243,7 +1243,7 @@ void declare_settings() | |||
1243 | // Secret debug stuff. | 1243 | // Secret debug stuff. |
1244 | gSavedSettings.declareBOOL("UseDebugMenus", FALSE, "Turns on \"Debug\" menu"); | 1244 | gSavedSettings.declareBOOL("UseDebugMenus", FALSE, "Turns on \"Debug\" menu"); |
1245 | gSavedSettings.declareS32("ServerChoice", 0, "[DO NOT MODIFY] Controls which grid you connect to"); | 1245 | gSavedSettings.declareS32("ServerChoice", 0, "[DO NOT MODIFY] Controls which grid you connect to"); |
1246 | gSavedSettings.declareString("CustomServer", "", "Specifies IP address or hostname of userserver to which you connect"); | 1246 | gSavedSettings.declareString("CustomServer", "", "Specifies IP address or hostname of grid to which you connect"); |
1247 | gSavedSettings.declareBOOL("UseDebugLogin", FALSE, "Provides extra control over which grid to connect to"); | 1247 | gSavedSettings.declareBOOL("UseDebugLogin", FALSE, "Provides extra control over which grid to connect to"); |
1248 | 1248 | ||
1249 | // First run is true on the first startup of a given installation. | 1249 | // First run is true on the first startup of a given installation. |
@@ -1383,8 +1383,9 @@ void declare_settings() | |||
1383 | gSavedSettings.declareString("SearchURLQuery", | 1383 | gSavedSettings.declareString("SearchURLQuery", |
1384 | "http://secondlife.com/app/search/search_proxy.php?q=[QUERY]&s=[COLLECTION]&", | 1384 | "http://secondlife.com/app/search/search_proxy.php?q=[QUERY]&s=[COLLECTION]&", |
1385 | "URL to use for searches"); | 1385 | "URL to use for searches"); |
1386 | gSavedSettings.declareString("SearchURLSuffix", | 1386 | // Version 2 added [SESSION], must invalidate old saved settings. |
1387 | "m=[MATURE]&t=[TEEN]®ion=[REGION]&x=[X]&y=[Y]&z=[Z]", | 1387 | gSavedSettings.declareString("SearchURLSuffix2", |
1388 | "m=[MATURE]&t=[TEEN]®ion=[REGION]&x=[X]&y=[Y]&z=[Z]&session=[SESSION]", | ||
1388 | "Parameters added to end of search queries"); | 1389 | "Parameters added to end of search queries"); |
1389 | 1390 | ||
1390 | // Arrow keys move avatar while in chat? | 1391 | // Arrow keys move avatar while in chat? |
diff --git a/linden/indra/newview/llcurrencyuimanager.cpp b/linden/indra/newview/llcurrencyuimanager.cpp index 1e97df0..eeb970e 100644 --- a/linden/indra/newview/llcurrencyuimanager.cpp +++ b/linden/indra/newview/llcurrencyuimanager.cpp | |||
@@ -44,8 +44,7 @@ | |||
44 | #include "lllineeditor.h" | 44 | #include "lllineeditor.h" |
45 | #include "llviewchildren.h" | 45 | #include "llviewchildren.h" |
46 | #include "llxmlrpctransaction.h" | 46 | #include "llxmlrpctransaction.h" |
47 | #include "viewer.h" | 47 | #include "llappviewer.h" |
48 | |||
49 | 48 | ||
50 | 49 | ||
51 | const F64 CURRENCY_ESTIMATE_FREQUENCY = 2.0; | 50 | const F64 CURRENCY_ESTIMATE_FREQUENCY = 2.0; |
@@ -239,7 +238,7 @@ void LLCurrencyUIManager::Impl::startTransaction(TransactionType type, | |||
239 | static std::string transactionURI; | 238 | static std::string transactionURI; |
240 | if (transactionURI.empty()) | 239 | if (transactionURI.empty()) |
241 | { | 240 | { |
242 | transactionURI = getHelperURI() + "currency.php"; | 241 | transactionURI = LLAppViewer::instance()->getHelperURI() + "currency.php"; |
243 | } | 242 | } |
244 | 243 | ||
245 | delete mTransaction; | 244 | delete mTransaction; |
diff --git a/linden/indra/newview/lldirpicker.cpp b/linden/indra/newview/lldirpicker.cpp index a63c687..3672939 100644 --- a/linden/indra/newview/lldirpicker.cpp +++ b/linden/indra/newview/lldirpicker.cpp | |||
@@ -32,7 +32,6 @@ | |||
32 | #include "llviewerprecompiledheaders.h" | 32 | #include "llviewerprecompiledheaders.h" |
33 | 33 | ||
34 | #include "lldirpicker.h" | 34 | #include "lldirpicker.h" |
35 | //#include "viewer.h" | ||
36 | //#include "llviewermessage.h" | 35 | //#include "llviewermessage.h" |
37 | #include "llworld.h" | 36 | #include "llworld.h" |
38 | #include "llviewerwindow.h" | 37 | #include "llviewerwindow.h" |
diff --git a/linden/indra/newview/lldrawable.h b/linden/indra/newview/lldrawable.h index c10c49c..52082ad 100644 --- a/linden/indra/newview/lldrawable.h +++ b/linden/indra/newview/lldrawable.h | |||
@@ -48,6 +48,7 @@ | |||
48 | #include "llstat.h" | 48 | #include "llstat.h" |
49 | #include "llviewerobject.h" | 49 | #include "llviewerobject.h" |
50 | #include "llrect.h" | 50 | #include "llrect.h" |
51 | #include "llappviewer.h" // for gFrameTimeSeconds | ||
51 | 52 | ||
52 | class LLCamera; | 53 | class LLCamera; |
53 | class LLDrawPool; | 54 | class LLDrawPool; |
@@ -59,8 +60,6 @@ class LLSpatialPartition; | |||
59 | class LLVOVolume; | 60 | class LLVOVolume; |
60 | class LLViewerImage; | 61 | class LLViewerImage; |
61 | 62 | ||
62 | extern F32 gFrameTimeSeconds; | ||
63 | |||
64 | // Can have multiple silhouettes for each object | 63 | // Can have multiple silhouettes for each object |
65 | const U32 SILHOUETTE_HIGHLIGHT = 0; | 64 | const U32 SILHOUETTE_HIGHLIGHT = 0; |
66 | 65 | ||
diff --git a/linden/indra/newview/lldrawpoolavatar.cpp b/linden/indra/newview/lldrawpoolavatar.cpp index 67a379d..9df9c11 100644 --- a/linden/indra/newview/lldrawpoolavatar.cpp +++ b/linden/indra/newview/lldrawpoolavatar.cpp | |||
@@ -45,13 +45,13 @@ | |||
45 | #include "noise.h" | 45 | #include "noise.h" |
46 | #include "pipeline.h" | 46 | #include "pipeline.h" |
47 | #include "llglslshader.h" | 47 | #include "llglslshader.h" |
48 | #include "llappviewer.h" | ||
48 | 49 | ||
49 | static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK; | 50 | static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK; |
50 | static U32 sBufferUsage = GL_STREAM_DRAW_ARB; | 51 | static U32 sBufferUsage = GL_STREAM_DRAW_ARB; |
51 | static U32 sShaderLevel = 0; | 52 | static U32 sShaderLevel = 0; |
52 | static LLGLSLShader* sVertexProgram = NULL; | 53 | static LLGLSLShader* sVertexProgram = NULL; |
53 | 54 | ||
54 | extern F32 gFrameDTClamped; | ||
55 | extern BOOL gUseGLPick; | 55 | extern BOOL gUseGLPick; |
56 | 56 | ||
57 | F32 CLOTHING_GRAVITY_EFFECT = 0.7f; | 57 | F32 CLOTHING_GRAVITY_EFFECT = 0.7f; |
diff --git a/linden/indra/newview/lldrawpoolwater.cpp b/linden/indra/newview/lldrawpoolwater.cpp index 54a33f2..4a7760f 100644 --- a/linden/indra/newview/lldrawpoolwater.cpp +++ b/linden/indra/newview/lldrawpoolwater.cpp | |||
@@ -50,7 +50,6 @@ | |||
50 | #include "llvowater.h" | 50 | #include "llvowater.h" |
51 | #include "llworld.h" | 51 | #include "llworld.h" |
52 | #include "pipeline.h" | 52 | #include "pipeline.h" |
53 | #include "viewer.h" // gSunTextureID, gMoonTextureID | ||
54 | #include "llglslshader.h" | 53 | #include "llglslshader.h" |
55 | 54 | ||
56 | const LLUUID WATER_TEST("2bfd3884-7e27-69b9-ba3a-3e673f680004"); | 55 | const LLUUID WATER_TEST("2bfd3884-7e27-69b9-ba3a-3e673f680004"); |
diff --git a/linden/indra/newview/lleventinfo.cpp b/linden/indra/newview/lleventinfo.cpp index 17b33f1..0e69891 100644 --- a/linden/indra/newview/lleventinfo.cpp +++ b/linden/indra/newview/lleventinfo.cpp | |||
@@ -32,7 +32,7 @@ | |||
32 | #include "llviewerprecompiledheaders.h" | 32 | #include "llviewerprecompiledheaders.h" |
33 | #include "lleventinfo.h" | 33 | #include "lleventinfo.h" |
34 | 34 | ||
35 | #include "viewer.h" // for gPacificDaylightTime | 35 | #include "llappviewer.h" // for gPacificDaylightTime |
36 | #include "lluuid.h" | 36 | #include "lluuid.h" |
37 | #include "message.h" | 37 | #include "message.h" |
38 | 38 | ||
diff --git a/linden/indra/newview/llfasttimerview.cpp b/linden/indra/newview/llfasttimerview.cpp index 424f47e..ee9177c 100644 --- a/linden/indra/newview/llfasttimerview.cpp +++ b/linden/indra/newview/llfasttimerview.cpp | |||
@@ -40,7 +40,7 @@ | |||
40 | #include "llmath.h" | 40 | #include "llmath.h" |
41 | #include "llfontgl.h" | 41 | #include "llfontgl.h" |
42 | 42 | ||
43 | #include "viewer.h" | 43 | #include "llappviewer.h" |
44 | #include "llviewerimagelist.h" | 44 | #include "llviewerimagelist.h" |
45 | #include "llui.h" | 45 | #include "llui.h" |
46 | #include "llviewercontrol.h" | 46 | #include "llviewercontrol.h" |
diff --git a/linden/indra/newview/llfeaturemanager.cpp b/linden/indra/newview/llfeaturemanager.cpp index 6b6eacd..1bcd1e1 100644 --- a/linden/indra/newview/llfeaturemanager.cpp +++ b/linden/indra/newview/llfeaturemanager.cpp | |||
@@ -58,8 +58,6 @@ | |||
58 | // | 58 | // |
59 | extern LLMemoryInfo gSysMemory; | 59 | extern LLMemoryInfo gSysMemory; |
60 | extern LLCPUInfo gSysCPU; | 60 | extern LLCPUInfo gSysCPU; |
61 | extern void write_debug(const char *str); | ||
62 | extern void write_debug(const std::string& str); | ||
63 | 61 | ||
64 | #if LL_DARWIN | 62 | #if LL_DARWIN |
65 | const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt"; | 63 | const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt"; |
@@ -493,8 +491,6 @@ void LLFeatureManager::initGraphicsFeatureMasks() | |||
493 | } | 491 | } |
494 | } | 492 | } |
495 | 493 | ||
496 | extern LLOSInfo gSysOS; | ||
497 | |||
498 | void LLFeatureManager::applyRecommendedFeatures() | 494 | void LLFeatureManager::applyRecommendedFeatures() |
499 | { | 495 | { |
500 | // see featuretable.txt / featuretable_linux.txt / featuretable_mac.txt | 496 | // see featuretable.txt / featuretable_linux.txt / featuretable_mac.txt |
diff --git a/linden/indra/newview/llfirstuse.cpp b/linden/indra/newview/llfirstuse.cpp index 0782586..2772a13 100644 --- a/linden/indra/newview/llfirstuse.cpp +++ b/linden/indra/newview/llfirstuse.cpp | |||
@@ -41,7 +41,7 @@ | |||
41 | #include "llfloatervoicewizard.h" | 41 | #include "llfloatervoicewizard.h" |
42 | #include "llviewercontrol.h" | 42 | #include "llviewercontrol.h" |
43 | #include "llui.h" | 43 | #include "llui.h" |
44 | #include "viewer.h" | 44 | #include "llappviewer.h" |
45 | 45 | ||
46 | // static | 46 | // static |
47 | std::set<LLString> LLFirstUse::sConfigVariables; | 47 | std::set<LLString> LLFirstUse::sConfigVariables; |
diff --git a/linden/indra/newview/llfloaterabout.cpp b/linden/indra/newview/llfloaterabout.cpp index 460b719..01e5290 100644 --- a/linden/indra/newview/llfloaterabout.cpp +++ b/linden/indra/newview/llfloaterabout.cpp | |||
@@ -47,7 +47,7 @@ | |||
47 | #include "llversionviewer.h" | 47 | #include "llversionviewer.h" |
48 | #include "llviewerbuild.h" | 48 | #include "llviewerbuild.h" |
49 | #include "llvieweruictrlfactory.h" | 49 | #include "llvieweruictrlfactory.h" |
50 | #include "viewer.h" // for gViewerDigest | 50 | #include "llappviewer.h" |
51 | 51 | ||
52 | #if LL_LIBXUL_ENABLED | 52 | #if LL_LIBXUL_ENABLED |
53 | #include "llmozlib.h" | 53 | #include "llmozlib.h" |
@@ -57,7 +57,6 @@ | |||
57 | 57 | ||
58 | extern LLCPUInfo gSysCPU; | 58 | extern LLCPUInfo gSysCPU; |
59 | extern LLMemoryInfo gSysMemory; | 59 | extern LLMemoryInfo gSysMemory; |
60 | extern LLOSInfo gSysOS; | ||
61 | extern U32 gPacketsIn; | 60 | extern U32 gPacketsIn; |
62 | 61 | ||
63 | ///---------------------------------------------------------------------------- | 62 | ///---------------------------------------------------------------------------- |
@@ -78,13 +77,13 @@ LLFloaterAbout::LLFloaterAbout() | |||
78 | 77 | ||
79 | // Support for changing product name. | 78 | // Support for changing product name. |
80 | LLString title("About "); | 79 | LLString title("About "); |
81 | title += gSecondLife; | 80 | title += LLAppViewer::instance()->getSecondLifeTitle(); |
82 | setTitle(title); | 81 | setTitle(title); |
83 | 82 | ||
84 | LLString support; | 83 | LLString support; |
85 | 84 | ||
86 | // Version string | 85 | // Version string |
87 | LLString version = gSecondLife | 86 | LLString version = LLAppViewer::instance()->getSecondLifeTitle() |
88 | + llformat(" %d.%d.%d (%d) %s %s (%s)", | 87 | + llformat(" %d.%d.%d (%d) %s %s (%s)", |
89 | LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD, | 88 | LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD, |
90 | __DATE__, __TIME__, | 89 | __DATE__, __TIME__, |
@@ -133,7 +132,7 @@ LLFloaterAbout::LLFloaterAbout() | |||
133 | support.append(mem_text); | 132 | support.append(mem_text); |
134 | 133 | ||
135 | support.append("OS Version: "); | 134 | support.append("OS Version: "); |
136 | support.append( gSysOS.getOSString().c_str() ); | 135 | support.append( LLAppViewer::instance()->getOSInfo().getOSString().c_str() ); |
137 | support.append("\n"); | 136 | support.append("\n"); |
138 | 137 | ||
139 | support.append("Graphics Card Vendor: "); | 138 | support.append("Graphics Card Vendor: "); |
diff --git a/linden/indra/newview/llfloateranimpreview.cpp b/linden/indra/newview/llfloateranimpreview.cpp index 71c2217..693ffe0 100644 --- a/linden/indra/newview/llfloateranimpreview.cpp +++ b/linden/indra/newview/llfloateranimpreview.cpp | |||
@@ -60,7 +60,6 @@ | |||
60 | #include "llviewermenufile.h" // upload_new_resource() | 60 | #include "llviewermenufile.h" // upload_new_resource() |
61 | #include "llvoavatar.h" | 61 | #include "llvoavatar.h" |
62 | #include "pipeline.h" | 62 | #include "pipeline.h" |
63 | #include "viewer.h" | ||
64 | #include "llvieweruictrlfactory.h" | 63 | #include "llvieweruictrlfactory.h" |
65 | 64 | ||
66 | S32 LLFloaterAnimPreview::sUploadAmount = 10; | 65 | S32 LLFloaterAnimPreview::sUploadAmount = 10; |
diff --git a/linden/indra/newview/llfloaterauction.cpp b/linden/indra/newview/llfloaterauction.cpp index bc00565..e044ead 100644 --- a/linden/indra/newview/llfloaterauction.cpp +++ b/linden/indra/newview/llfloaterauction.cpp | |||
@@ -50,7 +50,8 @@ | |||
50 | #include "llviewerregion.h" | 50 | #include "llviewerregion.h" |
51 | #include "llvieweruictrlfactory.h" | 51 | #include "llvieweruictrlfactory.h" |
52 | #include "llviewerwindow.h" | 52 | #include "llviewerwindow.h" |
53 | #include "viewer.h" | 53 | #include "llviewerdisplay.h" |
54 | #include "llviewercontrol.h" | ||
54 | #include "llui.h" | 55 | #include "llui.h" |
55 | 56 | ||
56 | ///---------------------------------------------------------------------------- | 57 | ///---------------------------------------------------------------------------- |
diff --git a/linden/indra/newview/llfloateravatarinfo.cpp b/linden/indra/newview/llfloateravatarinfo.cpp index 58fe1ab..a7deb6d 100644 --- a/linden/indra/newview/llfloateravatarinfo.cpp +++ b/linden/indra/newview/llfloateravatarinfo.cpp | |||
@@ -80,7 +80,7 @@ class LLAgentHandler : public LLCommandHandler | |||
80 | { | 80 | { |
81 | public: | 81 | public: |
82 | LLAgentHandler() : LLCommandHandler("agent") { } | 82 | LLAgentHandler() : LLCommandHandler("agent") { } |
83 | bool handle(const std::vector<std::string>& params) | 83 | bool handle(const LLSD& params, const LLSD& queryMap) |
84 | { | 84 | { |
85 | if (params.size() < 2) return false; | 85 | if (params.size() < 2) return false; |
86 | LLUUID agent_id; | 86 | LLUUID agent_id; |
@@ -89,7 +89,7 @@ public: | |||
89 | return false; | 89 | return false; |
90 | } | 90 | } |
91 | 91 | ||
92 | if (params[1] == "about") | 92 | if (params[1].asString() == "about") |
93 | { | 93 | { |
94 | LLFloaterAvatarInfo::show(agent_id); | 94 | LLFloaterAvatarInfo::show(agent_id); |
95 | return true; | 95 | return true; |
diff --git a/linden/indra/newview/llfloateravatarpicker.cpp b/linden/indra/newview/llfloateravatarpicker.cpp index 50f7387..a2ea8c2 100644 --- a/linden/indra/newview/llfloateravatarpicker.cpp +++ b/linden/indra/newview/llfloateravatarpicker.cpp | |||
@@ -42,7 +42,7 @@ | |||
42 | #include "llscrolllistctrl.h" | 42 | #include "llscrolllistctrl.h" |
43 | #include "lltextbox.h" | 43 | #include "lltextbox.h" |
44 | #include "llvieweruictrlfactory.h" | 44 | #include "llvieweruictrlfactory.h" |
45 | #include "viewer.h" | 45 | #include "llagent.h" |
46 | 46 | ||
47 | const S32 MIN_WIDTH = 200; | 47 | const S32 MIN_WIDTH = 200; |
48 | const S32 MIN_HEIGHT = 340; | 48 | const S32 MIN_HEIGHT = 340; |
@@ -265,13 +265,13 @@ void LLFloaterAvatarPicker::find() | |||
265 | 265 | ||
266 | msg->newMessage("AvatarPickerRequest"); | 266 | msg->newMessage("AvatarPickerRequest"); |
267 | msg->nextBlock("AgentData"); | 267 | msg->nextBlock("AgentData"); |
268 | msg->addUUID("AgentID", agent_get_id()); | 268 | msg->addUUID("AgentID", gAgent.getID()); |
269 | msg->addUUID("SessionID", agent_get_session_id()); | 269 | msg->addUUID("SessionID", gAgent.getSessionID()); |
270 | msg->addUUID("QueryID", mQueryID); // not used right now | 270 | msg->addUUID("QueryID", mQueryID); // not used right now |
271 | msg->nextBlock("Data"); | 271 | msg->nextBlock("Data"); |
272 | msg->addString("Name", text); | 272 | msg->addString("Name", text); |
273 | 273 | ||
274 | agent_send_reliable_message(); | 274 | gAgent.sendReliableMessage(); |
275 | 275 | ||
276 | if (mListNames) | 276 | if (mListNames) |
277 | { | 277 | { |
@@ -309,7 +309,7 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void* | |||
309 | msg->getUUID("AgentData", "QueryID", query_id); | 309 | msg->getUUID("AgentData", "QueryID", query_id); |
310 | 310 | ||
311 | // Not for us | 311 | // Not for us |
312 | if (agent_id != agent_get_id()) return; | 312 | if (agent_id != gAgent.getID()) return; |
313 | 313 | ||
314 | // Dialog already closed | 314 | // Dialog already closed |
315 | LLFloaterAvatarPicker *self = sInstance; | 315 | LLFloaterAvatarPicker *self = sInstance; |
diff --git a/linden/indra/newview/llfloateravatartextures.cpp b/linden/indra/newview/llfloateravatartextures.cpp index 904f47d..64dc968 100644 --- a/linden/indra/newview/llfloateravatartextures.cpp +++ b/linden/indra/newview/llfloateravatartextures.cpp | |||
@@ -110,7 +110,7 @@ static void update_texture_ctrl(LLVOAvatar* avatarp, | |||
110 | if (id == IMG_DEFAULT_AVATAR) | 110 | if (id == IMG_DEFAULT_AVATAR) |
111 | { | 111 | { |
112 | ctrl->setImageAssetID(LLUUID::null); | 112 | ctrl->setImageAssetID(LLUUID::null); |
113 | ctrl->setToolTip("IMG_DEFAULT_AVATAR"); | 113 | ctrl->setToolTip(LLString("IMG_DEFAULT_AVATAR")); |
114 | } | 114 | } |
115 | else | 115 | else |
116 | { | 116 | { |
diff --git a/linden/indra/newview/llfloaterbump.cpp b/linden/indra/newview/llfloaterbump.cpp index e891bbe..abae92a 100644 --- a/linden/indra/newview/llfloaterbump.cpp +++ b/linden/indra/newview/llfloaterbump.cpp | |||
@@ -37,7 +37,7 @@ | |||
37 | #include "llscrolllistctrl.h" | 37 | #include "llscrolllistctrl.h" |
38 | 38 | ||
39 | #include "llvieweruictrlfactory.h" | 39 | #include "llvieweruictrlfactory.h" |
40 | #include "viewer.h" // gPacificDaylightTime | 40 | #include "llappviewer.h" // gPacificDaylightTime |
41 | 41 | ||
42 | ///---------------------------------------------------------------------------- | 42 | ///---------------------------------------------------------------------------- |
43 | /// Local function declarations, constants, enums, and typedefs | 43 | /// Local function declarations, constants, enums, and typedefs |
diff --git a/linden/indra/newview/llfloaterbuycurrency.cpp b/linden/indra/newview/llfloaterbuycurrency.cpp index a7233c3..4b5bb35 100644 --- a/linden/indra/newview/llfloaterbuycurrency.cpp +++ b/linden/indra/newview/llfloaterbuycurrency.cpp | |||
@@ -43,7 +43,7 @@ | |||
43 | #include "llvieweruictrlfactory.h" | 43 | #include "llvieweruictrlfactory.h" |
44 | #include "llweb.h" | 44 | #include "llweb.h" |
45 | #include "llwindow.h" | 45 | #include "llwindow.h" |
46 | #include "viewer.h" | 46 | #include "llappviewer.h" |
47 | 47 | ||
48 | static const S32 STANDARD_BUY_AMOUNT = 1000; | 48 | static const S32 STANDARD_BUY_AMOUNT = 1000; |
49 | static const S32 MINIMUM_BALANCE_AMOUNT = 0; | 49 | static const S32 MINIMUM_BALANCE_AMOUNT = 0; |
diff --git a/linden/indra/newview/llfloaterbuyland.cpp b/linden/indra/newview/llfloaterbuyland.cpp index 9ae634c..12722b6 100644 --- a/linden/indra/newview/llfloaterbuyland.cpp +++ b/linden/indra/newview/llfloaterbuyland.cpp | |||
@@ -62,7 +62,7 @@ | |||
62 | #include "llwindow.h" | 62 | #include "llwindow.h" |
63 | #include "llworld.h" | 63 | #include "llworld.h" |
64 | #include "llxmlrpctransaction.h" | 64 | #include "llxmlrpctransaction.h" |
65 | #include "viewer.h" | 65 | #include "llappviewer.h" |
66 | #include "roles_constants.h" | 66 | #include "roles_constants.h" |
67 | 67 | ||
68 | // NOTE: This is duplicated in lldatamoney.cpp ... | 68 | // NOTE: This is duplicated in lldatamoney.cpp ... |
@@ -847,7 +847,7 @@ void LLFloaterBuyLandUI::startTransaction(TransactionType type, | |||
847 | static std::string transaction_uri; | 847 | static std::string transaction_uri; |
848 | if (transaction_uri.empty()) | 848 | if (transaction_uri.empty()) |
849 | { | 849 | { |
850 | transaction_uri = getHelperURI() + "landtool.php"; | 850 | transaction_uri = LLAppViewer::instance()->getHelperURI() + "landtool.php"; |
851 | } | 851 | } |
852 | 852 | ||
853 | const char* method; | 853 | const char* method; |
diff --git a/linden/indra/newview/llfloaterclassified.cpp b/linden/indra/newview/llfloaterclassified.cpp index aa57c6f..cc5ee59 100644 --- a/linden/indra/newview/llfloaterclassified.cpp +++ b/linden/indra/newview/llfloaterclassified.cpp | |||
@@ -46,7 +46,7 @@ class LLClassifiedHandler : public LLCommandHandler | |||
46 | { | 46 | { |
47 | public: | 47 | public: |
48 | LLClassifiedHandler() : LLCommandHandler("classified") { } | 48 | LLClassifiedHandler() : LLCommandHandler("classified") { } |
49 | bool handle(const std::vector<std::string>& tokens) | 49 | bool handle(const LLSD& tokens, const LLSD& queryMap) |
50 | { | 50 | { |
51 | if (tokens.size() < 2) | 51 | if (tokens.size() < 2) |
52 | { | 52 | { |
@@ -58,7 +58,7 @@ public: | |||
58 | return false; | 58 | return false; |
59 | } | 59 | } |
60 | 60 | ||
61 | if (tokens[1] == "about") | 61 | if (tokens[1].asString() == "about") |
62 | { | 62 | { |
63 | LLFloaterClassifiedInfo::show(classified_id); | 63 | LLFloaterClassifiedInfo::show(classified_id); |
64 | return true; | 64 | return true; |
diff --git a/linden/indra/newview/llfloatercolorpicker.cpp b/linden/indra/newview/llfloatercolorpicker.cpp index 03e3a2e..324da68 100644 --- a/linden/indra/newview/llfloatercolorpicker.cpp +++ b/linden/indra/newview/llfloatercolorpicker.cpp | |||
@@ -46,7 +46,6 @@ | |||
46 | #include "v4coloru.h" | 46 | #include "v4coloru.h" |
47 | #include "llbutton.h" | 47 | #include "llbutton.h" |
48 | #include "llviewercontrol.h" | 48 | #include "llviewercontrol.h" |
49 | #include "viewer.h" | ||
50 | #include "llvieweruictrlfactory.h" | 49 | #include "llvieweruictrlfactory.h" |
51 | #include "llviewerwindow.h" | 50 | #include "llviewerwindow.h" |
52 | #include "llgl.h" | 51 | #include "llgl.h" |
diff --git a/linden/indra/newview/llfloaterdirectory.cpp b/linden/indra/newview/llfloaterdirectory.cpp index 1693532..f453794 100644 --- a/linden/indra/newview/llfloaterdirectory.cpp +++ b/linden/indra/newview/llfloaterdirectory.cpp | |||
@@ -65,6 +65,10 @@ | |||
65 | #include "llvieweruictrlfactory.h" | 65 | #include "llvieweruictrlfactory.h" |
66 | 66 | ||
67 | LLFloaterDirectory* LLFloaterDirectory::sInstance = NULL; | 67 | LLFloaterDirectory* LLFloaterDirectory::sInstance = NULL; |
68 | //static | ||
69 | S32 LLFloaterDirectory::sOldSearchCount = 0; // debug | ||
70 | S32 LLFloaterDirectory::sNewSearchCount = 0; // debug | ||
71 | |||
68 | 72 | ||
69 | LLFloaterDirectory::LLFloaterDirectory(const std::string& name) | 73 | LLFloaterDirectory::LLFloaterDirectory(const std::string& name) |
70 | : LLFloater(name, "FloaterFindRect2", ""), | 74 | : LLFloater(name, "FloaterFindRect2", ""), |
diff --git a/linden/indra/newview/llfloaterdirectory.h b/linden/indra/newview/llfloaterdirectory.h index 4b0d81e..b7193b3 100644 --- a/linden/indra/newview/llfloaterdirectory.h +++ b/linden/indra/newview/llfloaterdirectory.h | |||
@@ -33,6 +33,7 @@ | |||
33 | #define LL_LLFLOATERDIRECTORY_H | 33 | #define LL_LLFLOATERDIRECTORY_H |
34 | 34 | ||
35 | #include "llfloater.h" | 35 | #include "llfloater.h" |
36 | #include "lltabcontainer.h" | ||
36 | 37 | ||
37 | class LLDirectoryCore; | 38 | class LLDirectoryCore; |
38 | class LLPanelDirBrowser; | 39 | class LLPanelDirBrowser; |
@@ -128,6 +129,9 @@ public: | |||
128 | LLPanelPlace* mPanelPlaceSmallp; | 129 | LLPanelPlace* mPanelPlaceSmallp; |
129 | LLPanelClassified* mPanelClassifiedp; | 130 | LLPanelClassified* mPanelClassifiedp; |
130 | 131 | ||
132 | static S32 sOldSearchCount; // debug | ||
133 | static S32 sNewSearchCount; // debug | ||
134 | |||
131 | private: | 135 | private: |
132 | bool mMinimizing; // HACK: see reshape() for details | 136 | bool mMinimizing; // HACK: see reshape() for details |
133 | static LLFloaterDirectory *sInstance; | 137 | static LLFloaterDirectory *sInstance; |
diff --git a/linden/indra/newview/llfloaterevent.cpp b/linden/indra/newview/llfloaterevent.cpp index d237fc9..9ef18cd 100644 --- a/linden/indra/newview/llfloaterevent.cpp +++ b/linden/indra/newview/llfloaterevent.cpp | |||
@@ -47,14 +47,14 @@ class LLEventHandler : public LLCommandHandler | |||
47 | { | 47 | { |
48 | public: | 48 | public: |
49 | LLEventHandler() : LLCommandHandler("event") { } | 49 | LLEventHandler() : LLCommandHandler("event") { } |
50 | bool handle(const std::vector<std::string>& tokens) | 50 | bool handle(const LLSD& tokens, const LLSD& queryMap) |
51 | { | 51 | { |
52 | if (tokens.size() < 2) | 52 | if (tokens.size() < 2) |
53 | { | 53 | { |
54 | return false; | 54 | return false; |
55 | } | 55 | } |
56 | U32 event_id = atoi(tokens[0].c_str()); | 56 | U32 event_id = tokens[0].asInteger(); |
57 | if (tokens[1] == "about") | 57 | if (tokens[1].asString() == "about") |
58 | { | 58 | { |
59 | LLFloaterEventInfo::show(event_id); | 59 | LLFloaterEventInfo::show(event_id); |
60 | return true; | 60 | return true; |
diff --git a/linden/indra/newview/llfloaterfriends.cpp b/linden/indra/newview/llfloaterfriends.cpp index 6f792e0..6f4945e 100644 --- a/linden/indra/newview/llfloaterfriends.cpp +++ b/linden/indra/newview/llfloaterfriends.cpp | |||
@@ -61,19 +61,43 @@ | |||
61 | //Maximum number of people you can select to do an operation on at once. | 61 | //Maximum number of people you can select to do an operation on at once. |
62 | #define MAX_FRIEND_SELECT 20 | 62 | #define MAX_FRIEND_SELECT 20 |
63 | #define RIGHTS_CHANGE_TIMEOUT 5.0 | 63 | #define RIGHTS_CHANGE_TIMEOUT 5.0 |
64 | #define OBSERVER_TIMEOUT 0.5 | ||
64 | 65 | ||
65 | // simple class to observe the calling cards. | 66 | // simple class to observe the calling cards. |
66 | class LLLocalFriendsObserver : public LLFriendObserver | 67 | class LLLocalFriendsObserver : public LLFriendObserver, public LLEventTimer |
67 | { | 68 | { |
68 | public: | 69 | public: |
69 | LLLocalFriendsObserver(LLPanelFriends* floater) : mFloater(floater) {} | 70 | LLLocalFriendsObserver(LLPanelFriends* floater) : mFloater(floater), LLEventTimer(OBSERVER_TIMEOUT) |
70 | virtual ~LLLocalFriendsObserver() { mFloater = NULL; } | 71 | { |
72 | mEventTimer.stop(); | ||
73 | } | ||
74 | virtual ~LLLocalFriendsObserver() | ||
75 | { | ||
76 | mFloater = NULL; | ||
77 | } | ||
71 | virtual void changed(U32 mask) | 78 | virtual void changed(U32 mask) |
72 | { | 79 | { |
73 | mFloater->updateFriends(mask); | 80 | // events can arrive quickly in bulk - we need not process EVERY one of them - |
81 | // so we wait a short while to let others pile-in, and process them in aggregate. | ||
82 | mEventTimer.start(); | ||
83 | mEventTimer.reset(); | ||
84 | |||
85 | // save-up all the mask-bits which have come-in | ||
86 | mMask |= mask; | ||
87 | } | ||
88 | virtual BOOL tick() | ||
89 | { | ||
90 | mFloater->updateFriends(mMask); | ||
91 | |||
92 | mEventTimer.stop(); | ||
93 | mMask = 0; | ||
94 | |||
95 | return FALSE; | ||
74 | } | 96 | } |
97 | |||
75 | protected: | 98 | protected: |
76 | LLPanelFriends* mFloater; | 99 | LLPanelFriends* mFloater; |
100 | U32 mMask; | ||
77 | }; | 101 | }; |
78 | 102 | ||
79 | LLPanelFriends::LLPanelFriends() : | 103 | LLPanelFriends::LLPanelFriends() : |
diff --git a/linden/indra/newview/llfloatergroupinfo.cpp b/linden/indra/newview/llfloatergroupinfo.cpp index eb3b692..b274a51 100644 --- a/linden/indra/newview/llfloatergroupinfo.cpp +++ b/linden/indra/newview/llfloatergroupinfo.cpp | |||
@@ -56,7 +56,7 @@ class LLGroupHandler : public LLCommandHandler | |||
56 | { | 56 | { |
57 | public: | 57 | public: |
58 | LLGroupHandler() : LLCommandHandler("group") { } | 58 | LLGroupHandler() : LLCommandHandler("group") { } |
59 | bool handle(const std::vector<std::string>& tokens) | 59 | bool handle(const LLSD& tokens, const LLSD& queryMap) |
60 | { | 60 | { |
61 | if (tokens.size() < 2) | 61 | if (tokens.size() < 2) |
62 | { | 62 | { |
@@ -69,7 +69,7 @@ public: | |||
69 | return false; | 69 | return false; |
70 | } | 70 | } |
71 | 71 | ||
72 | if (tokens[1] == "about") | 72 | if (tokens[1].asString() == "about") |
73 | { | 73 | { |
74 | LLFloaterGroupInfo::showFromUUID(group_id); | 74 | LLFloaterGroupInfo::showFromUUID(group_id); |
75 | return true; | 75 | return true; |
diff --git a/linden/indra/newview/llfloaterimagepreview.cpp b/linden/indra/newview/llfloaterimagepreview.cpp index c24d435..53779b6 100644 --- a/linden/indra/newview/llfloaterimagepreview.cpp +++ b/linden/indra/newview/llfloaterimagepreview.cpp | |||
@@ -51,7 +51,6 @@ | |||
51 | #include "llviewerwindow.h" | 51 | #include "llviewerwindow.h" |
52 | #include "llvoavatar.h" | 52 | #include "llvoavatar.h" |
53 | #include "pipeline.h" | 53 | #include "pipeline.h" |
54 | #include "viewer.h" | ||
55 | #include "llvieweruictrlfactory.h" | 54 | #include "llvieweruictrlfactory.h" |
56 | #include "llviewerimagelist.h" | 55 | #include "llviewerimagelist.h" |
57 | 56 | ||
diff --git a/linden/indra/newview/llfloaterimport.cpp b/linden/indra/newview/llfloaterimport.cpp index 4923497..edb1edb 100644 --- a/linden/indra/newview/llfloaterimport.cpp +++ b/linden/indra/newview/llfloaterimport.cpp | |||
@@ -57,7 +57,6 @@ | |||
57 | #include "llviewerwindow.h" | 57 | #include "llviewerwindow.h" |
58 | #include "llvoavatar.h" | 58 | #include "llvoavatar.h" |
59 | #include "pipeline.h" | 59 | #include "pipeline.h" |
60 | #include "viewer.h" | ||
61 | #include "llvieweruictrlfactory.h" | 60 | #include "llvieweruictrlfactory.h" |
62 | #include "llmd5.h" | 61 | #include "llmd5.h" |
63 | 62 | ||
diff --git a/linden/indra/newview/llfloaterlagmeter.cpp b/linden/indra/newview/llfloaterlagmeter.cpp index 399d0b6..04a5cf6 100644 --- a/linden/indra/newview/llfloaterlagmeter.cpp +++ b/linden/indra/newview/llfloaterlagmeter.cpp | |||
@@ -37,7 +37,8 @@ | |||
37 | #include "llviewerstats.h" | 37 | #include "llviewerstats.h" |
38 | #include "llviewerimage.h" | 38 | #include "llviewerimage.h" |
39 | #include "llviewercontrol.h" | 39 | #include "llviewercontrol.h" |
40 | #include "viewer.h" | 40 | #include "llappviewer.h" |
41 | |||
41 | #include "lltexturefetch.h" | 42 | #include "lltexturefetch.h" |
42 | 43 | ||
43 | #include "llbutton.h" | 44 | #include "llbutton.h" |
@@ -189,7 +190,7 @@ void LLFloaterLagMeter::determineClient() | |||
189 | { | 190 | { |
190 | mClientCause->setText( childGetText("client_draw_distance_cause_msg") ); | 191 | mClientCause->setText( childGetText("client_draw_distance_cause_msg") ); |
191 | } | 192 | } |
192 | else if(gTextureFetch->getNumRequests() > 2) | 193 | else if(LLAppViewer::instance()->getTextureFetch()->getNumRequests() > 2) |
193 | { | 194 | { |
194 | mClientCause->setText( childGetText("client_texture_loading_cause_msg") ); | 195 | mClientCause->setText( childGetText("client_texture_loading_cause_msg") ); |
195 | } | 196 | } |
diff --git a/linden/indra/newview/llfloaterland.cpp b/linden/indra/newview/llfloaterland.cpp index 283b3f4..543dd94 100644 --- a/linden/indra/newview/llfloaterland.cpp +++ b/linden/indra/newview/llfloaterland.cpp | |||
@@ -239,7 +239,6 @@ LLFloaterLand::LLFloaterLand() | |||
239 | factory_map["land_options_panel"] = LLCallbackMap(createPanelLandOptions, this); | 239 | factory_map["land_options_panel"] = LLCallbackMap(createPanelLandOptions, this); |
240 | factory_map["land_media_panel"] = LLCallbackMap(createPanelLandMedia, this); | 240 | factory_map["land_media_panel"] = LLCallbackMap(createPanelLandMedia, this); |
241 | factory_map["land_access_panel"] = LLCallbackMap(createPanelLandAccess, this); | 241 | factory_map["land_access_panel"] = LLCallbackMap(createPanelLandAccess, this); |
242 | factory_map["land_ban_panel"] = LLCallbackMap(createPanelLandBan, this); | ||
243 | 242 | ||
244 | gUICtrlFactory->buildFloater(this, "floater_about_land.xml", &factory_map); | 243 | gUICtrlFactory->buildFloater(this, "floater_about_land.xml", &factory_map); |
245 | 244 | ||
@@ -271,7 +270,6 @@ void LLFloaterLand::refresh() | |||
271 | mPanelOptions->refresh(); | 270 | mPanelOptions->refresh(); |
272 | mPanelMedia->refresh(); | 271 | mPanelMedia->refresh(); |
273 | mPanelAccess->refresh(); | 272 | mPanelAccess->refresh(); |
274 | mPanelBan->refresh(); | ||
275 | } | 273 | } |
276 | 274 | ||
277 | 275 | ||
@@ -326,15 +324,6 @@ void* LLFloaterLand::createPanelLandAccess(void* data) | |||
326 | return self->mPanelAccess; | 324 | return self->mPanelAccess; |
327 | } | 325 | } |
328 | 326 | ||
329 | // static | ||
330 | void* LLFloaterLand::createPanelLandBan(void* data) | ||
331 | { | ||
332 | LLFloaterLand* self = (LLFloaterLand*)data; | ||
333 | self->mPanelBan = new LLPanelLandBan(self->mParcel); | ||
334 | return self->mPanelBan; | ||
335 | } | ||
336 | |||
337 | |||
338 | //--------------------------------------------------------------------------- | 327 | //--------------------------------------------------------------------------- |
339 | // LLPanelLandGeneral | 328 | // LLPanelLandGeneral |
340 | //--------------------------------------------------------------------------- | 329 | //--------------------------------------------------------------------------- |
@@ -2558,35 +2547,27 @@ LLPanelLandAccess::LLPanelLandAccess(LLParcelSelectionHandle& parcel) | |||
2558 | 2547 | ||
2559 | BOOL LLPanelLandAccess::postBuild() | 2548 | BOOL LLPanelLandAccess::postBuild() |
2560 | { | 2549 | { |
2561 | 2550 | childSetCommitCallback("public_access", onCommitAny, this); | |
2562 | 2551 | childSetCommitCallback("limit_payment", onCommitAny, this); | |
2563 | mCheckGroup = LLUICtrlFactory::getCheckBoxByName(this, "GroupCheck"); | 2552 | childSetCommitCallback("limit_age_verified", onCommitAny, this); |
2564 | childSetCommitCallback("GroupCheck", onCommitAny, this); | 2553 | childSetCommitCallback("GroupCheck", onCommitAny, this); |
2565 | |||
2566 | mCheckAccess = LLUICtrlFactory::getCheckBoxByName(this, "AccessCheck"); | ||
2567 | childSetCommitCallback("AccessCheck", onCommitAny, this); | ||
2568 | |||
2569 | mListAccess = LLUICtrlFactory::getNameListByName(this, "AccessList"); | ||
2570 | mListAccess->sortByColumn(0, TRUE); // ascending | ||
2571 | |||
2572 | mBtnAddAccess = LLUICtrlFactory::getButtonByName(this, "Add..."); | ||
2573 | |||
2574 | mBtnAddAccess->setClickedCallback(onClickAdd, this); | ||
2575 | |||
2576 | mBtnRemoveAccess = LLUICtrlFactory::getButtonByName(this, "Remove"); | ||
2577 | |||
2578 | mBtnRemoveAccess->setClickedCallback(onClickRemove, this); | ||
2579 | |||
2580 | mCheckPass = LLUICtrlFactory::getCheckBoxByName(this, "PassCheck"); | ||
2581 | childSetCommitCallback("PassCheck", onCommitAny, this); | 2554 | childSetCommitCallback("PassCheck", onCommitAny, this); |
2582 | 2555 | childSetCommitCallback("pass_combo", onCommitAny, this); | |
2583 | |||
2584 | mSpinPrice = LLUICtrlFactory::getSpinnerByName(this, "PriceSpin"); | ||
2585 | childSetCommitCallback("PriceSpin", onCommitAny, this); | 2556 | childSetCommitCallback("PriceSpin", onCommitAny, this); |
2586 | |||
2587 | mSpinHours = LLUICtrlFactory::getSpinnerByName(this, "HoursSpin"); | ||
2588 | childSetCommitCallback("HoursSpin", onCommitAny, this); | 2557 | childSetCommitCallback("HoursSpin", onCommitAny, this); |
2589 | 2558 | ||
2559 | childSetAction("add_allowed", onClickAddAccess, this); | ||
2560 | childSetAction("remove_allowed", onClickRemoveAccess, this); | ||
2561 | childSetAction("add_banned", onClickAddBanned, this); | ||
2562 | childSetAction("remove_banned", onClickRemoveBanned, this); | ||
2563 | |||
2564 | mListAccess = LLUICtrlFactory::getNameListByName(this, "AccessList"); | ||
2565 | if (mListAccess) | ||
2566 | mListAccess->sortByColumn(0, TRUE); // ascending | ||
2567 | |||
2568 | mListBanned = LLUICtrlFactory::getNameListByName(this, "BannedList"); | ||
2569 | if (mListBanned) | ||
2570 | mListBanned->sortByColumn(0, TRUE); // ascending | ||
2590 | 2571 | ||
2591 | return TRUE; | 2572 | return TRUE; |
2592 | } | 2573 | } |
@@ -2598,106 +2579,241 @@ LLPanelLandAccess::~LLPanelLandAccess() | |||
2598 | 2579 | ||
2599 | void LLPanelLandAccess::refresh() | 2580 | void LLPanelLandAccess::refresh() |
2600 | { | 2581 | { |
2601 | mListAccess->deleteAllItems(); | 2582 | if (mListAccess) |
2602 | 2583 | mListAccess->deleteAllItems(); | |
2584 | if (mListBanned) | ||
2585 | mListBanned->deleteAllItems(); | ||
2586 | |||
2603 | LLParcel *parcel = mParcel->getParcel(); | 2587 | LLParcel *parcel = mParcel->getParcel(); |
2604 | 2588 | ||
2589 | // Display options | ||
2605 | if (parcel) | 2590 | if (parcel) |
2606 | { | 2591 | { |
2607 | // Display options | 2592 | BOOL use_access_list = parcel->getParcelFlag(PF_USE_ACCESS_LIST); |
2608 | BOOL use_group = parcel->getParcelFlag(PF_USE_ACCESS_GROUP); | 2593 | BOOL use_group = parcel->getParcelFlag(PF_USE_ACCESS_GROUP); |
2609 | mCheckGroup->set( use_group ); | 2594 | BOOL public_access = !use_access_list && !use_group; |
2595 | |||
2596 | childSetValue("public_access", public_access ); | ||
2597 | childSetValue("GroupCheck", use_group ); | ||
2610 | 2598 | ||
2611 | char group_name[MAX_STRING]; /*Flawfinder: ignore*/ | 2599 | char group_name[MAX_STRING]; /*Flawfinder: ignore*/ |
2612 | gCacheName->getGroupName(parcel->getGroupID(), group_name); | 2600 | gCacheName->getGroupName(parcel->getGroupID(), group_name); |
2613 | mCheckGroup->setLabelArg( "[GROUP]", LLString(group_name) ); | 2601 | childSetLabelArg("GroupCheck", "[GROUP]", LLString(group_name) ); |
2614 | 2602 | ||
2615 | S32 count = parcel->mAccessList.size(); | 2603 | // Allow list |
2616 | |||
2617 | BOOL use_list = parcel->getParcelFlag(PF_USE_ACCESS_LIST); | ||
2618 | mCheckAccess->set( use_list ); | ||
2619 | mCheckAccess->setLabelArg( "[LISTED]", llformat("%d",count)); | ||
2620 | mCheckAccess->setLabelArg( "[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST)); | ||
2621 | |||
2622 | access_map_const_iterator cit = parcel->mAccessList.begin(); | ||
2623 | access_map_const_iterator end = parcel->mAccessList.end(); | ||
2624 | |||
2625 | for (; cit != end; ++cit) | ||
2626 | { | 2604 | { |
2627 | const LLAccessEntry& entry = (*cit).second; | 2605 | S32 count = parcel->mAccessList.size(); |
2628 | LLString suffix; | 2606 | childSetToolTipArg("AccessList", "[LISTED]", llformat("%d",count)); |
2629 | if (entry.mTime != 0) | 2607 | childSetToolTipArg("AccessList", "[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST)); |
2608 | |||
2609 | // *TODO: Translate | ||
2610 | for (access_map_const_iterator cit = parcel->mAccessList.begin(); | ||
2611 | cit != parcel->mAccessList.end(); ++cit) | ||
2630 | { | 2612 | { |
2631 | S32 now = time(NULL); | 2613 | const LLAccessEntry& entry = (*cit).second; |
2632 | S32 seconds = entry.mTime - now; | 2614 | LLString suffix; |
2633 | if (seconds < 0) seconds = 0; | 2615 | if (entry.mTime != 0) |
2634 | suffix.assign(" ("); | ||
2635 | if (seconds >= 120) | ||
2636 | { | 2616 | { |
2637 | char buf[30]; /*Flawfinder: ignore*/ | 2617 | S32 now = time(NULL); |
2638 | snprintf(buf, sizeof(buf), "%d minutes", (seconds/60)); /* Flawfinder: ignore */ | 2618 | S32 seconds = entry.mTime - now; |
2639 | suffix.append(buf); | 2619 | if (seconds < 0) seconds = 0; |
2620 | suffix.assign(" ("); | ||
2621 | if (seconds >= 120) | ||
2622 | { | ||
2623 | std::string buf = llformat("%d minutes", (seconds/60)); | ||
2624 | suffix.append(buf); | ||
2625 | } | ||
2626 | else if (seconds >= 60) | ||
2627 | { | ||
2628 | suffix.append("1 minute"); | ||
2629 | } | ||
2630 | else | ||
2631 | { | ||
2632 | std::string buf = llformat("%d seconds", seconds); | ||
2633 | suffix.append(buf); | ||
2634 | } | ||
2635 | suffix.append(" remaining)"); | ||
2640 | } | 2636 | } |
2641 | else if (seconds >= 60) | 2637 | if (mListAccess) |
2642 | { | 2638 | mListAccess->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix); |
2643 | suffix.append("1 minute"); | ||
2644 | } | ||
2645 | else | ||
2646 | { | ||
2647 | char buf[30]; /*Flawfinder: ignore*/ | ||
2648 | snprintf(buf, sizeof(buf), "%d seconds", seconds); /* Flawfinder: ignore */ | ||
2649 | suffix.append(buf); | ||
2650 | } | ||
2651 | suffix.append(" remaining)"); | ||
2652 | } | 2639 | } |
2653 | mListAccess->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix); | ||
2654 | } | 2640 | } |
2655 | 2641 | ||
2656 | BOOL can_manage_allowed = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_ALLOWED); | 2642 | // Ban List |
2657 | 2643 | { | |
2658 | BOOL enable_add = can_manage_allowed && (count < PARCEL_MAX_ACCESS_LIST); | 2644 | S32 count = parcel->mBanList.size(); |
2659 | mBtnAddAccess->setEnabled(enable_add); | ||
2660 | 2645 | ||
2661 | BOOL enable_remove = can_manage_allowed && (count > 0); | 2646 | childSetToolTipArg("BannedList", "[LISTED]", llformat("%d",count)); |
2662 | mBtnRemoveAccess->setEnabled(enable_remove); | 2647 | childSetToolTipArg("BannedList", "[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST)); |
2663 | 2648 | ||
2664 | // Can only sell passes when limiting the access. | 2649 | for (access_map_const_iterator cit = parcel->mBanList.begin(); |
2665 | BOOL can_manage_passes = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_PASSES); | 2650 | cit != parcel->mBanList.end(); ++cit) |
2666 | mCheckPass->setEnabled( (use_group || use_list) && can_manage_passes ); | 2651 | { |
2652 | const LLAccessEntry& entry = (*cit).second; | ||
2653 | LLString suffix; | ||
2654 | if (entry.mTime != 0) | ||
2655 | { | ||
2656 | S32 now = time(NULL); | ||
2657 | S32 seconds = entry.mTime - now; | ||
2658 | if (seconds < 0) seconds = 0; | ||
2659 | suffix.assign(" ("); | ||
2660 | if (seconds >= 120) | ||
2661 | { | ||
2662 | std::string buf = llformat("%d minutes", (seconds/60)); | ||
2663 | suffix.append(buf); | ||
2664 | } | ||
2665 | else if (seconds >= 60) | ||
2666 | { | ||
2667 | suffix.append("1 minute"); | ||
2668 | } | ||
2669 | else | ||
2670 | { | ||
2671 | std::string buf = llformat("%d seconds", seconds); | ||
2672 | suffix.append(buf); | ||
2673 | } | ||
2674 | suffix.append(" remaining)"); | ||
2675 | } | ||
2676 | mListBanned->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix); | ||
2677 | } | ||
2678 | } | ||
2667 | 2679 | ||
2680 | if(parcel->getRegionDenyAnonymousOverride()) | ||
2681 | { | ||
2682 | childSetValue("limit_payment", TRUE); | ||
2683 | } | ||
2684 | else | ||
2685 | { | ||
2686 | childSetValue("limit_payment", (parcel->getParcelFlag(PF_DENY_ANONYMOUS))); | ||
2687 | } | ||
2688 | if(parcel->getRegionDenyAgeUnverifiedOverride()) | ||
2689 | { | ||
2690 | childSetValue("limit_age_verified", TRUE); | ||
2691 | } | ||
2692 | else | ||
2693 | { | ||
2694 | childSetValue("limit_age_verified", (parcel->getParcelFlag(PF_DENY_AGEUNVERIFIED))); | ||
2695 | } | ||
2696 | |||
2668 | BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST); | 2697 | BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST); |
2669 | mCheckPass->set( use_pass ); | 2698 | childSetValue("PassCheck", use_pass ); |
2670 | 2699 | LLCtrlSelectionInterface* passcombo = childGetSelectionInterface("pass_combo"); | |
2671 | BOOL enable_pass = can_manage_passes && use_pass; | 2700 | if (passcombo) |
2672 | mSpinPrice->setEnabled( enable_pass ); | 2701 | { |
2673 | mSpinHours->setEnabled( enable_pass ); | 2702 | if (public_access || !use_pass || !use_group) |
2674 | 2703 | { | |
2704 | passcombo->selectByValue("anyone"); | ||
2705 | } | ||
2706 | } | ||
2707 | |||
2675 | S32 pass_price = parcel->getPassPrice(); | 2708 | S32 pass_price = parcel->getPassPrice(); |
2676 | mSpinPrice->set( F32(pass_price) ); | 2709 | childSetValue( "PriceSpin", (F32)pass_price ); |
2677 | 2710 | ||
2678 | F32 pass_hours = parcel->getPassHours(); | 2711 | F32 pass_hours = parcel->getPassHours(); |
2679 | mSpinHours->set( pass_hours ); | 2712 | childSetValue( "HoursSpin", pass_hours ); |
2680 | |||
2681 | mCheckGroup->setEnabled( can_manage_allowed ); | ||
2682 | mCheckAccess->setEnabled( can_manage_allowed ); | ||
2683 | |||
2684 | } | 2713 | } |
2685 | else | 2714 | else |
2686 | { | 2715 | { |
2687 | mCheckGroup->set(FALSE); | 2716 | childSetValue("public_access", FALSE); |
2688 | mCheckGroup->setLabelArg( "[GROUP]", LLString::null ); | 2717 | childSetValue("limit_payment", FALSE); |
2689 | mCheckAccess->set(FALSE); | 2718 | childSetValue("limit_age_verified", FALSE); |
2690 | mCheckAccess->setLabelArg( "[LISTED]", llformat("%d",0)); | 2719 | childSetValue("GroupCheck", FALSE); |
2691 | mBtnAddAccess->setEnabled(FALSE); | 2720 | childSetLabelArg("GroupCheck", "[GROUP]", LLString::null ); |
2692 | mBtnRemoveAccess->setEnabled(FALSE); | 2721 | childSetValue("PassCheck", FALSE); |
2693 | mSpinPrice->set((F32)PARCEL_PASS_PRICE_DEFAULT); | 2722 | childSetValue("PriceSpin", (F32)PARCEL_PASS_PRICE_DEFAULT); |
2694 | mSpinPrice->setEnabled(FALSE); | 2723 | childSetValue( "HoursSpin", PARCEL_PASS_HOURS_DEFAULT ); |
2695 | mSpinHours->set( PARCEL_PASS_HOURS_DEFAULT ); | 2724 | childSetToolTipArg("AccessList", "[LISTED]", llformat("%d",0)); |
2696 | mSpinHours->setEnabled(FALSE); | 2725 | childSetToolTipArg("AccessList", "[MAX]", llformat("%d",0)); |
2697 | mCheckGroup->setEnabled(FALSE); | 2726 | childSetToolTipArg("BannedList", "[LISTED]", llformat("%d",0)); |
2698 | mCheckAccess->setEnabled(FALSE); | 2727 | childSetToolTipArg("BannedList", "[MAX]", llformat("%d",0)); |
2728 | } | ||
2729 | } | ||
2730 | |||
2731 | void LLPanelLandAccess::refresh_ui() | ||
2732 | { | ||
2733 | childSetEnabled("public_access", FALSE); | ||
2734 | childSetEnabled("limit_payment", FALSE); | ||
2735 | childSetEnabled("limit_age_verified", FALSE); | ||
2736 | childSetEnabled("GroupCheck", FALSE); | ||
2737 | childSetEnabled("PassCheck", FALSE); | ||
2738 | childSetEnabled("pass_combo", FALSE); | ||
2739 | childSetEnabled("PriceSpin", FALSE); | ||
2740 | childSetEnabled("HoursSpin", FALSE); | ||
2741 | childSetEnabled("AccessList", FALSE); | ||
2742 | childSetEnabled("BannedList", FALSE); | ||
2743 | |||
2744 | LLParcel *parcel = mParcel->getParcel(); | ||
2745 | if (parcel) | ||
2746 | { | ||
2747 | BOOL can_manage_allowed = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_ALLOWED); | ||
2748 | BOOL can_manage_banned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_BANNED); | ||
2749 | |||
2750 | childSetEnabled("public_access", can_manage_allowed); | ||
2751 | BOOL public_access = childGetValue("public_access").asBoolean(); | ||
2752 | if (public_access) | ||
2753 | { | ||
2754 | bool override = false; | ||
2755 | if(parcel->getRegionDenyAnonymousOverride()) | ||
2756 | { | ||
2757 | override = true; | ||
2758 | childSetEnabled("limit_payment", FALSE); | ||
2759 | } | ||
2760 | else | ||
2761 | { | ||
2762 | childSetEnabled("limit_payment", can_manage_allowed); | ||
2763 | } | ||
2764 | if(parcel->getRegionDenyAgeUnverifiedOverride()) | ||
2765 | { | ||
2766 | override = true; | ||
2767 | childSetEnabled("limit_age_verified", FALSE); | ||
2768 | } | ||
2769 | else | ||
2770 | { | ||
2771 | childSetEnabled("limit_age_verified", can_manage_allowed); | ||
2772 | } | ||
2773 | if (override) | ||
2774 | { | ||
2775 | childSetToolTip("Only Allow", getUIString("estate_override")); | ||
2776 | } | ||
2777 | else | ||
2778 | { | ||
2779 | childSetToolTip("Only Allow", LLString()); | ||
2780 | } | ||
2781 | childSetEnabled("GroupCheck", FALSE); | ||
2782 | childSetEnabled("PassCheck", FALSE); | ||
2783 | childSetEnabled("pass_combo", FALSE); | ||
2784 | childSetEnabled("AccessList", FALSE); | ||
2785 | } | ||
2786 | else | ||
2787 | { | ||
2788 | childSetEnabled("limit_payment", FALSE); | ||
2789 | childSetEnabled("limit_age_verified", FALSE); | ||
2790 | char group_name[MAX_STRING]; /*Flawfinder: ignore*/ | ||
2791 | if (gCacheName->getGroupName(parcel->getGroupID(), group_name)) | ||
2792 | { | ||
2793 | childSetEnabled("GroupCheck", can_manage_allowed); | ||
2794 | } | ||
2795 | BOOL group_access = childGetValue("GroupCheck").asBoolean(); | ||
2796 | BOOL sell_passes = childGetValue("PassCheck").asBoolean(); | ||
2797 | childSetEnabled("PassCheck", can_manage_allowed); | ||
2798 | if (sell_passes) | ||
2799 | { | ||
2800 | childSetEnabled("pass_combo", group_access && can_manage_allowed); | ||
2801 | childSetEnabled("PriceSpin", can_manage_allowed); | ||
2802 | childSetEnabled("HoursSpin", can_manage_allowed); | ||
2803 | } | ||
2804 | } | ||
2805 | childSetEnabled("AccessList", can_manage_allowed); | ||
2806 | S32 allowed_list_count = parcel->mAccessList.size(); | ||
2807 | childSetEnabled("add_allowed", can_manage_allowed && allowed_list_count < PARCEL_MAX_ACCESS_LIST); | ||
2808 | childSetEnabled("remove_allowed", can_manage_allowed && allowed_list_count > 0); | ||
2809 | |||
2810 | childSetEnabled("BannedList", can_manage_banned); | ||
2811 | S32 banned_list_count = parcel->mBanList.size(); | ||
2812 | childSetEnabled("add_banned", can_manage_banned && banned_list_count < PARCEL_MAX_ACCESS_LIST); | ||
2813 | childSetEnabled("remove_banned", can_manage_banned && banned_list_count > 0); | ||
2699 | } | 2814 | } |
2700 | } | 2815 | } |
2816 | |||
2701 | 2817 | ||
2702 | // public | 2818 | // public |
2703 | void LLPanelLandAccess::refreshNames() | 2819 | void LLPanelLandAccess::refreshNames() |
@@ -2709,23 +2825,19 @@ void LLPanelLandAccess::refreshNames() | |||
2709 | { | 2825 | { |
2710 | gCacheName->getGroupName(parcel->getGroupID(), group_name); | 2826 | gCacheName->getGroupName(parcel->getGroupID(), group_name); |
2711 | } | 2827 | } |
2712 | mCheckGroup->setLabelArg("[GROUP]", LLString(group_name)); | 2828 | childSetLabelArg("GroupCheck", "[GROUP]", LLString(group_name)); |
2713 | } | 2829 | } |
2714 | 2830 | ||
2715 | 2831 | ||
2716 | // virtual | 2832 | // virtual |
2717 | void LLPanelLandAccess::draw() | 2833 | void LLPanelLandAccess::draw() |
2718 | { | 2834 | { |
2835 | refresh_ui(); | ||
2719 | refreshNames(); | 2836 | refreshNames(); |
2720 | LLPanel::draw(); | 2837 | LLPanel::draw(); |
2721 | } | 2838 | } |
2722 | 2839 | ||
2723 | 2840 | ||
2724 | void LLPanelLandAccess::onAccessLevelChange(LLUICtrl*, void *userdata) | ||
2725 | { | ||
2726 | LLPanelLandAccess::onCommitAny(NULL, userdata); | ||
2727 | } | ||
2728 | |||
2729 | // static | 2841 | // static |
2730 | void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata) | 2842 | void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata) |
2731 | { | 2843 | { |
@@ -2738,27 +2850,53 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata) | |||
2738 | } | 2850 | } |
2739 | 2851 | ||
2740 | // Extract data from UI | 2852 | // Extract data from UI |
2741 | BOOL use_access_group = self->mCheckGroup->get(); | 2853 | BOOL public_access = self->childGetValue("public_access").asBoolean(); |
2742 | BOOL use_access_list = self->mCheckAccess->get(); | 2854 | BOOL limit_payment = FALSE, limit_age_verified = FALSE; |
2743 | BOOL use_pass_list = self->mCheckPass->get(); | 2855 | BOOL use_access_group = FALSE; |
2744 | 2856 | BOOL use_access_list = FALSE; | |
2745 | 2857 | BOOL use_pass_list = FALSE; | |
2746 | 2858 | if (public_access) | |
2747 | // Must be limiting access to sell passes | ||
2748 | if (!use_access_group && !use_access_list) | ||
2749 | { | 2859 | { |
2750 | use_pass_list = FALSE; | 2860 | use_access_list = FALSE; |
2861 | limit_payment = self->childGetValue("limit_payment").asBoolean(); | ||
2862 | limit_age_verified = self->childGetValue("limit_age_verified").asBoolean(); | ||
2863 | } | ||
2864 | else | ||
2865 | { | ||
2866 | use_access_list = TRUE; | ||
2867 | use_access_group = self->childGetValue("GroupCheck").asBoolean(); | ||
2868 | use_pass_list = self->childGetValue("PassCheck").asBoolean(); | ||
2869 | if (use_access_group) | ||
2870 | { | ||
2871 | char group_name[MAX_STRING]; /*Flawfinder: ignore*/ | ||
2872 | if (!gCacheName->getGroupName(parcel->getGroupID(), group_name)) | ||
2873 | { | ||
2874 | use_access_group = FALSE; | ||
2875 | } | ||
2876 | if (use_pass_list) | ||
2877 | { | ||
2878 | LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo"); | ||
2879 | if (passcombo) | ||
2880 | { | ||
2881 | if (passcombo->getSimpleSelectedValue().asString() == "group") | ||
2882 | { | ||
2883 | use_access_list = FALSE; | ||
2884 | } | ||
2885 | } | ||
2886 | } | ||
2887 | } | ||
2751 | } | 2888 | } |
2752 | 2889 | ||
2753 | S32 pass_price = llfloor(self->mSpinPrice->get()); | 2890 | S32 pass_price = llfloor((F32)self->childGetValue("PriceSpin").asReal()); |
2754 | F32 pass_hours = self->mSpinHours->get(); | 2891 | F32 pass_hours = (F32)self->childGetValue("HoursSpin").asReal(); |
2755 | |||
2756 | // Validate extracted data | ||
2757 | 2892 | ||
2758 | // Push data into current parcel | 2893 | // Push data into current parcel |
2759 | parcel->setParcelFlag(PF_USE_ACCESS_GROUP, use_access_group); | 2894 | parcel->setParcelFlag(PF_USE_ACCESS_GROUP, use_access_group); |
2760 | parcel->setParcelFlag(PF_USE_ACCESS_LIST, use_access_list); | 2895 | parcel->setParcelFlag(PF_USE_ACCESS_LIST, use_access_list); |
2761 | parcel->setParcelFlag(PF_USE_PASS_LIST, use_pass_list); | 2896 | parcel->setParcelFlag(PF_USE_PASS_LIST, use_pass_list); |
2897 | parcel->setParcelFlag(PF_USE_BAN_LIST, TRUE); | ||
2898 | parcel->setParcelFlag(PF_DENY_ANONYMOUS, limit_payment); | ||
2899 | parcel->setParcelFlag(PF_DENY_AGEUNVERIFIED, limit_age_verified); | ||
2762 | 2900 | ||
2763 | parcel->setPassPrice( pass_price ); | 2901 | parcel->setPassPrice( pass_price ); |
2764 | parcel->setPassHours( pass_hours ); | 2902 | parcel->setPassHours( pass_hours ); |
@@ -2771,287 +2909,100 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata) | |||
2771 | } | 2909 | } |
2772 | 2910 | ||
2773 | // static | 2911 | // static |
2774 | void LLPanelLandAccess::onClickAdd(void* data) | 2912 | void LLPanelLandAccess::onClickAddAccess(void* data) |
2775 | { | 2913 | { |
2776 | LLPanelLandAccess* panelp = (LLPanelLandAccess*)data; | 2914 | LLPanelLandAccess* panelp = (LLPanelLandAccess*)data; |
2777 | gFloaterView->getParentFloater(panelp)->addDependentFloater(LLFloaterAvatarPicker::show(callbackAvatarID, data) ); | 2915 | if (panelp) |
2778 | } | 2916 | { |
2779 | 2917 | gFloaterView->getParentFloater(panelp)->addDependentFloater(LLFloaterAvatarPicker::show(callbackAvatarCBAccess, data) ); | |
2780 | // static | 2918 | } |
2781 | void LLPanelLandAccess::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata) | ||
2782 | { | ||
2783 | LLPanelLandAccess* self = (LLPanelLandAccess*)userdata; | ||
2784 | if (names.empty() || ids.empty()) return; | ||
2785 | self->addAvatar(ids[0]); | ||
2786 | } | ||
2787 | |||
2788 | |||
2789 | void LLPanelLandAccess::addAvatar(LLUUID id) | ||
2790 | { | ||
2791 | LLParcel* parcel = mParcel->getParcel(); | ||
2792 | if (!parcel) return; | ||
2793 | |||
2794 | parcel->addToAccessList(id, 0); | ||
2795 | |||
2796 | gParcelMgr->sendParcelAccessListUpdate(AL_ACCESS); | ||
2797 | |||
2798 | refresh(); | ||
2799 | } | 2919 | } |
2800 | 2920 | ||
2801 | |||
2802 | // static | 2921 | // static |
2803 | void LLPanelLandAccess::onClickRemove(void* data) | 2922 | void LLPanelLandAccess::callbackAvatarCBAccess(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata) |
2804 | { | 2923 | { |
2805 | LLPanelLandAccess* self = (LLPanelLandAccess*)data; | 2924 | LLPanelLandAccess* panelp = (LLPanelLandAccess*)userdata; |
2806 | if (!self) return; | 2925 | if (!names.empty() && !ids.empty()) |
2807 | |||
2808 | LLScrollListItem* item = self->mListAccess->getFirstSelected(); | ||
2809 | if (!item) return; | ||
2810 | |||
2811 | LLParcel* parcel = self->mParcel->getParcel(); | ||
2812 | if (!parcel) return; | ||
2813 | |||
2814 | const LLUUID& agent_id = item->getUUID(); | ||
2815 | |||
2816 | parcel->removeFromAccessList(agent_id); | ||
2817 | |||
2818 | gParcelMgr->sendParcelAccessListUpdate(AL_ACCESS); | ||
2819 | |||
2820 | self->refresh(); | ||
2821 | } | ||
2822 | |||
2823 | |||
2824 | |||
2825 | //--------------------------------------------------------------------------- | ||
2826 | // LLPanelLandBan | ||
2827 | //--------------------------------------------------------------------------- | ||
2828 | LLPanelLandBan::LLPanelLandBan(LLParcelSelectionHandle& parcel) | ||
2829 | : LLPanel("land_ban_panel"), mParcel(parcel) | ||
2830 | { | ||
2831 | |||
2832 | } | ||
2833 | |||
2834 | |||
2835 | |||
2836 | BOOL LLPanelLandBan::postBuild() | ||
2837 | { | ||
2838 | |||
2839 | mCheck = LLUICtrlFactory::getCheckBoxByName(this, "LandBanCheck"); | ||
2840 | childSetCommitCallback("LandBanCheck", onCommitAny, this); | ||
2841 | |||
2842 | mList = LLUICtrlFactory::getNameListByName(this, "LandBanList"); | ||
2843 | mList->sortByColumn(0, TRUE); // ascending | ||
2844 | |||
2845 | mBtnAdd = LLUICtrlFactory::getButtonByName(this, "Add..."); | ||
2846 | |||
2847 | mBtnAdd->setClickedCallback(onClickAdd, this); | ||
2848 | |||
2849 | mBtnRemove = LLUICtrlFactory::getButtonByName(this, "Remove"); | ||
2850 | |||
2851 | mBtnRemove->setClickedCallback(onClickRemove, this); | ||
2852 | |||
2853 | mCheckDenyAnonymous = LLUICtrlFactory::getCheckBoxByName(this, "DenyAnonymousCheck"); | ||
2854 | childSetCommitCallback("DenyAnonymousCheck", onCommitAny, this); | ||
2855 | |||
2856 | mCheckDenyIdentified = LLUICtrlFactory::getCheckBoxByName(this, "DenyIdentifiedCheck"); | ||
2857 | childSetCommitCallback("DenyIdentifiedCheck", onCommitAny, this); | ||
2858 | |||
2859 | mCheckDenyTransacted = LLUICtrlFactory::getCheckBoxByName(this, "DenyTransactedCheck"); | ||
2860 | childSetCommitCallback("DenyTransactedCheck", onCommitAny, this); | ||
2861 | |||
2862 | return TRUE; | ||
2863 | |||
2864 | } | ||
2865 | |||
2866 | |||
2867 | LLPanelLandBan::~LLPanelLandBan() | ||
2868 | { } | ||
2869 | |||
2870 | void LLPanelLandBan::refresh() | ||
2871 | { | ||
2872 | mList->deleteAllItems(); | ||
2873 | |||
2874 | LLParcel *parcel = mParcel->getParcel(); | ||
2875 | |||
2876 | if (parcel) | ||
2877 | { | 2926 | { |
2878 | // Display options | 2927 | LLUUID id = ids[0]; |
2879 | 2928 | LLParcel* parcel = panelp->mParcel->getParcel(); | |
2880 | S32 count = parcel->mBanList.size(); | 2929 | if (parcel) |
2881 | |||
2882 | BOOL use_ban = parcel->getParcelFlag(PF_USE_BAN_LIST); | ||
2883 | mCheck->set( use_ban ); | ||
2884 | mCheck->setLabelArg( "[LISTED]", llformat("%d",count)); | ||
2885 | mCheck->setLabelArg( "[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST)); | ||
2886 | |||
2887 | access_map_const_iterator cit = parcel->mBanList.begin(); | ||
2888 | access_map_const_iterator end = parcel->mBanList.end(); | ||
2889 | for ( ; cit != end; ++cit) | ||
2890 | { | ||
2891 | const LLAccessEntry& entry = (*cit).second; | ||
2892 | LLString suffix; | ||
2893 | if (entry.mTime != 0) | ||
2894 | { | ||
2895 | S32 now = time(NULL); | ||
2896 | S32 seconds = entry.mTime - now; | ||
2897 | if (seconds < 0) seconds = 0; | ||
2898 | suffix.assign(" ("); | ||
2899 | if (seconds >= 120) | ||
2900 | { | ||
2901 | char buf[30]; /*Flawfinder: ignore*/ | ||
2902 | snprintf(buf, sizeof(buf), "%d minutes", (seconds/60)); /* Flawfinder: ignore */ | ||
2903 | suffix.append(buf); | ||
2904 | } | ||
2905 | else if (seconds >= 60) | ||
2906 | { | ||
2907 | suffix.append("1 minute"); | ||
2908 | } | ||
2909 | else | ||
2910 | { | ||
2911 | char buf[30]; /*Flawfinder: ignore*/ | ||
2912 | snprintf(buf, sizeof(buf), "%d seconds", seconds); /* Flawfinder: ignore */ | ||
2913 | suffix.append(buf); | ||
2914 | } | ||
2915 | suffix.append(" remaining)"); | ||
2916 | } | ||
2917 | mList->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix); | ||
2918 | } | ||
2919 | |||
2920 | BOOL can_manage_banned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_BANNED); | ||
2921 | mCheck->setEnabled( can_manage_banned ); | ||
2922 | mCheckDenyAnonymous->setEnabled( FALSE ); | ||
2923 | mCheckDenyIdentified->setEnabled( FALSE ); | ||
2924 | mCheckDenyTransacted->setEnabled( FALSE ); | ||
2925 | |||
2926 | if(parcel->getRegionDenyAnonymousOverride()) | ||
2927 | { | ||
2928 | mCheckDenyAnonymous->set(TRUE); | ||
2929 | } | ||
2930 | else if(can_manage_banned) | ||
2931 | { | ||
2932 | mCheckDenyAnonymous->setEnabled(TRUE); | ||
2933 | mCheckDenyAnonymous->set(parcel->getParcelFlag(PF_DENY_ANONYMOUS)); | ||
2934 | } | ||
2935 | if(parcel->getRegionDenyIdentifiedOverride()) | ||
2936 | { | ||
2937 | mCheckDenyIdentified->set(TRUE); | ||
2938 | } | ||
2939 | else if(can_manage_banned) | ||
2940 | { | ||
2941 | mCheckDenyIdentified->setEnabled(TRUE); | ||
2942 | mCheckDenyIdentified->set(parcel->getParcelFlag(PF_DENY_IDENTIFIED)); | ||
2943 | } | ||
2944 | if(parcel->getRegionDenyTransactedOverride()) | ||
2945 | { | ||
2946 | mCheckDenyTransacted->set(TRUE); | ||
2947 | } | ||
2948 | else if(can_manage_banned) | ||
2949 | { | 2930 | { |
2950 | mCheckDenyTransacted->setEnabled(TRUE); | 2931 | parcel->addToAccessList(id, 0); |
2951 | mCheckDenyTransacted->set(parcel->getParcelFlag(PF_DENY_TRANSACTED)); | 2932 | gParcelMgr->sendParcelAccessListUpdate(AL_ACCESS); |
2933 | panelp->refresh(); | ||
2952 | } | 2934 | } |
2953 | |||
2954 | |||
2955 | BOOL enable_add = can_manage_banned && (count < PARCEL_MAX_ACCESS_LIST); | ||
2956 | mBtnAdd->setEnabled(enable_add); | ||
2957 | |||
2958 | BOOL enable_remove = can_manage_banned && (count > 0); | ||
2959 | mBtnRemove->setEnabled(enable_remove); | ||
2960 | } | ||
2961 | else | ||
2962 | { | ||
2963 | mCheck->set(FALSE); | ||
2964 | mCheck->setLabelArg( "[LISTED]", llformat("%d",0)); | ||
2965 | mCheck->setEnabled(FALSE); | ||
2966 | mBtnAdd->setEnabled(FALSE); | ||
2967 | mBtnRemove->setEnabled(FALSE); | ||
2968 | mCheckDenyAnonymous->set(FALSE); | ||
2969 | mCheckDenyAnonymous->setEnabled(FALSE); | ||
2970 | mCheckDenyIdentified->set(FALSE); | ||
2971 | mCheckDenyIdentified->setEnabled(FALSE); | ||
2972 | mCheckDenyTransacted->set(FALSE); | ||
2973 | mCheckDenyTransacted->setEnabled(FALSE); | ||
2974 | } | 2935 | } |
2975 | } | 2936 | } |
2976 | 2937 | ||
2977 | // static | 2938 | // static |
2978 | void LLPanelLandBan::onCommitAny(LLUICtrl *ctrl, void *userdata) | 2939 | void LLPanelLandAccess::onClickRemoveAccess(void* data) |
2979 | { | 2940 | { |
2980 | LLPanelLandBan *self = (LLPanelLandBan*)userdata; | 2941 | LLPanelLandAccess* panelp = (LLPanelLandAccess*)data; |
2981 | 2942 | if (panelp && panelp->mListAccess) | |
2982 | LLParcel* parcel = self->mParcel->getParcel(); | ||
2983 | if (!parcel) | ||
2984 | { | 2943 | { |
2985 | return; | 2944 | LLParcel* parcel = panelp->mParcel->getParcel(); |
2945 | if (parcel) | ||
2946 | { | ||
2947 | std::vector<LLScrollListItem*> names = panelp->mListAccess->getAllSelected(); | ||
2948 | for (std::vector<LLScrollListItem*>::iterator iter = names.begin(); | ||
2949 | iter != names.end(); ) | ||
2950 | { | ||
2951 | LLScrollListItem* item = *iter++; | ||
2952 | const LLUUID& agent_id = item->getUUID(); | ||
2953 | parcel->removeFromAccessList(agent_id); | ||
2954 | } | ||
2955 | gParcelMgr->sendParcelAccessListUpdate(AL_ACCESS); | ||
2956 | panelp->refresh(); | ||
2957 | } | ||
2986 | } | 2958 | } |
2987 | |||
2988 | // Extract data from UI | ||
2989 | BOOL use_ban_list = self->mCheck->get(); | ||
2990 | BOOL deny_access_anonymous = self->mCheckDenyAnonymous->get(); | ||
2991 | BOOL deny_access_identified = self->mCheckDenyIdentified->get(); | ||
2992 | BOOL deny_access_transacted = self->mCheckDenyTransacted->get(); | ||
2993 | |||
2994 | // Push data into current parcel | ||
2995 | parcel->setParcelFlag(PF_USE_BAN_LIST, use_ban_list); | ||
2996 | parcel->setParcelFlag(PF_DENY_ANONYMOUS, deny_access_anonymous); | ||
2997 | parcel->setParcelFlag(PF_DENY_IDENTIFIED, deny_access_identified); | ||
2998 | parcel->setParcelFlag(PF_DENY_TRANSACTED, deny_access_transacted); | ||
2999 | |||
3000 | // Send current parcel data upstream to server | ||
3001 | gParcelMgr->sendParcelPropertiesUpdate( parcel ); | ||
3002 | |||
3003 | // Might have changed properties, so let's redraw! | ||
3004 | self->refresh(); | ||
3005 | } | 2959 | } |
3006 | 2960 | ||
3007 | // static | 2961 | // static |
3008 | void LLPanelLandBan::onClickAdd(void* data) | 2962 | void LLPanelLandAccess::onClickAddBanned(void* data) |
3009 | { | 2963 | { |
3010 | LLPanelLandBan* panelp = (LLPanelLandBan*)data; | 2964 | LLPanelLandAccess* panelp = (LLPanelLandAccess*)data; |
3011 | gFloaterView->getParentFloater(panelp)->addDependentFloater(LLFloaterAvatarPicker::show(callbackAvatarID, data) ); | 2965 | gFloaterView->getParentFloater(panelp)->addDependentFloater(LLFloaterAvatarPicker::show(callbackAvatarCBBanned, data) ); |
3012 | } | 2966 | } |
3013 | 2967 | ||
3014 | // static | 2968 | // static |
3015 | void LLPanelLandBan::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata) | 2969 | void LLPanelLandAccess::callbackAvatarCBBanned(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata) |
3016 | { | 2970 | { |
3017 | LLPanelLandBan* self = (LLPanelLandBan*)userdata; | 2971 | LLPanelLandAccess* panelp = (LLPanelLandAccess*)userdata; |
3018 | if (names.empty() || ids.empty()) return; | 2972 | if (!names.empty() && !ids.empty()) |
3019 | self->addAvatar(ids[0]); | 2973 | { |
3020 | } | 2974 | LLUUID id = ids[0]; |
3021 | 2975 | LLParcel* parcel = panelp->mParcel->getParcel(); | |
3022 | 2976 | if (parcel) | |
3023 | void LLPanelLandBan::addAvatar(LLUUID id) | 2977 | { |
3024 | { | 2978 | parcel->addToBanList(id, 0); |
3025 | LLParcel* parcel = mParcel->getParcel(); | 2979 | gParcelMgr->sendParcelAccessListUpdate(AL_BAN); |
3026 | if (!parcel) return; | 2980 | panelp->refresh(); |
3027 | 2981 | } | |
3028 | parcel->addToBanList(id, 0); | 2982 | } |
3029 | |||
3030 | gParcelMgr->sendParcelAccessListUpdate(AL_BAN); | ||
3031 | |||
3032 | refresh(); | ||
3033 | } | 2983 | } |
3034 | 2984 | ||
3035 | |||
3036 | // static | 2985 | // static |
3037 | void LLPanelLandBan::onClickRemove(void* data) | 2986 | void LLPanelLandAccess::onClickRemoveBanned(void* data) |
3038 | { | 2987 | { |
3039 | LLPanelLandBan* self = (LLPanelLandBan*)data; | 2988 | LLPanelLandAccess* panelp = (LLPanelLandAccess*)data; |
3040 | if (!self) return; | 2989 | if (panelp && panelp->mListBanned) |
3041 | 2990 | { | |
3042 | LLScrollListItem* item = self->mList->getFirstSelected(); | 2991 | LLParcel* parcel = panelp->mParcel->getParcel(); |
3043 | if (!item) return; | 2992 | if (parcel) |
3044 | 2993 | { | |
3045 | LLParcel* parcel = self->mParcel->getParcel(); | 2994 | std::vector<LLScrollListItem*> names = panelp->mListBanned->getAllSelected(); |
3046 | if (!parcel) return; | 2995 | for (std::vector<LLScrollListItem*>::iterator iter = names.begin(); |
3047 | 2996 | iter != names.end(); ) | |
3048 | const LLUUID& agent_id = item->getUUID(); | 2997 | { |
3049 | 2998 | LLScrollListItem* item = *iter++; | |
3050 | parcel->removeFromBanList(agent_id); | 2999 | const LLUUID& agent_id = item->getUUID(); |
3051 | 3000 | parcel->removeFromBanList(agent_id); | |
3052 | gParcelMgr->sendParcelAccessListUpdate(AL_BAN); | 3001 | } |
3053 | 3002 | gParcelMgr->sendParcelAccessListUpdate(AL_BAN); | |
3054 | self->refresh(); | 3003 | panelp->refresh(); |
3004 | } | ||
3005 | } | ||
3055 | } | 3006 | } |
3056 | 3007 | ||
3057 | //--------------------------------------------------------------------------- | 3008 | //--------------------------------------------------------------------------- |
diff --git a/linden/indra/newview/llfloaterland.h b/linden/indra/newview/llfloaterland.h index d8b7ecf..9be813f 100644 --- a/linden/indra/newview/llfloaterland.h +++ b/linden/indra/newview/llfloaterland.h | |||
@@ -112,7 +112,6 @@ protected: | |||
112 | LLPanelLandOptions* mPanelOptions; | 112 | LLPanelLandOptions* mPanelOptions; |
113 | LLPanelLandMedia* mPanelMedia; | 113 | LLPanelLandMedia* mPanelMedia; |
114 | LLPanelLandAccess* mPanelAccess; | 114 | LLPanelLandAccess* mPanelAccess; |
115 | LLPanelLandBan* mPanelBan; | ||
116 | LLPanelLandCovenant* mPanelCovenant; | 115 | LLPanelLandCovenant* mPanelCovenant; |
117 | 116 | ||
118 | LLHandle<LLParcelSelection> mParcel; | 117 | LLHandle<LLParcelSelection> mParcel; |
@@ -392,93 +391,28 @@ public: | |||
392 | LLPanelLandAccess(LLHandle<LLParcelSelection>& parcelp); | 391 | LLPanelLandAccess(LLHandle<LLParcelSelection>& parcelp); |
393 | virtual ~LLPanelLandAccess(); | 392 | virtual ~LLPanelLandAccess(); |
394 | void refresh(); | 393 | void refresh(); |
394 | void refresh_ui(); | ||
395 | void refreshNames(); | 395 | void refreshNames(); |
396 | virtual void draw(); | 396 | virtual void draw(); |
397 | 397 | ||
398 | void addAvatar(LLUUID id); | ||
399 | |||
400 | static void onCommitAny(LLUICtrl* ctrl, void *userdata); | 398 | static void onCommitAny(LLUICtrl* ctrl, void *userdata); |
401 | static void onClickAdd(void*); | 399 | static void onClickAddAccess(void*); |
402 | static void onClickRemove(void*); | 400 | static void callbackAvatarCBAccess(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata); |
403 | static void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata); | 401 | static void onClickRemoveAccess(void*); |
404 | static void onAccessLevelChange(LLUICtrl* ctrl, void* userdata); | 402 | static void onClickAddBanned(void*); |
403 | static void callbackAvatarCBBanned(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata); | ||
404 | static void onClickRemoveBanned(void*); | ||
405 | 405 | ||
406 | virtual BOOL postBuild(); | 406 | virtual BOOL postBuild(); |
407 | 407 | ||
408 | protected: | 408 | protected: |
409 | LLTextBox* mLabelTitle; | ||
410 | |||
411 | LLCheckBoxCtrl* mCheckGroup; | ||
412 | |||
413 | LLCheckBoxCtrl* mCheckAccess; | ||
414 | LLNameListCtrl* mListAccess; | 409 | LLNameListCtrl* mListAccess; |
415 | LLButton* mBtnAddAccess; | 410 | LLNameListCtrl* mListBanned; |
416 | LLButton* mBtnRemoveAccess; | ||
417 | |||
418 | LLCheckBoxCtrl* mCheckPass; | ||
419 | LLSpinCtrl* mSpinPrice; | ||
420 | LLSpinCtrl* mSpinHours; | ||
421 | |||
422 | LLCheckBoxCtrl* mCheckIdentified; | ||
423 | LLCheckBoxCtrl* mCheckTransacted; | ||
424 | LLRadioGroup* mCheckStatusLevel; | ||
425 | 411 | ||
426 | LLHandle<LLParcelSelection>& mParcel; | 412 | LLHandle<LLParcelSelection>& mParcel; |
427 | }; | 413 | }; |
428 | 414 | ||
429 | 415 | ||
430 | class LLPanelLandBan | ||
431 | : public LLPanel | ||
432 | { | ||
433 | public: | ||
434 | LLPanelLandBan(LLHandle<LLParcelSelection>& parcelp); | ||
435 | virtual ~LLPanelLandBan(); | ||
436 | void refresh(); | ||
437 | |||
438 | void addAvatar(LLUUID id); | ||
439 | |||
440 | static void onCommitAny(LLUICtrl* ctrl, void *userdata); | ||
441 | static void onClickAdd(void*); | ||
442 | static void onClickRemove(void*); | ||
443 | static void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata); | ||
444 | |||
445 | virtual BOOL postBuild(); | ||
446 | |||
447 | protected: | ||
448 | LLTextBox* mLabelTitle; | ||
449 | |||
450 | LLCheckBoxCtrl* mCheck; | ||
451 | LLNameListCtrl* mList; | ||
452 | LLButton* mBtnAdd; | ||
453 | LLButton* mBtnRemove; | ||
454 | LLCheckBoxCtrl* mCheckDenyAnonymous; | ||
455 | LLCheckBoxCtrl* mCheckDenyIdentified; | ||
456 | LLCheckBoxCtrl* mCheckDenyTransacted; | ||
457 | |||
458 | LLHandle<LLParcelSelection>& mParcel; | ||
459 | }; | ||
460 | |||
461 | |||
462 | class LLPanelLandRenters | ||
463 | : public LLPanel | ||
464 | { | ||
465 | public: | ||
466 | LLPanelLandRenters(LLHandle<LLParcelSelection>& parcelp); | ||
467 | virtual ~LLPanelLandRenters(); | ||
468 | void refresh(); | ||
469 | |||
470 | static void onClickAdd(void*); | ||
471 | static void onClickRemove(void*); | ||
472 | |||
473 | protected: | ||
474 | LLCheckBoxCtrl* mCheckRenters; | ||
475 | LLNameListCtrl* mListRenters; | ||
476 | LLButton* mBtnAddRenter; | ||
477 | LLButton* mBtnRemoveRenter; | ||
478 | |||
479 | LLHandle<LLParcelSelection>& mParcel; | ||
480 | }; | ||
481 | |||
482 | class LLPanelLandCovenant | 416 | class LLPanelLandCovenant |
483 | : public LLPanel | 417 | : public LLPanel |
484 | { | 418 | { |
diff --git a/linden/indra/newview/llfloatermap.cpp b/linden/indra/newview/llfloatermap.cpp index a158000..ef628be 100644 --- a/linden/indra/newview/llfloatermap.cpp +++ b/linden/indra/newview/llfloatermap.cpp | |||
@@ -63,7 +63,7 @@ | |||
63 | #include "llviewerparceloverlay.h" | 63 | #include "llviewerparceloverlay.h" |
64 | #include "llviewerregion.h" | 64 | #include "llviewerregion.h" |
65 | #include "llviewerstats.h" | 65 | #include "llviewerstats.h" |
66 | #include "viewer.h" | 66 | #include "llurlsimstring.h" |
67 | 67 | ||
68 | #include "llglheaders.h" | 68 | #include "llglheaders.h" |
69 | 69 | ||
@@ -178,7 +178,7 @@ void LLFloaterMap::onClose(bool app_quitting) | |||
178 | 178 | ||
179 | BOOL LLFloaterMap::canClose() | 179 | BOOL LLFloaterMap::canClose() |
180 | { | 180 | { |
181 | return !gQuit; | 181 | return !LLApp::isExiting(); |
182 | } | 182 | } |
183 | 183 | ||
184 | 184 | ||
diff --git a/linden/indra/newview/llfloaternewim.cpp b/linden/indra/newview/llfloaternewim.cpp index b21ad31..bd7107d 100644 --- a/linden/indra/newview/llfloaternewim.cpp +++ b/linden/indra/newview/llfloaternewim.cpp | |||
@@ -53,7 +53,6 @@ | |||
53 | #include "lltextbox.h" | 53 | #include "lltextbox.h" |
54 | 54 | ||
55 | extern LLAudioEngine* gAudiop; | 55 | extern LLAudioEngine* gAudiop; |
56 | extern BOOL gInitializationComplete; | ||
57 | S32 COL_1_WIDTH = 200; | 56 | S32 COL_1_WIDTH = 200; |
58 | 57 | ||
59 | static LLString sOnlineDescriptor = "*"; | 58 | static LLString sOnlineDescriptor = "*"; |
diff --git a/linden/indra/newview/llfloaterparcel.cpp b/linden/indra/newview/llfloaterparcel.cpp index a63987a..8cb91a0 100644 --- a/linden/indra/newview/llfloaterparcel.cpp +++ b/linden/indra/newview/llfloaterparcel.cpp | |||
@@ -42,7 +42,7 @@ class LLParcelHandler : public LLCommandHandler | |||
42 | { | 42 | { |
43 | public: | 43 | public: |
44 | LLParcelHandler() : LLCommandHandler("parcel") { } | 44 | LLParcelHandler() : LLCommandHandler("parcel") { } |
45 | bool handle(const std::vector<std::string>& params) | 45 | bool handle(const LLSD& params, const LLSD& queryMap) |
46 | { | 46 | { |
47 | if (params.size() < 2) | 47 | if (params.size() < 2) |
48 | { | 48 | { |
@@ -53,7 +53,7 @@ public: | |||
53 | { | 53 | { |
54 | return false; | 54 | return false; |
55 | } | 55 | } |
56 | if (params[1] == "about") | 56 | if (params[1].asString() == "about") |
57 | { | 57 | { |
58 | LLFloaterParcelInfo::show(parcel_id); | 58 | LLFloaterParcelInfo::show(parcel_id); |
59 | return true; | 59 | return true; |
diff --git a/linden/indra/newview/llfloaterpostcard.cpp b/linden/indra/newview/llfloaterpostcard.cpp index cab9d37..a00f512 100644 --- a/linden/indra/newview/llfloaterpostcard.cpp +++ b/linden/indra/newview/llfloaterpostcard.cpp | |||
@@ -60,7 +60,6 @@ | |||
60 | #include "llimagej2c.h" | 60 | #include "llimagej2c.h" |
61 | #include "llvfile.h" | 61 | #include "llvfile.h" |
62 | #include "llvfs.h" | 62 | #include "llvfs.h" |
63 | #include "viewer.h" | ||
64 | 63 | ||
65 | #include "llassetuploadresponders.h" | 64 | #include "llassetuploadresponders.h" |
66 | 65 | ||
diff --git a/linden/indra/newview/llfloaterpreference.cpp b/linden/indra/newview/llfloaterpreference.cpp index 100ae0c..25a88e6 100644 --- a/linden/indra/newview/llfloaterpreference.cpp +++ b/linden/indra/newview/llfloaterpreference.cpp | |||
@@ -47,13 +47,16 @@ | |||
47 | #include "llspinctrl.h" | 47 | #include "llspinctrl.h" |
48 | #include "message.h" | 48 | #include "message.h" |
49 | 49 | ||
50 | #include "llcommandhandler.h" | ||
50 | #include "llfloaterabout.h" | 51 | #include "llfloaterabout.h" |
52 | #include "llfloaterpreference.h" | ||
51 | #include "llpanelnetwork.h" | 53 | #include "llpanelnetwork.h" |
52 | #include "llpanelaudioprefs.h" | 54 | #include "llpanelaudioprefs.h" |
53 | #include "llpaneldisplay.h" | 55 | #include "llpaneldisplay.h" |
54 | #include "llpaneldebug.h" | 56 | #include "llpaneldebug.h" |
55 | #include "llpanelgeneral.h" | 57 | #include "llpanelgeneral.h" |
56 | #include "llpanelinput.h" | 58 | #include "llpanelinput.h" |
59 | #include "llpanellogin.h" | ||
57 | #include "llpanelLCD.h" | 60 | #include "llpanelLCD.h" |
58 | #include "llpanelmsgs.h" | 61 | #include "llpanelmsgs.h" |
59 | #include "llpanelweb.h" | 62 | #include "llpanelweb.h" |
@@ -71,6 +74,13 @@ | |||
71 | #include "llkeyboard.h" | 74 | #include "llkeyboard.h" |
72 | #include "llscrollcontainer.h" | 75 | #include "llscrollcontainer.h" |
73 | 76 | ||
77 | #if LL_WINDOWS | ||
78 | // for Logitech LCD keyboards / speakers | ||
79 | #ifndef LL_LOGITECH_LCD_H | ||
80 | #include "lllogitechlcd.h" | ||
81 | #endif | ||
82 | extern llLCD *gLcdScreen; | ||
83 | #endif | ||
74 | 84 | ||
75 | const S32 PREF_BORDER = 4; | 85 | const S32 PREF_BORDER = 4; |
76 | const S32 PREF_PAD = 5; | 86 | const S32 PREF_PAD = 5; |
@@ -81,13 +91,20 @@ const S32 PREF_FLOATER_MIN_HEIGHT = 2 * SCROLLBAR_SIZE + 2 * LLPANEL_BORDER_WIDT | |||
81 | 91 | ||
82 | LLFloaterPreference* LLFloaterPreference::sInstance = NULL; | 92 | LLFloaterPreference* LLFloaterPreference::sInstance = NULL; |
83 | 93 | ||
84 | #if LL_WINDOWS | 94 | |
85 | // for Logitech LCD keyboards / speakers | 95 | class LLPreferencesHandler : public LLCommandHandler |
86 | #ifndef LL_LOGITECH_LCD_H | 96 | { |
87 | #include "lllogitechlcd.h" | 97 | public: |
88 | #endif | 98 | LLPreferencesHandler() : LLCommandHandler("preferences") { } |
89 | extern llLCD *gLcdScreen; | 99 | bool handle(const LLSD& tokens, const LLSD& queryMap) |
90 | #endif | 100 | { |
101 | LLFloaterPreference::show(NULL); | ||
102 | return true; | ||
103 | } | ||
104 | }; | ||
105 | |||
106 | LLPreferencesHandler gPreferencesHandler; | ||
107 | |||
91 | 108 | ||
92 | // Must be done at run time, not compile time. JC | 109 | // Must be done at run time, not compile time. JC |
93 | S32 pref_min_width() | 110 | S32 pref_min_width() |
@@ -410,6 +427,8 @@ void LLFloaterPreference::show(void*) | |||
410 | gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); | 427 | gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); |
411 | gAgent.sendReliableMessage(); | 428 | gAgent.sendReliableMessage(); |
412 | } | 429 | } |
430 | |||
431 | LLPanelLogin::setAlwaysRefresh(true); | ||
413 | } | 432 | } |
414 | 433 | ||
415 | 434 | ||
@@ -423,6 +442,9 @@ void LLFloaterPreference::onClickAbout(void*) | |||
423 | // static | 442 | // static |
424 | void LLFloaterPreference::onBtnOK( void* userdata ) | 443 | void LLFloaterPreference::onBtnOK( void* userdata ) |
425 | { | 444 | { |
445 | //refresh splash page if we're displaying it | ||
446 | LLPanelLogin::loadLoginPage(); | ||
447 | |||
426 | LLFloaterPreference *fp =(LLFloaterPreference *)userdata; | 448 | LLFloaterPreference *fp =(LLFloaterPreference *)userdata; |
427 | // commit any outstanding text entry | 449 | // commit any outstanding text entry |
428 | if (fp->hasFocus()) | 450 | if (fp->hasFocus()) |
@@ -466,6 +488,16 @@ void LLFloaterPreference::onBtnApply( void* userdata ) | |||
466 | } | 488 | } |
467 | } | 489 | } |
468 | fp->apply(); | 490 | fp->apply(); |
491 | |||
492 | //refresh splash page if we're displaying it | ||
493 | LLPanelLogin::loadLoginPage(); | ||
494 | } | ||
495 | |||
496 | |||
497 | void LLFloaterPreference::onClose(bool app_quitting) | ||
498 | { | ||
499 | LLPanelLogin::setAlwaysRefresh(false); | ||
500 | LLFloater::onClose(app_quitting); | ||
469 | } | 501 | } |
470 | 502 | ||
471 | 503 | ||
diff --git a/linden/indra/newview/llfloaterpreference.h b/linden/indra/newview/llfloaterpreference.h index a4c43fc..bf55476 100644 --- a/linden/indra/newview/llfloaterpreference.h +++ b/linden/indra/newview/llfloaterpreference.h | |||
@@ -117,6 +117,7 @@ protected: | |||
117 | LLPreferenceCore *mPreferenceCore; | 117 | LLPreferenceCore *mPreferenceCore; |
118 | 118 | ||
119 | /*virtual*/ void draw(); | 119 | /*virtual*/ void draw(); |
120 | /*virtual*/ void onClose(bool app_quitting); | ||
120 | 121 | ||
121 | LLButton* mAboutBtn; | 122 | LLButton* mAboutBtn; |
122 | LLButton *mOKBtn; | 123 | LLButton *mOKBtn; |
diff --git a/linden/indra/newview/llfloaterregioninfo.cpp b/linden/indra/newview/llfloaterregioninfo.cpp index 20f3192..3306142 100644 --- a/linden/indra/newview/llfloaterregioninfo.cpp +++ b/linden/indra/newview/llfloaterregioninfo.cpp | |||
@@ -408,6 +408,15 @@ void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region) | |||
408 | region)); | 408 | region)); |
409 | } | 409 | } |
410 | 410 | ||
411 | // public | ||
412 | void LLFloaterRegionInfo::refresh() | ||
413 | { | ||
414 | for(info_panels_t::iterator iter = mInfoPanels.begin(); | ||
415 | iter != mInfoPanels.end(); ++iter) | ||
416 | { | ||
417 | (*iter)->refresh(); | ||
418 | } | ||
419 | } | ||
411 | 420 | ||
412 | 421 | ||
413 | ///---------------------------------------------------------------------------- | 422 | ///---------------------------------------------------------------------------- |
@@ -447,6 +456,7 @@ void LLPanelRegionInfo::onChangeAnything(LLUICtrl* ctrl, void* user_data) | |||
447 | if(panel) | 456 | if(panel) |
448 | { | 457 | { |
449 | panel->enableButton("apply_btn"); | 458 | panel->enableButton("apply_btn"); |
459 | panel->refresh(); | ||
450 | } | 460 | } |
451 | } | 461 | } |
452 | 462 | ||
@@ -455,6 +465,7 @@ BOOL LLPanelRegionInfo::postBuild() | |||
455 | { | 465 | { |
456 | childSetAction("apply_btn", onBtnSet, this); | 466 | childSetAction("apply_btn", onBtnSet, this); |
457 | childDisable("apply_btn"); | 467 | childDisable("apply_btn"); |
468 | refresh(); | ||
458 | return TRUE; | 469 | return TRUE; |
459 | } | 470 | } |
460 | 471 | ||
@@ -716,6 +727,8 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate() | |||
716 | body["allow_land_resell"] = childGetValue("allow_land_resell_check"); | 727 | body["allow_land_resell"] = childGetValue("allow_land_resell_check"); |
717 | body["agent_limit"] = childGetValue("agent_limit_spin"); | 728 | body["agent_limit"] = childGetValue("agent_limit_spin"); |
718 | body["prim_bonus"] = childGetValue("object_bonus_spin"); | 729 | body["prim_bonus"] = childGetValue("object_bonus_spin"); |
730 | // the combo box stores strings "Mature" and "PG", but we have to convert back to a number, | ||
731 | // because the sim doesn't know from strings for this stuff | ||
719 | body["sim_access"] = LLViewerRegion::stringToAccess(childGetValue("access_combo").asString().c_str()); | 732 | body["sim_access"] = LLViewerRegion::stringToAccess(childGetValue("access_combo").asString().c_str()); |
720 | body["restrict_pushobject"] = childGetValue("restrict_pushobject"); | 733 | body["restrict_pushobject"] = childGetValue("restrict_pushobject"); |
721 | body["allow_parcel_changes"] = childGetValue("allow_parcel_changes_check"); | 734 | body["allow_parcel_changes"] = childGetValue("allow_parcel_changes_check"); |
@@ -1907,6 +1920,7 @@ bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region) | |||
1907 | BOOL owner = (region && (region->getOwner() == gAgent.getID())); | 1920 | BOOL owner = (region && (region->getOwner() == gAgent.getID())); |
1908 | BOOL manager = (region && region->isEstateManager()); | 1921 | BOOL manager = (region && region->isEstateManager()); |
1909 | setCtrlsEnabled(god || owner || manager); | 1922 | setCtrlsEnabled(god || owner || manager); |
1923 | |||
1910 | childDisable("apply_btn"); | 1924 | childDisable("apply_btn"); |
1911 | childSetEnabled("add_allowed_avatar_btn", god || owner || manager); | 1925 | childSetEnabled("add_allowed_avatar_btn", god || owner || manager); |
1912 | childSetEnabled("remove_allowed_avatar_btn", god || owner || manager); | 1926 | childSetEnabled("remove_allowed_avatar_btn", god || owner || manager); |
@@ -1942,8 +1956,7 @@ bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region) | |||
1942 | 1956 | ||
1943 | sendEstateOwnerMessage(gMessageSystem, "getinfo", invoice, strings); | 1957 | sendEstateOwnerMessage(gMessageSystem, "getinfo", invoice, strings); |
1944 | 1958 | ||
1945 | 1959 | refresh(); | |
1946 | |||
1947 | 1960 | ||
1948 | return rv; | 1961 | return rv; |
1949 | } | 1962 | } |
@@ -1974,9 +1987,8 @@ BOOL LLPanelEstateInfo::postBuild() | |||
1974 | initCtrl("use_global_time_check"); | 1987 | initCtrl("use_global_time_check"); |
1975 | initCtrl("fixed_sun_check"); | 1988 | initCtrl("fixed_sun_check"); |
1976 | initCtrl("allow_direct_teleport"); | 1989 | initCtrl("allow_direct_teleport"); |
1977 | initCtrl("deny_anonymous"); | 1990 | initCtrl("limit_payment"); |
1978 | initCtrl("deny_identified"); | 1991 | initCtrl("limit_age_verified"); |
1979 | initCtrl("deny_transacted"); | ||
1980 | initCtrl("voice_chat_check"); | 1992 | initCtrl("voice_chat_check"); |
1981 | 1993 | ||
1982 | initHelpBtn("estate_manager_help", "HelpEstateEstateManager"); | 1994 | initHelpBtn("estate_manager_help", "HelpEstateEstateManager"); |
@@ -2043,6 +2055,19 @@ BOOL LLPanelEstateInfo::postBuild() | |||
2043 | return LLPanelRegionInfo::postBuild(); | 2055 | return LLPanelRegionInfo::postBuild(); |
2044 | } | 2056 | } |
2045 | 2057 | ||
2058 | void LLPanelEstateInfo::refresh() | ||
2059 | { | ||
2060 | bool public_access = childGetValue("externally_visible_check").asBoolean(); | ||
2061 | childSetEnabled("Only Allow", public_access); | ||
2062 | childSetEnabled("limit_payment", public_access); | ||
2063 | childSetEnabled("limit_age_verified", public_access); | ||
2064 | // if this is set to false, then the limit fields are meaningless and should be turned off | ||
2065 | if (public_access == false) | ||
2066 | { | ||
2067 | childSetValue("limit_payment", false); | ||
2068 | childSetValue("limit_age_verified", false); | ||
2069 | } | ||
2070 | } | ||
2046 | 2071 | ||
2047 | BOOL LLPanelEstateInfo::sendUpdate() | 2072 | BOOL LLPanelEstateInfo::sendUpdate() |
2048 | { | 2073 | { |
@@ -2157,10 +2182,11 @@ void LLPanelEstateInfo::setEstateFlags(U32 flags) | |||
2157 | "voice_chat_check", | 2182 | "voice_chat_check", |
2158 | LLSD(flags & REGION_FLAGS_ALLOW_VOICE ? TRUE : FALSE)); | 2183 | LLSD(flags & REGION_FLAGS_ALLOW_VOICE ? TRUE : FALSE)); |
2159 | childSetValue("allow_direct_teleport", LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) ); | 2184 | childSetValue("allow_direct_teleport", LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) ); |
2160 | childSetValue("deny_anonymous", LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) ); | 2185 | childSetValue("limit_payment", LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) ); |
2161 | childSetValue("deny_identified", LLSD(flags & REGION_FLAGS_DENY_IDENTIFIED ? TRUE : FALSE) ); | 2186 | childSetValue("limit_age_verified", LLSD(flags & REGION_FLAGS_DENY_AGEUNVERIFIED ? TRUE : FALSE) ); |
2162 | childSetValue("deny_transacted", LLSD(flags & REGION_FLAGS_DENY_TRANSACTED ? TRUE : FALSE) ); | ||
2163 | childSetVisible("abuse_email_text", flags & REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER); | 2187 | childSetVisible("abuse_email_text", flags & REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER); |
2188 | |||
2189 | refresh(); | ||
2164 | } | 2190 | } |
2165 | 2191 | ||
2166 | U32 LLPanelEstateInfo::computeEstateFlags() | 2192 | U32 LLPanelEstateInfo::computeEstateFlags() |
@@ -2187,20 +2213,16 @@ U32 LLPanelEstateInfo::computeEstateFlags() | |||
2187 | flags |= REGION_FLAGS_SUN_FIXED; | 2213 | flags |= REGION_FLAGS_SUN_FIXED; |
2188 | } | 2214 | } |
2189 | 2215 | ||
2190 | if (childGetValue("deny_anonymous").asBoolean()) | 2216 | if (childGetValue("limit_payment").asBoolean()) |
2191 | { | 2217 | { |
2192 | flags |= REGION_FLAGS_DENY_ANONYMOUS; | 2218 | flags |= REGION_FLAGS_DENY_ANONYMOUS; |
2193 | } | 2219 | } |
2194 | 2220 | ||
2195 | if (childGetValue("deny_identified").asBoolean()) | 2221 | if (childGetValue("limit_age_verified").asBoolean()) |
2196 | { | 2222 | { |
2197 | flags |= REGION_FLAGS_DENY_IDENTIFIED; | 2223 | flags |= REGION_FLAGS_DENY_AGEUNVERIFIED; |
2198 | } | 2224 | } |
2199 | 2225 | ||
2200 | if (childGetValue("deny_transacted").asBoolean()) | ||
2201 | { | ||
2202 | flags |= REGION_FLAGS_DENY_TRANSACTED; | ||
2203 | } | ||
2204 | 2226 | ||
2205 | return flags; | 2227 | return flags; |
2206 | } | 2228 | } |
diff --git a/linden/indra/newview/llfloaterregioninfo.h b/linden/indra/newview/llfloaterregioninfo.h index 656583b..abf4789 100644 --- a/linden/indra/newview/llfloaterregioninfo.h +++ b/linden/indra/newview/llfloaterregioninfo.h | |||
@@ -79,6 +79,9 @@ public: | |||
79 | static LLPanelEstateInfo* getPanelEstate(); | 79 | static LLPanelEstateInfo* getPanelEstate(); |
80 | static LLPanelEstateCovenant* getPanelCovenant(); | 80 | static LLPanelEstateCovenant* getPanelCovenant(); |
81 | 81 | ||
82 | // from LLPanel | ||
83 | virtual void refresh(); | ||
84 | |||
82 | protected: | 85 | protected: |
83 | LLFloaterRegionInfo(const LLRect& rect); | 86 | LLFloaterRegionInfo(const LLRect& rect); |
84 | void refreshFromRegion(LLViewerRegion* region); | 87 | void refreshFromRegion(LLViewerRegion* region); |
@@ -294,6 +297,7 @@ public: | |||
294 | // LLPanel | 297 | // LLPanel |
295 | virtual BOOL postBuild(); | 298 | virtual BOOL postBuild(); |
296 | virtual void updateChild(LLUICtrl* child_ctrl); | 299 | virtual void updateChild(LLUICtrl* child_ctrl); |
300 | virtual void refresh(); | ||
297 | 301 | ||
298 | U32 computeEstateFlags(); | 302 | U32 computeEstateFlags(); |
299 | void setEstateFlags(U32 flags); | 303 | void setEstateFlags(U32 flags); |
diff --git a/linden/indra/newview/llfloaterreleasemsg.cpp b/linden/indra/newview/llfloaterreleasemsg.cpp index 87ff436..bb5bbd5 100644 --- a/linden/indra/newview/llfloaterreleasemsg.cpp +++ b/linden/indra/newview/llfloaterreleasemsg.cpp | |||
@@ -37,9 +37,10 @@ | |||
37 | #include "llfloaterreleasemsg.h" | 37 | #include "llfloaterreleasemsg.h" |
38 | #include "llagent.h" | 38 | #include "llagent.h" |
39 | #include "llviewerregion.h" | 39 | #include "llviewerregion.h" |
40 | #include "llappviewer.h" | ||
40 | 41 | ||
41 | extern LLAgent gAgent; | 42 | extern LLAgent gAgent; |
42 | extern LLString gLastVersionChannel; | 43 | |
43 | 44 | ||
44 | LLFloaterReleaseMsg* LLFloaterReleaseMsg::sInstance = 0; | 45 | LLFloaterReleaseMsg* LLFloaterReleaseMsg::sInstance = 0; |
45 | 46 | ||
diff --git a/linden/indra/newview/llfloaterreporter.cpp b/linden/indra/newview/llfloaterreporter.cpp index a7cd211..bd5438e 100644 --- a/linden/indra/newview/llfloaterreporter.cpp +++ b/linden/indra/newview/llfloaterreporter.cpp | |||
@@ -81,7 +81,7 @@ | |||
81 | #include "llselectmgr.h" | 81 | #include "llselectmgr.h" |
82 | #include "llviewerbuild.h" | 82 | #include "llviewerbuild.h" |
83 | #include "llvieweruictrlfactory.h" | 83 | #include "llvieweruictrlfactory.h" |
84 | #include "viewer.h" | 84 | #include "llappviewer.h" |
85 | 85 | ||
86 | #include "llassetuploadresponders.h" | 86 | #include "llassetuploadresponders.h" |
87 | 87 | ||
diff --git a/linden/indra/newview/llfloatersnapshot.cpp b/linden/indra/newview/llfloatersnapshot.cpp index 3bc172c..71e94cc 100644 --- a/linden/indra/newview/llfloatersnapshot.cpp +++ b/linden/indra/newview/llfloatersnapshot.cpp | |||
@@ -51,7 +51,6 @@ | |||
51 | #include "llsliderctrl.h" | 51 | #include "llsliderctrl.h" |
52 | #include "llspinctrl.h" | 52 | #include "llspinctrl.h" |
53 | #include "llviewercontrol.h" | 53 | #include "llviewercontrol.h" |
54 | #include "viewer.h" | ||
55 | #include "llvieweruictrlfactory.h" | 54 | #include "llvieweruictrlfactory.h" |
56 | #include "llviewerstats.h" | 55 | #include "llviewerstats.h" |
57 | #include "llviewercamera.h" | 56 | #include "llviewercamera.h" |
diff --git a/linden/indra/newview/llfloatertest.cpp b/linden/indra/newview/llfloatertest.cpp index 5af34a8..2716306 100644 --- a/linden/indra/newview/llfloatertest.cpp +++ b/linden/indra/newview/llfloatertest.cpp | |||
@@ -147,7 +147,7 @@ LLFloaterTestImpl::LLFloaterTestImpl() | |||
147 | "monospaced, non-opaque text with tooltip, non-opaque non-opaque", | 147 | "monospaced, non-opaque text with tooltip, non-opaque non-opaque", |
148 | LLFontGL::sMonospace, | 148 | LLFontGL::sMonospace, |
149 | FALSE); // mouse_opaque | 149 | FALSE); // mouse_opaque |
150 | text->setToolTip("I'm a tooltip"); | 150 | text->setToolTip(LLString("I'm a tooltip")); |
151 | addChild(text); | 151 | addChild(text); |
152 | 152 | ||
153 | y -= VPAD + LINE; | 153 | y -= VPAD + LINE; |
@@ -178,7 +178,7 @@ LLFloaterTestImpl::LLFloaterTestImpl() | |||
178 | LLString("File"), | 178 | LLString("File"), |
179 | LLFontGL::sSansSerif, | 179 | LLFontGL::sSansSerif, |
180 | TRUE); // mouse_opaque | 180 | TRUE); // mouse_opaque |
181 | text->setToolTip("This should be Unicode text"); | 181 | text->setToolTip(LLString("This should be Unicode text")); |
182 | panel->addChild(text); | 182 | panel->addChild(text); |
183 | 183 | ||
184 | y -= VPAD + LINE; | 184 | y -= VPAD + LINE; |
diff --git a/linden/indra/newview/llfloatertools.cpp b/linden/indra/newview/llfloatertools.cpp index 4f8ed08..22581c6 100644 --- a/linden/indra/newview/llfloatertools.cpp +++ b/linden/indra/newview/llfloatertools.cpp | |||
@@ -76,7 +76,6 @@ | |||
76 | #include "llviewerparcelmgr.h" | 76 | #include "llviewerparcelmgr.h" |
77 | #include "llviewerwindow.h" | 77 | #include "llviewerwindow.h" |
78 | #include "llviewercontrol.h" | 78 | #include "llviewercontrol.h" |
79 | #include "viewer.h" | ||
80 | 79 | ||
81 | #include "llvieweruictrlfactory.h" | 80 | #include "llvieweruictrlfactory.h" |
82 | 81 | ||
@@ -752,7 +751,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask) | |||
752 | BOOL LLFloaterTools::canClose() | 751 | BOOL LLFloaterTools::canClose() |
753 | { | 752 | { |
754 | // don't close when quitting, so camera will stay put | 753 | // don't close when quitting, so camera will stay put |
755 | return !gQuit; | 754 | return !LLApp::isExiting(); |
756 | } | 755 | } |
757 | 756 | ||
758 | // virtual | 757 | // virtual |
diff --git a/linden/indra/newview/llfloatertos.cpp b/linden/indra/newview/llfloatertos.cpp index 9e86c92..20f9e1e 100644 --- a/linden/indra/newview/llfloatertos.cpp +++ b/linden/indra/newview/llfloatertos.cpp | |||
@@ -38,7 +38,7 @@ | |||
38 | #include "llvfile.h" | 38 | #include "llvfile.h" |
39 | #include "lltextbox.h" | 39 | #include "lltextbox.h" |
40 | #include "llviewertexteditor.h" | 40 | #include "llviewertexteditor.h" |
41 | #include "viewer.h" | 41 | #include "llappviewer.h" |
42 | #include "llstartup.h" | 42 | #include "llstartup.h" |
43 | #include "message.h" | 43 | #include "message.h" |
44 | #include "llagent.h" | 44 | #include "llagent.h" |
diff --git a/linden/indra/newview/llfloaterworldmap.cpp b/linden/indra/newview/llfloaterworldmap.cpp index b411bb2..53b43ef 100644 --- a/linden/indra/newview/llfloaterworldmap.cpp +++ b/linden/indra/newview/llfloaterworldmap.cpp | |||
@@ -84,7 +84,7 @@ | |||
84 | #include "llworldmapview.h" | 84 | #include "llworldmapview.h" |
85 | #include "llurl.h" | 85 | #include "llurl.h" |
86 | #include "llvieweruictrlfactory.h" | 86 | #include "llvieweruictrlfactory.h" |
87 | #include "viewer.h" | 87 | #include "llappviewer.h" |
88 | #include "llmapimagetype.h" | 88 | #include "llmapimagetype.h" |
89 | #include "llweb.h" | 89 | #include "llweb.h" |
90 | 90 | ||
diff --git a/linden/indra/newview/llfolderview.cpp b/linden/indra/newview/llfolderview.cpp index c6a2710..eb9addc 100644 --- a/linden/indra/newview/llfolderview.cpp +++ b/linden/indra/newview/llfolderview.cpp | |||
@@ -66,7 +66,7 @@ | |||
66 | // We need these because some of the code below relies on things like | 66 | // We need these because some of the code below relies on things like |
67 | // gAgent root folder. Remove them once the abstraction leak is fixed. | 67 | // gAgent root folder. Remove them once the abstraction leak is fixed. |
68 | #include "llagent.h" | 68 | #include "llagent.h" |
69 | #include "viewer.h" | 69 | #include "llappviewer.h" |
70 | 70 | ||
71 | ///---------------------------------------------------------------------------- | 71 | ///---------------------------------------------------------------------------- |
72 | /// Local function declarations, constants, enums, and typedefs | 72 | /// Local function declarations, constants, enums, and typedefs |
diff --git a/linden/indra/newview/llframestatview.cpp b/linden/indra/newview/llframestatview.cpp index aa6c609..1111e18 100644 --- a/linden/indra/newview/llframestatview.cpp +++ b/linden/indra/newview/llframestatview.cpp | |||
@@ -40,7 +40,6 @@ | |||
40 | #include "llmath.h" | 40 | #include "llmath.h" |
41 | #include "llfontgl.h" | 41 | #include "llfontgl.h" |
42 | 42 | ||
43 | #include "viewer.h" | ||
44 | #include "llui.h" | 43 | #include "llui.h" |
45 | #include "llviewercontrol.h" | 44 | #include "llviewercontrol.h" |
46 | #include "llstat.h" | 45 | #include "llstat.h" |
diff --git a/linden/indra/newview/llgesturemgr.cpp b/linden/indra/newview/llgesturemgr.cpp index 3e17ecf..537cadf 100644 --- a/linden/indra/newview/llgesturemgr.cpp +++ b/linden/indra/newview/llgesturemgr.cpp | |||
@@ -55,7 +55,6 @@ | |||
55 | #include "llviewermessage.h" | 55 | #include "llviewermessage.h" |
56 | #include "llvoavatar.h" | 56 | #include "llvoavatar.h" |
57 | #include "llviewerstats.h" | 57 | #include "llviewerstats.h" |
58 | #include "viewer.h" | ||
59 | 58 | ||
60 | LLGestureManager gGestureManager; | 59 | LLGestureManager gGestureManager; |
61 | 60 | ||
diff --git a/linden/indra/newview/llglsandbox.cpp b/linden/indra/newview/llglsandbox.cpp index da3f7aa..ba56d70 100644 --- a/linden/indra/newview/llglsandbox.cpp +++ b/linden/indra/newview/llglsandbox.cpp | |||
@@ -56,7 +56,6 @@ | |||
56 | #include "llviewerobjectlist.h" | 56 | #include "llviewerobjectlist.h" |
57 | #include "lltoolselectrect.h" | 57 | #include "lltoolselectrect.h" |
58 | #include "llviewerwindow.h" | 58 | #include "llviewerwindow.h" |
59 | #include "viewer.h" | ||
60 | #include "llcompass.h" | 59 | #include "llcompass.h" |
61 | #include "llsurface.h" | 60 | #include "llsurface.h" |
62 | #include "llwind.h" | 61 | #include "llwind.h" |
diff --git a/linden/indra/newview/llgroupmgr.cpp b/linden/indra/newview/llgroupmgr.cpp index d1116b6..c213d26 100644 --- a/linden/indra/newview/llgroupmgr.cpp +++ b/linden/indra/newview/llgroupmgr.cpp | |||
@@ -47,7 +47,6 @@ | |||
47 | #include "roles_constants.h" | 47 | #include "roles_constants.h" |
48 | #include "lltransactiontypes.h" | 48 | #include "lltransactiontypes.h" |
49 | #include "llstatusbar.h" | 49 | #include "llstatusbar.h" |
50 | #include "viewer.h" | ||
51 | #include "lleconomy.h" | 50 | #include "lleconomy.h" |
52 | #include "llviewerwindow.h" | 51 | #include "llviewerwindow.h" |
53 | #include "llfloaterdirectory.h" | 52 | #include "llfloaterdirectory.h" |
@@ -806,8 +805,7 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data) | |||
806 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); | 805 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); |
807 | if (gAgent.getID() != agent_id) | 806 | if (gAgent.getID() != agent_id) |
808 | { | 807 | { |
809 | llwarns << "Got group properties reply for another agent!" | 808 | llwarns << "Got group properties reply for another agent!" << llendl; |
810 | << " Probably a userserver bug!" << llendl; | ||
811 | return; | 809 | return; |
812 | } | 810 | } |
813 | 811 | ||
@@ -895,8 +893,7 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data) | |||
895 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); | 893 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); |
896 | if (gAgent.getID() != agent_id) | 894 | if (gAgent.getID() != agent_id) |
897 | { | 895 | { |
898 | llwarns << "Got group properties reply for another agent!" | 896 | llwarns << "Got group properties reply for another agent!" << llendl; |
899 | << " Probably a userserver bug!" << llendl; | ||
900 | return; | 897 | return; |
901 | } | 898 | } |
902 | 899 | ||
@@ -963,8 +960,7 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data) | |||
963 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); | 960 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); |
964 | if (gAgent.getID() != agent_id) | 961 | if (gAgent.getID() != agent_id) |
965 | { | 962 | { |
966 | llwarns << "Got group properties reply for another agent!" | 963 | llwarns << "Got group properties reply for another agent!" << llendl; |
967 | << " Probably a userserver bug!" << llendl; | ||
968 | return; | 964 | return; |
969 | } | 965 | } |
970 | 966 | ||
@@ -1031,8 +1027,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data) | |||
1031 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); | 1027 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); |
1032 | if (gAgent.getID() != agent_id) | 1028 | if (gAgent.getID() != agent_id) |
1033 | { | 1029 | { |
1034 | llwarns << "Got group properties reply for another agent!" | 1030 | llwarns << "Got group properties reply for another agent!" << llendl; |
1035 | << " Probably a userserver bug!" << llendl; | ||
1036 | return; | 1031 | return; |
1037 | } | 1032 | } |
1038 | 1033 | ||
@@ -1142,8 +1137,7 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data) | |||
1142 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); | 1137 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); |
1143 | if (gAgent.getID() != agent_id) | 1138 | if (gAgent.getID() != agent_id) |
1144 | { | 1139 | { |
1145 | llwarns << "Got group properties reply for another agent!" | 1140 | llwarns << "Got group properties reply for another agent!" << llendl; |
1146 | << " Probably a userserver bug!" << llendl; | ||
1147 | return; | 1141 | return; |
1148 | } | 1142 | } |
1149 | 1143 | ||
diff --git a/linden/indra/newview/llgroupnotify.cpp b/linden/indra/newview/llgroupnotify.cpp index 8a88165..6947aae 100644 --- a/linden/indra/newview/llgroupnotify.cpp +++ b/linden/indra/newview/llgroupnotify.cpp | |||
@@ -285,7 +285,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const char* subject, | |||
285 | onClickNext, | 285 | onClickNext, |
286 | this, | 286 | this, |
287 | LLFontGL::sSansSerif); | 287 | LLFontGL::sSansSerif); |
288 | btn->setToolTip("Next"); | 288 | btn->setToolTip(LLString("Next")); // *TODO: Translate |
289 | addChild(btn); | 289 | addChild(btn); |
290 | mNextBtn = btn; | 290 | mNextBtn = btn; |
291 | 291 | ||
@@ -312,7 +312,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const char* subject, | |||
312 | BTN_HEIGHT); | 312 | BTN_HEIGHT); |
313 | 313 | ||
314 | btn = new LLButton("Group Notices", btn_rect, "", onClickGroupInfo, this); | 314 | btn = new LLButton("Group Notices", btn_rect, "", onClickGroupInfo, this); |
315 | btn->setToolTip("View past notices or opt-out of receiving these messages here."); | 315 | btn->setToolTip(LLString("View past notices or opt-out of receiving these messages here.")); // TODO: Translate |
316 | addChild(btn, -1); | 316 | addChild(btn, -1); |
317 | 317 | ||
318 | if (mHasInventory && mInventoryOffer) | 318 | if (mHasInventory && mInventoryOffer) |
diff --git a/linden/indra/newview/llhudtext.cpp b/linden/indra/newview/llhudtext.cpp index 1ebe813..1d68441 100644 --- a/linden/indra/newview/llhudtext.cpp +++ b/linden/indra/newview/llhudtext.cpp | |||
@@ -48,7 +48,6 @@ | |||
48 | #include "llviewerobject.h" | 48 | #include "llviewerobject.h" |
49 | #include "llvovolume.h" | 49 | #include "llvovolume.h" |
50 | #include "llviewerwindow.h" | 50 | #include "llviewerwindow.h" |
51 | #include "viewer.h" | ||
52 | #include "llstatusbar.h" | 51 | #include "llstatusbar.h" |
53 | #include "llmenugl.h" | 52 | #include "llmenugl.h" |
54 | #include "pipeline.h" | 53 | #include "pipeline.h" |
diff --git a/linden/indra/newview/llimpanel.cpp b/linden/indra/newview/llimpanel.cpp index b259b80..810d3a2 100644 --- a/linden/indra/newview/llimpanel.cpp +++ b/linden/indra/newview/llimpanel.cpp | |||
@@ -61,7 +61,7 @@ | |||
61 | #include "llviewertexteditor.h" | 61 | #include "llviewertexteditor.h" |
62 | #include "llviewermessage.h" | 62 | #include "llviewermessage.h" |
63 | #include "llviewerstats.h" | 63 | #include "llviewerstats.h" |
64 | #include "viewer.h" | 64 | #include "llviewercontrol.h" |
65 | #include "llvieweruictrlfactory.h" | 65 | #include "llvieweruictrlfactory.h" |
66 | #include "lllogchat.h" | 66 | #include "lllogchat.h" |
67 | #include "llfloaterhtml.h" | 67 | #include "llfloaterhtml.h" |
diff --git a/linden/indra/newview/llimview.cpp b/linden/indra/newview/llimview.cpp index a6e2a13..9c37f1f 100644 --- a/linden/indra/newview/llimview.cpp +++ b/linden/indra/newview/llimview.cpp | |||
@@ -55,7 +55,7 @@ | |||
55 | #include "llimpanel.h" | 55 | #include "llimpanel.h" |
56 | #include "llresizebar.h" | 56 | #include "llresizebar.h" |
57 | #include "lltabcontainer.h" | 57 | #include "lltabcontainer.h" |
58 | #include "viewer.h" | 58 | #include "llviewercontrol.h" |
59 | #include "llfloater.h" | 59 | #include "llfloater.h" |
60 | #include "llmutelist.h" | 60 | #include "llmutelist.h" |
61 | #include "llresizehandle.h" | 61 | #include "llresizehandle.h" |
diff --git a/linden/indra/newview/llinventoryactions.cpp b/linden/indra/newview/llinventoryactions.cpp index fba3ace..9adb3b9 100644 --- a/linden/indra/newview/llinventoryactions.cpp +++ b/linden/indra/newview/llinventoryactions.cpp | |||
@@ -78,7 +78,6 @@ | |||
78 | #include "llviewerwindow.h" | 78 | #include "llviewerwindow.h" |
79 | #include "llwearable.h" | 79 | #include "llwearable.h" |
80 | #include "llwearablelist.h" | 80 | #include "llwearablelist.h" |
81 | #include "viewer.h" | ||
82 | #include "llviewermessage.h" | 81 | #include "llviewermessage.h" |
83 | #include "llviewerregion.h" | 82 | #include "llviewerregion.h" |
84 | #include "lltabcontainer.h" | 83 | #include "lltabcontainer.h" |
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp index f777e09..12617ef 100644 --- a/linden/indra/newview/llinventorybridge.cpp +++ b/linden/indra/newview/llinventorybridge.cpp | |||
@@ -78,7 +78,6 @@ | |||
78 | #include "llviewerwindow.h" | 78 | #include "llviewerwindow.h" |
79 | #include "llwearable.h" | 79 | #include "llwearable.h" |
80 | #include "llwearablelist.h" | 80 | #include "llwearablelist.h" |
81 | #include "viewer.h" | ||
82 | #include "llviewermessage.h" | 81 | #include "llviewermessage.h" |
83 | #include "llviewerregion.h" | 82 | #include "llviewerregion.h" |
84 | #include "lltabcontainer.h" | 83 | #include "lltabcontainer.h" |
diff --git a/linden/indra/newview/llinventorybridge.h b/linden/indra/newview/llinventorybridge.h index 8c2eb2b..c61fa7f 100644 --- a/linden/indra/newview/llinventorybridge.h +++ b/linden/indra/newview/llinventorybridge.h | |||
@@ -383,6 +383,7 @@ class LLLandmarkBridge : public LLItemBridge | |||
383 | { | 383 | { |
384 | friend class LLInvFVBridge; | 384 | friend class LLInvFVBridge; |
385 | public: | 385 | public: |
386 | static const LLString& prefix() { return sPrefix; } | ||
386 | virtual const LLString& getPrefix() { return sPrefix; } | 387 | virtual const LLString& getPrefix() { return sPrefix; } |
387 | virtual void performAction(LLFolderView* folder, LLInventoryModel* model, LLString action); | 388 | virtual void performAction(LLFolderView* folder, LLInventoryModel* model, LLString action); |
388 | virtual void buildContextMenu(LLMenuGL& menu, U32 flags); | 389 | virtual void buildContextMenu(LLMenuGL& menu, U32 flags); |
diff --git a/linden/indra/newview/llinventorymodel.cpp b/linden/indra/newview/llinventorymodel.cpp index 4e54e78..ca65b87 100644 --- a/linden/indra/newview/llinventorymodel.cpp +++ b/linden/indra/newview/llinventorymodel.cpp | |||
@@ -47,7 +47,7 @@ | |||
47 | #include "llviewerinventory.h" | 47 | #include "llviewerinventory.h" |
48 | #include "llviewermessage.h" | 48 | #include "llviewermessage.h" |
49 | #include "llviewerwindow.h" | 49 | #include "llviewerwindow.h" |
50 | #include "viewer.h" | 50 | #include "llappviewer.h" |
51 | #include "lldbstrings.h" | 51 | #include "lldbstrings.h" |
52 | #include "llviewerstats.h" | 52 | #include "llviewerstats.h" |
53 | #include "llmutelist.h" | 53 | #include "llmutelist.h" |
diff --git a/linden/indra/newview/llinventoryview.cpp b/linden/indra/newview/llinventoryview.cpp index 2ac46ab..96d947f 100644 --- a/linden/indra/newview/llinventoryview.cpp +++ b/linden/indra/newview/llinventoryview.cpp | |||
@@ -75,7 +75,7 @@ | |||
75 | #include "llviewerobjectlist.h" | 75 | #include "llviewerobjectlist.h" |
76 | #include "llviewerwindow.h" | 76 | #include "llviewerwindow.h" |
77 | #include "llwearablelist.h" | 77 | #include "llwearablelist.h" |
78 | #include "viewer.h" | 78 | #include "llappviewer.h" |
79 | #include "llviewermessage.h" | 79 | #include "llviewermessage.h" |
80 | #include "llviewerregion.h" | 80 | #include "llviewerregion.h" |
81 | #include "lltabcontainer.h" | 81 | #include "lltabcontainer.h" |
diff --git a/linden/indra/newview/lllcd.cpp b/linden/indra/newview/lllcd.cpp index f6fec7d..f980ee4 100644 --- a/linden/indra/newview/lllcd.cpp +++ b/linden/indra/newview/lllcd.cpp | |||
@@ -31,11 +31,14 @@ | |||
31 | 31 | ||
32 | 32 | ||
33 | #include "llviewerprecompiledheaders.h" | 33 | #include "llviewerprecompiledheaders.h" |
34 | #include "lllcd.h" | ||
35 | |||
34 | #include "llcontrol.h" | 36 | #include "llcontrol.h" |
35 | #include "llstatusbar.h" | 37 | #include "llstatusbar.h" |
36 | #include "llviewerregion.h" | 38 | #include "llviewerregion.h" |
37 | #include "llviewerstats.h" | 39 | #include "llviewerstats.h" |
38 | #include "llvieweruictrlfactory.h" | 40 | #include "llvieweruictrlfactory.h" |
41 | #include "llviewercontrol.h" | ||
39 | 42 | ||
40 | #if LL_LCD_COMPILE | 43 | #if LL_LCD_COMPILE |
41 | 44 | ||
@@ -47,7 +50,8 @@ extern LLControlGroup gSavedSettings; | |||
47 | // for Logitech LCD keyboards / speakers | 50 | // for Logitech LCD keyboards / speakers |
48 | #include "EZ_LCD.h" | 51 | #include "EZ_LCD.h" |
49 | #include "lllogitechlcd.h" | 52 | #include "lllogitechlcd.h" |
50 | #include "lllcd.h" | 53 | |
54 | llLCD *gLcdScreen = NULL; // Singleton-ish? | ||
51 | 55 | ||
52 | // not happy about this, but there's no local class to put it in. | 56 | // not happy about this, but there's no local class to put it in. |
53 | LLPanel *bogus = NULL; | 57 | LLPanel *bogus = NULL; |
diff --git a/linden/indra/newview/lllcd.h b/linden/indra/newview/lllcd.h index e6583c7..ae21da3 100644 --- a/linden/indra/newview/lllcd.h +++ b/linden/indra/newview/lllcd.h | |||
@@ -105,6 +105,9 @@ public: | |||
105 | }; | 105 | }; |
106 | 106 | ||
107 | class llLCD; | 107 | class llLCD; |
108 | |||
109 | // The following symbols are exported from lllcd.cpp | ||
108 | extern llLCD *gLcdScreen; | 110 | extern llLCD *gLcdScreen; |
111 | extern void CreateLCDDebugWindows(); | ||
109 | 112 | ||
110 | //#endif | 113 | //#endif |
diff --git a/linden/indra/newview/lllogchat.cpp b/linden/indra/newview/lllogchat.cpp index 8620446..d89ec79 100644 --- a/linden/indra/newview/lllogchat.cpp +++ b/linden/indra/newview/lllogchat.cpp | |||
@@ -32,7 +32,7 @@ | |||
32 | #include "llviewerprecompiledheaders.h" | 32 | #include "llviewerprecompiledheaders.h" |
33 | 33 | ||
34 | #include "lllogchat.h" | 34 | #include "lllogchat.h" |
35 | #include "viewer.h" | 35 | #include "llappviewer.h" |
36 | 36 | ||
37 | const S32 LOG_RECALL_SIZE = 2048; | 37 | const S32 LOG_RECALL_SIZE = 2048; |
38 | 38 | ||
diff --git a/linden/indra/newview/llmanip.cpp b/linden/indra/newview/llmanip.cpp index 953befc..44b919a 100644 --- a/linden/indra/newview/llmanip.cpp +++ b/linden/indra/newview/llmanip.cpp | |||
@@ -55,7 +55,6 @@ | |||
55 | #include "llvoavatar.h" | 55 | #include "llvoavatar.h" |
56 | #include "llworld.h" // for gWorldPointer | 56 | #include "llworld.h" // for gWorldPointer |
57 | #include "llresmgr.h" | 57 | #include "llresmgr.h" |
58 | #include "viewer.h" // for gFPS | ||
59 | #include "pipeline.h" | 58 | #include "pipeline.h" |
60 | #include "llglheaders.h" | 59 | #include "llglheaders.h" |
61 | 60 | ||
diff --git a/linden/indra/newview/llmaniprotate.cpp b/linden/indra/newview/llmaniprotate.cpp index fb3de3a..2e4f66c 100644 --- a/linden/indra/newview/llmaniprotate.cpp +++ b/linden/indra/newview/llmaniprotate.cpp | |||
@@ -60,7 +60,6 @@ | |||
60 | #include "llviewerwindow.h" | 60 | #include "llviewerwindow.h" |
61 | #include "llworld.h" | 61 | #include "llworld.h" |
62 | #include "pipeline.h" | 62 | #include "pipeline.h" |
63 | #include "viewer.h" | ||
64 | #include "lldrawable.h" | 63 | #include "lldrawable.h" |
65 | #include "llglheaders.h" | 64 | #include "llglheaders.h" |
66 | 65 | ||
@@ -513,8 +512,6 @@ LLVector3 LLManipRotate::projectToSphere( F32 x, F32 y, BOOL* on_sphere ) | |||
513 | return LLVector3( x, y, z ); | 512 | return LLVector3( x, y, z ); |
514 | } | 513 | } |
515 | 514 | ||
516 | extern U32 gFrameCount; | ||
517 | |||
518 | // Freeform rotation | 515 | // Freeform rotation |
519 | void LLManipRotate::drag( S32 x, S32 y ) | 516 | void LLManipRotate::drag( S32 x, S32 y ) |
520 | { | 517 | { |
diff --git a/linden/indra/newview/llmaniptranslate.cpp b/linden/indra/newview/llmaniptranslate.cpp index 1963b1a..36e3f9a 100644 --- a/linden/indra/newview/llmaniptranslate.cpp +++ b/linden/indra/newview/llmaniptranslate.cpp | |||
@@ -61,7 +61,6 @@ | |||
61 | #include "llviewerwindow.h" | 61 | #include "llviewerwindow.h" |
62 | #include "llvoavatar.h" | 62 | #include "llvoavatar.h" |
63 | #include "llworld.h" | 63 | #include "llworld.h" |
64 | #include "viewer.h" | ||
65 | #include "llui.h" | 64 | #include "llui.h" |
66 | #include "pipeline.h" | 65 | #include "pipeline.h" |
67 | 66 | ||
diff --git a/linden/indra/newview/llmemoryview.cpp b/linden/indra/newview/llmemoryview.cpp index 53582ac..a698c53 100644 --- a/linden/indra/newview/llmemoryview.cpp +++ b/linden/indra/newview/llmemoryview.cpp | |||
@@ -41,7 +41,6 @@ | |||
41 | #include "llfontgl.h" | 41 | #include "llfontgl.h" |
42 | #include "llmemtype.h" | 42 | #include "llmemtype.h" |
43 | 43 | ||
44 | #include "viewer.h" | ||
45 | #include "llui.h" | 44 | #include "llui.h" |
46 | #include "llviewercontrol.h" | 45 | #include "llviewercontrol.h" |
47 | #include "llstat.h" | 46 | #include "llstat.h" |
diff --git a/linden/indra/newview/llmenucommands.cpp b/linden/indra/newview/llmenucommands.cpp index 92c7832..68bbe53 100644 --- a/linden/indra/newview/llmenucommands.cpp +++ b/linden/indra/newview/llmenucommands.cpp | |||
@@ -67,7 +67,6 @@ | |||
67 | #include "llviewerwindow.h" | 67 | #include "llviewerwindow.h" |
68 | #include "llworld.h" | 68 | #include "llworld.h" |
69 | #include "llworldmap.h" | 69 | #include "llworldmap.h" |
70 | #include "viewer.h" | ||
71 | #include "llfocusmgr.h" | 70 | #include "llfocusmgr.h" |
72 | 71 | ||
73 | void handle_track_avatar(const LLUUID& agent_id, const std::string& name) | 72 | void handle_track_avatar(const LLUUID& agent_id, const std::string& name) |
diff --git a/linden/indra/newview/llmorphview.cpp b/linden/indra/newview/llmorphview.cpp index d69968d..81e6774 100644 --- a/linden/indra/newview/llmorphview.cpp +++ b/linden/indra/newview/llmorphview.cpp | |||
@@ -49,7 +49,6 @@ | |||
49 | #include "llvoavatar.h" | 49 | #include "llvoavatar.h" |
50 | #include "llviewerwindow.h" | 50 | #include "llviewerwindow.h" |
51 | #include "pipeline.h" | 51 | #include "pipeline.h" |
52 | #include "viewer.h" | ||
53 | 52 | ||
54 | LLMorphView *gMorphView = NULL; | 53 | LLMorphView *gMorphView = NULL; |
55 | 54 | ||
diff --git a/linden/indra/newview/llmoveview.cpp b/linden/indra/newview/llmoveview.cpp index e115f10..4f1d7bb 100644 --- a/linden/indra/newview/llmoveview.cpp +++ b/linden/indra/newview/llmoveview.cpp | |||
@@ -39,7 +39,7 @@ | |||
39 | // Viewer includes | 39 | // Viewer includes |
40 | #include "llagent.h" | 40 | #include "llagent.h" |
41 | #include "llcallbacklist.h" | 41 | #include "llcallbacklist.h" |
42 | #include "viewer.h" | 42 | #include "llviewercontrol.h" |
43 | #include "llfontgl.h" | 43 | #include "llfontgl.h" |
44 | #include "llbutton.h" | 44 | #include "llbutton.h" |
45 | #include "llviewerwindow.h" | 45 | #include "llviewerwindow.h" |
diff --git a/linden/indra/newview/llmutelist.cpp b/linden/indra/newview/llmutelist.cpp index 118fd42..f36e282 100644 --- a/linden/indra/newview/llmutelist.cpp +++ b/linden/indra/newview/llmutelist.cpp | |||
@@ -61,7 +61,6 @@ | |||
61 | #include "llfloatermute.h" | 61 | #include "llfloatermute.h" |
62 | #include "llviewergenericmessage.h" // for gGenericDispatcher | 62 | #include "llviewergenericmessage.h" // for gGenericDispatcher |
63 | #include "llviewerwindow.h" | 63 | #include "llviewerwindow.h" |
64 | #include "viewer.h" | ||
65 | #include "llworld.h" //for particle system banning | 64 | #include "llworld.h" //for particle system banning |
66 | 65 | ||
67 | LLMuteList* gMuteListp = NULL; | 66 | LLMuteList* gMuteListp = NULL; |
diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp index edf2567..c312865 100644 --- a/linden/indra/newview/llnetmap.cpp +++ b/linden/indra/newview/llnetmap.cpp | |||
@@ -65,7 +65,7 @@ | |||
65 | #include "llvoavatar.h" | 65 | #include "llvoavatar.h" |
66 | #include "llworld.h" | 66 | #include "llworld.h" |
67 | #include "llworldmapview.h" // shared draw code | 67 | #include "llworldmapview.h" // shared draw code |
68 | #include "viewer.h" // Only for constants! | 68 | #include "llappviewer.h" // Only for constants! |
69 | 69 | ||
70 | #include "llglheaders.h" | 70 | #include "llglheaders.h" |
71 | 71 | ||
diff --git a/linden/indra/newview/llnotify.cpp b/linden/indra/newview/llnotify.cpp index cd22343..0c259c0 100644 --- a/linden/indra/newview/llnotify.cpp +++ b/linden/indra/newview/llnotify.cpp | |||
@@ -152,7 +152,7 @@ LLNotifyBox* LLNotifyBox::findExistingNotify(LLPointer<LLNotifyBoxTemplate> noti | |||
152 | if(notify_template->mUnique) | 152 | if(notify_template->mUnique) |
153 | { | 153 | { |
154 | LLString message = notify_template->mMessage; | 154 | LLString message = notify_template->mMessage; |
155 | LLAlertDialog::format(message, args); | 155 | format(message, args); |
156 | unique_map_t::iterator found_it = sOpenUniqueNotifyBoxes.find(notify_template->mLabel + message); | 156 | unique_map_t::iterator found_it = sOpenUniqueNotifyBoxes.find(notify_template->mLabel + message); |
157 | if (found_it != sOpenUniqueNotifyBoxes.end()) | 157 | if (found_it != sOpenUniqueNotifyBoxes.end()) |
158 | { | 158 | { |
@@ -162,6 +162,7 @@ LLNotifyBox* LLNotifyBox::findExistingNotify(LLPointer<LLNotifyBoxTemplate> noti | |||
162 | return NULL; | 162 | return NULL; |
163 | } | 163 | } |
164 | 164 | ||
165 | //static | ||
165 | void LLNotifyBox::cleanup() | 166 | void LLNotifyBox::cleanup() |
166 | { | 167 | { |
167 | sDefaultTemplate = NULL; | 168 | sDefaultTemplate = NULL; |
@@ -196,7 +197,7 @@ LLNotifyBox::LLNotifyBox(LLPointer<LLNotifyBoxTemplate> xml_template, const LLSt | |||
196 | // setup paramaters | 197 | // setup paramaters |
197 | 198 | ||
198 | mMessage = xml_template->mMessage; | 199 | mMessage = xml_template->mMessage; |
199 | LLAlertDialog::format(mMessage, args); | 200 | format(mMessage, args); |
200 | 201 | ||
201 | // use name + formatted text as unique key | 202 | // use name + formatted text as unique key |
202 | if (mUnique) | 203 | if (mUnique) |
@@ -339,7 +340,7 @@ LLNotifyBox::LLNotifyBox(LLPointer<LLNotifyBoxTemplate> xml_template, const LLSt | |||
339 | onClickNext, | 340 | onClickNext, |
340 | this, | 341 | this, |
341 | sFont); | 342 | sFont); |
342 | btn->setToolTip("Next"); | 343 | btn->setToolTip(LLString("Next")); // *TODO: Translate |
343 | addChild(btn); | 344 | addChild(btn); |
344 | mNextBtn = btn; | 345 | mNextBtn = btn; |
345 | 346 | ||
@@ -440,7 +441,7 @@ BOOL LLNotifyBox::handleRightMouseDown(S32 x, S32 y, MASK mask) | |||
440 | { | 441 | { |
441 | if (!mIsTip && getVisible() && getEnabled() && pointInView(x,y)) | 442 | if (!mIsTip && getVisible() && getEnabled() && pointInView(x,y)) |
442 | { | 443 | { |
443 | moveToBack(); | 444 | moveToBack(true); |
444 | return TRUE; | 445 | return TRUE; |
445 | } | 446 | } |
446 | 447 | ||
@@ -554,6 +555,15 @@ void LLNotifyBox::close() | |||
554 | } | 555 | } |
555 | } | 556 | } |
556 | 557 | ||
558 | void LLNotifyBox::format(LLString& msg, const LLString::format_map_t& args) | ||
559 | { | ||
560 | // XUI:translate! | ||
561 | LLString::format_map_t targs = args; | ||
562 | targs["[SECOND_LIFE]"] = "Second Life"; | ||
563 | LLString::format(msg, targs); | ||
564 | } | ||
565 | |||
566 | |||
557 | /*virtual*/ | 567 | /*virtual*/ |
558 | BOOL LLNotifyBox::tick() | 568 | BOOL LLNotifyBox::tick() |
559 | { | 569 | { |
@@ -575,7 +585,7 @@ void LLNotifyBox::setVisible(BOOL visible) | |||
575 | LLPanel::setVisible(visible); | 585 | LLPanel::setVisible(visible); |
576 | } | 586 | } |
577 | 587 | ||
578 | void LLNotifyBox::moveToBack() | 588 | void LLNotifyBox::moveToBack(bool getfocus) |
579 | { | 589 | { |
580 | // Move this dialog to the back. | 590 | // Move this dialog to the back. |
581 | gNotifyBoxView->sendChildToBack(this); | 591 | gNotifyBoxView->sendChildToBack(this); |
@@ -590,10 +600,13 @@ void LLNotifyBox::moveToBack() | |||
590 | if (front) | 600 | if (front) |
591 | { | 601 | { |
592 | gNotifyBoxView->showOnly(front); | 602 | gNotifyBoxView->showOnly(front); |
593 | // assuming that moveToBack is only called by clicking the next button, | 603 | if (getfocus) |
594 | // we give focus to the next next button | 604 | { |
595 | front->mNextBtn->setFocus(TRUE); | 605 | // if are called from a user interaction |
596 | gFocusMgr.triggerFocusFlash(); // TODO: it's ugly to call this here | 606 | // we give focus to the next next button |
607 | front->mNextBtn->setFocus(TRUE); | ||
608 | gFocusMgr.triggerFocusFlash(); // TODO: it's ugly to call this here | ||
609 | } | ||
597 | } | 610 | } |
598 | } | 611 | } |
599 | } | 612 | } |
@@ -755,7 +768,7 @@ void LLNotifyBox::onClickButton(void* data) | |||
755 | void LLNotifyBox::onClickNext(void* data) | 768 | void LLNotifyBox::onClickNext(void* data) |
756 | { | 769 | { |
757 | LLNotifyBox* self = static_cast<LLNotifyBox*>(data); | 770 | LLNotifyBox* self = static_cast<LLNotifyBox*>(data); |
758 | self->moveToBack(); | 771 | self->moveToBack(true); |
759 | } | 772 | } |
760 | 773 | ||
761 | // static | 774 | // static |
@@ -795,7 +808,7 @@ const LLString LLNotifyBox::getTemplateMessage(const LLString& xml_desc, const L | |||
795 | if (iter != sNotifyTemplates.end()) | 808 | if (iter != sNotifyTemplates.end()) |
796 | { | 809 | { |
797 | LLString message = iter->second->mMessage; | 810 | LLString message = iter->second->mMessage; |
798 | LLAlertDialog::format(message, args); | 811 | format(message, args); |
799 | return message; | 812 | return message; |
800 | } | 813 | } |
801 | else | 814 | else |
diff --git a/linden/indra/newview/llnotify.h b/linden/indra/newview/llnotify.h index 3d7bf6d..d717883 100644 --- a/linden/indra/newview/llnotify.h +++ b/linden/indra/newview/llnotify.h | |||
@@ -74,6 +74,7 @@ public: | |||
74 | void close(); | 74 | void close(); |
75 | 75 | ||
76 | static void cleanup(); | 76 | static void cleanup(); |
77 | static void format(LLString& msg, const LLString::format_map_t& args); | ||
77 | 78 | ||
78 | protected: | 79 | protected: |
79 | LLNotifyBox(LLPointer<LLNotifyBoxTemplate> notify_template, const LLString::format_map_t& args, | 80 | LLNotifyBox(LLPointer<LLNotifyBoxTemplate> notify_template, const LLString::format_map_t& args, |
@@ -91,7 +92,7 @@ protected: | |||
91 | /*virtual*/ void draw(); | 92 | /*virtual*/ void draw(); |
92 | /*virtual*/ BOOL tick(); | 93 | /*virtual*/ BOOL tick(); |
93 | 94 | ||
94 | void moveToBack(); | 95 | void moveToBack(bool getfocus = false); |
95 | 96 | ||
96 | // Returns the rect, relative to gNotifyView, where this | 97 | // Returns the rect, relative to gNotifyView, where this |
97 | // notify box should be placed. | 98 | // notify box should be placed. |
diff --git a/linden/indra/newview/lloverlaybar.cpp b/linden/indra/newview/lloverlaybar.cpp index bcdb6c6..15c993e 100644 --- a/linden/indra/newview/lloverlaybar.cpp +++ b/linden/indra/newview/lloverlaybar.cpp | |||
@@ -57,7 +57,6 @@ | |||
57 | #include "llvoavatar.h" | 57 | #include "llvoavatar.h" |
58 | #include "llvoiceremotectrl.h" | 58 | #include "llvoiceremotectrl.h" |
59 | #include "llwebbrowserctrl.h" | 59 | #include "llwebbrowserctrl.h" |
60 | #include "viewer.h" | ||
61 | 60 | ||
62 | // | 61 | // |
63 | // Globals | 62 | // Globals |
diff --git a/linden/indra/newview/llpanelLCD.cpp b/linden/indra/newview/llpanelLCD.cpp index 960a321..63a1d6b 100644 --- a/linden/indra/newview/llpanelLCD.cpp +++ b/linden/indra/newview/llpanelLCD.cpp | |||
@@ -47,7 +47,7 @@ | |||
47 | #include "llresmgr.h" | 47 | #include "llresmgr.h" |
48 | #include "lltextbox.h" | 48 | #include "lltextbox.h" |
49 | #include "llui.h" | 49 | #include "llui.h" |
50 | #include "viewer.h" | 50 | #include "llviewercontrol.h" |
51 | 51 | ||
52 | //Ventrella | 52 | //Ventrella |
53 | #include "llagent.h" | 53 | #include "llagent.h" |
diff --git a/linden/indra/newview/llpanelaudioprefs.cpp b/linden/indra/newview/llpanelaudioprefs.cpp index a4591dc..7edccc2 100644 --- a/linden/indra/newview/llpanelaudioprefs.cpp +++ b/linden/indra/newview/llpanelaudioprefs.cpp | |||
@@ -60,7 +60,7 @@ | |||
60 | #include "llviewerparcelmgr.h" | 60 | #include "llviewerparcelmgr.h" |
61 | #include "llvieweruictrlfactory.h" | 61 | #include "llvieweruictrlfactory.h" |
62 | #include "llviewerwindow.h" | 62 | #include "llviewerwindow.h" |
63 | #include "viewer.h" // do_disconnect | 63 | #include "llviewercontrol.h" |
64 | 64 | ||
65 | // | 65 | // |
66 | // Static functions | 66 | // Static functions |
diff --git a/linden/indra/newview/llpanelavatar.cpp b/linden/indra/newview/llpanelavatar.cpp index dc2f14f..5b43497 100644 --- a/linden/indra/newview/llpanelavatar.cpp +++ b/linden/indra/newview/llpanelavatar.cpp | |||
@@ -69,6 +69,7 @@ | |||
69 | #include "lltooldraganddrop.h" | 69 | #include "lltooldraganddrop.h" |
70 | #include "lluiconstants.h" | 70 | #include "lluiconstants.h" |
71 | #include "llvoavatar.h" | 71 | #include "llvoavatar.h" |
72 | #include "llviewercontrol.h" | ||
72 | #include "llviewermenu.h" // *FIX: for is_agent_friend() | 73 | #include "llviewermenu.h" // *FIX: for is_agent_friend() |
73 | #include "llviewergenericmessage.h" // send_generic_message | 74 | #include "llviewergenericmessage.h" // send_generic_message |
74 | #include "llviewerobjectlist.h" | 75 | #include "llviewerobjectlist.h" |
@@ -76,7 +77,6 @@ | |||
76 | #include "llviewborder.h" | 77 | #include "llviewborder.h" |
77 | #include "llweb.h" | 78 | #include "llweb.h" |
78 | #include "llinventorymodel.h" | 79 | #include "llinventorymodel.h" |
79 | #include "viewer.h" // for gUserServer | ||
80 | #include "roles_constants.h" | 80 | #include "roles_constants.h" |
81 | 81 | ||
82 | #define kArraySize( _kArray ) ( sizeof( (_kArray) ) / sizeof( _kArray[0] ) ) | 82 | #define kArraySize( _kArray ) ( sizeof( (_kArray) ) / sizeof( _kArray[0] ) ) |
@@ -1788,6 +1788,7 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**) | |||
1788 | //BOOL mature = FALSE; | 1788 | //BOOL mature = FALSE; |
1789 | BOOL identified = FALSE; | 1789 | BOOL identified = FALSE; |
1790 | BOOL transacted = FALSE; | 1790 | BOOL transacted = FALSE; |
1791 | BOOL age_verified = FALSE; | ||
1791 | BOOL online = FALSE; | 1792 | BOOL online = FALSE; |
1792 | char profile_url[DB_USER_PROFILE_URL_BUF_SIZE]; /*Flawfinder: ignore*/ | 1793 | char profile_url[DB_USER_PROFILE_URL_BUF_SIZE]; /*Flawfinder: ignore*/ |
1793 | 1794 | ||
@@ -1825,6 +1826,7 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**) | |||
1825 | 1826 | ||
1826 | identified = (flags & AVATAR_IDENTIFIED); | 1827 | identified = (flags & AVATAR_IDENTIFIED); |
1827 | transacted = (flags & AVATAR_TRANSACTED); | 1828 | transacted = (flags & AVATAR_TRANSACTED); |
1829 | age_verified = (flags & AVATAR_AGEVERIFIED); | ||
1828 | allow_publish = (flags & AVATAR_ALLOW_PUBLISH); | 1830 | allow_publish = (flags & AVATAR_ALLOW_PUBLISH); |
1829 | online = (flags & AVATAR_ONLINE); | 1831 | online = (flags & AVATAR_ONLINE); |
1830 | 1832 | ||
@@ -1874,6 +1876,12 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**) | |||
1874 | payment_text = "NoPaymentInfoOnFile"; | 1876 | payment_text = "NoPaymentInfoOnFile"; |
1875 | } | 1877 | } |
1876 | args["[PAYMENTINFO]"] = self->mPanelSecondLife->childGetValue(payment_text).asString(); | 1878 | args["[PAYMENTINFO]"] = self->mPanelSecondLife->childGetValue(payment_text).asString(); |
1879 | LLString age_text = "NotAgeVerified"; | ||
1880 | if(age_verified) | ||
1881 | { | ||
1882 | age_text = "AgeVerified"; | ||
1883 | } | ||
1884 | args["[PAYMENTINFO]"] += self->mPanelSecondLife->childGetValue(age_text).asString(); | ||
1877 | } | 1885 | } |
1878 | else | 1886 | else |
1879 | { | 1887 | { |
diff --git a/linden/indra/newview/llpanelclassified.cpp b/linden/indra/newview/llpanelclassified.cpp index e0f750f..04fb54b 100644 --- a/linden/indra/newview/llpanelclassified.cpp +++ b/linden/indra/newview/llpanelclassified.cpp | |||
@@ -66,7 +66,7 @@ | |||
66 | #include "llviewergenericmessage.h" // send_generic_message | 66 | #include "llviewergenericmessage.h" // send_generic_message |
67 | #include "llviewerregion.h" | 67 | #include "llviewerregion.h" |
68 | #include "llviewerwindow.h" // for window width, height | 68 | #include "llviewerwindow.h" // for window width, height |
69 | #include "viewer.h" // app_abort_quit() | 69 | #include "llappviewer.h" // abortQuit() |
70 | 70 | ||
71 | const S32 MINIMUM_PRICE_FOR_LISTING = 50; // L$ | 71 | const S32 MINIMUM_PRICE_FOR_LISTING = 50; // L$ |
72 | 72 | ||
@@ -322,7 +322,7 @@ void LLPanelClassified::saveCallback(S32 option, void* data) | |||
322 | 322 | ||
323 | case 2: // Cancel | 323 | case 2: // Cancel |
324 | default: | 324 | default: |
325 | app_abort_quit(); | 325 | LLAppViewer::instance()->abortQuit(); |
326 | break; | 326 | break; |
327 | } | 327 | } |
328 | } | 328 | } |
diff --git a/linden/indra/newview/llpanelcontents.cpp b/linden/indra/newview/llpanelcontents.cpp index 50ff7bd..fa7cdfb 100644 --- a/linden/indra/newview/llpanelcontents.cpp +++ b/linden/indra/newview/llpanelcontents.cpp | |||
@@ -65,7 +65,6 @@ | |||
65 | #include "lltoolmgr.h" | 65 | #include "lltoolmgr.h" |
66 | #include "lltoolcomp.h" | 66 | #include "lltoolcomp.h" |
67 | #include "llpanelinventory.h" | 67 | #include "llpanelinventory.h" |
68 | #include "viewer.h" | ||
69 | 68 | ||
70 | // | 69 | // |
71 | // Imported globals | 70 | // Imported globals |
diff --git a/linden/indra/newview/llpaneldirbrowser.cpp b/linden/indra/newview/llpaneldirbrowser.cpp index 27fb3ac..65b1e59 100644 --- a/linden/indra/newview/llpaneldirbrowser.cpp +++ b/linden/indra/newview/llpaneldirbrowser.cpp | |||
@@ -1184,6 +1184,7 @@ void LLPanelDirBrowser::setupNewSearch() | |||
1184 | 1184 | ||
1185 | 1185 | ||
1186 | // static | 1186 | // static |
1187 | // called from calssifieds, events, groups, land, people, and places | ||
1187 | void LLPanelDirBrowser::onClickSearchCore(void* userdata) | 1188 | void LLPanelDirBrowser::onClickSearchCore(void* userdata) |
1188 | { | 1189 | { |
1189 | LLPanelDirBrowser* self = (LLPanelDirBrowser*)userdata; | 1190 | LLPanelDirBrowser* self = (LLPanelDirBrowser*)userdata; |
@@ -1191,6 +1192,8 @@ void LLPanelDirBrowser::onClickSearchCore(void* userdata) | |||
1191 | 1192 | ||
1192 | self->resetSearchStart(); | 1193 | self->resetSearchStart(); |
1193 | self->performQuery(); | 1194 | self->performQuery(); |
1195 | |||
1196 | LLFloaterDirectory::sOldSearchCount++; | ||
1194 | } | 1197 | } |
1195 | 1198 | ||
1196 | 1199 | ||
diff --git a/linden/indra/newview/llpaneldirevents.cpp b/linden/indra/newview/llpaneldirevents.cpp index d8a4652..1dc4286 100644 --- a/linden/indra/newview/llpaneldirevents.cpp +++ b/linden/indra/newview/llpaneldirevents.cpp | |||
@@ -48,7 +48,7 @@ | |||
48 | #include "llresmgr.h" | 48 | #include "llresmgr.h" |
49 | #include "lluiconstants.h" | 49 | #include "lluiconstants.h" |
50 | #include "llpanelevent.h" | 50 | #include "llpanelevent.h" |
51 | #include "viewer.h" | 51 | #include "llappviewer.h" |
52 | 52 | ||
53 | BOOL gDisplayEventHack = FALSE; | 53 | BOOL gDisplayEventHack = FALSE; |
54 | 54 | ||
diff --git a/linden/indra/newview/llpaneldirfind.cpp b/linden/indra/newview/llpaneldirfind.cpp index 3dd419f..640cbef 100644 --- a/linden/indra/newview/llpaneldirfind.cpp +++ b/linden/indra/newview/llpaneldirfind.cpp | |||
@@ -276,7 +276,7 @@ std::string LLPanelDirFindAll::getSearchURLSuffix(bool mature_in) | |||
276 | mature = false; | 276 | mature = false; |
277 | } | 277 | } |
278 | 278 | ||
279 | std::string url = gSavedSettings.getString("SearchURLSuffix"); | 279 | std::string url = gSavedSettings.getString("SearchURLSuffix2"); |
280 | 280 | ||
281 | // if the mature checkbox is unchecked, modify query to remove | 281 | // if the mature checkbox is unchecked, modify query to remove |
282 | // terms with given phrase from the result set | 282 | // terms with given phrase from the result set |
@@ -314,6 +314,11 @@ std::string LLPanelDirFindAll::getSearchURLSuffix(bool mature_in) | |||
314 | substring = "[Z]"; | 314 | substring = "[Z]"; |
315 | url.replace(url.find(substring), substring.length(), z); | 315 | url.replace(url.find(substring), substring.length(), z); |
316 | 316 | ||
317 | LLUUID session_id = gAgent.getSessionID(); | ||
318 | std::string session_string = session_id.getString(); | ||
319 | substring = "[SESSION]"; | ||
320 | url.replace(url.find(substring), substring.length(), session_string); | ||
321 | |||
317 | return url; | 322 | return url; |
318 | } | 323 | } |
319 | 324 | ||
@@ -366,6 +371,8 @@ void LLPanelDirFindAll::onClickSearch(void* data) | |||
366 | LLPanelDirFindAll* self = ( LLPanelDirFindAll* )data; | 371 | LLPanelDirFindAll* self = ( LLPanelDirFindAll* )data; |
367 | LLString search_text = self->childGetText("search_editor"); | 372 | LLString search_text = self->childGetText("search_editor"); |
368 | self->search(search_text); | 373 | self->search(search_text); |
374 | |||
375 | LLFloaterDirectory::sNewSearchCount++; | ||
369 | } | 376 | } |
370 | 377 | ||
371 | void LLPanelDirFindAll::onNavigateBegin( const EventType& eventIn ) | 378 | void LLPanelDirFindAll::onNavigateBegin( const EventType& eventIn ) |
diff --git a/linden/indra/newview/llpaneldisplay.cpp b/linden/indra/newview/llpaneldisplay.cpp index 3b2edcc..0d0fc80 100644 --- a/linden/indra/newview/llpaneldisplay.cpp +++ b/linden/indra/newview/llpaneldisplay.cpp | |||
@@ -74,7 +74,7 @@ | |||
74 | 74 | ||
75 | //RN temporary includes for resolution switching | 75 | //RN temporary includes for resolution switching |
76 | #include "llglheaders.h" | 76 | #include "llglheaders.h" |
77 | #include "viewer.h" | 77 | #include "llviewercontrol.h" |
78 | #include "llsky.h" | 78 | #include "llsky.h" |
79 | 79 | ||
80 | const F32 MAX_USER_FAR_CLIP = 512.f; | 80 | const F32 MAX_USER_FAR_CLIP = 512.f; |
diff --git a/linden/indra/newview/llpanelgeneral.cpp b/linden/indra/newview/llpanelgeneral.cpp index 9cdf919..007e2ff 100644 --- a/linden/indra/newview/llpanelgeneral.cpp +++ b/linden/indra/newview/llpanelgeneral.cpp | |||
@@ -46,6 +46,7 @@ | |||
46 | #include "llcolorswatch.h" | 46 | #include "llcolorswatch.h" |
47 | #include "llcombobox.h" | 47 | #include "llcombobox.h" |
48 | #include "llconsole.h" | 48 | #include "llconsole.h" |
49 | #include "lllineeditor.h" | ||
49 | #include "llpanellogin.h" | 50 | #include "llpanellogin.h" |
50 | #include "llnetmap.h" | 51 | #include "llnetmap.h" |
51 | #include "llresmgr.h" | 52 | #include "llresmgr.h" |
@@ -54,8 +55,9 @@ | |||
54 | #include "llui.h" | 55 | #include "llui.h" |
55 | #include "llurlsimstring.h" | 56 | #include "llurlsimstring.h" |
56 | #include "llviewercontrol.h" | 57 | #include "llviewercontrol.h" |
57 | #include "viewer.h" // gCrashBehavior | 58 | #include "llappviewer.h" |
58 | 59 | #include "llurlsimstring.h" | |
60 | #include "llappviewer.h" | ||
59 | // | 61 | // |
60 | // Imported globals | 62 | // Imported globals |
61 | // | 63 | // |
@@ -63,6 +65,7 @@ | |||
63 | void set_crash_behavior(LLUICtrl* ctrl, void* data); | 65 | void set_crash_behavior(LLUICtrl* ctrl, void* data); |
64 | void set_start_location(LLUICtrl* ctrl, void* data); | 66 | void set_start_location(LLUICtrl* ctrl, void* data); |
65 | 67 | ||
68 | |||
66 | // | 69 | // |
67 | // Globals | 70 | // Globals |
68 | // | 71 | // |
@@ -72,8 +75,7 @@ void set_start_location(LLUICtrl* ctrl, void* data); | |||
72 | // | 75 | // |
73 | void set_crash_behavior(LLUICtrl* ctrl, void* data) | 76 | void set_crash_behavior(LLUICtrl* ctrl, void* data) |
74 | { | 77 | { |
75 | gCrashBehavior = ((LLComboBox*) ctrl)->getCurrentIndex(); | 78 | LLAppViewer::instance()->setCrashBehavior(((LLComboBox*) ctrl)->getCurrentIndex()); |
76 | gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, gCrashBehavior); | ||
77 | } | 79 | } |
78 | 80 | ||
79 | void set_language(LLUICtrl* ctrl, void* data) | 81 | void set_language(LLUICtrl* ctrl, void* data) |
@@ -86,6 +88,11 @@ void LLPanelGeneral::set_start_location(LLUICtrl* ctrl, void* data) | |||
86 | LLURLSimString::setString(ctrl->getValue().asString()); | 88 | LLURLSimString::setString(ctrl->getValue().asString()); |
87 | } | 89 | } |
88 | 90 | ||
91 | void LLPanelGeneral::set_specific_start_location(LLLineEditor* line_editor, void* data) | ||
92 | { | ||
93 | LLURLSimString::setString(line_editor->getValue().asString()); | ||
94 | } | ||
95 | |||
89 | LLPanelGeneral::LLPanelGeneral() | 96 | LLPanelGeneral::LLPanelGeneral() |
90 | { | 97 | { |
91 | gUICtrlFactory->buildPanel(this, "panel_preferences_general.xml"); | 98 | gUICtrlFactory->buildPanel(this, "panel_preferences_general.xml"); |
@@ -137,6 +144,7 @@ BOOL LLPanelGeneral::postBuild() | |||
137 | combo->setCurrentByIndex( login_last ? 1 : 0 ); | 144 | combo->setCurrentByIndex( login_last ? 1 : 0 ); |
138 | } | 145 | } |
139 | combo->setCommitCallback( &set_start_location ); | 146 | combo->setCommitCallback( &set_start_location ); |
147 | combo->setTextEntryCallback( &set_specific_start_location ); | ||
140 | } | 148 | } |
141 | 149 | ||
142 | // Show location on login screen | 150 | // Show location on login screen |
@@ -145,7 +153,7 @@ BOOL LLPanelGeneral::postBuild() | |||
145 | combo = LLUICtrlFactory::getComboBoxByName(this, "crash_behavior_combobox"); | 153 | combo = LLUICtrlFactory::getComboBoxByName(this, "crash_behavior_combobox"); |
146 | if (combo) | 154 | if (combo) |
147 | { | 155 | { |
148 | combo->setCurrentByIndex( gCrashBehavior ); | 156 | combo->setCurrentByIndex( LLAppViewer::instance()->getCrashBehavior() ); |
149 | combo->setCommitCallback( &set_crash_behavior ); | 157 | combo->setCommitCallback( &set_crash_behavior ); |
150 | } | 158 | } |
151 | 159 | ||
@@ -181,11 +189,11 @@ void LLPanelGeneral::refresh() | |||
181 | mLoginLocation = combo->getValue().asString(); | 189 | mLoginLocation = combo->getValue().asString(); |
182 | } | 190 | } |
183 | 191 | ||
184 | mCrashBehavior = gCrashBehavior; | 192 | mCrashBehavior = LLAppViewer::instance()->getCrashBehavior(); |
185 | combo = LLUICtrlFactory::getComboBoxByName(this, "crash_behavior_combobox"); | 193 | combo = LLUICtrlFactory::getComboBoxByName(this, "crash_behavior_combobox"); |
186 | if (combo) | 194 | if (combo) |
187 | { | 195 | { |
188 | combo->setCurrentByIndex( gCrashBehavior ); | 196 | combo->setCurrentByIndex( LLAppViewer::instance()->getCrashBehavior() ); |
189 | } | 197 | } |
190 | 198 | ||
191 | mRenderName = gSavedSettings.getS32("RenderName"); | 199 | mRenderName = gSavedSettings.getS32("RenderName"); |
@@ -222,8 +230,7 @@ void LLPanelGeneral::cancel() | |||
222 | 230 | ||
223 | LLURLSimString::setString(mLoginLocation); | 231 | LLURLSimString::setString(mLoginLocation); |
224 | 232 | ||
225 | gCrashBehavior = mCrashBehavior; | 233 | LLAppViewer::instance()->setCrashBehavior(mCrashBehavior); |
226 | gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, gCrashBehavior); | ||
227 | 234 | ||
228 | // make listener | 235 | // make listener |
229 | //gAFKTimeout = away_timeout; | 236 | //gAFKTimeout = away_timeout; |
@@ -231,5 +238,5 @@ void LLPanelGeneral::cancel() | |||
231 | 238 | ||
232 | void LLPanelGeneral::clickShowStartLocation(LLUICtrl*, void* user_data) | 239 | void LLPanelGeneral::clickShowStartLocation(LLUICtrl*, void* user_data) |
233 | { | 240 | { |
234 | LLPanelLogin::refreshLocation( false ); // in case LLPanelLogin is visible | 241 | LLPanelLogin::loadLoginPage(); |
235 | } | 242 | } |
diff --git a/linden/indra/newview/llpanelgeneral.h b/linden/indra/newview/llpanelgeneral.h index 7c89d78..f3f29c5 100644 --- a/linden/indra/newview/llpanelgeneral.h +++ b/linden/indra/newview/llpanelgeneral.h | |||
@@ -55,6 +55,7 @@ public: | |||
55 | 55 | ||
56 | static void clickShowStartLocation(LLUICtrl*, void* user_data); | 56 | static void clickShowStartLocation(LLUICtrl*, void* user_data); |
57 | static void set_start_location(LLUICtrl* ctrl, void* data); | 57 | static void set_start_location(LLUICtrl* ctrl, void* data); |
58 | static void set_specific_start_location(LLLineEditor* line_editor, void* data); | ||
58 | 59 | ||
59 | protected: | 60 | protected: |
60 | S32 mRenderName; | 61 | S32 mRenderName; |
diff --git a/linden/indra/newview/llpanelgroup.cpp b/linden/indra/newview/llpanelgroup.cpp index 99744c9..76fbada 100644 --- a/linden/indra/newview/llpanelgroup.cpp +++ b/linden/indra/newview/llpanelgroup.cpp | |||
@@ -44,7 +44,7 @@ | |||
44 | #include "llviewermessage.h" | 44 | #include "llviewermessage.h" |
45 | #include "llvieweruictrlfactory.h" | 45 | #include "llvieweruictrlfactory.h" |
46 | #include "llviewerwindow.h" | 46 | #include "llviewerwindow.h" |
47 | #include "viewer.h" | 47 | #include "llappviewer.h" |
48 | 48 | ||
49 | // static | 49 | // static |
50 | void* LLPanelGroupTab::createTab(void* data) | 50 | void* LLPanelGroupTab::createTab(void* data) |
@@ -530,7 +530,7 @@ void LLPanelGroup::handleNotifyCallback(S32 option) | |||
530 | default: | 530 | default: |
531 | // Do nothing. The user is canceling the action. | 531 | // Do nothing. The user is canceling the action. |
532 | // If we were quitting, we didn't really mean it. | 532 | // If we were quitting, we didn't really mean it. |
533 | app_abort_quit(); | 533 | LLAppViewer::instance()->abortQuit(); |
534 | break; | 534 | break; |
535 | } | 535 | } |
536 | } | 536 | } |
diff --git a/linden/indra/newview/llpanelgrouplandmoney.cpp b/linden/indra/newview/llpanelgrouplandmoney.cpp index 4c12aa2..0152990 100644 --- a/linden/indra/newview/llpanelgrouplandmoney.cpp +++ b/linden/indra/newview/llpanelgrouplandmoney.cpp | |||
@@ -1115,8 +1115,7 @@ void LLPanelGroupLandMoney::processGroupAccountDetailsReply(LLMessageSystem* msg | |||
1115 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); | 1115 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); |
1116 | if (gAgent.getID() != agent_id) | 1116 | if (gAgent.getID() != agent_id) |
1117 | { | 1117 | { |
1118 | llwarns << "Got group L$ history reply for another agent!" | 1118 | llwarns << "Got group L$ history reply for another agent!" << llendl; |
1119 | << " Probably a userserver bug!" << llendl; | ||
1120 | return; | 1119 | return; |
1121 | } | 1120 | } |
1122 | 1121 | ||
@@ -1292,8 +1291,7 @@ void LLPanelGroupLandMoney::processGroupAccountTransactionsReply(LLMessageSystem | |||
1292 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); | 1291 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); |
1293 | if (gAgent.getID() != agent_id) | 1292 | if (gAgent.getID() != agent_id) |
1294 | { | 1293 | { |
1295 | llwarns << "Got group L$ history reply for another agent!" | 1294 | llwarns << "Got group L$ history reply for another agent!" << llendl; |
1296 | << " Probably a userserver bug!" << llendl; | ||
1297 | return; | 1295 | return; |
1298 | } | 1296 | } |
1299 | 1297 | ||
@@ -1463,8 +1461,7 @@ void LLPanelGroupLandMoney::processGroupAccountSummaryReply(LLMessageSystem* msg | |||
1463 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); | 1461 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); |
1464 | if (gAgent.getID() != agent_id) | 1462 | if (gAgent.getID() != agent_id) |
1465 | { | 1463 | { |
1466 | llwarns << "Got group L$ history reply for another agent!" | 1464 | llwarns << "Got group L$ history reply for another agent!" << llendl; |
1467 | << " Probably a userserver bug!" << llendl; | ||
1468 | return; | 1465 | return; |
1469 | } | 1466 | } |
1470 | 1467 | ||
diff --git a/linden/indra/newview/llpanelgroupvoting.cpp b/linden/indra/newview/llpanelgroupvoting.cpp index b74bf9c..6007c88 100644 --- a/linden/indra/newview/llpanelgroupvoting.cpp +++ b/linden/indra/newview/llpanelgroupvoting.cpp | |||
@@ -752,8 +752,7 @@ void LLPanelGroupVoting::impl::processGroupActiveProposalItemReply(LLMessageSyst | |||
752 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); | 752 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); |
753 | if (gAgent.getID() != agent_id) | 753 | if (gAgent.getID() != agent_id) |
754 | { | 754 | { |
755 | llwarns << "Got active group proposals reply for another agent!" | 755 | llwarns << "Got active group proposals reply for another agent!" << llendl; |
756 | << " Probably a userserver bug!" << llendl; | ||
757 | return; | 756 | return; |
758 | } | 757 | } |
759 | 758 | ||
@@ -913,8 +912,7 @@ void LLPanelGroupVoting::impl::processGroupVoteHistoryItemReply(LLMessageSystem | |||
913 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); | 912 | msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); |
914 | if (gAgent.getID() != agent_id) | 913 | if (gAgent.getID() != agent_id) |
915 | { | 914 | { |
916 | llwarns << "Got group voting history reply for another agent!" | 915 | llwarns << "Got group voting history reply for another agent!" << llendl; |
917 | << " Probably a userserver bug!" << llendl; | ||
918 | return; | 916 | return; |
919 | } | 917 | } |
920 | 918 | ||
diff --git a/linden/indra/newview/llpanelinput.cpp b/linden/indra/newview/llpanelinput.cpp index d3a140c..4e0e182 100644 --- a/linden/indra/newview/llpanelinput.cpp +++ b/linden/indra/newview/llpanelinput.cpp | |||
@@ -50,7 +50,8 @@ | |||
50 | #include "llsliderctrl.h" | 50 | #include "llsliderctrl.h" |
51 | #include "lltextbox.h" | 51 | #include "lltextbox.h" |
52 | #include "llui.h" | 52 | #include "llui.h" |
53 | #include "viewer.h" | 53 | #include "llappviewer.h" |
54 | #include "llviewercontrol.h" | ||
54 | 55 | ||
55 | //Ventrella | 56 | //Ventrella |
56 | #include "llagent.h" | 57 | #include "llagent.h" |
@@ -61,9 +62,6 @@ | |||
61 | // Imported globals | 62 | // Imported globals |
62 | // | 63 | // |
63 | 64 | ||
64 | extern F32 gMouseSensitivity; | ||
65 | extern BOOL gInvertMouse; | ||
66 | |||
67 | // | 65 | // |
68 | // Globals | 66 | // Globals |
69 | // | 67 | // |
diff --git a/linden/indra/newview/llpanellogin.cpp b/linden/indra/newview/llpanellogin.cpp index 292f5c3..3e64bba 100644 --- a/linden/indra/newview/llpanellogin.cpp +++ b/linden/indra/newview/llpanellogin.cpp | |||
@@ -44,13 +44,16 @@ | |||
44 | 44 | ||
45 | #include "llbutton.h" | 45 | #include "llbutton.h" |
46 | #include "llcheckboxctrl.h" | 46 | #include "llcheckboxctrl.h" |
47 | #include "llcommandhandler.h" | ||
47 | #include "llcombobox.h" | 48 | #include "llcombobox.h" |
49 | #include "llcurl.h" | ||
48 | #include "llviewercontrol.h" | 50 | #include "llviewercontrol.h" |
49 | #include "llfloaterabout.h" | 51 | #include "llfloaterabout.h" |
50 | #include "llfloatertest.h" | 52 | #include "llfloatertest.h" |
51 | #include "llfloaterpreference.h" | 53 | #include "llfloaterpreference.h" |
52 | #include "llfocusmgr.h" | 54 | #include "llfocusmgr.h" |
53 | #include "lllineeditor.h" | 55 | #include "lllineeditor.h" |
56 | #include "llstartup.h" | ||
54 | #include "lltextbox.h" | 57 | #include "lltextbox.h" |
55 | #include "llui.h" | 58 | #include "llui.h" |
56 | #include "lluiconstants.h" | 59 | #include "lluiconstants.h" |
@@ -61,7 +64,8 @@ | |||
61 | #include "llviewernetwork.h" | 64 | #include "llviewernetwork.h" |
62 | #include "llviewerwindow.h" // to link into child list | 65 | #include "llviewerwindow.h" // to link into child list |
63 | #include "llnotify.h" | 66 | #include "llnotify.h" |
64 | #include "viewer.h" // for gHideLinks | 67 | #include "llappviewer.h" // for gHideLinks |
68 | #include "llurlsimstring.h" | ||
65 | #include "llvieweruictrlfactory.h" | 69 | #include "llvieweruictrlfactory.h" |
66 | #include "llhttpclient.h" | 70 | #include "llhttpclient.h" |
67 | #include "llweb.h" | 71 | #include "llweb.h" |
@@ -72,11 +76,146 @@ | |||
72 | 76 | ||
73 | #include "llglheaders.h" | 77 | #include "llglheaders.h" |
74 | 78 | ||
79 | |||
80 | LLString load_password_from_disk(void); | ||
81 | void save_password_to_disk(const char* hashed_password); | ||
82 | |||
75 | const S32 BLACK_BORDER_HEIGHT = 160; | 83 | const S32 BLACK_BORDER_HEIGHT = 160; |
76 | const S32 MAX_PASSWORD = 16; | 84 | const S32 MAX_PASSWORD = 16; |
77 | 85 | ||
78 | LLPanelLogin *LLPanelLogin::sInstance = NULL; | 86 | LLPanelLogin *LLPanelLogin::sInstance = NULL; |
79 | BOOL LLPanelLogin::sCapslockDidNotification = FALSE; | 87 | |
88 | |||
89 | //parses the input url and returns true if afterwards | ||
90 | //a web-login-key, firstname and lastname is set | ||
91 | bool LLLoginHandler::parseDirectLogin(std::string url) | ||
92 | { | ||
93 | LLURI uri(url); | ||
94 | parse(uri.queryMap()); | ||
95 | |||
96 | if (mWebLoginKey.isNull() || | ||
97 | mFirstName.empty() || | ||
98 | mLastName.empty()) | ||
99 | { | ||
100 | return false; | ||
101 | } | ||
102 | else | ||
103 | { | ||
104 | return true; | ||
105 | } | ||
106 | } | ||
107 | |||
108 | |||
109 | void LLLoginHandler::parse(const LLSD& queryMap) | ||
110 | { | ||
111 | mWebLoginKey = queryMap["web_login_key"].asUUID(); | ||
112 | mFirstName = queryMap["first_name"].asString(); | ||
113 | mLastName = queryMap["last_name"].asString(); | ||
114 | |||
115 | if (queryMap["grid"].asString() == "aditi") | ||
116 | { | ||
117 | gGridChoice = GRID_INFO_ADITI; | ||
118 | } | ||
119 | else if (queryMap["grid"].asString() == "agni") | ||
120 | { | ||
121 | gGridChoice = GRID_INFO_AGNI; | ||
122 | } | ||
123 | else if (queryMap["grid"].asString() == "siva") | ||
124 | { | ||
125 | gGridChoice = GRID_INFO_SIVA; | ||
126 | } | ||
127 | else if (queryMap["grid"].asString() == "durga") | ||
128 | { | ||
129 | gGridChoice = GRID_INFO_DURGA; | ||
130 | } | ||
131 | else if (queryMap["grid"].asString() == "shakti") | ||
132 | { | ||
133 | gGridChoice = GRID_INFO_SHAKTI; | ||
134 | } | ||
135 | else if (queryMap["grid"].asString() == "soma") | ||
136 | { | ||
137 | gGridChoice = GRID_INFO_SOMA; | ||
138 | } | ||
139 | else if (queryMap["grid"].asString() == "ganga") | ||
140 | { | ||
141 | gGridChoice = GRID_INFO_GANGA; | ||
142 | } | ||
143 | else if (queryMap["grid"].asString() == "vaak") | ||
144 | { | ||
145 | gGridChoice = GRID_INFO_VAAK; | ||
146 | } | ||
147 | else if (queryMap["grid"].asString() == "uma") | ||
148 | { | ||
149 | gGridChoice = GRID_INFO_UMA; | ||
150 | } | ||
151 | |||
152 | snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); /* Flawfinder: ignore */ | ||
153 | LLAppViewer::instance()->resetURIs(); | ||
154 | |||
155 | LLString startLocation = queryMap["location"].asString(); | ||
156 | |||
157 | if (startLocation == "specify") | ||
158 | { | ||
159 | LLURLSimString::setString(queryMap["region"].asString()); | ||
160 | } | ||
161 | else if (startLocation == "home") | ||
162 | { | ||
163 | gSavedSettings.setBOOL("LoginLastLocation", FALSE); | ||
164 | LLURLSimString::setString(""); | ||
165 | } | ||
166 | else if (startLocation == "last") | ||
167 | { | ||
168 | gSavedSettings.setBOOL("LoginLastLocation", TRUE); | ||
169 | LLURLSimString::setString(""); | ||
170 | } | ||
171 | } | ||
172 | |||
173 | bool LLLoginHandler::handle(const LLSD& tokens, | ||
174 | const LLSD& queryMap) | ||
175 | { | ||
176 | parse(queryMap); | ||
177 | |||
178 | //if we haven't initialized stuff yet, this is | ||
179 | //coming in from the GURL handler, just parse | ||
180 | if (STATE_FIRST == LLStartUp::getStartupState()) | ||
181 | { | ||
182 | return true; | ||
183 | } | ||
184 | |||
185 | LLString password = queryMap["password"].asString(); | ||
186 | |||
187 | if (!password.empty()) | ||
188 | { | ||
189 | gSavedSettings.setBOOL("RememberPassword", TRUE); | ||
190 | |||
191 | if (password.substr(0,3) != "$1$") | ||
192 | { | ||
193 | LLMD5 pass((unsigned char*)password.c_str()); | ||
194 | char md5pass[33]; /* Flawfinder: ignore */ | ||
195 | pass.hex_digest(md5pass); | ||
196 | password = md5pass; | ||
197 | save_password_to_disk(password.c_str()); | ||
198 | } | ||
199 | } | ||
200 | else | ||
201 | { | ||
202 | save_password_to_disk(NULL); | ||
203 | gSavedSettings.setBOOL("RememberPassword", FALSE); | ||
204 | } | ||
205 | |||
206 | |||
207 | if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) //on splash page | ||
208 | { | ||
209 | if (mWebLoginKey.isNull()) { | ||
210 | LLPanelLogin::loadLoginPage(); | ||
211 | } else { | ||
212 | LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); | ||
213 | } | ||
214 | } | ||
215 | return true; | ||
216 | } | ||
217 | |||
218 | LLLoginHandler gLoginHandler; | ||
80 | 219 | ||
81 | // helper class that trys to download a URL from a web site and calls a method | 220 | // helper class that trys to download a URL from a web site and calls a method |
82 | // on parent class indicating if the web server is working or not | 221 | // on parent class indicating if the web server is working or not |
@@ -155,112 +294,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, | |||
155 | mLogoImage = gImageList.getImage("startup_logo.tga", LLUUID::null, MIPMAP_FALSE, TRUE); | 294 | mLogoImage = gImageList.getImage("startup_logo.tga", LLUUID::null, MIPMAP_FALSE, TRUE); |
156 | 295 | ||
157 | gUICtrlFactory->buildPanel(this, "panel_login.xml"); | 296 | gUICtrlFactory->buildPanel(this, "panel_login.xml"); |
158 | setRect(rect); | 297 | |
298 | //leave room for the login menu bar | ||
299 | setRect(LLRect(0, rect.getHeight()-18, rect.getWidth(), 0)); | ||
159 | reshape(rect.getWidth(), rect.getHeight()); | 300 | reshape(rect.getWidth(), rect.getHeight()); |
160 | |||
161 | childSetPrevalidate("first_name_edit", LLLineEditor::prevalidatePrintableNoSpace); | ||
162 | childSetPrevalidate("last_name_edit", LLLineEditor::prevalidatePrintableNoSpace); | ||
163 | |||
164 | childSetCommitCallback("password_edit", mungePassword); | ||
165 | childSetKeystrokeCallback("password_edit", onPassKey, this); | ||
166 | childSetUserData("password_edit", this); | ||
167 | |||
168 | LLLineEditor* edit = LLUICtrlFactory::getLineEditorByName(this, "password_edit"); | ||
169 | if (edit) edit->setDrawAsterixes(TRUE); | ||
170 | |||
171 | LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(this, "start_location_combo"); | ||
172 | if (combo) | ||
173 | { | ||
174 | combo->setAllowTextEntry(TRUE, 128, FALSE); | ||
175 | |||
176 | // The XML file loads the combo with the following labels: | ||
177 | // 0 - "My Home" | ||
178 | // 1 - "My Last Location" | ||
179 | // 2 - "<Type region name>" | ||
180 | |||
181 | BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation"); | ||
182 | LLString sim_string = LLURLSimString::sInstance.mSimString; | ||
183 | if (!sim_string.empty()) | ||
184 | { | ||
185 | // Replace "<Type region name>" with this region name | ||
186 | combo->remove(2); | ||
187 | combo->add( sim_string ); | ||
188 | combo->setTextEntry(sim_string); | ||
189 | combo->setCurrentByIndex( 2 ); | ||
190 | } | ||
191 | else if (login_last) | ||
192 | { | ||
193 | combo->setCurrentByIndex( 1 ); | ||
194 | } | ||
195 | else | ||
196 | { | ||
197 | combo->setCurrentByIndex( 0 ); | ||
198 | } | ||
199 | |||
200 | combo->setCommitCallback( &LLPanelGeneral::set_start_location ); | ||
201 | } | ||
202 | 301 | ||
203 | // Specific servers added later. | ||
204 | childSetVisible("server_combo", show_server); | ||
205 | |||
206 | childSetAction("new_account_btn", onClickNewAccount, this); | ||
207 | childSetVisible("new_account_btn", !gHideLinks); | ||
208 | |||
209 | childSetAction("connect_btn", onClickConnect, this); | ||
210 | |||
211 | setDefaultBtn("connect_btn"); | ||
212 | |||
213 | childSetAction("preferences_btn", LLFloaterPreference::show, this); | ||
214 | |||
215 | childSetAction("quit_btn", onClickQuit, this); | ||
216 | |||
217 | LLTextBox* text = LLUICtrlFactory::getTextBoxByName(this, "version_text"); | ||
218 | if (text) | ||
219 | { | ||
220 | LLString version = llformat("%d.%d.%d (%d)", | ||
221 | LL_VERSION_MAJOR, | ||
222 | LL_VERSION_MINOR, | ||
223 | LL_VERSION_PATCH, | ||
224 | LL_VIEWER_BUILD ); | ||
225 | text->setText(version); | ||
226 | text->setClickedCallback(onClickVersion); | ||
227 | text->setCallbackUserData(this); | ||
228 | |||
229 | // HACK to move to the lower-right of the window | ||
230 | // replace/remove this logic when we have dynamic layouts | ||
231 | S32 right = getRect().mRight; | ||
232 | LLRect r = text->getRect(); | ||
233 | const S32 PAD = 2; | ||
234 | r.setOriginAndSize( right - r.getWidth() - PAD, PAD, | ||
235 | r.getWidth(), r.getHeight() ); | ||
236 | text->setRect(r); | ||
237 | } | ||
238 | |||
239 | LLTextBox* channel_text = LLUICtrlFactory::getTextBoxByName(this, "channel_text"); | ||
240 | if (channel_text) | ||
241 | { | ||
242 | channel_text->setText(gChannelName); | ||
243 | channel_text->setClickedCallback(onClickVersion); | ||
244 | channel_text->setCallbackUserData(this); | ||
245 | |||
246 | // HACK to move to the right of the window, above the version string, | ||
247 | // replace/remove this logic when we have dynamic layouts | ||
248 | S32 right = getRect().mRight; | ||
249 | LLRect r = channel_text->getRect(); | ||
250 | const S32 PAD = 2; | ||
251 | S32 version_string_top = r.mTop; | ||
252 | if(text) | ||
253 | { | ||
254 | version_string_top = text->getRect().mTop; | ||
255 | } | ||
256 | r.setOriginAndSize( | ||
257 | right - r.getWidth() - PAD, | ||
258 | version_string_top, | ||
259 | r.getWidth(), | ||
260 | r.getHeight()); | ||
261 | channel_text->setRect(r); | ||
262 | } | ||
263 | |||
264 | // get the web browser control | 302 | // get the web browser control |
265 | #if LL_LIBXUL_ENABLED | 303 | #if LL_LIBXUL_ENABLED |
266 | LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(this, "login_html"); | 304 | LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(this, "login_html"); |
@@ -284,11 +322,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, | |||
284 | 322 | ||
285 | // force the size to be correct (XML doesn't seem to be sufficient to do this) (with some padding so the other login screen doesn't show through) | 323 | // force the size to be correct (XML doesn't seem to be sufficient to do this) (with some padding so the other login screen doesn't show through) |
286 | LLRect htmlRect = mRect; | 324 | LLRect htmlRect = mRect; |
287 | htmlRect.setCenterAndSize( mRect.getCenterX() - 2, mRect.getCenterY() + 40, mRect.getWidth() + 6, mRect.getHeight() - 78 ); | 325 | htmlRect.setCenterAndSize( mRect.getCenterX() - 2, mRect.getCenterY(), mRect.getWidth() + 6, mRect.getHeight()); |
288 | web_browser->setRect( htmlRect ); | 326 | web_browser->setRect( htmlRect ); |
289 | web_browser->reshape( htmlRect.getWidth(), htmlRect.getHeight(), TRUE ); | 327 | web_browser->reshape( htmlRect.getWidth(), htmlRect.getHeight(), TRUE ); |
290 | reshape( mRect.getWidth(), mRect.getHeight(), 1 ); | 328 | reshape( mRect.getWidth(), mRect.getHeight(), 1 ); |
291 | 329 | ||
292 | // kick off a request to grab the url manually | 330 | // kick off a request to grab the url manually |
293 | gResponsePtr = LLIamHereLogin::build( this ); | 331 | gResponsePtr = LLIamHereLogin::build( this ); |
294 | LLHTTPClient::get( childGetValue( "real_url" ).asString(), gResponsePtr ); | 332 | LLHTTPClient::get( childGetValue( "real_url" ).asString(), gResponsePtr ); |
@@ -298,7 +336,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, | |||
298 | #endif | 336 | #endif |
299 | 337 | ||
300 | // Initialize visibility (and don't force visibility - use prefs) | 338 | // Initialize visibility (and don't force visibility - use prefs) |
301 | refreshLocation( false ); | ||
302 | } | 339 | } |
303 | 340 | ||
304 | void LLPanelLogin::setSiteIsAlive( bool alive ) | 341 | void LLPanelLogin::setSiteIsAlive( bool alive ) |
@@ -310,9 +347,8 @@ void LLPanelLogin::setSiteIsAlive( bool alive ) | |||
310 | { | 347 | { |
311 | if ( web_browser ) | 348 | if ( web_browser ) |
312 | { | 349 | { |
313 | // navigate to the "real" page | 350 | loadLoginPage(); |
314 | web_browser->navigateTo( childGetValue( "real_url" ).asString() ); | 351 | |
315 | |||
316 | // mark as available | 352 | // mark as available |
317 | mHtmlAvailable = TRUE; | 353 | mHtmlAvailable = TRUE; |
318 | }; | 354 | }; |
@@ -334,21 +370,6 @@ void LLPanelLogin::setSiteIsAlive( bool alive ) | |||
334 | #endif | 370 | #endif |
335 | } | 371 | } |
336 | 372 | ||
337 | void LLPanelLogin::mungePassword(LLUICtrl* caller, void* user_data) | ||
338 | { | ||
339 | LLPanelLogin* self = (LLPanelLogin*)user_data; | ||
340 | LLLineEditor* editor = (LLLineEditor*)caller; | ||
341 | std::string password = editor->getText(); | ||
342 | |||
343 | // Re-md5 if we've changed at all | ||
344 | if (password != self->mIncomingPassword) | ||
345 | { | ||
346 | LLMD5 pass((unsigned char *)password.c_str()); | ||
347 | char munged_password[MD5HEX_STR_SIZE]; | ||
348 | pass.hex_digest(munged_password); | ||
349 | self->mMungedPassword = munged_password; | ||
350 | } | ||
351 | } | ||
352 | 373 | ||
353 | LLPanelLogin::~LLPanelLogin() | 374 | LLPanelLogin::~LLPanelLogin() |
354 | { | 375 | { |
@@ -384,13 +405,6 @@ void LLPanelLogin::draw() | |||
384 | glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * mRect.getWidth(), 0.f, 0.f); | 405 | glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * mRect.getWidth(), 0.f, 0.f); |
385 | glScalef(image_aspect / view_aspect, 1.f, 1.f); | 406 | glScalef(image_aspect / view_aspect, 1.f, 1.f); |
386 | } | 407 | } |
387 | // Don't maintain aspect ratio if screen wider than image. This results in the | ||
388 | // hand being partially cut off. JC | ||
389 | //else | ||
390 | //{ | ||
391 | // glTranslatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * (F32)BLACK_BORDER_HEIGHT, 0.f); | ||
392 | // glScalef(1.f, view_aspect / image_aspect, 1.f); | ||
393 | //} | ||
394 | 408 | ||
395 | S32 width = mRect.getWidth(); | 409 | S32 width = mRect.getWidth(); |
396 | S32 height = mRect.getHeight(); | 410 | S32 height = mRect.getHeight(); |
@@ -399,9 +413,6 @@ void LLPanelLogin::draw() | |||
399 | { | 413 | { |
400 | // draw a background box in black | 414 | // draw a background box in black |
401 | gl_rect_2d( 0, height - 264, width, 264, LLColor4( 0.0f, 0.0f, 0.0f, 1.f ) ); | 415 | gl_rect_2d( 0, height - 264, width, 264, LLColor4( 0.0f, 0.0f, 0.0f, 1.f ) ); |
402 | |||
403 | // draw the bottom part of the background image - just the blue background to the native client UI | ||
404 | gl_draw_scaled_image(0, -264, width + 8, mLogoImage->getHeight(), mLogoImage); | ||
405 | } | 416 | } |
406 | else | 417 | else |
407 | { | 418 | { |
@@ -469,54 +480,14 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent) | |||
469 | 480 | ||
470 | return LLPanel::handleKeyHere(key, mask, called_from_parent); | 481 | return LLPanel::handleKeyHere(key, mask, called_from_parent); |
471 | } | 482 | } |
472 | 483 | ||
473 | // virtual | ||
474 | void LLPanelLogin::setFocus(BOOL b) | ||
475 | { | ||
476 | if(b != hasFocus()) | ||
477 | { | ||
478 | if(b) | ||
479 | { | ||
480 | LLPanelLogin::giveFocus(); | ||
481 | } | ||
482 | else | ||
483 | { | ||
484 | LLPanel::setFocus(b); | ||
485 | } | ||
486 | } | ||
487 | } | ||
488 | 484 | ||
489 | // static | 485 | // static |
490 | void LLPanelLogin::giveFocus() | 486 | void LLPanelLogin::giveFocus() |
491 | { | 487 | { |
492 | if( sInstance ) | ||
493 | { | ||
494 | // Grab focus and move cursor to first blank input field | ||
495 | std::string first = sInstance->childGetText("first_name_edit"); | ||
496 | std::string pass = sInstance->childGetText("password_edit"); | ||
497 | |||
498 | BOOL have_first = !first.empty(); | ||
499 | BOOL have_pass = !pass.empty(); | ||
500 | |||
501 | LLLineEditor* edit = NULL; | ||
502 | if (have_first && !have_pass) | ||
503 | { | ||
504 | // User saved his name but not his password. Move | ||
505 | // focus to password field. | ||
506 | edit = LLUICtrlFactory::getLineEditorByName(sInstance, "password_edit"); | ||
507 | } | ||
508 | else | ||
509 | { | ||
510 | // User doesn't have a name, so start there. | ||
511 | edit = LLUICtrlFactory::getLineEditorByName(sInstance, "first_name_edit"); | ||
512 | } | ||
513 | 488 | ||
514 | if (edit) | 489 | if (sInstance) |
515 | { | 490 | sInstance->setFocus(TRUE); |
516 | edit->setFocus(TRUE); | ||
517 | edit->selectAll(); | ||
518 | } | ||
519 | } | ||
520 | } | 491 | } |
521 | 492 | ||
522 | 493 | ||
@@ -528,266 +499,167 @@ void LLPanelLogin::show(const LLRect &rect, | |||
528 | { | 499 | { |
529 | new LLPanelLogin(rect, show_server, callback, callback_data); | 500 | new LLPanelLogin(rect, show_server, callback, callback_data); |
530 | 501 | ||
502 | LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html"); | ||
503 | |||
504 | if (!web_browser) return; | ||
505 | |||
531 | if( !gFocusMgr.getKeyboardFocus() ) | 506 | if( !gFocusMgr.getKeyboardFocus() ) |
532 | { | 507 | { |
533 | // Grab focus and move cursor to first enabled control | 508 | // Grab focus and move cursor to first enabled control |
534 | sInstance->setFocus(TRUE); | 509 | web_browser->setFocus(TRUE); |
535 | } | 510 | } |
536 | 511 | ||
537 | // Make sure that focus always goes here (and use the latest sInstance that was just created) | 512 | // Make sure that focus always goes here (and use the latest sInstance that was just created) |
538 | gFocusMgr.setDefaultKeyboardFocus(sInstance); | 513 | gFocusMgr.setDefaultKeyboardFocus(web_browser); |
539 | } | 514 | } |
540 | 515 | ||
516 | |||
541 | // static | 517 | // static |
542 | void LLPanelLogin::setFields(const std::string& firstname, const std::string& lastname, const std::string& password, | 518 | void LLPanelLogin::close() |
543 | BOOL remember) | ||
544 | { | 519 | { |
545 | if (!sInstance) | 520 | if (sInstance) |
546 | { | 521 | { |
547 | llwarns << "Attempted fillFields with no login view shown" << llendl; | 522 | gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance ); |
548 | return; | 523 | |
549 | } | 524 | gFocusMgr.setDefaultKeyboardFocus(NULL); |
550 | |||
551 | sInstance->childSetText("first_name_edit", firstname); | ||
552 | sInstance->childSetText("last_name_edit", lastname); | ||
553 | 525 | ||
554 | // Max "actual" password length is 16 characters. | 526 | delete sInstance; |
555 | // Hex digests are always 32 characters. | 527 | sInstance = NULL; |
556 | if (password.length() == 32) | ||
557 | { | ||
558 | // This is a MD5 hex digest of a password. | ||
559 | // We don't actually use the password input field, | ||
560 | // fill it with MAX_PASSWORD characters so we get a | ||
561 | // nice row of asterixes. | ||
562 | const std::string filler("123456789!123456"); | ||
563 | sInstance->childSetText("password_edit", filler); | ||
564 | sInstance->mIncomingPassword = filler; | ||
565 | sInstance->mMungedPassword = password; | ||
566 | } | ||
567 | else | ||
568 | { | ||
569 | // this is a normal text password | ||
570 | sInstance->childSetText("password_edit", password); | ||
571 | sInstance->mIncomingPassword = password; | ||
572 | LLMD5 pass((unsigned char *)password.c_str()); | ||
573 | char munged_password[MD5HEX_STR_SIZE]; | ||
574 | pass.hex_digest(munged_password); | ||
575 | sInstance->mMungedPassword = munged_password; | ||
576 | } | 528 | } |
577 | |||
578 | sInstance->childSetValue("remember_check", remember); | ||
579 | } | 529 | } |
580 | 530 | ||
581 | |||
582 | // static | 531 | // static |
583 | void LLPanelLogin::addServer(const char *server, S32 domain_name) | 532 | void LLPanelLogin::setAlwaysRefresh(bool refresh) |
584 | { | 533 | { |
585 | if (!sInstance) | 534 | if (LLStartUp::getStartupState() >= STATE_LOGIN_CLEANUP) return; |
586 | { | ||
587 | llwarns << "Attempted addServer with no login view shown" << llendl; | ||
588 | return; | ||
589 | } | ||
590 | 535 | ||
591 | LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo"); | 536 | LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html"); |
592 | if (combo) | 537 | |
538 | if (web_browser) | ||
593 | { | 539 | { |
594 | combo->add(server, LLSD(domain_name) ); | 540 | web_browser->setAlwaysRefresh(refresh); |
595 | combo->setCurrentByIndex(0); | ||
596 | } | 541 | } |
597 | } | 542 | } |
598 | 543 | ||
599 | // static | ||
600 | void LLPanelLogin::getFields(LLString &firstname, LLString &lastname, LLString &password, | ||
601 | BOOL &remember) | ||
602 | { | ||
603 | if (!sInstance) | ||
604 | { | ||
605 | llwarns << "Attempted getFields with no login view shown" << llendl; | ||
606 | return; | ||
607 | } | ||
608 | 544 | ||
609 | firstname = sInstance->childGetText("first_name_edit"); | ||
610 | LLString::trim(firstname); | ||
611 | 545 | ||
612 | lastname = sInstance->childGetText("last_name_edit"); | 546 | void LLPanelLogin::loadLoginPage() |
613 | LLString::trim(lastname); | 547 | { |
548 | if (!sInstance) return; | ||
614 | 549 | ||
615 | password = sInstance->mMungedPassword; | 550 | LLURLSimString::sInstance.parse(); |
616 | remember = sInstance->childGetValue("remember_check"); | ||
617 | } | ||
618 | 551 | ||
552 | LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html"); | ||
619 | 553 | ||
620 | // static. Return TRUE if user made a choice from the popup | 554 | std::ostringstream oStr; |
621 | BOOL LLPanelLogin::getServer(LLString &server, S32 &domain_name) | 555 | |
622 | { | 556 | LLString location; |
623 | BOOL user_picked = FALSE; | 557 | LLString region; |
624 | if (!sInstance) | 558 | LLString password; |
625 | { | 559 | |
626 | llwarns << "Attempted getServer with no login view shown" << llendl; | 560 | if (LLURLSimString::parse()) |
561 | { | ||
562 | std::ostringstream oRegionStr; | ||
563 | location = "specify"; | ||
564 | oRegionStr << LLURLSimString::sInstance.mSimName << "/" << LLURLSimString::sInstance.mX << "/" | ||
565 | << LLURLSimString::sInstance.mY << "/" | ||
566 | << LLURLSimString::sInstance.mZ; | ||
567 | region = oRegionStr.str(); | ||
627 | } | 568 | } |
628 | else | 569 | else |
629 | { | 570 | { |
630 | LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo"); | 571 | if (gSavedSettings.getBOOL("LoginLastLocation")) |
631 | if (combo) | ||
632 | { | 572 | { |
633 | LLSD combo_val = combo->getValue(); | 573 | location = "last"; |
634 | if (LLSD::TypeInteger == combo_val.type()) | 574 | } |
635 | { | 575 | else |
636 | domain_name = combo->getValue().asInteger(); | 576 | { |
637 | 577 | location = "home"; | |
638 | if ((S32)USERSERVER_OTHER == domain_name) | ||
639 | { | ||
640 | server = gUserServerName; | ||
641 | } | ||
642 | } | ||
643 | else | ||
644 | { | ||
645 | // no valid selection, return other | ||
646 | domain_name = (S32)USERSERVER_OTHER; | ||
647 | server = combo_val.asString(); | ||
648 | } | ||
649 | user_picked = combo->isDirty(); | ||
650 | } | 578 | } |
651 | } | 579 | } |
652 | 580 | ||
653 | return user_picked; | 581 | LLString firstname, lastname; |
654 | } | 582 | |
655 | 583 | if (gCmdLineFirstName.empty()) | |
656 | // static | ||
657 | void LLPanelLogin::getLocation(LLString &location) | ||
658 | { | ||
659 | if (!sInstance) | ||
660 | { | 584 | { |
661 | llwarns << "Attempted getLocation with no login view shown" << llendl; | 585 | firstname = gSavedSettings.getString("FirstName"); |
662 | return; | ||
663 | } | 586 | } |
664 | 587 | else | |
665 | LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "start_location_combo"); | ||
666 | if (combo) | ||
667 | { | 588 | { |
668 | location = combo->getValue().asString(); | 589 | firstname = gCmdLineFirstName; |
669 | } | 590 | } |
670 | } | 591 | |
671 | 592 | if (gCmdLineLastName.empty()) | |
672 | // static | ||
673 | void LLPanelLogin::refreshLocation( bool force_visible ) | ||
674 | { | ||
675 | if (!sInstance) return; | ||
676 | |||
677 | LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "start_location_combo"); | ||
678 | if (!combo) return; | ||
679 | |||
680 | LLString sim_string = LLURLSimString::sInstance.mSimString; | ||
681 | if (!sim_string.empty()) | ||
682 | { | 593 | { |
683 | combo->setCurrentByIndex( 3 ); // BUG? Maybe 2? | 594 | lastname = gSavedSettings.getString("LastName"); |
684 | combo->setTextEntry(sim_string); | ||
685 | } | 595 | } |
686 | else | 596 | else |
687 | { | 597 | { |
688 | BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation"); | 598 | lastname = gCmdLineLastName; |
689 | combo->setCurrentByIndex( login_last ? 1 : 0 ); | ||
690 | } | 599 | } |
600 | |||
601 | LLString version = llformat("%d.%d.%d (%d)", | ||
602 | LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD); | ||
691 | 603 | ||
692 | BOOL show_start = TRUE; | 604 | char* curl_region = curl_escape(region.c_str(), 0); |
605 | char* curl_channel = curl_escape(gChannelName.c_str(), 0); | ||
606 | char* curl_version = curl_escape(version.c_str(), 0); | ||
693 | 607 | ||
694 | if ( ! force_visible ) | 608 | |
695 | show_start = gSavedSettings.getBOOL("ShowStartLocation"); | 609 | oStr << sInstance->childGetValue( "real_url" ).asString() << "&firstname=" << firstname << |
610 | "&lastname=" << lastname << "&location=" << location << "®ion=" << curl_region << | ||
611 | "&grid=" << gGridInfo[gGridChoice].mLabel << "&channel=" << curl_channel << | ||
612 | "&version=" << curl_version; | ||
696 | 613 | ||
697 | sInstance->childSetVisible("start_location_combo", show_start); | 614 | |
698 | sInstance->childSetVisible("start_location_text", show_start); | 615 | curl_free(curl_region); |
699 | } | 616 | curl_free(curl_channel); |
617 | curl_free(curl_version); | ||
700 | 618 | ||
701 | // static | 619 | LLString language(gSavedSettings.getString("Language")); |
702 | void LLPanelLogin::close() | 620 | if(language == "default") |
703 | { | ||
704 | if (sInstance) | ||
705 | { | 621 | { |
706 | gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance ); | 622 | language = gSavedSettings.getString("SystemLanguage"); |
707 | |||
708 | gFocusMgr.setDefaultKeyboardFocus(NULL); | ||
709 | |||
710 | delete sInstance; | ||
711 | sInstance = NULL; | ||
712 | } | 623 | } |
713 | } | ||
714 | |||
715 | 624 | ||
716 | //--------------------------------------------------------------------------- | 625 | oStr << "&lang=" << language; |
717 | // Protected methods | ||
718 | //--------------------------------------------------------------------------- | ||
719 | 626 | ||
720 | // static | 627 | if (!gCmdLinePassword.empty()) |
721 | void LLPanelLogin::onClickConnect(void *) | ||
722 | { | ||
723 | if (sInstance && sInstance->mCallback) | ||
724 | { | 628 | { |
725 | // tell the responder we're not here anymore | 629 | oStr << "&password=" << gCmdLinePassword; |
726 | if ( gResponsePtr ) | ||
727 | gResponsePtr->setParent( 0 ); | ||
728 | |||
729 | // JC - Make sure the fields all get committed. | ||
730 | sInstance->setFocus(FALSE); | ||
731 | |||
732 | LLString first = sInstance->childGetText("first_name_edit"); | ||
733 | LLString last = sInstance->childGetText("last_name_edit"); | ||
734 | if (!first.empty() && !last.empty()) | ||
735 | { | ||
736 | // has both first and last name typed | ||
737 | |||
738 | // store off custom server entry, if currently selected | ||
739 | LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo"); | ||
740 | if (combo) | ||
741 | { | ||
742 | S32 selected_server = combo->getValue(); | ||
743 | if (selected_server == USERSERVER_NONE) | ||
744 | { | ||
745 | LLString custom_server = combo->getValue().asString(); | ||
746 | gSavedSettings.setString("CustomServer", custom_server); | ||
747 | } | ||
748 | } | ||
749 | sInstance->mCallback(0, sInstance->mCallbackData); | ||
750 | } | ||
751 | else | ||
752 | { | ||
753 | // empty first or last name | ||
754 | // same as clicking new account | ||
755 | onClickNewAccount(NULL); | ||
756 | } | ||
757 | } | 630 | } |
758 | } | 631 | else if (!(password = load_password_from_disk()).empty()) |
759 | |||
760 | |||
761 | // static | ||
762 | void LLPanelLogin::newAccountAlertCallback(S32 option, void*) | ||
763 | { | ||
764 | if (0 == option) | ||
765 | { | 632 | { |
766 | llinfos << "Going to account creation URL" << llendl; | 633 | oStr << "&password=$1$" << password; |
767 | LLWeb::loadURL( CREATE_ACCOUNT_URL ); | ||
768 | } | 634 | } |
769 | else | 635 | if (gAutoLogin) |
770 | { | 636 | { |
771 | sInstance->setFocus(TRUE); | 637 | oStr << "&auto_login=TRUE"; |
772 | } | 638 | } |
773 | } | 639 | if (gSavedSettings.getBOOL("ShowStartLocation")) |
774 | |||
775 | |||
776 | // static | ||
777 | void LLPanelLogin::onClickNewAccount(void*) | ||
778 | { | ||
779 | if (gHideLinks) | ||
780 | { | 640 | { |
781 | gViewerWindow->alertXml("MustHaveAccountToLogInNoLinks"); | 641 | oStr << "&show_start_location=TRUE"; |
782 | } | 642 | } |
783 | else | 643 | if (gSavedSettings.getBOOL("RememberPassword")) |
784 | { | 644 | { |
785 | gViewerWindow->alertXml("MustHaveAccountToLogIn", | 645 | oStr << "&remember_password=TRUE"; |
786 | LLPanelLogin::newAccountAlertCallback); | 646 | } |
787 | } | 647 | #ifndef LL_RELEASE_FOR_DOWNLOAD |
648 | oStr << "&show_grid=TRUE"; | ||
649 | #else | ||
650 | if (gSavedSettings.getBOOL("ForceShowGrid")) | ||
651 | oStr << "&show_grid=TRUE"; | ||
652 | #endif | ||
653 | |||
654 | // navigate to the "real" page | ||
655 | web_browser->navigateTo( oStr.str() ); | ||
788 | } | 656 | } |
789 | 657 | ||
790 | 658 | ||
659 | //--------------------------------------------------------------------------- | ||
660 | // Protected methods | ||
661 | //--------------------------------------------------------------------------- | ||
662 | |||
791 | // static | 663 | // static |
792 | void LLPanelLogin::onClickQuit(void*) | 664 | void LLPanelLogin::onClickQuit(void*) |
793 | { | 665 | { |
@@ -807,13 +679,3 @@ void LLPanelLogin::onClickVersion(void*) | |||
807 | { | 679 | { |
808 | LLFloaterAbout::show(NULL); | 680 | LLFloaterAbout::show(NULL); |
809 | } | 681 | } |
810 | |||
811 | // static | ||
812 | void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data) | ||
813 | { | ||
814 | if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE) | ||
815 | { | ||
816 | LLNotifyBox::showXml("CapsKeyOn"); | ||
817 | sCapslockDidNotification = TRUE; | ||
818 | } | ||
819 | } | ||
diff --git a/linden/indra/newview/llpanellogin.h b/linden/indra/newview/llpanellogin.h index 94e746e..191e88c 100644 --- a/linden/indra/newview/llpanellogin.h +++ b/linden/indra/newview/llpanellogin.h | |||
@@ -33,7 +33,7 @@ | |||
33 | #define LL_LLPANELLOGIN_H | 33 | #define LL_LLPANELLOGIN_H |
34 | 34 | ||
35 | #include "llpanel.h" | 35 | #include "llpanel.h" |
36 | 36 | #include "llcommandhandler.h" | |
37 | #include "lldbstrings.h" | 37 | #include "lldbstrings.h" |
38 | #include "llmemory.h" | 38 | #include "llmemory.h" |
39 | #include "llviewerimage.h" | 39 | #include "llviewerimage.h" |
@@ -46,6 +46,22 @@ class LLCheckBoxCtrl; | |||
46 | class LLButton; | 46 | class LLButton; |
47 | class LLComboBox; | 47 | class LLComboBox; |
48 | 48 | ||
49 | |||
50 | class LLLoginHandler : public LLCommandHandler | ||
51 | { | ||
52 | public: | ||
53 | LLLoginHandler() : LLCommandHandler("login") { } | ||
54 | bool handle(const LLSD& tokens, const LLSD& queryMap); | ||
55 | bool parseDirectLogin(std::string url); | ||
56 | void parse(const LLSD& queryMap); | ||
57 | |||
58 | LLUUID mWebLoginKey; | ||
59 | LLString mFirstName; | ||
60 | LLString mLastName; | ||
61 | }; | ||
62 | |||
63 | extern LLLoginHandler gLoginHandler; | ||
64 | |||
49 | class LLPanelLogin | 65 | class LLPanelLogin |
50 | : public LLPanel | 66 | : public LLPanel |
51 | { | 67 | { |
@@ -57,50 +73,30 @@ public: | |||
57 | 73 | ||
58 | virtual BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent); | 74 | virtual BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent); |
59 | virtual void draw(); | 75 | virtual void draw(); |
60 | virtual void setFocus( BOOL b ); | ||
61 | 76 | ||
62 | static void show(const LLRect &rect, BOOL show_server, | 77 | static void show(const LLRect &rect, BOOL show_server, |
63 | void (*callback)(S32 option, void* user_data), | 78 | void (*callback)(S32 option, void* user_data), |
64 | void* callback_data); | 79 | void* callback_data); |
65 | 80 | ||
66 | static void setFields(const std::string& firstname, const std::string& lastname, | ||
67 | const std::string& password, BOOL remember); | ||
68 | |||
69 | static void addServer(const char *server, S32 domain_name); | ||
70 | static void refreshLocation( bool force_visible ); | ||
71 | |||
72 | static void getFields(LLString &firstname, LLString &lastname, | ||
73 | LLString &password, BOOL &remember); | ||
74 | |||
75 | static BOOL getServer(LLString &server, S32& domain_name); | ||
76 | static void getLocation(LLString &location); | ||
77 | |||
78 | static void close(); | 81 | static void close(); |
79 | 82 | ||
80 | void setSiteIsAlive( bool alive ); | 83 | void setSiteIsAlive( bool alive ); |
81 | 84 | ||
82 | static void giveFocus(); | 85 | static void loadLoginPage(); |
83 | static void mungePassword(LLUICtrl* caller, void* user_data); | 86 | static void giveFocus(); |
84 | 87 | static void setAlwaysRefresh(bool refresh); | |
88 | |||
85 | private: | 89 | private: |
86 | static void onClickConnect(void*); | ||
87 | static void onClickNewAccount(void*); | ||
88 | static void newAccountAlertCallback(S32 option, void*); | ||
89 | static void onClickQuit(void*); | 90 | static void onClickQuit(void*); |
90 | static void onClickVersion(void*); | 91 | static void onClickVersion(void*); |
91 | static void onPassKey(LLLineEditor* caller, void* user_data); | 92 | |
92 | |||
93 | private: | 93 | private: |
94 | LLPointer<LLViewerImage> mLogoImage; | 94 | LLPointer<LLViewerImage> mLogoImage; |
95 | 95 | ||
96 | void (*mCallback)(S32 option, void *userdata); | 96 | void (*mCallback)(S32 option, void *userdata); |
97 | void* mCallbackData; | 97 | void* mCallbackData; |
98 | 98 | ||
99 | std::string mIncomingPassword; | ||
100 | std::string mMungedPassword; | ||
101 | |||
102 | static LLPanelLogin* sInstance; | 99 | static LLPanelLogin* sInstance; |
103 | static BOOL sCapslockDidNotification; | ||
104 | BOOL mHtmlAvailable; | 100 | BOOL mHtmlAvailable; |
105 | }; | 101 | }; |
106 | 102 | ||
diff --git a/linden/indra/newview/llpanelobject.cpp b/linden/indra/newview/llpanelobject.cpp index cf50709..c3d949d 100644 --- a/linden/indra/newview/llpanelobject.cpp +++ b/linden/indra/newview/llpanelobject.cpp | |||
@@ -68,7 +68,7 @@ | |||
68 | #include "llvovolume.h" | 68 | #include "llvovolume.h" |
69 | #include "llworld.h" | 69 | #include "llworld.h" |
70 | #include "pipeline.h" | 70 | #include "pipeline.h" |
71 | #include "viewer.h" | 71 | #include "llviewercontrol.h" |
72 | #include "llvieweruictrlfactory.h" | 72 | #include "llvieweruictrlfactory.h" |
73 | #include "llfirstuse.h" | 73 | #include "llfirstuse.h" |
74 | 74 | ||
diff --git a/linden/indra/newview/llpanelvolume.cpp b/linden/indra/newview/llpanelvolume.cpp index 69e0fde..c288c6a 100644 --- a/linden/indra/newview/llpanelvolume.cpp +++ b/linden/indra/newview/llpanelvolume.cpp | |||
@@ -72,7 +72,6 @@ | |||
72 | #include "llvovolume.h" | 72 | #include "llvovolume.h" |
73 | #include "llworld.h" | 73 | #include "llworld.h" |
74 | #include "pipeline.h" | 74 | #include "pipeline.h" |
75 | #include "viewer.h" | ||
76 | 75 | ||
77 | #include "lldrawpool.h" | 76 | #include "lldrawpool.h" |
78 | #include "llvieweruictrlfactory.h" | 77 | #include "llvieweruictrlfactory.h" |
diff --git a/linden/indra/newview/llprefsvoice.cpp b/linden/indra/newview/llprefsvoice.cpp index 59619d6..9ad7149 100644 --- a/linden/indra/newview/llprefsvoice.cpp +++ b/linden/indra/newview/llprefsvoice.cpp | |||
@@ -45,7 +45,7 @@ | |||
45 | #include "llfocusmgr.h" | 45 | #include "llfocusmgr.h" |
46 | #include "llfloatervoicewizard.h" | 46 | #include "llfloatervoicewizard.h" |
47 | 47 | ||
48 | #include "viewer.h" | 48 | #include "llappviewer.h" |
49 | 49 | ||
50 | #include "llvoiceclient.h" | 50 | #include "llvoiceclient.h" |
51 | 51 | ||
diff --git a/linden/indra/newview/llpreviewgesture.cpp b/linden/indra/newview/llpreviewgesture.cpp index 720963c..051e328 100644 --- a/linden/indra/newview/llpreviewgesture.cpp +++ b/linden/indra/newview/llpreviewgesture.cpp | |||
@@ -65,7 +65,7 @@ | |||
65 | #include "llviewerregion.h" | 65 | #include "llviewerregion.h" |
66 | #include "llviewerstats.h" | 66 | #include "llviewerstats.h" |
67 | #include "llviewerwindow.h" // busycount | 67 | #include "llviewerwindow.h" // busycount |
68 | #include "viewer.h" // gVFS | 68 | #include "llappviewer.h" // gVFS |
69 | 69 | ||
70 | #include "llresmgr.h" | 70 | #include "llresmgr.h" |
71 | 71 | ||
@@ -342,7 +342,7 @@ void LLPreviewGesture::handleSaveChangesDialog(S32 option, void* data) | |||
342 | case 2: // "Cancel" | 342 | case 2: // "Cancel" |
343 | default: | 343 | default: |
344 | // If we were quitting, we didn't really mean it. | 344 | // If we were quitting, we didn't really mean it. |
345 | app_abort_quit(); | 345 | LLAppViewer::instance()->abortQuit(); |
346 | break; | 346 | break; |
347 | } | 347 | } |
348 | } | 348 | } |
diff --git a/linden/indra/newview/llpreviewlandmark.cpp b/linden/indra/newview/llpreviewlandmark.cpp index 2d20fd5..461f7d4 100644 --- a/linden/indra/newview/llpreviewlandmark.cpp +++ b/linden/indra/newview/llpreviewlandmark.cpp | |||
@@ -56,7 +56,6 @@ | |||
56 | #include "llviewercontrol.h" | 56 | #include "llviewercontrol.h" |
57 | #include "llviewerregion.h" | 57 | #include "llviewerregion.h" |
58 | #include "llviewerstats.h" | 58 | #include "llviewerstats.h" |
59 | #include "viewer.h" | ||
60 | #include "llvieweruictrlfactory.h" | 59 | #include "llvieweruictrlfactory.h" |
61 | 60 | ||
62 | 61 | ||
diff --git a/linden/indra/newview/llpreviewnotecard.cpp b/linden/indra/newview/llpreviewnotecard.cpp index 620be8f..dc56494 100644 --- a/linden/indra/newview/llpreviewnotecard.cpp +++ b/linden/indra/newview/llpreviewnotecard.cpp | |||
@@ -55,7 +55,8 @@ | |||
55 | #include "lldir.h" | 55 | #include "lldir.h" |
56 | //#include "llfloaterchat.h" | 56 | //#include "llfloaterchat.h" |
57 | #include "llviewerstats.h" | 57 | #include "llviewerstats.h" |
58 | #include "viewer.h" // app_abort_quit() | 58 | #include "llviewercontrol.h" // gSavedSettings |
59 | #include "llappviewer.h" // app_abort_quit() | ||
59 | #include "lllineeditor.h" | 60 | #include "lllineeditor.h" |
60 | #include "llvieweruictrlfactory.h" | 61 | #include "llvieweruictrlfactory.h" |
61 | 62 | ||
@@ -636,7 +637,7 @@ void LLPreviewNotecard::handleSaveChangesDialog(S32 option, void* userdata) | |||
636 | case 2: // "Cancel" | 637 | case 2: // "Cancel" |
637 | default: | 638 | default: |
638 | // If we were quitting, we didn't really mean it. | 639 | // If we were quitting, we didn't really mean it. |
639 | app_abort_quit(); | 640 | LLAppViewer::instance()->abortQuit(); |
640 | break; | 641 | break; |
641 | } | 642 | } |
642 | } | 643 | } |
diff --git a/linden/indra/newview/llpreviewscript.cpp b/linden/indra/newview/llpreviewscript.cpp index 7eac589..6c37700 100644 --- a/linden/indra/newview/llpreviewscript.cpp +++ b/linden/indra/newview/llpreviewscript.cpp | |||
@@ -72,7 +72,6 @@ | |||
72 | #include "llscrolllistctrl.h" | 72 | #include "llscrolllistctrl.h" |
73 | #include "lltextbox.h" | 73 | #include "lltextbox.h" |
74 | #include "llslider.h" | 74 | #include "llslider.h" |
75 | #include "viewer.h" | ||
76 | #include "lldir.h" | 75 | #include "lldir.h" |
77 | #include "llcombobox.h" | 76 | #include "llcombobox.h" |
78 | //#include "llfloaterchat.h" | 77 | //#include "llfloaterchat.h" |
@@ -83,7 +82,8 @@ | |||
83 | #include "llwebbrowserctrl.h" | 82 | #include "llwebbrowserctrl.h" |
84 | #include "lluictrlfactory.h" | 83 | #include "lluictrlfactory.h" |
85 | 84 | ||
86 | #include "viewer.h" | 85 | #include "llviewercontrol.h" |
86 | #include "llappviewer.h" | ||
87 | 87 | ||
88 | #include "llpanelinventory.h" | 88 | #include "llpanelinventory.h" |
89 | 89 | ||
@@ -629,7 +629,7 @@ void LLScriptEdCore::handleSaveChangesDialog( S32 option, void* userdata ) | |||
629 | case 2: // "Cancel" | 629 | case 2: // "Cancel" |
630 | default: | 630 | default: |
631 | // If we were quitting, we didn't really mean it. | 631 | // If we were quitting, we didn't really mean it. |
632 | app_abort_quit(); | 632 | LLAppViewer::instance()->abortQuit(); |
633 | break; | 633 | break; |
634 | } | 634 | } |
635 | } | 635 | } |
diff --git a/linden/indra/newview/llprogressview.cpp b/linden/indra/newview/llprogressview.cpp index d855f75..cc9c3fa 100644 --- a/linden/indra/newview/llprogressview.cpp +++ b/linden/indra/newview/llprogressview.cpp | |||
@@ -49,7 +49,7 @@ | |||
49 | #include "llviewercontrol.h" | 49 | #include "llviewercontrol.h" |
50 | #include "llviewerimagelist.h" | 50 | #include "llviewerimagelist.h" |
51 | #include "llviewerwindow.h" | 51 | #include "llviewerwindow.h" |
52 | #include "viewer.h" | 52 | #include "llappviewer.h" |
53 | 53 | ||
54 | LLProgressView* LLProgressView::sInstance = NULL; | 54 | LLProgressView* LLProgressView::sInstance = NULL; |
55 | 55 | ||
@@ -127,7 +127,7 @@ BOOL LLProgressView::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent) | |||
127 | // Suck up all keystokes except CTRL-Q. | 127 | // Suck up all keystokes except CTRL-Q. |
128 | if( ('Q' == key) && (MASK_CONTROL == mask) ) | 128 | if( ('Q' == key) && (MASK_CONTROL == mask) ) |
129 | { | 129 | { |
130 | app_user_quit(); | 130 | LLAppViewer::instance()->userQuit(); |
131 | } | 131 | } |
132 | return TRUE; | 132 | return TRUE; |
133 | } | 133 | } |
@@ -228,7 +228,7 @@ void LLProgressView::draw() | |||
228 | F32 alpha = 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32())); | 228 | F32 alpha = 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32())); |
229 | // background_color.mV[3] = background_color.mV[3]*alpha; | 229 | // background_color.mV[3] = background_color.mV[3]*alpha; |
230 | 230 | ||
231 | LLString top_line = gSecondLife; | 231 | LLString top_line = LLAppViewer::instance()->getSecondLifeTitle(); |
232 | 232 | ||
233 | font->renderUTF8(top_line, 0, | 233 | font->renderUTF8(top_line, 0, |
234 | line_x, line_one_y, | 234 | line_x, line_one_y, |
@@ -338,7 +338,7 @@ void LLProgressView::onCancelButtonClicked(void*) | |||
338 | { | 338 | { |
339 | if (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE) | 339 | if (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE) |
340 | { | 340 | { |
341 | app_request_quit(); | 341 | LLAppViewer::instance()->requestQuit(); |
342 | } | 342 | } |
343 | else | 343 | else |
344 | { | 344 | { |
diff --git a/linden/indra/newview/llsky.cpp b/linden/indra/newview/llsky.cpp index eadac8a..ee3890e 100644 --- a/linden/indra/newview/llsky.cpp +++ b/linden/indra/newview/llsky.cpp | |||
@@ -64,6 +64,7 @@ extern LLPipeline gPipeline; | |||
64 | F32 azimuth_from_vector(const LLVector3 &v); | 64 | F32 azimuth_from_vector(const LLVector3 &v); |
65 | F32 elevation_from_vector(const LLVector3 &v); | 65 | F32 elevation_from_vector(const LLVector3 &v); |
66 | 66 | ||
67 | LLSky gSky; | ||
67 | // ---------------- LLSky ---------------- | 68 | // ---------------- LLSky ---------------- |
68 | 69 | ||
69 | ////////////////////////////////////////////////////////////////////// | 70 | ////////////////////////////////////////////////////////////////////// |
diff --git a/linden/indra/newview/llspatialpartition.cpp b/linden/indra/newview/llspatialpartition.cpp index 6cd1ace..abb8d97 100644 --- a/linden/indra/newview/llspatialpartition.cpp +++ b/linden/indra/newview/llspatialpartition.cpp | |||
@@ -38,7 +38,7 @@ | |||
38 | #include "llvovolume.h" | 38 | #include "llvovolume.h" |
39 | #include "llviewercamera.h" | 39 | #include "llviewercamera.h" |
40 | #include "llface.h" | 40 | #include "llface.h" |
41 | #include "viewer.h" | 41 | #include "llviewercontrol.h" |
42 | #include "llagent.h" | 42 | #include "llagent.h" |
43 | #include "llviewerregion.h" | 43 | #include "llviewerregion.h" |
44 | #include "llcamera.h" | 44 | #include "llcamera.h" |
diff --git a/linden/indra/newview/llsprite.cpp b/linden/indra/newview/llsprite.cpp index 332a5aa..827493d 100644 --- a/linden/indra/newview/llsprite.cpp +++ b/linden/indra/newview/llsprite.cpp | |||
@@ -48,7 +48,6 @@ | |||
48 | #include "llface.h" | 48 | #include "llface.h" |
49 | #include "llviewercamera.h" | 49 | #include "llviewercamera.h" |
50 | #include "llviewerimagelist.h" | 50 | #include "llviewerimagelist.h" |
51 | #include "viewer.h" | ||
52 | 51 | ||
53 | LLVector3 LLSprite::sCameraUp(0.0f,0.0f,1.0f); | 52 | LLVector3 LLSprite::sCameraUp(0.0f,0.0f,1.0f); |
54 | LLVector3 LLSprite::sCameraRight(1.0f,0.0f,0.0f); | 53 | LLVector3 LLSprite::sCameraRight(1.0f,0.0f,0.0f); |
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp index dad8046..6c37341 100644 --- a/linden/indra/newview/llstartup.cpp +++ b/linden/indra/newview/llstartup.cpp | |||
@@ -134,6 +134,7 @@ | |||
134 | #include "llurlsimstring.h" | 134 | #include "llurlsimstring.h" |
135 | #include "llurlwhitelist.h" | 135 | #include "llurlwhitelist.h" |
136 | #include "lluserauth.h" | 136 | #include "lluserauth.h" |
137 | #include "llvieweraudio.h" | ||
137 | #include "llviewerassetstorage.h" | 138 | #include "llviewerassetstorage.h" |
138 | #include "llviewercamera.h" | 139 | #include "llviewercamera.h" |
139 | #include "llviewerdisplay.h" | 140 | #include "llviewerdisplay.h" |
@@ -155,12 +156,16 @@ | |||
155 | #include "llworldmap.h" | 156 | #include "llworldmap.h" |
156 | #include "llxfermanager.h" | 157 | #include "llxfermanager.h" |
157 | #include "pipeline.h" | 158 | #include "pipeline.h" |
158 | #include "viewer.h" | 159 | #include "llappviewer.h" |
159 | #include "llmediaengine.h" | 160 | #include "llmediaengine.h" |
160 | #include "llfasttimerview.h" | 161 | #include "llfasttimerview.h" |
161 | #include "llfloatermap.h" | 162 | #include "llfloatermap.h" |
162 | #include "llweb.h" | 163 | #include "llweb.h" |
163 | #include "llvoiceclient.h" | 164 | #include "llvoiceclient.h" |
165 | #include "llnamelistctrl.h" | ||
166 | #include "llnamebox.h" | ||
167 | #include "llnameeditor.h" | ||
168 | #include "llurlsimstring.h" | ||
164 | 169 | ||
165 | #if LL_LIBXUL_ENABLED | 170 | #if LL_LIBXUL_ENABLED |
166 | #include "llmozlib.h" | 171 | #include "llmozlib.h" |
@@ -186,13 +191,7 @@ | |||
186 | // | 191 | // |
187 | // exported globals | 192 | // exported globals |
188 | // | 193 | // |
189 | 194 | BOOL gAgentMovementCompleted = FALSE; | |
190 | // HACK: Allow server to change sun and moon IDs. | ||
191 | // I can't figure out how to pass the appropriate | ||
192 | // information into the LLVOSky constructor. JC | ||
193 | LLUUID gSunTextureID = IMG_SUN; | ||
194 | LLUUID gMoonTextureID = IMG_MOON; | ||
195 | LLUUID gCloudTextureID = IMG_CLOUD_POOF; | ||
196 | 195 | ||
197 | const char* SCREEN_HOME_FILENAME = "screen_home.bmp"; | 196 | const char* SCREEN_HOME_FILENAME = "screen_home.bmp"; |
198 | const char* SCREEN_LAST_FILENAME = "screen_last.bmp"; | 197 | const char* SCREEN_LAST_FILENAME = "screen_last.bmp"; |
@@ -202,7 +201,6 @@ const char* SCREEN_LAST_FILENAME = "screen_last.bmp"; | |||
202 | // | 201 | // |
203 | extern S32 gStartImageWidth; | 202 | extern S32 gStartImageWidth; |
204 | extern S32 gStartImageHeight; | 203 | extern S32 gStartImageHeight; |
205 | extern std::string gSerialNumber; | ||
206 | 204 | ||
207 | // | 205 | // |
208 | // local globals | 206 | // local globals |
@@ -250,6 +248,17 @@ void init_start_screen(S32 location_id); | |||
250 | void release_start_screen(); | 248 | void release_start_screen(); |
251 | void reset_login(); | 249 | void reset_login(); |
252 | 250 | ||
251 | void callback_cache_name(const LLUUID& id, const char* firstname, const char* lastname, BOOL is_group, void* data) | ||
252 | { | ||
253 | LLNameListCtrl::refreshAll(id, firstname, lastname, is_group); | ||
254 | LLNameBox::refreshAll(id, firstname, lastname, is_group); | ||
255 | LLNameEditor::refreshAll(id, firstname, lastname, is_group); | ||
256 | |||
257 | // TODO: Actually be intelligent about the refresh. | ||
258 | // For now, just brute force refresh the dialogs. | ||
259 | dialog_refresh_all(); | ||
260 | } | ||
261 | |||
253 | // | 262 | // |
254 | // exported functionality | 263 | // exported functionality |
255 | // | 264 | // |
@@ -288,9 +297,9 @@ public: | |||
288 | 297 | ||
289 | void update_texture_fetch() | 298 | void update_texture_fetch() |
290 | { | 299 | { |
291 | gTextureCache->update(1); // unpauses the texture cache thread | 300 | LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread |
292 | gImageDecodeThread->update(1); // unpauses the image thread | 301 | LLAppViewer::getImageDecodeThread()->update(1); // unpauses the image thread |
293 | gTextureFetch->update(1); // unpauses the texture fetch thread | 302 | LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread |
294 | gImageList.updateImages(0.10f); | 303 | gImageList.updateImages(0.10f); |
295 | } | 304 | } |
296 | 305 | ||
@@ -320,6 +329,7 @@ BOOL idle_startup() | |||
320 | static std::string auth_message; | 329 | static std::string auth_message; |
321 | static LLString firstname; | 330 | static LLString firstname; |
322 | static LLString lastname; | 331 | static LLString lastname; |
332 | static LLUUID web_login_key; | ||
323 | static LLString password; | 333 | static LLString password; |
324 | static std::vector<const char*> requested_options; | 334 | static std::vector<const char*> requested_options; |
325 | 335 | ||
@@ -339,7 +349,6 @@ BOOL idle_startup() | |||
339 | static S32 location_which = START_LOCATION_ID_LAST; | 349 | static S32 location_which = START_LOCATION_ID_LAST; |
340 | 350 | ||
341 | static BOOL show_connect_box = TRUE; | 351 | static BOOL show_connect_box = TRUE; |
342 | static BOOL remember_password = TRUE; | ||
343 | 352 | ||
344 | static BOOL stipend_since_login = FALSE; | 353 | static BOOL stipend_since_login = FALSE; |
345 | 354 | ||
@@ -372,7 +381,7 @@ BOOL idle_startup() | |||
372 | 381 | ||
373 | ///////////////////////////////////////////////// | 382 | ///////////////////////////////////////////////// |
374 | // | 383 | // |
375 | // Initialize stuff that doesn't need data from userserver/simulators | 384 | // Initialize stuff that doesn't need data from simulators |
376 | // | 385 | // |
377 | 386 | ||
378 | if (gFeatureManagerp->isSafe()) | 387 | if (gFeatureManagerp->isSafe()) |
@@ -412,7 +421,7 @@ BOOL idle_startup() | |||
412 | // *TODO:translate (maybe - very unlikely error message) | 421 | // *TODO:translate (maybe - very unlikely error message) |
413 | // Note: alerts.xml may be invalid - if this gets translated it will need to be in the code | 422 | // Note: alerts.xml may be invalid - if this gets translated it will need to be in the code |
414 | LLString bad_xui_msg = "An error occured while updating Second Life. Please download the latest version from www.secondlife.com."; | 423 | LLString bad_xui_msg = "An error occured while updating Second Life. Please download the latest version from www.secondlife.com."; |
415 | app_early_exit(bad_xui_msg); | 424 | LLAppViewer::instance()->earlyExit(bad_xui_msg); |
416 | } | 425 | } |
417 | // | 426 | // |
418 | // Statistics stuff | 427 | // Statistics stuff |
@@ -465,13 +474,13 @@ BOOL idle_startup() | |||
465 | std::string())) | 474 | std::string())) |
466 | { | 475 | { |
467 | std::string msg = llformat("Unable to start networking, error %d", gMessageSystem->getErrorCode()); | 476 | std::string msg = llformat("Unable to start networking, error %d", gMessageSystem->getErrorCode()); |
468 | app_early_exit(msg); | 477 | LLAppViewer::instance()->earlyExit(msg); |
469 | } | 478 | } |
470 | LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); | 479 | LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); |
471 | } | 480 | } |
472 | else | 481 | else |
473 | { | 482 | { |
474 | app_early_exit("Unable to initialize communications."); | 483 | LLAppViewer::instance()->earlyExit("Unable to initialize communications."); |
475 | } | 484 | } |
476 | 485 | ||
477 | if(gMessageSystem && gMessageSystem->isOK()) | 486 | if(gMessageSystem && gMessageSystem->isOK()) |
@@ -625,37 +634,42 @@ BOOL idle_startup() | |||
625 | // | 634 | // |
626 | // Log on to system | 635 | // Log on to system |
627 | // | 636 | // |
628 | if( !gCmdLineFirstName.empty() | 637 | if ((!gLoginHandler.mFirstName.empty() && |
638 | !gLoginHandler.mLastName.empty() && | ||
639 | !gLoginHandler.mWebLoginKey.isNull()) | ||
640 | || gLoginHandler.parseDirectLogin(LLStartUp::sSLURLCommand) ) | ||
641 | { | ||
642 | firstname = gLoginHandler.mFirstName; | ||
643 | lastname = gLoginHandler.mLastName; | ||
644 | web_login_key = gLoginHandler.mWebLoginKey; | ||
645 | |||
646 | show_connect_box = FALSE; | ||
647 | } | ||
648 | else if( !gCmdLineFirstName.empty() | ||
629 | && !gCmdLineLastName.empty() | 649 | && !gCmdLineLastName.empty() |
630 | && !gCmdLinePassword.empty()) | 650 | && !gCmdLinePassword.empty()) |
631 | { | 651 | { |
632 | firstname = gCmdLineFirstName; | 652 | firstname = gCmdLineFirstName; |
633 | lastname = gCmdLineLastName; | 653 | lastname = gCmdLineLastName; |
634 | 654 | ||
635 | LLMD5 pass((unsigned char*)gCmdLinePassword.c_str()); | 655 | show_connect_box = TRUE; |
636 | char md5pass[33]; /* Flawfinder: ignore */ | 656 | gAutoLogin = TRUE; |
637 | pass.hex_digest(md5pass); | ||
638 | password = md5pass; | ||
639 | |||
640 | remember_password = gSavedSettings.getBOOL("RememberPassword"); | ||
641 | show_connect_box = FALSE; | ||
642 | } | 657 | } |
643 | else if (gAutoLogin || gSavedSettings.getBOOL("AutoLogin")) | 658 | else if (gAutoLogin || gSavedSettings.getBOOL("AutoLogin")) |
644 | { | 659 | { |
645 | firstname = gSavedSettings.getString("FirstName"); | 660 | firstname = gSavedSettings.getString("FirstName"); |
646 | lastname = gSavedSettings.getString("LastName"); | 661 | lastname = gSavedSettings.getString("LastName"); |
647 | password = load_password_from_disk(); | 662 | password = load_password_from_disk(); |
648 | remember_password = TRUE; | 663 | gSavedSettings.setBOOL("RememberPassword", TRUE); |
649 | show_connect_box = FALSE; | 664 | show_connect_box = TRUE; |
650 | } | 665 | } |
651 | else | 666 | else |
652 | { | 667 | { |
653 | // if not automatically logging in, display login dialog | 668 | // if not automatically logging in, display login dialog |
654 | // until a valid userserver is selected | 669 | // a valid grid is selected |
655 | firstname = gSavedSettings.getString("FirstName"); | 670 | firstname = gSavedSettings.getString("FirstName"); |
656 | lastname = gSavedSettings.getString("LastName"); | 671 | lastname = gSavedSettings.getString("LastName"); |
657 | password = load_password_from_disk(); | 672 | password = load_password_from_disk(); |
658 | remember_password = gSavedSettings.getBOOL("RememberPassword"); | ||
659 | show_connect_box = TRUE; | 673 | show_connect_box = TRUE; |
660 | } | 674 | } |
661 | 675 | ||
@@ -665,7 +679,8 @@ BOOL idle_startup() | |||
665 | } | 679 | } |
666 | 680 | ||
667 | if (STATE_LOGIN_SHOW == LLStartUp::getStartupState()) | 681 | if (STATE_LOGIN_SHOW == LLStartUp::getStartupState()) |
668 | { | 682 | { |
683 | |||
669 | llinfos << "Initializing Window" << llendl; | 684 | llinfos << "Initializing Window" << llendl; |
670 | 685 | ||
671 | gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW); | 686 | gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW); |
@@ -686,8 +701,6 @@ BOOL idle_startup() | |||
686 | // Show the login dialog | 701 | // Show the login dialog |
687 | login_show(); | 702 | login_show(); |
688 | 703 | ||
689 | // connect dialog is already shown, so fill in the names | ||
690 | LLPanelLogin::setFields( firstname, lastname, password, remember_password ); | ||
691 | LLPanelLogin::giveFocus(); | 704 | LLPanelLogin::giveFocus(); |
692 | 705 | ||
693 | gSavedSettings.setBOOL("FirstRunThisInstall", FALSE); | 706 | gSavedSettings.setBOOL("FirstRunThisInstall", FALSE); |
@@ -699,6 +712,32 @@ BOOL idle_startup() | |||
699 | // skip directly to message template verification | 712 | // skip directly to message template verification |
700 | LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); | 713 | LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); |
701 | } | 714 | } |
715 | |||
716 | // Create selection manager | ||
717 | // Must be done before menus created, because many enabled callbacks | ||
718 | // require its existance. | ||
719 | gSelectMgr = new LLSelectMgr(); | ||
720 | gParcelMgr = new LLViewerParcelMgr(); | ||
721 | gHUDManager = new LLHUDManager(); | ||
722 | gMuteListp = new LLMuteList(); | ||
723 | |||
724 | // Initialize UI | ||
725 | if (!gNoRender) | ||
726 | { | ||
727 | // Initialize all our tools. Must be done after saved settings loaded. | ||
728 | if ( gToolMgr == NULL ) | ||
729 | { | ||
730 | gToolMgr = new LLToolMgr(); | ||
731 | gToolMgr->initTools(); | ||
732 | } | ||
733 | |||
734 | // Quickly get something onscreen to look at. | ||
735 | gViewerWindow->initWorldUI(); | ||
736 | } | ||
737 | |||
738 | gViewerWindow->setNormalControlsVisible( FALSE ); | ||
739 | gLoginMenuBarView->setVisible( TRUE ); | ||
740 | gLoginMenuBarView->setEnabled( TRUE ); | ||
702 | 741 | ||
703 | timeout.reset(); | 742 | timeout.reset(); |
704 | return do_normal_idle; | 743 | return do_normal_idle; |
@@ -716,11 +755,16 @@ BOOL idle_startup() | |||
716 | 755 | ||
717 | if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState()) | 756 | if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState()) |
718 | { | 757 | { |
758 | //reset the values that could have come in from a slurl | ||
759 | if (!gLoginHandler.mWebLoginKey.isNull()) | ||
760 | { | ||
761 | firstname = gLoginHandler.mFirstName; | ||
762 | lastname = gLoginHandler.mLastName; | ||
763 | web_login_key = gLoginHandler.mWebLoginKey; | ||
764 | } | ||
765 | |||
719 | if (show_connect_box) | 766 | if (show_connect_box) |
720 | { | 767 | { |
721 | // Load all the name information out of the login view | ||
722 | LLPanelLogin::getFields(firstname, lastname, password, remember_password); | ||
723 | |||
724 | // HACK: Try to make not jump on login | 768 | // HACK: Try to make not jump on login |
725 | gKeyboard->resetKeys(); | 769 | gKeyboard->resetKeys(); |
726 | } | 770 | } |
@@ -730,12 +774,11 @@ BOOL idle_startup() | |||
730 | gSavedSettings.setString("FirstName", firstname); | 774 | gSavedSettings.setString("FirstName", firstname); |
731 | gSavedSettings.setString("LastName", lastname); | 775 | gSavedSettings.setString("LastName", lastname); |
732 | 776 | ||
777 | |||
778 | |||
779 | |||
733 | llinfos << "Attempting login as: " << firstname << " " << lastname << llendl; | 780 | llinfos << "Attempting login as: " << firstname << " " << lastname << llendl; |
734 | write_debug("Attempting login as: "); | 781 | gDebugInfo["LoginName"] = firstname + " " + lastname; |
735 | write_debug(firstname); | ||
736 | write_debug(" "); | ||
737 | write_debug(lastname); | ||
738 | write_debug("\n"); | ||
739 | } | 782 | } |
740 | 783 | ||
741 | // create necessary directories | 784 | // create necessary directories |
@@ -780,28 +823,10 @@ BOOL idle_startup() | |||
780 | 823 | ||
781 | if (show_connect_box) | 824 | if (show_connect_box) |
782 | { | 825 | { |
783 | LLString server_label; | ||
784 | S32 domain_name_index; | ||
785 | BOOL user_picked_server = LLPanelLogin::getServer( server_label, domain_name_index ); | ||
786 | gUserServerChoice = (EUserServerDomain) domain_name_index; | ||
787 | gSavedSettings.setS32("ServerChoice", gUserServerChoice); | ||
788 | if (gUserServerChoice == USERSERVER_OTHER) | ||
789 | { | ||
790 | snprintf(gUserServerName, MAX_STRING, "%s", server_label.c_str()); /* Flawfinder: ignore */ | ||
791 | } | ||
792 | |||
793 | if ( user_picked_server ) | ||
794 | { // User picked a grid from the popup, so clear the stored urls and they will be re-generated from gUserServerChoice | ||
795 | sAuthUris.clear(); | ||
796 | resetURIs(); | ||
797 | } | ||
798 | |||
799 | LLString location; | ||
800 | LLPanelLogin::getLocation( location ); | ||
801 | LLURLSimString::setString( location ); | ||
802 | LLPanelLogin::close(); | 826 | LLPanelLogin::close(); |
803 | } | 827 | } |
804 | 828 | ||
829 | |||
805 | //For HTML parsing in text boxes. | 830 | //For HTML parsing in text boxes. |
806 | LLTextEditor::setLinkColor( gSavedSettings.getColor4("HTMLLinkColor") ); | 831 | LLTextEditor::setLinkColor( gSavedSettings.getColor4("HTMLLinkColor") ); |
807 | LLTextEditor::setURLCallbacks ( &LLWeb::loadURL, &LLURLDispatcher::dispatch, &LLURLDispatcher::dispatch ); | 832 | LLTextEditor::setURLCallbacks ( &LLWeb::loadURL, &LLURLDispatcher::dispatch, &LLURLDispatcher::dispatch ); |
@@ -871,6 +896,8 @@ BOOL idle_startup() | |||
871 | if(STATE_LOGIN_AUTH_INIT == LLStartUp::getStartupState()) | 896 | if(STATE_LOGIN_AUTH_INIT == LLStartUp::getStartupState()) |
872 | { | 897 | { |
873 | //#define LL_MINIMIAL_REQUESTED_OPTIONS | 898 | //#define LL_MINIMIAL_REQUESTED_OPTIONS |
899 | gDebugInfo["GridUtilHost"] = gGridInfo[gGridChoice].mName; | ||
900 | |||
874 | lldebugs << "STATE_LOGIN_AUTH_INIT" << llendl; | 901 | lldebugs << "STATE_LOGIN_AUTH_INIT" << llendl; |
875 | if (!gUserAuthp) | 902 | if (!gUserAuthp) |
876 | { | 903 | { |
@@ -906,14 +933,13 @@ BOOL idle_startup() | |||
906 | gSavedSettings.setBOOL("UseDebugMenus", TRUE); | 933 | gSavedSettings.setBOOL("UseDebugMenus", TRUE); |
907 | requested_options.push_back("god-connect"); | 934 | requested_options.push_back("god-connect"); |
908 | } | 935 | } |
909 | if (sAuthUris.empty()) | 936 | LLAppViewer::instance()->getLoginURIs(); |
910 | { | 937 | sAuthUris = LLAppViewer::instance()->getLoginURIs(); |
911 | sAuthUris = getLoginURIs(); | 938 | |
912 | } | ||
913 | sAuthUriNum = 0; | 939 | sAuthUriNum = 0; |
914 | auth_method = "login_to_simulator"; | 940 | auth_method = "login_to_simulator"; |
915 | auth_desc = "Logging in. "; | 941 | auth_desc = "Logging in. "; |
916 | auth_desc += gSecondLife; | 942 | auth_desc += LLAppViewer::instance()->getSecondLifeTitle(); |
917 | auth_desc += " may appear frozen. Please wait."; | 943 | auth_desc += " may appear frozen. Please wait."; |
918 | LLStartUp::setStartupState( STATE_LOGIN_AUTHENTICATE ); | 944 | LLStartUp::setStartupState( STATE_LOGIN_AUTHENTICATE ); |
919 | } | 945 | } |
@@ -931,11 +957,12 @@ BOOL idle_startup() | |||
931 | // a startup URL was specified | 957 | // a startup URL was specified |
932 | std::stringstream unescaped_start; | 958 | std::stringstream unescaped_start; |
933 | unescaped_start << "uri:" | 959 | unescaped_start << "uri:" |
934 | << LLURLSimString::sInstance.mSimName << "&" | 960 | << LLURLSimString::sInstance.mSimName << "&" |
935 | << LLURLSimString::sInstance.mX << "&" | 961 | << LLURLSimString::sInstance.mX << "&" |
936 | << LLURLSimString::sInstance.mY << "&" | 962 | << LLURLSimString::sInstance.mY << "&" |
937 | << LLURLSimString::sInstance.mZ; | 963 | << LLURLSimString::sInstance.mZ; |
938 | start << xml_escape_string(unescaped_start.str().c_str()); | 964 | start << xml_escape_string(unescaped_start.str().c_str()); |
965 | |||
939 | } | 966 | } |
940 | else if (gSavedSettings.getBOOL("LoginLastLocation")) | 967 | else if (gSavedSettings.getBOOL("LoginLastLocation")) |
941 | { | 968 | { |
@@ -951,13 +978,13 @@ BOOL idle_startup() | |||
951 | hashed_mac.update( gMACAddress, MAC_ADDRESS_BYTES ); | 978 | hashed_mac.update( gMACAddress, MAC_ADDRESS_BYTES ); |
952 | hashed_mac.finalize(); | 979 | hashed_mac.finalize(); |
953 | hashed_mac.hex_digest(hashed_mac_string); | 980 | hashed_mac.hex_digest(hashed_mac_string); |
954 | 981 | ||
955 | gUserAuthp->authenticate( | 982 | gUserAuthp->authenticate( |
956 | sAuthUris[sAuthUriNum].c_str(), | 983 | sAuthUris[sAuthUriNum].c_str(), |
957 | auth_method.c_str(), | 984 | auth_method.c_str(), |
958 | firstname.c_str(), | 985 | firstname.c_str(), |
959 | lastname.c_str(), | 986 | lastname.c_str(), |
960 | password.c_str(), | 987 | web_login_key, |
961 | start.str().c_str(), | 988 | start.str().c_str(), |
962 | gSkipOptionalUpdate, | 989 | gSkipOptionalUpdate, |
963 | gAcceptTOS, | 990 | gAcceptTOS, |
@@ -966,7 +993,8 @@ BOOL idle_startup() | |||
966 | gLastExecFroze, | 993 | gLastExecFroze, |
967 | requested_options, | 994 | requested_options, |
968 | hashed_mac_string, | 995 | hashed_mac_string, |
969 | gSerialNumber); | 996 | LLAppViewer::instance()->getSerialNumber()); |
997 | |||
970 | // reset globals | 998 | // reset globals |
971 | gAcceptTOS = FALSE; | 999 | gAcceptTOS = FALSE; |
972 | gAcceptCriticalMessage = FALSE; | 1000 | gAcceptCriticalMessage = FALSE; |
@@ -977,6 +1005,10 @@ BOOL idle_startup() | |||
977 | if(STATE_LOGIN_NO_DATA_YET == LLStartUp::getStartupState()) | 1005 | if(STATE_LOGIN_NO_DATA_YET == LLStartUp::getStartupState()) |
978 | { | 1006 | { |
979 | //lldebugs << "STATE_LOGIN_NO_DATA_YET" << llendl; | 1007 | //lldebugs << "STATE_LOGIN_NO_DATA_YET" << llendl; |
1008 | // If we get here we have gotten past the potential stall | ||
1009 | // in curl, so take "may appear frozen" out of progress bar. JC | ||
1010 | auth_desc = "Logging in..."; | ||
1011 | set_startup_status(progress, auth_desc.c_str(), auth_message.c_str()); | ||
980 | if (!gUserAuthp) | 1012 | if (!gUserAuthp) |
981 | { | 1013 | { |
982 | llerrs << "No userauth in STATE_LOGIN_NO_DATA_YET!" << llendl; | 1014 | llerrs << "No userauth in STATE_LOGIN_NO_DATA_YET!" << llendl; |
@@ -1167,7 +1199,7 @@ BOOL idle_startup() | |||
1167 | default: | 1199 | default: |
1168 | if (sAuthUriNum >= (int) sAuthUris.size() - 1) | 1200 | if (sAuthUriNum >= (int) sAuthUris.size() - 1) |
1169 | { | 1201 | { |
1170 | emsg << "Unable to connect to " << gSecondLife << ".\n"; | 1202 | emsg << "Unable to connect to " << LLAppViewer::instance()->getSecondLifeTitle() << ".\n"; |
1171 | emsg << gUserAuthp->errorMessage(); | 1203 | emsg << gUserAuthp->errorMessage(); |
1172 | } else { | 1204 | } else { |
1173 | sAuthUriNum++; | 1205 | sAuthUriNum++; |
@@ -1187,7 +1219,7 @@ BOOL idle_startup() | |||
1187 | { | 1219 | { |
1188 | delete gUserAuthp; | 1220 | delete gUserAuthp; |
1189 | gUserAuthp = NULL; | 1221 | gUserAuthp = NULL; |
1190 | app_force_quit(NULL); | 1222 | LLAppViewer::instance()->forceQuit(); |
1191 | return FALSE; | 1223 | return FALSE; |
1192 | } | 1224 | } |
1193 | 1225 | ||
@@ -1202,15 +1234,11 @@ BOOL idle_startup() | |||
1202 | const char* text; | 1234 | const char* text; |
1203 | text = gUserAuthp->getResponse("agent_id"); | 1235 | text = gUserAuthp->getResponse("agent_id"); |
1204 | if(text) gAgentID.set(text); | 1236 | if(text) gAgentID.set(text); |
1205 | write_debug("AgentID: "); | 1237 | gDebugInfo["AgentID"] = text; |
1206 | write_debug(text); | ||
1207 | write_debug("\n"); | ||
1208 | 1238 | ||
1209 | text = gUserAuthp->getResponse("session_id"); | 1239 | text = gUserAuthp->getResponse("session_id"); |
1210 | if(text) gAgentSessionID.set(text); | 1240 | if(text) gAgentSessionID.set(text); |
1211 | write_debug("SessionID: "); | 1241 | gDebugInfo["SessionID"] = text; |
1212 | write_debug(text); | ||
1213 | write_debug("\n"); | ||
1214 | 1242 | ||
1215 | text = gUserAuthp->getResponse("secure_session_id"); | 1243 | text = gUserAuthp->getResponse("secure_session_id"); |
1216 | if(text) gAgent.mSecureSessionID.set(text); | 1244 | if(text) gAgent.mSecureSessionID.set(text); |
@@ -1228,17 +1256,8 @@ BOOL idle_startup() | |||
1228 | if(text) lastname.assign(text); | 1256 | if(text) lastname.assign(text); |
1229 | gSavedSettings.setString("FirstName", firstname); | 1257 | gSavedSettings.setString("FirstName", firstname); |
1230 | gSavedSettings.setString("LastName", lastname); | 1258 | gSavedSettings.setString("LastName", lastname); |
1231 | if (remember_password) | 1259 | |
1232 | { | ||
1233 | save_password_to_disk(password.c_str()); | ||
1234 | } | ||
1235 | else | ||
1236 | { | ||
1237 | save_password_to_disk(NULL); | ||
1238 | } | ||
1239 | gSavedSettings.setBOOL("RememberPassword", remember_password); | ||
1240 | gSavedSettings.setBOOL("LoginLastLocation", gSavedSettings.getBOOL("LoginLastLocation")); | 1260 | gSavedSettings.setBOOL("LoginLastLocation", gSavedSettings.getBOOL("LoginLastLocation")); |
1241 | gSavedSettings.setBOOL("LoggedIn", TRUE); | ||
1242 | 1261 | ||
1243 | text = gUserAuthp->getResponse("agent_access"); | 1262 | text = gUserAuthp->getResponse("agent_access"); |
1244 | if(text && (text[0] == 'M')) | 1263 | if(text && (text[0] == 'M')) |
@@ -1463,14 +1482,6 @@ BOOL idle_startup() | |||
1463 | // type the name/password again if we crash. | 1482 | // type the name/password again if we crash. |
1464 | gSavedSettings.saveToFile(gSettingsFileName, TRUE); | 1483 | gSavedSettings.saveToFile(gSettingsFileName, TRUE); |
1465 | 1484 | ||
1466 | // Create selection manager | ||
1467 | // Must be done before menus created, because many enabled callbacks | ||
1468 | // require its existance. | ||
1469 | gSelectMgr = new LLSelectMgr(); | ||
1470 | gParcelMgr = new LLViewerParcelMgr(); | ||
1471 | gHUDManager = new LLHUDManager(); | ||
1472 | gMuteListp = new LLMuteList(); | ||
1473 | |||
1474 | // | 1485 | // |
1475 | // Initialize classes w/graphics stuff. | 1486 | // Initialize classes w/graphics stuff. |
1476 | // | 1487 | // |
@@ -1539,21 +1550,14 @@ BOOL idle_startup() | |||
1539 | if ( gViewerWindow != NULL && gToolMgr != NULL ) | 1550 | if ( gViewerWindow != NULL && gToolMgr != NULL ) |
1540 | { // This isn't the first logon attempt, so show the UI | 1551 | { // This isn't the first logon attempt, so show the UI |
1541 | gViewerWindow->setNormalControlsVisible( TRUE ); | 1552 | gViewerWindow->setNormalControlsVisible( TRUE ); |
1542 | } | 1553 | } |
1554 | gLoginMenuBarView->setVisible( FALSE ); | ||
1555 | gLoginMenuBarView->setEnabled( FALSE ); | ||
1556 | |||
1557 | gFloaterMap->setVisible( gSavedSettings.getBOOL("ShowMiniMap") ); | ||
1543 | 1558 | ||
1544 | // Initialize UI | ||
1545 | if (!gNoRender) | 1559 | if (!gNoRender) |
1546 | { | 1560 | { |
1547 | // Initialize all our tools. Must be done after saved settings loaded. | ||
1548 | if ( gToolMgr == NULL ) | ||
1549 | { | ||
1550 | gToolMgr = new LLToolMgr(); | ||
1551 | gToolMgr->initTools(); | ||
1552 | } | ||
1553 | |||
1554 | // Quickly get something onscreen to look at. | ||
1555 | gViewerWindow->initWorldUI(); | ||
1556 | |||
1557 | // Move the progress view in front of the UI | 1561 | // Move the progress view in front of the UI |
1558 | gViewerWindow->moveProgressViewToFront(); | 1562 | gViewerWindow->moveProgressViewToFront(); |
1559 | 1563 | ||
@@ -1587,7 +1591,7 @@ BOOL idle_startup() | |||
1587 | gCacheName->addObserver(callback_cache_name); | 1591 | gCacheName->addObserver(callback_cache_name); |
1588 | 1592 | ||
1589 | // Load stored cache if possible | 1593 | // Load stored cache if possible |
1590 | load_name_cache(); | 1594 | LLAppViewer::instance()->loadNameCache(); |
1591 | } | 1595 | } |
1592 | 1596 | ||
1593 | // Data storage for map of world. | 1597 | // Data storage for map of world. |
@@ -1985,22 +1989,8 @@ BOOL idle_startup() | |||
1985 | gAgent.sendReliableMessage(); | 1989 | gAgent.sendReliableMessage(); |
1986 | 1990 | ||
1987 | // request all group information | 1991 | // request all group information |
1988 | // *FIX: This will not do the right thing if the message | ||
1989 | // gets there before the requestuserserverconnection | ||
1990 | // circuit is completed. | ||
1991 | gAgent.sendAgentDataUpdateRequest(); | 1992 | gAgent.sendAgentDataUpdateRequest(); |
1992 | 1993 | ||
1993 | |||
1994 | // NOTE: removed as part of user-privacy | ||
1995 | // enhancements. this information should be available from | ||
1996 | // login. 2006-10-16 Phoenix. | ||
1997 | // get the users that have been granted modify powers | ||
1998 | //msg->newMessageFast(_PREHASH_RequestGrantedProxies); | ||
1999 | //msg->nextBlockFast(_PREHASH_AgentData); | ||
2000 | //msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); | ||
2001 | //msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); | ||
2002 | //gAgent.sendReliableMessage(); | ||
2003 | |||
2004 | BOOL shown_at_exit = gSavedSettings.getBOOL("ShowInventory"); | 1994 | BOOL shown_at_exit = gSavedSettings.getBOOL("ShowInventory"); |
2005 | 1995 | ||
2006 | // Create the inventory views | 1996 | // Create the inventory views |
@@ -2136,7 +2126,6 @@ BOOL idle_startup() | |||
2136 | //msg->setHandlerFuncFast(_PREHASH_AttachedSoundCutoffRadius, process_attached_sound_cutoff_radius); | 2126 | //msg->setHandlerFuncFast(_PREHASH_AttachedSoundCutoffRadius, process_attached_sound_cutoff_radius); |
2137 | 2127 | ||
2138 | llinfos << "Initialization complete" << llendl; | 2128 | llinfos << "Initialization complete" << llendl; |
2139 | gInitializationComplete = TRUE; | ||
2140 | 2129 | ||
2141 | gRenderStartTime.reset(); | 2130 | gRenderStartTime.reset(); |
2142 | gForegroundTime.reset(); | 2131 | gForegroundTime.reset(); |
@@ -2169,17 +2158,17 @@ BOOL idle_startup() | |||
2169 | if (url_ok) | 2158 | if (url_ok) |
2170 | { | 2159 | { |
2171 | args["[TYPE]"] = "desired"; | 2160 | args["[TYPE]"] = "desired"; |
2172 | args["[HELP]"] = " "; | 2161 | args["[HELP]"] = ""; |
2173 | } | 2162 | } |
2174 | else if (gSavedSettings.getBOOL("LoginLastLocation")) | 2163 | else if (gSavedSettings.getBOOL("LoginLastLocation")) |
2175 | { | 2164 | { |
2176 | args["[TYPE]"] = "last"; | 2165 | args["[TYPE]"] = "last"; |
2177 | args["[HELP]"] = " \n "; | 2166 | args["[HELP]"] = ""; |
2178 | } | 2167 | } |
2179 | else | 2168 | else |
2180 | { | 2169 | { |
2181 | args["[TYPE]"] = "home"; | 2170 | args["[TYPE]"] = "home"; |
2182 | args["[HELP]"] = " \nYou may want to set a new home location.\n "; | 2171 | args["[HELP]"] = "\nYou may want to set a new home location."; |
2183 | } | 2172 | } |
2184 | gViewerWindow->alertXml("AvatarMoved", args); | 2173 | gViewerWindow->alertXml("AvatarMoved", args); |
2185 | } | 2174 | } |
@@ -2351,68 +2340,12 @@ void login_show() | |||
2351 | // UI textures have been previously loaded in doPreloadImages() | 2340 | // UI textures have been previously loaded in doPreloadImages() |
2352 | 2341 | ||
2353 | llinfos << "Setting Servers" << llendl; | 2342 | llinfos << "Setting Servers" << llendl; |
2354 | |||
2355 | if( USERSERVER_OTHER == gUserServerChoice ) | ||
2356 | { | ||
2357 | LLPanelLogin::addServer( gUserServerName, USERSERVER_OTHER ); | ||
2358 | } | ||
2359 | else | ||
2360 | { | ||
2361 | LLPanelLogin::addServer( gUserServerDomainName[gUserServerChoice].mLabel, gUserServerChoice ); | ||
2362 | } | ||
2363 | |||
2364 | // Arg! We hate loops! | ||
2365 | LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_DMZ].mLabel, USERSERVER_DMZ ); | ||
2366 | LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_LOCAL].mLabel, USERSERVER_LOCAL ); | ||
2367 | LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_AGNI].mLabel, USERSERVER_AGNI ); | ||
2368 | LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_ADITI].mLabel, USERSERVER_ADITI ); | ||
2369 | LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_SIVA].mLabel, USERSERVER_SIVA ); | ||
2370 | LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_DURGA].mLabel, USERSERVER_DURGA ); | ||
2371 | LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_SHAKTI].mLabel, USERSERVER_SHAKTI ); | ||
2372 | LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_GANGA].mLabel, USERSERVER_GANGA ); | ||
2373 | LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_UMA].mLabel, USERSERVER_UMA ); | ||
2374 | LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_SOMA].mLabel, USERSERVER_SOMA ); | ||
2375 | LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_VAAK].mLabel, USERSERVER_VAAK ); | ||
2376 | } | 2343 | } |
2377 | 2344 | ||
2378 | // Callback for when login screen is closed. Option 0 = connect, option 1 = quit. | 2345 | // Callback for when login screen is closed. Option 0 = connect, option 1 = quit. |
2379 | void login_callback(S32 option, void *userdata) | 2346 | void login_callback(S32 option, void *userdata) |
2380 | { | 2347 | { |
2381 | const S32 CONNECT_OPTION = 0; | ||
2382 | const S32 QUIT_OPTION = 1; | ||
2383 | |||
2384 | if (CONNECT_OPTION == option) | ||
2385 | { | ||
2386 | LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); | ||
2387 | return; | ||
2388 | } | ||
2389 | else if (QUIT_OPTION == option) | ||
2390 | { | ||
2391 | // Make sure we don't save the password if the user is trying to clear it. | ||
2392 | LLString first, last, password; | ||
2393 | BOOL remember = TRUE; | ||
2394 | LLPanelLogin::getFields(first, last, password, remember); | ||
2395 | if (!remember) | ||
2396 | { | ||
2397 | // turn off the setting and write out to disk | ||
2398 | gSavedSettings.setBOOL("RememberPassword", FALSE); | ||
2399 | gSavedSettings.saveToFile(gSettingsFileName, TRUE); | ||
2400 | |||
2401 | // stomp the saved password on disk | ||
2402 | save_password_to_disk(NULL); | ||
2403 | } | ||
2404 | 2348 | ||
2405 | LLPanelLogin::close(); | ||
2406 | |||
2407 | // Next iteration through main loop should shut down the app cleanly. | ||
2408 | gQuit = TRUE; | ||
2409 | |||
2410 | return; | ||
2411 | } | ||
2412 | else | ||
2413 | { | ||
2414 | llwarns << "Unknown login button clicked" << llendl; | ||
2415 | } | ||
2416 | } | 2349 | } |
2417 | 2350 | ||
2418 | LLString load_password_from_disk() | 2351 | LLString load_password_from_disk() |
@@ -2660,7 +2593,7 @@ void update_dialog_callback(S32 option, void *userdata) | |||
2660 | // ...user doesn't want to do it | 2593 | // ...user doesn't want to do it |
2661 | if (mandatory) | 2594 | if (mandatory) |
2662 | { | 2595 | { |
2663 | app_force_quit(); | 2596 | LLAppViewer::instance()->forceQuit(); |
2664 | // Bump them back to the login screen. | 2597 | // Bump them back to the login screen. |
2665 | //reset_login(); | 2598 | //reset_login(); |
2666 | } | 2599 | } |
@@ -2680,7 +2613,9 @@ void update_dialog_callback(S32 option, void *userdata) | |||
2680 | #elif LL_LINUX | 2613 | #elif LL_LINUX |
2681 | query_map["os"] = "lnx"; | 2614 | query_map["os"] = "lnx"; |
2682 | #endif | 2615 | #endif |
2683 | query_map["userserver"] = gUserServerName; | 2616 | // *TODO change userserver to be grid on both viewer and sim, since |
2617 | // userserver no longer exists. | ||
2618 | query_map["userserver"] = gGridName; | ||
2684 | query_map["channel"] = gChannelName; | 2619 | query_map["channel"] = gChannelName; |
2685 | // *TODO constantize this guy | 2620 | // *TODO constantize this guy |
2686 | LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map); | 2621 | LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map); |
@@ -2691,7 +2626,7 @@ void update_dialog_callback(S32 option, void *userdata) | |||
2691 | { | 2626 | { |
2692 | // We're hosed, bail | 2627 | // We're hosed, bail |
2693 | llwarns << "LLDir::getTempFilename() failed" << llendl; | 2628 | llwarns << "LLDir::getTempFilename() failed" << llendl; |
2694 | app_force_quit(NULL); | 2629 | LLAppViewer::instance()->forceQuit(); |
2695 | return; | 2630 | return; |
2696 | } | 2631 | } |
2697 | 2632 | ||
@@ -2709,7 +2644,7 @@ void update_dialog_callback(S32 option, void *userdata) | |||
2709 | if (!CopyFileA(updater_source.c_str(), update_exe_path.c_str(), FALSE)) | 2644 | if (!CopyFileA(updater_source.c_str(), update_exe_path.c_str(), FALSE)) |
2710 | { | 2645 | { |
2711 | llinfos << "Unable to copy the updater!" << llendl; | 2646 | llinfos << "Unable to copy the updater!" << llendl; |
2712 | app_force_quit(NULL); | 2647 | LLAppViewer::instance()->forceQuit(); |
2713 | return; | 2648 | return; |
2714 | } | 2649 | } |
2715 | 2650 | ||
@@ -2742,13 +2677,14 @@ void update_dialog_callback(S32 option, void *userdata) | |||
2742 | program_name = "SecondLife"; | 2677 | program_name = "SecondLife"; |
2743 | } | 2678 | } |
2744 | 2679 | ||
2745 | params << " -silent -name \"" << gSecondLife << "\""; | 2680 | params << " -silent -name \"" << LLAppViewer::instance()->getSecondLifeTitle() << "\""; |
2746 | params << " -program \"" << program_name << "\""; | 2681 | params << " -program \"" << program_name << "\""; |
2747 | } | 2682 | } |
2748 | 2683 | ||
2749 | llinfos << "Calling updater: " << update_exe_path << " " << params.str() << llendl; | 2684 | llinfos << "Calling updater: " << update_exe_path << " " << params.str() << llendl; |
2750 | 2685 | ||
2751 | remove_marker_file(); // In case updater fails | 2686 | // *REMOVE:Mani The following call is handled through ~LLAppViewer. |
2687 | // remove_marker_file(); // In case updater fails | ||
2752 | 2688 | ||
2753 | // Use spawn() to run asynchronously | 2689 | // Use spawn() to run asynchronously |
2754 | int retval = _spawnl(_P_NOWAIT, update_exe_path.c_str(), update_exe_path.c_str(), params.str().c_str(), NULL); | 2690 | int retval = _spawnl(_P_NOWAIT, update_exe_path.c_str(), update_exe_path.c_str(), params.str().c_str(), NULL); |
@@ -2767,13 +2703,14 @@ void update_dialog_callback(S32 option, void *userdata) | |||
2767 | update_exe_path += "/AutoUpdater.app/Contents/MacOS/AutoUpdater' -url \""; | 2703 | update_exe_path += "/AutoUpdater.app/Contents/MacOS/AutoUpdater' -url \""; |
2768 | update_exe_path += update_url.asString(); | 2704 | update_exe_path += update_url.asString(); |
2769 | update_exe_path += "\" -name \""; | 2705 | update_exe_path += "\" -name \""; |
2770 | update_exe_path += gSecondLife; | 2706 | update_exe_path += LLAppViewer::instance()->getSecondLifeTitle(); |
2771 | update_exe_path += "\" &"; | 2707 | update_exe_path += "\" &"; |
2772 | 2708 | ||
2773 | llinfos << "Calling updater: " << update_exe_path << llendl; | 2709 | llinfos << "Calling updater: " << update_exe_path << llendl; |
2774 | |||
2775 | remove_marker_file(); // In case updater fails | ||
2776 | 2710 | ||
2711 | // *REMOVE:Mani The following call is handled through ~LLAppViewer. | ||
2712 | // remove_marker_file(); // In case updater fails | ||
2713 | |||
2777 | // Run the auto-updater. | 2714 | // Run the auto-updater. |
2778 | system(update_exe_path.c_str()); /* Flawfinder: ignore */ | 2715 | system(update_exe_path.c_str()); /* Flawfinder: ignore */ |
2779 | 2716 | ||
@@ -2781,16 +2718,18 @@ void update_dialog_callback(S32 option, void *userdata) | |||
2781 | OSMessageBox("Automatic updating is not yet implemented for Linux.\n" | 2718 | OSMessageBox("Automatic updating is not yet implemented for Linux.\n" |
2782 | "Please download the latest version from www.secondlife.com.", | 2719 | "Please download the latest version from www.secondlife.com.", |
2783 | NULL, OSMB_OK); | 2720 | NULL, OSMB_OK); |
2784 | remove_marker_file(); | 2721 | |
2722 | // *REMOVE:Mani The following call is handled through ~LLAppViewer. | ||
2723 | // remove_marker_file(); | ||
2785 | 2724 | ||
2786 | #endif | 2725 | #endif |
2787 | app_force_quit(NULL); | 2726 | LLAppViewer::instance()->forceQuit(); |
2788 | } | 2727 | } |
2789 | 2728 | ||
2790 | void use_circuit_callback(void**, S32 result) | 2729 | void use_circuit_callback(void**, S32 result) |
2791 | { | 2730 | { |
2792 | // bail if we're quitting. | 2731 | // bail if we're quitting. |
2793 | if(gQuit) return; | 2732 | if(LLApp::isExiting()) return; |
2794 | if( !gUseCircuitCallbackCalled ) | 2733 | if( !gUseCircuitCallbackCalled ) |
2795 | { | 2734 | { |
2796 | gUseCircuitCallbackCalled = true; | 2735 | gUseCircuitCallbackCalled = true; |
@@ -3646,6 +3585,8 @@ void reset_login() | |||
3646 | if ( gViewerWindow ) | 3585 | if ( gViewerWindow ) |
3647 | { // Hide menus and normal buttons | 3586 | { // Hide menus and normal buttons |
3648 | gViewerWindow->setNormalControlsVisible( FALSE ); | 3587 | gViewerWindow->setNormalControlsVisible( FALSE ); |
3588 | gLoginMenuBarView->setVisible( TRUE ); | ||
3589 | gLoginMenuBarView->setEnabled( TRUE ); | ||
3649 | } | 3590 | } |
3650 | 3591 | ||
3651 | // Hide any other stuff | 3592 | // Hide any other stuff |
@@ -3689,3 +3630,8 @@ bool LLStartUp::dispatchURL() | |||
3689 | } | 3630 | } |
3690 | return false; | 3631 | return false; |
3691 | } | 3632 | } |
3633 | |||
3634 | void login_alert_done(S32 option, void* user_data) | ||
3635 | { | ||
3636 | LLPanelLogin::giveFocus(); | ||
3637 | } | ||
diff --git a/linden/indra/newview/llstartup.h b/linden/indra/newview/llstartup.h index ad27b28..08f2f60 100644 --- a/linden/indra/newview/llstartup.h +++ b/linden/indra/newview/llstartup.h | |||
@@ -36,9 +36,9 @@ | |||
36 | 36 | ||
37 | // functions | 37 | // functions |
38 | BOOL idle_startup(); | 38 | BOOL idle_startup(); |
39 | void cleanup_app(); | ||
40 | LLString load_password_from_disk(); | 39 | LLString load_password_from_disk(); |
41 | void release_start_screen(); | 40 | void release_start_screen(); |
41 | void login_alert_done(S32 option, void* user_data); | ||
42 | 42 | ||
43 | // constants, variables, & enumerations | 43 | // constants, variables, & enumerations |
44 | extern const char* SCREEN_HOME_FILENAME; | 44 | extern const char* SCREEN_HOME_FILENAME; |
diff --git a/linden/indra/newview/llstatgraph.cpp b/linden/indra/newview/llstatgraph.cpp index bd31077..25ff11c 100644 --- a/linden/indra/newview/llstatgraph.cpp +++ b/linden/indra/newview/llstatgraph.cpp | |||
@@ -95,10 +95,10 @@ void LLStatGraph::draw() | |||
95 | 95 | ||
96 | if (mUpdateTimer.getElapsedTimeF32() > 0.5f) | 96 | if (mUpdateTimer.getElapsedTimeF32() > 0.5f) |
97 | { | 97 | { |
98 | char format_str[256]; /* Flawfinder: ignore */ | 98 | std::string format_str; |
99 | char tmp_str[256]; /* Flawfinder: ignore */ | 99 | std::string tmp_str; |
100 | snprintf(format_str, sizeof(format_str), "%%s%%.%df%%s", mPrecision); /* Flawfinder: ignore */ | 100 | format_str = llformat("%%s%%.%df%%s", mPrecision); |
101 | snprintf(tmp_str, sizeof(tmp_str), format_str, mLabel.c_str(), mValue, mUnits.c_str()); /* Flawfinder: ignore */ | 101 | tmp_str = llformat(format_str.c_str(), mLabel.c_str(), mValue, mUnits.c_str()); |
102 | setToolTip(tmp_str); | 102 | setToolTip(tmp_str); |
103 | 103 | ||
104 | mUpdateTimer.reset(); | 104 | mUpdateTimer.reset(); |
diff --git a/linden/indra/newview/llstatusbar.cpp b/linden/indra/newview/llstatusbar.cpp index 8c50eca..856943d 100644 --- a/linden/indra/newview/llstatusbar.cpp +++ b/linden/indra/newview/llstatusbar.cpp | |||
@@ -78,7 +78,7 @@ | |||
78 | 78 | ||
79 | #include "lltoolmgr.h" | 79 | #include "lltoolmgr.h" |
80 | #include "llfocusmgr.h" | 80 | #include "llfocusmgr.h" |
81 | #include "viewer.h" | 81 | #include "llappviewer.h" |
82 | 82 | ||
83 | //#include "llfirstuse.h" | 83 | //#include "llfirstuse.h" |
84 | 84 | ||
@@ -256,7 +256,7 @@ void LLStatusBar::refresh() | |||
256 | << std::setfill('0') << std::setw(2) << internal_time->tm_mday << " " | 256 | << std::setfill('0') << std::setw(2) << internal_time->tm_mday << " " |
257 | << sMonths[internal_time->tm_mon] << " " | 257 | << sMonths[internal_time->tm_mon] << " " |
258 | << internal_time->tm_year + 1900; | 258 | << internal_time->tm_year + 1900; |
259 | mTextTime->setToolTip(date.str().c_str()); | 259 | mTextTime->setToolTip(date.str()); |
260 | 260 | ||
261 | LLRect r; | 261 | LLRect r; |
262 | const S32 MENU_RIGHT = gMenuBarView->getRightmostMenuEdge(); | 262 | const S32 MENU_RIGHT = gMenuBarView->getRightmostMenuEdge(); |
diff --git a/linden/indra/newview/llsurface.cpp b/linden/indra/newview/llsurface.cpp index e9643eb..e9aa9b0 100644 --- a/linden/indra/newview/llsurface.cpp +++ b/linden/indra/newview/llsurface.cpp | |||
@@ -41,7 +41,7 @@ | |||
41 | #include "llviewerobjectlist.h" | 41 | #include "llviewerobjectlist.h" |
42 | #include "llregionhandle.h" | 42 | #include "llregionhandle.h" |
43 | #include "llagent.h" | 43 | #include "llagent.h" |
44 | #include "viewer.h" | 44 | #include "llappviewer.h" |
45 | #include "llworld.h" | 45 | #include "llworld.h" |
46 | #include "llviewercontrol.h" | 46 | #include "llviewercontrol.h" |
47 | #include "llviewerimage.h" | 47 | #include "llviewerimage.h" |
@@ -67,8 +67,6 @@ S32 LLSurface::sTexelsUpdated = 0; | |||
67 | F32 LLSurface::sTextureUpdateTime = 0.f; | 67 | F32 LLSurface::sTextureUpdateTime = 0.f; |
68 | LLStat LLSurface::sTexelsUpdatedPerSecStat; | 68 | LLStat LLSurface::sTexelsUpdatedPerSecStat; |
69 | 69 | ||
70 | extern void bad_network_handler(); | ||
71 | |||
72 | // ---------------- LLSurface:: Public Members --------------- | 70 | // ---------------- LLSurface:: Public Members --------------- |
73 | 71 | ||
74 | LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) : | 72 | LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) : |
@@ -776,7 +774,7 @@ void LLSurface::decompressDCTPatch(LLBitPack &bitpack, LLGroupHeader *gopp, BOOL | |||
776 | << " quant_wbits " << (S32)ph.quant_wbits | 774 | << " quant_wbits " << (S32)ph.quant_wbits |
777 | << " patchids " << (S32)ph.patchids | 775 | << " patchids " << (S32)ph.patchids |
778 | << llendl; | 776 | << llendl; |
779 | bad_network_handler(); | 777 | LLAppViewer::instance()->badNetworkHandler(); |
780 | return; | 778 | return; |
781 | } | 779 | } |
782 | 780 | ||
diff --git a/linden/indra/newview/lltexlayer.cpp b/linden/indra/newview/lltexlayer.cpp index 097682f..5330e8d 100644 --- a/linden/indra/newview/lltexlayer.cpp +++ b/linden/indra/newview/lltexlayer.cpp | |||
@@ -52,7 +52,6 @@ | |||
52 | #include "llxmltree.h" | 52 | #include "llxmltree.h" |
53 | #include "pipeline.h" | 53 | #include "pipeline.h" |
54 | #include "v4coloru.h" | 54 | #include "v4coloru.h" |
55 | #include "viewer.h" | ||
56 | 55 | ||
57 | //#include "../tools/imdebug/imdebug.h" | 56 | //#include "../tools/imdebug/imdebug.h" |
58 | 57 | ||
diff --git a/linden/indra/newview/lltexturectrl.cpp b/linden/indra/newview/lltexturectrl.cpp index b961053..706587a 100644 --- a/linden/indra/newview/lltexturectrl.cpp +++ b/linden/indra/newview/lltexturectrl.cpp | |||
@@ -1037,19 +1037,21 @@ void LLTextureCtrl::setVisible( BOOL visible ) | |||
1037 | 1037 | ||
1038 | void LLTextureCtrl::setEnabled( BOOL enabled ) | 1038 | void LLTextureCtrl::setEnabled( BOOL enabled ) |
1039 | { | 1039 | { |
1040 | LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)LLFloater::getFloaterByHandle(mFloaterHandle); | ||
1040 | if( enabled ) | 1041 | if( enabled ) |
1041 | { | 1042 | { |
1042 | setToolTip( "Click to choose a picture" ); | 1043 | LLString tooltip; |
1044 | if (floaterp) tooltip = floaterp->getUIString("choose_picture"); | ||
1045 | setToolTip( tooltip ); | ||
1043 | } | 1046 | } |
1044 | else | 1047 | else |
1045 | { | 1048 | { |
1046 | setToolTip( "" ); | 1049 | setToolTip( LLString() ); |
1047 | // *TODO: would be better to keep floater open and show | 1050 | // *TODO: would be better to keep floater open and show |
1048 | // disabled state. | 1051 | // disabled state. |
1049 | closeFloater(); | 1052 | closeFloater(); |
1050 | } | 1053 | } |
1051 | 1054 | ||
1052 | LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)LLFloater::getFloaterByHandle(mFloaterHandle); | ||
1053 | if( floaterp ) | 1055 | if( floaterp ) |
1054 | { | 1056 | { |
1055 | floaterp->setActive(enabled); | 1057 | floaterp->setActive(enabled); |
diff --git a/linden/indra/newview/lltexturefetch.cpp b/linden/indra/newview/lltexturefetch.cpp index 7d5e6ab..9464146 100644 --- a/linden/indra/newview/lltexturefetch.cpp +++ b/linden/indra/newview/lltexturefetch.cpp | |||
@@ -46,7 +46,6 @@ | |||
46 | #include "llviewerimagelist.h" | 46 | #include "llviewerimagelist.h" |
47 | #include "llviewerimage.h" | 47 | #include "llviewerimage.h" |
48 | #include "llviewerregion.h" | 48 | #include "llviewerregion.h" |
49 | #include "viewer.h" | ||
50 | 49 | ||
51 | ////////////////////////////////////////////////////////////////////////////// | 50 | ////////////////////////////////////////////////////////////////////////////// |
52 | 51 | ||
@@ -1295,11 +1294,21 @@ bool LLTextureFetch::createRequest(const LLUUID& id, const LLHost& host, F32 pri | |||
1295 | return false; | 1294 | return false; |
1296 | } | 1295 | } |
1297 | } | 1296 | } |
1298 | // If the requester knows the dimentions of the image, | 1297 | |
1299 | // this will calculate how much data we need without having to parse the header | ||
1300 | S32 desired_size; | 1298 | S32 desired_size; |
1301 | if (w*h*c > 0) | 1299 | if ((discard == 0) && worker && worker->mFileSize) |
1300 | { | ||
1301 | // if we want the entire image, and we know its size, then get it all | ||
1302 | // (calcDataSizeJ2C() below makes assumptions about how the image | ||
1303 | // was compressed - this code ensures that when we request the entire image, | ||
1304 | // we really do get it.) | ||
1305 | desired_size = worker->mFileSize; | ||
1306 | } | ||
1307 | else if (w*h*c > 0) | ||
1302 | { | 1308 | { |
1309 | // If the requester knows the dimentions of the image, | ||
1310 | // this will calculate how much data we need without having to parse the header | ||
1311 | |||
1303 | desired_size = LLImageJ2C::calcDataSizeJ2C(w, h, c, discard); | 1312 | desired_size = LLImageJ2C::calcDataSizeJ2C(w, h, c, discard); |
1304 | } | 1313 | } |
1305 | else | 1314 | else |
diff --git a/linden/indra/newview/lltextureview.cpp b/linden/indra/newview/lltextureview.cpp index 4df5444..06a4ea0 100644 --- a/linden/indra/newview/lltextureview.cpp +++ b/linden/indra/newview/lltextureview.cpp | |||
@@ -49,7 +49,7 @@ | |||
49 | #include "llviewerobject.h" | 49 | #include "llviewerobject.h" |
50 | #include "llviewerimage.h" | 50 | #include "llviewerimage.h" |
51 | #include "llviewerimagelist.h" | 51 | #include "llviewerimagelist.h" |
52 | #include "viewer.h" | 52 | #include "llappviewer.h" |
53 | 53 | ||
54 | extern F32 texmem_lower_bound_scale; | 54 | extern F32 texmem_lower_bound_scale; |
55 | 55 | ||
@@ -145,7 +145,7 @@ void LLTextureBar::draw() | |||
145 | } | 145 | } |
146 | 146 | ||
147 | LLColor4 color; | 147 | LLColor4 color; |
148 | if (mImagep->getID() == gTextureFetch->mDebugID) | 148 | if (mImagep->getID() == LLAppViewer::getTextureFetch()->mDebugID) |
149 | { | 149 | { |
150 | color = LLColor4::cyan2; | 150 | color = LLColor4::cyan2; |
151 | } | 151 | } |
@@ -347,7 +347,7 @@ BOOL LLTextureBar::handleMouseDown(S32 x, S32 y, MASK mask) | |||
347 | { | 347 | { |
348 | if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == MASK_ALT) | 348 | if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == MASK_ALT) |
349 | { | 349 | { |
350 | gTextureFetch->mDebugID = mImagep->getID(); | 350 | LLAppViewer::getTextureFetch()->mDebugID = mImagep->getID(); |
351 | return TRUE; | 351 | return TRUE; |
352 | } | 352 | } |
353 | return LLView::handleMouseDown(x,y,mask); | 353 | return LLView::handleMouseDown(x,y,mask); |
@@ -469,9 +469,9 @@ void LLGLTexMemBar::draw() | |||
469 | 469 | ||
470 | text = llformat("Textures: Count: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d(%d) RAW:%d", | 470 | text = llformat("Textures: Count: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d(%d) RAW:%d", |
471 | gImageList.getNumImages(), | 471 | gImageList.getNumImages(), |
472 | gTextureFetch->getNumRequests(), gTextureFetch->getNumDeletes(), | 472 | LLAppViewer::getTextureFetch()->getNumRequests(), LLAppViewer::getTextureFetch()->getNumDeletes(), |
473 | gTextureFetch->mPacketCount, gTextureFetch->mBadPacketCount, | 473 | LLAppViewer::getTextureFetch()->mPacketCount, LLAppViewer::getTextureFetch()->mBadPacketCount, |
474 | gTextureCache->getNumReads(), gTextureCache->getNumWrites(), | 474 | LLAppViewer::getTextureCache()->getNumReads(), LLAppViewer::getTextureCache()->getNumWrites(), |
475 | LLLFSThread::sLocal->getPending(), | 475 | LLLFSThread::sLocal->getPending(), |
476 | LLImageWorker::sCount, LLImageWorker::getWorkerThread()->getNumDeletes(), | 476 | LLImageWorker::sCount, LLImageWorker::getWorkerThread()->getNumDeletes(), |
477 | LLImageRaw::sRawImageCount); | 477 | LLImageRaw::sRawImageCount); |
@@ -480,7 +480,7 @@ void LLGLTexMemBar::draw() | |||
480 | text_color, LLFontGL::LEFT, LLFontGL::TOP); | 480 | text_color, LLFontGL::LEFT, LLFontGL::TOP); |
481 | 481 | ||
482 | S32 dx1 = 0; | 482 | S32 dx1 = 0; |
483 | if (gTextureFetch->mDebugPause) | 483 | if (LLAppViewer::getTextureFetch()->mDebugPause) |
484 | { | 484 | { |
485 | LLFontGL::sMonospace->renderUTF8("!", 0, title_x1, line_height, | 485 | LLFontGL::sMonospace->renderUTF8("!", 0, title_x1, line_height, |
486 | text_color, LLFontGL::LEFT, LLFontGL::TOP); | 486 | text_color, LLFontGL::LEFT, LLFontGL::TOP); |
@@ -781,7 +781,7 @@ BOOL LLTextureView::handleMouseDown(S32 x, S32 y, MASK mask) | |||
781 | } | 781 | } |
782 | if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == (MASK_CONTROL|MASK_SHIFT)) | 782 | if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == (MASK_CONTROL|MASK_SHIFT)) |
783 | { | 783 | { |
784 | gTextureFetch->mDebugPause = !gTextureFetch->mDebugPause; | 784 | LLAppViewer::getTextureFetch()->mDebugPause = !LLAppViewer::getTextureFetch()->mDebugPause; |
785 | return TRUE; | 785 | return TRUE; |
786 | } | 786 | } |
787 | if (mask & MASK_SHIFT) | 787 | if (mask & MASK_SHIFT) |
diff --git a/linden/indra/newview/lltoolbar.cpp b/linden/indra/newview/lltoolbar.cpp index 71e8aec..e7a5445 100644 --- a/linden/indra/newview/lltoolbar.cpp +++ b/linden/indra/newview/lltoolbar.cpp | |||
@@ -59,7 +59,6 @@ | |||
59 | #include "llviewerparcelmgr.h" | 59 | #include "llviewerparcelmgr.h" |
60 | #include "llvieweruictrlfactory.h" | 60 | #include "llvieweruictrlfactory.h" |
61 | #include "llviewerwindow.h" | 61 | #include "llviewerwindow.h" |
62 | #include "viewer.h" | ||
63 | #include "lltoolgrab.h" | 62 | #include "lltoolgrab.h" |
64 | 63 | ||
65 | #if LL_DARWIN | 64 | #if LL_DARWIN |
diff --git a/linden/indra/newview/lltoolbrush.cpp b/linden/indra/newview/lltoolbrush.cpp index a56bf42..189996e 100644 --- a/linden/indra/newview/lltoolbrush.cpp +++ b/linden/indra/newview/lltoolbrush.cpp | |||
@@ -53,7 +53,7 @@ | |||
53 | #include "llviewerregion.h" | 53 | #include "llviewerregion.h" |
54 | #include "llviewerwindow.h" | 54 | #include "llviewerwindow.h" |
55 | #include "llworld.h" | 55 | #include "llworld.h" |
56 | #include "viewer.h" | 56 | #include "llappviewer.h" |
57 | #include "llparcel.h" | 57 | #include "llparcel.h" |
58 | 58 | ||
59 | #include "llglheaders.h" | 59 | #include "llglheaders.h" |
diff --git a/linden/indra/newview/lltooldraganddrop.cpp b/linden/indra/newview/lltooldraganddrop.cpp index 1f607de..e6eca31 100644 --- a/linden/indra/newview/lltooldraganddrop.cpp +++ b/linden/indra/newview/lltooldraganddrop.cpp | |||
@@ -63,7 +63,6 @@ | |||
63 | #include "llvolume.h" | 63 | #include "llvolume.h" |
64 | #include "llworld.h" | 64 | #include "llworld.h" |
65 | #include "object_flags.h" | 65 | #include "object_flags.h" |
66 | #include "viewer.h" | ||
67 | 66 | ||
68 | LLToolDragAndDrop *gToolDragAndDrop = NULL; | 67 | LLToolDragAndDrop *gToolDragAndDrop = NULL; |
69 | 68 | ||
diff --git a/linden/indra/newview/lltoolfocus.cpp b/linden/indra/newview/lltoolfocus.cpp index 2ac2b33..43c8e1a 100644 --- a/linden/indra/newview/lltoolfocus.cpp +++ b/linden/indra/newview/lltoolfocus.cpp | |||
@@ -55,7 +55,6 @@ | |||
55 | #include "llviewercamera.h" | 55 | #include "llviewercamera.h" |
56 | #include "llviewerobject.h" | 56 | #include "llviewerobject.h" |
57 | #include "llviewerwindow.h" | 57 | #include "llviewerwindow.h" |
58 | #include "viewer.h" | ||
59 | #include "llvoavatar.h" | 58 | #include "llvoavatar.h" |
60 | #include "llmorphview.h" | 59 | #include "llmorphview.h" |
61 | 60 | ||
diff --git a/linden/indra/newview/lltoolgrab.cpp b/linden/indra/newview/lltoolgrab.cpp index 13977ee..3f19ed4 100644 --- a/linden/indra/newview/lltoolgrab.cpp +++ b/linden/indra/newview/lltoolgrab.cpp | |||
@@ -62,7 +62,6 @@ | |||
62 | #include "llviewerwindow.h" | 62 | #include "llviewerwindow.h" |
63 | #include "llvoavatar.h" | 63 | #include "llvoavatar.h" |
64 | #include "llworld.h" | 64 | #include "llworld.h" |
65 | #include "viewer.h" | ||
66 | 65 | ||
67 | const S32 SLOP_DIST_SQ = 4; | 66 | const S32 SLOP_DIST_SQ = 4; |
68 | 67 | ||
diff --git a/linden/indra/newview/lltoolgun.cpp b/linden/indra/newview/lltoolgun.cpp index c7e598e..ebe22fc 100644 --- a/linden/indra/newview/lltoolgun.cpp +++ b/linden/indra/newview/lltoolgun.cpp | |||
@@ -37,7 +37,6 @@ | |||
37 | #include "llagent.h" | 37 | #include "llagent.h" |
38 | #include "llviewercontrol.h" | 38 | #include "llviewercontrol.h" |
39 | #include "llsky.h" | 39 | #include "llsky.h" |
40 | #include "viewer.h" | ||
41 | #include "llresmgr.h" | 40 | #include "llresmgr.h" |
42 | #include "llfontgl.h" | 41 | #include "llfontgl.h" |
43 | #include "llui.h" | 42 | #include "llui.h" |
diff --git a/linden/indra/newview/lltoolmgr.cpp b/linden/indra/newview/lltoolmgr.cpp index ae74eba..0e46ece 100644 --- a/linden/indra/newview/lltoolmgr.cpp +++ b/linden/indra/newview/lltoolmgr.cpp | |||
@@ -428,6 +428,11 @@ void LLToolMgr::onAppFocusGained() | |||
428 | updateToolStatus(); | 428 | updateToolStatus(); |
429 | } | 429 | } |
430 | 430 | ||
431 | void LLToolMgr::clearSavedTool() | ||
432 | { | ||
433 | mSavedTool = NULL; | ||
434 | } | ||
435 | |||
431 | ///////////////////////////////////////////////////// | 436 | ///////////////////////////////////////////////////// |
432 | // LLToolset | 437 | // LLToolset |
433 | 438 | ||
diff --git a/linden/indra/newview/lltoolmgr.h b/linden/indra/newview/lltoolmgr.h index e0f554d..557208b 100644 --- a/linden/indra/newview/lltoolmgr.h +++ b/linden/indra/newview/lltoolmgr.h | |||
@@ -70,6 +70,8 @@ public: | |||
70 | void onAppFocusGained(); | 70 | void onAppFocusGained(); |
71 | void onAppFocusLost(); | 71 | void onAppFocusLost(); |
72 | 72 | ||
73 | void clearSavedTool(); | ||
74 | |||
73 | protected: | 75 | protected: |
74 | friend class LLToolset; // to allow access to setCurrentTool(); | 76 | friend class LLToolset; // to allow access to setCurrentTool(); |
75 | void setCurrentTool(LLTool* tool); | 77 | void setCurrentTool(LLTool* tool); |
diff --git a/linden/indra/newview/lltoolmorph.cpp b/linden/indra/newview/lltoolmorph.cpp index d3cd997..3a56a9f 100644 --- a/linden/indra/newview/lltoolmorph.cpp +++ b/linden/indra/newview/lltoolmorph.cpp | |||
@@ -62,7 +62,6 @@ | |||
62 | #include "llviewerwindow.h" | 62 | #include "llviewerwindow.h" |
63 | #include "llvoavatar.h" | 63 | #include "llvoavatar.h" |
64 | #include "pipeline.h" | 64 | #include "pipeline.h" |
65 | #include "viewer.h" | ||
66 | 65 | ||
67 | //LLToolMorph *gToolMorph = NULL; | 66 | //LLToolMorph *gToolMorph = NULL; |
68 | 67 | ||
diff --git a/linden/indra/newview/lltoolobjpicker.cpp b/linden/indra/newview/lltoolobjpicker.cpp index 8e8abfe..a8876da 100644 --- a/linden/indra/newview/lltoolobjpicker.cpp +++ b/linden/indra/newview/lltoolobjpicker.cpp | |||
@@ -38,7 +38,6 @@ | |||
38 | #include "llagent.h" | 38 | #include "llagent.h" |
39 | #include "llselectmgr.h" | 39 | #include "llselectmgr.h" |
40 | #include "llworld.h" | 40 | #include "llworld.h" |
41 | #include "viewer.h" // for gFPSClamped, pie menus | ||
42 | #include "llviewercontrol.h" | 41 | #include "llviewercontrol.h" |
43 | #include "llmenugl.h" | 42 | #include "llmenugl.h" |
44 | #include "lltoolmgr.h" | 43 | #include "lltoolmgr.h" |
diff --git a/linden/indra/newview/lltoolpie.cpp b/linden/indra/newview/lltoolpie.cpp index 166209d..fa8213d 100644 --- a/linden/indra/newview/lltoolpie.cpp +++ b/linden/indra/newview/lltoolpie.cpp | |||
@@ -85,6 +85,8 @@ LLToolPie::LLToolPie() | |||
85 | 85 | ||
86 | BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask) | 86 | BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask) |
87 | { | 87 | { |
88 | if (!gCamera) return FALSE; | ||
89 | |||
88 | //left mouse down always picks transparent | 90 | //left mouse down always picks transparent |
89 | gViewerWindow->hitObjectOrLandGlobalAsync(x, y, mask, leftMouseCallback, | 91 | gViewerWindow->hitObjectOrLandGlobalAsync(x, y, mask, leftMouseCallback, |
90 | TRUE, TRUE); | 92 | TRUE, TRUE); |
diff --git a/linden/indra/newview/lltoolplacer.cpp b/linden/indra/newview/lltoolplacer.cpp index ee5d08f..d26bdab 100644 --- a/linden/indra/newview/lltoolplacer.cpp +++ b/linden/indra/newview/lltoolplacer.cpp | |||
@@ -50,9 +50,22 @@ | |||
50 | #include "llviewerregion.h" | 50 | #include "llviewerregion.h" |
51 | #include "llviewerwindow.h" | 51 | #include "llviewerwindow.h" |
52 | #include "llworld.h" | 52 | #include "llworld.h" |
53 | #include "viewer.h" | ||
54 | #include "llui.h" | 53 | #include "llui.h" |
55 | 54 | ||
55 | //Headers added for functions moved from viewer.cpp | ||
56 | #include "llvograss.h" | ||
57 | #include "llvotree.h" | ||
58 | #include "llvolumemessage.h" | ||
59 | #include "llhudmanager.h" | ||
60 | #include "llagent.h" | ||
61 | #include "audioengine.h" | ||
62 | #include "llhudeffecttrail.h" | ||
63 | #include "llviewerobjectlist.h" | ||
64 | #include "llviewercamera.h" | ||
65 | #include "llviewerstats.h" | ||
66 | |||
67 | const LLVector3 DEFAULT_OBJECT_SCALE(0.5f, 0.5f, 0.5f); | ||
68 | |||
56 | //static | 69 | //static |
57 | LLPCode LLToolPlacer::sObjectType = LL_PCODE_CUBE; | 70 | LLPCode LLToolPlacer::sObjectType = LL_PCODE_CUBE; |
58 | 71 | ||
@@ -61,9 +74,366 @@ LLToolPlacer::LLToolPlacer() | |||
61 | { | 74 | { |
62 | } | 75 | } |
63 | 76 | ||
77 | BOOL LLToolPlacer::raycastForNewObjPos( S32 x, S32 y, LLViewerObject** hit_obj, S32* hit_face, | ||
78 | BOOL* b_hit_land, LLVector3* ray_start_region, LLVector3* ray_end_region, LLViewerRegion** region ) | ||
79 | { | ||
80 | F32 max_dist_from_camera = gSavedSettings.getF32( "MaxSelectDistance" ) - 1.f; | ||
81 | |||
82 | // Viewer-side pick to find the right sim to create the object on. | ||
83 | // First find the surface the object will be created on. | ||
84 | gViewerWindow->hitObjectOrLandGlobalImmediate(x, y, NULL, FALSE); | ||
85 | |||
86 | // Note: use the frontmost non-flora version because (a) plants usually have lots of alpha and (b) pants' Havok | ||
87 | // representations (if any) are NOT the same as their viewer representation. | ||
88 | *hit_obj = gObjectList.findObject( gLastHitNonFloraObjectID ); | ||
89 | *hit_face = gLastHitNonFloraObjectFace; | ||
90 | *b_hit_land = !(*hit_obj) && !gLastHitNonFloraPosGlobal.isExactlyZero(); | ||
91 | LLVector3d land_pos_global = gLastHitNonFloraPosGlobal; | ||
92 | |||
93 | // Make sure there's a surface to place the new object on. | ||
94 | BOOL bypass_sim_raycast = FALSE; | ||
95 | LLVector3d surface_pos_global; | ||
96 | if (*b_hit_land) | ||
97 | { | ||
98 | surface_pos_global = land_pos_global; | ||
99 | bypass_sim_raycast = TRUE; | ||
100 | } | ||
101 | else | ||
102 | if (*hit_obj) | ||
103 | { | ||
104 | surface_pos_global = (*hit_obj)->getPositionGlobal(); | ||
105 | } | ||
106 | else | ||
107 | { | ||
108 | return FALSE; | ||
109 | } | ||
110 | |||
111 | // Make sure the surface isn't too far away. | ||
112 | LLVector3d ray_start_global = gAgent.getCameraPositionGlobal(); | ||
113 | F32 dist_to_surface_sq = (F32)((surface_pos_global - ray_start_global).magVecSquared()); | ||
114 | if( dist_to_surface_sq > (max_dist_from_camera * max_dist_from_camera) ) | ||
115 | { | ||
116 | return FALSE; | ||
117 | } | ||
118 | |||
119 | // Find the sim where the surface lives. | ||
120 | LLViewerRegion *regionp = gWorldp->getRegionFromPosGlobal(surface_pos_global); | ||
121 | if (!regionp) | ||
122 | { | ||
123 | llwarns << "Trying to add object outside of all known regions!" << llendl; | ||
124 | return FALSE; | ||
125 | } | ||
126 | |||
127 | // Find the simulator-side ray that will be used to place the object accurately | ||
128 | LLVector3d mouse_direction; | ||
129 | mouse_direction.setVec( gViewerWindow->mouseDirectionGlobal( x, y ) ); | ||
130 | |||
131 | *region = regionp; | ||
132 | *ray_start_region = regionp->getPosRegionFromGlobal( ray_start_global ); | ||
133 | F32 near_clip = gCamera->getNear() + 0.01f; // Include an epsilon to avoid rounding issues. | ||
134 | *ray_start_region += gCamera->getAtAxis() * near_clip; | ||
135 | |||
136 | if( bypass_sim_raycast ) | ||
137 | { | ||
138 | // Hack to work around Havok's inability to ray cast onto height fields | ||
139 | *ray_end_region = regionp->getPosRegionFromGlobal( surface_pos_global ); // ray end is the viewer's intersection point | ||
140 | } | ||
141 | else | ||
142 | { | ||
143 | LLVector3d ray_end_global = ray_start_global + (1.f + max_dist_from_camera) * mouse_direction; // add an epsilon to the sim version of the ray to avoid rounding problems. | ||
144 | *ray_end_region = regionp->getPosRegionFromGlobal( ray_end_global ); | ||
145 | } | ||
146 | |||
147 | return TRUE; | ||
148 | } | ||
149 | |||
150 | |||
151 | BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics ) | ||
152 | { | ||
153 | LLVector3 ray_start_region; | ||
154 | LLVector3 ray_end_region; | ||
155 | LLViewerRegion* regionp = NULL; | ||
156 | BOOL b_hit_land = FALSE; | ||
157 | S32 hit_face = -1; | ||
158 | LLViewerObject* hit_obj = NULL; | ||
159 | U8 state = 0; | ||
160 | BOOL success = raycastForNewObjPos( x, y, &hit_obj, &hit_face, &b_hit_land, &ray_start_region, &ray_end_region, ®ionp ); | ||
161 | if( !success ) | ||
162 | { | ||
163 | return FALSE; | ||
164 | } | ||
165 | |||
166 | if( hit_obj && (hit_obj->isAvatar() || hit_obj->isAttachment()) ) | ||
167 | { | ||
168 | // Can't create objects on avatars or attachments | ||
169 | return FALSE; | ||
170 | } | ||
171 | |||
172 | if (NULL == regionp) | ||
173 | { | ||
174 | llwarns << "regionp was NULL; aborting function." << llendl; | ||
175 | return FALSE; | ||
176 | } | ||
177 | |||
178 | if (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX) | ||
179 | { | ||
180 | LLFirstUse::useSandbox(); | ||
181 | } | ||
182 | |||
183 | // Set params for new object based on its PCode. | ||
184 | LLQuaternion rotation; | ||
185 | LLVector3 scale = DEFAULT_OBJECT_SCALE; | ||
186 | U8 material = LL_MCODE_WOOD; | ||
187 | BOOL create_selected = FALSE; | ||
188 | LLVolumeParams volume_params; | ||
189 | |||
190 | switch (pcode) | ||
191 | { | ||
192 | case LL_PCODE_LEGACY_GRASS: | ||
193 | // Randomize size of grass patch | ||
194 | scale.setVec(10.f + ll_frand(20.f), 10.f + ll_frand(20.f), 1.f + ll_frand(2.f)); | ||
195 | state = rand() % LLVOGrass::sMaxGrassSpecies; | ||
196 | break; | ||
197 | |||
198 | |||
199 | case LL_PCODE_LEGACY_TREE: | ||
200 | case LL_PCODE_TREE_NEW: | ||
201 | state = rand() % LLVOTree::sMaxTreeSpecies; | ||
202 | break; | ||
203 | |||
204 | case LL_PCODE_SPHERE: | ||
205 | case LL_PCODE_CONE: | ||
206 | case LL_PCODE_CUBE: | ||
207 | case LL_PCODE_CYLINDER: | ||
208 | case LL_PCODE_TORUS: | ||
209 | case LLViewerObject::LL_VO_SQUARE_TORUS: | ||
210 | case LLViewerObject::LL_VO_TRIANGLE_TORUS: | ||
211 | default: | ||
212 | create_selected = TRUE; | ||
213 | break; | ||
214 | } | ||
215 | |||
216 | // Play creation sound | ||
217 | if (gAudiop) | ||
218 | { | ||
219 | F32 volume = gSavedSettings.getF32("AudioLevelUI"); | ||
220 | gAudiop->triggerSound( LLUUID(gSavedSettings.getString("UISndObjectCreate")), gAgent.getID(), volume); | ||
221 | } | ||
222 | |||
223 | gMessageSystem->newMessageFast(_PREHASH_ObjectAdd); | ||
224 | gMessageSystem->nextBlockFast(_PREHASH_AgentData); | ||
225 | gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); | ||
226 | gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); | ||
227 | gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); | ||
228 | gMessageSystem->nextBlockFast(_PREHASH_ObjectData); | ||
229 | gMessageSystem->addU8Fast(_PREHASH_Material, material); | ||
230 | |||
231 | U32 flags = 0; // not selected | ||
232 | if (use_physics) | ||
233 | { | ||
234 | flags |= FLAGS_USE_PHYSICS; | ||
235 | } | ||
236 | if (create_selected) | ||
237 | { | ||
238 | flags |= FLAGS_CREATE_SELECTED; | ||
239 | } | ||
240 | gMessageSystem->addU32Fast(_PREHASH_AddFlags, flags ); | ||
241 | |||
242 | LLPCode volume_pcode; // ...PCODE_VOLUME, or the original on error | ||
243 | switch (pcode) | ||
244 | { | ||
245 | case LL_PCODE_SPHERE: | ||
246 | rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis); | ||
247 | |||
248 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE ); | ||
249 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
250 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
251 | volume_params.setRatio ( 1, 1 ); | ||
252 | volume_params.setShear ( 0, 0 ); | ||
253 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
254 | volume_pcode = LL_PCODE_VOLUME; | ||
255 | break; | ||
256 | |||
257 | case LL_PCODE_TORUS: | ||
258 | rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis); | ||
259 | |||
260 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_CIRCLE ); | ||
261 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
262 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
263 | volume_params.setRatio ( 1.f, 0.25f ); // "top size" | ||
264 | volume_params.setShear ( 0, 0 ); | ||
265 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
266 | volume_pcode = LL_PCODE_VOLUME; | ||
267 | break; | ||
268 | |||
269 | case LLViewerObject::LL_VO_SQUARE_TORUS: | ||
270 | rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis); | ||
271 | |||
272 | volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_CIRCLE ); | ||
273 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
274 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
275 | volume_params.setRatio ( 1.f, 0.25f ); // "top size" | ||
276 | volume_params.setShear ( 0, 0 ); | ||
277 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
278 | volume_pcode = LL_PCODE_VOLUME; | ||
279 | break; | ||
280 | |||
281 | case LLViewerObject::LL_VO_TRIANGLE_TORUS: | ||
282 | rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis); | ||
283 | |||
284 | volume_params.setType( LL_PCODE_PROFILE_EQUALTRI, LL_PCODE_PATH_CIRCLE ); | ||
285 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
286 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
287 | volume_params.setRatio ( 1.f, 0.25f ); // "top size" | ||
288 | volume_params.setShear ( 0, 0 ); | ||
289 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
290 | volume_pcode = LL_PCODE_VOLUME; | ||
291 | break; | ||
292 | |||
293 | case LL_PCODE_SPHERE_HEMI: | ||
294 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE ); | ||
295 | //volume_params.setBeginAndEndS( 0.5f, 1.f ); | ||
296 | volume_params.setBeginAndEndT( 0.f, 0.5f ); | ||
297 | volume_params.setRatio ( 1, 1 ); | ||
298 | volume_params.setShear ( 0, 0 ); | ||
299 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
300 | volume_pcode = LL_PCODE_VOLUME; | ||
301 | break; | ||
302 | |||
303 | case LL_PCODE_CUBE: | ||
304 | volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE ); | ||
305 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
306 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
307 | volume_params.setRatio ( 1, 1 ); | ||
308 | volume_params.setShear ( 0, 0 ); | ||
309 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
310 | volume_pcode = LL_PCODE_VOLUME; | ||
311 | break; | ||
312 | |||
313 | case LL_PCODE_PRISM: | ||
314 | volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE ); | ||
315 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
316 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
317 | volume_params.setRatio ( 0, 1 ); | ||
318 | volume_params.setShear ( -0.5f, 0 ); | ||
319 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
320 | volume_pcode = LL_PCODE_VOLUME; | ||
321 | break; | ||
322 | |||
323 | case LL_PCODE_PYRAMID: | ||
324 | volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE ); | ||
325 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
326 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
327 | volume_params.setRatio ( 0, 0 ); | ||
328 | volume_params.setShear ( 0, 0 ); | ||
329 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
330 | volume_pcode = LL_PCODE_VOLUME; | ||
331 | break; | ||
332 | |||
333 | case LL_PCODE_TETRAHEDRON: | ||
334 | volume_params.setType( LL_PCODE_PROFILE_EQUALTRI, LL_PCODE_PATH_LINE ); | ||
335 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
336 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
337 | volume_params.setRatio ( 0, 0 ); | ||
338 | volume_params.setShear ( 0, 0 ); | ||
339 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
340 | volume_pcode = LL_PCODE_VOLUME; | ||
341 | break; | ||
342 | |||
343 | case LL_PCODE_CYLINDER: | ||
344 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE ); | ||
345 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
346 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
347 | volume_params.setRatio ( 1, 1 ); | ||
348 | volume_params.setShear ( 0, 0 ); | ||
349 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
350 | volume_pcode = LL_PCODE_VOLUME; | ||
351 | break; | ||
352 | |||
353 | case LL_PCODE_CYLINDER_HEMI: | ||
354 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE ); | ||
355 | volume_params.setBeginAndEndS( 0.25f, 0.75f ); | ||
356 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
357 | volume_params.setRatio ( 1, 1 ); | ||
358 | volume_params.setShear ( 0, 0 ); | ||
359 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
360 | volume_pcode = LL_PCODE_VOLUME; | ||
361 | break; | ||
362 | |||
363 | case LL_PCODE_CONE: | ||
364 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE ); | ||
365 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
366 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
367 | volume_params.setRatio ( 0, 0 ); | ||
368 | volume_params.setShear ( 0, 0 ); | ||
369 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
370 | volume_pcode = LL_PCODE_VOLUME; | ||
371 | break; | ||
372 | |||
373 | case LL_PCODE_CONE_HEMI: | ||
374 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE ); | ||
375 | volume_params.setBeginAndEndS( 0.25f, 0.75f ); | ||
376 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
377 | volume_params.setRatio ( 0, 0 ); | ||
378 | volume_params.setShear ( 0, 0 ); | ||
379 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
380 | volume_pcode = LL_PCODE_VOLUME; | ||
381 | break; | ||
382 | |||
383 | default: | ||
384 | LLVolumeMessage::packVolumeParams(0, gMessageSystem); | ||
385 | volume_pcode = pcode; | ||
386 | break; | ||
387 | } | ||
388 | gMessageSystem->addU8Fast(_PREHASH_PCode, volume_pcode); | ||
389 | |||
390 | gMessageSystem->addVector3Fast(_PREHASH_Scale, scale ); | ||
391 | gMessageSystem->addQuatFast(_PREHASH_Rotation, rotation ); | ||
392 | gMessageSystem->addVector3Fast(_PREHASH_RayStart, ray_start_region ); | ||
393 | gMessageSystem->addVector3Fast(_PREHASH_RayEnd, ray_end_region ); | ||
394 | gMessageSystem->addU8Fast(_PREHASH_BypassRaycast, (U8)b_hit_land ); | ||
395 | gMessageSystem->addU8Fast(_PREHASH_RayEndIsIntersection, (U8)FALSE ); | ||
396 | gMessageSystem->addU8Fast(_PREHASH_State, state); | ||
397 | |||
398 | // Limit raycast to a single object. | ||
399 | // Speeds up server raycast + avoid problems with server ray hitting objects | ||
400 | // that were clipped by the near plane or culled on the viewer. | ||
401 | LLUUID ray_target_id; | ||
402 | if( hit_obj ) | ||
403 | { | ||
404 | ray_target_id = hit_obj->getID(); | ||
405 | } | ||
406 | else | ||
407 | { | ||
408 | ray_target_id.setNull(); | ||
409 | } | ||
410 | gMessageSystem->addUUIDFast(_PREHASH_RayTargetID, ray_target_id ); | ||
411 | |||
412 | // Pack in name value pairs | ||
413 | gMessageSystem->sendReliable(regionp->getHost()); | ||
414 | |||
415 | // Spawns a message, so must be after above send | ||
416 | if (create_selected) | ||
417 | { | ||
418 | gSelectMgr->deselectAll(); | ||
419 | gViewerWindow->getWindow()->incBusyCount(); | ||
420 | } | ||
421 | |||
422 | // VEFFECT: AddObject | ||
423 | LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); | ||
424 | effectp->setSourceObject((LLViewerObject*)gAgent.getAvatarObject()); | ||
425 | effectp->setPositionGlobal(regionp->getPosGlobalFromRegion(ray_end_region)); | ||
426 | effectp->setDuration(LL_HUD_DUR_SHORT); | ||
427 | effectp->setColor(LLColor4U(gAgent.getEffectColor())); | ||
428 | |||
429 | gViewerStats->incStat(LLViewerStats::ST_CREATE_COUNT); | ||
430 | |||
431 | return TRUE; | ||
432 | } | ||
433 | |||
64 | // Used by the placer tool to add copies of the current selection. | 434 | // Used by the placer tool to add copies of the current selection. |
65 | // Inspired by add_object(). JC | 435 | // Inspired by add_object(). JC |
66 | BOOL add_duplicate(S32 x, S32 y) | 436 | BOOL LLToolPlacer::addDuplicate(S32 x, S32 y) |
67 | { | 437 | { |
68 | LLVector3 ray_start_region; | 438 | LLVector3 ray_start_region; |
69 | LLVector3 ray_end_region; | 439 | LLVector3 ray_end_region; |
@@ -71,7 +441,7 @@ BOOL add_duplicate(S32 x, S32 y) | |||
71 | BOOL b_hit_land = FALSE; | 441 | BOOL b_hit_land = FALSE; |
72 | S32 hit_face = -1; | 442 | S32 hit_face = -1; |
73 | LLViewerObject* hit_obj = NULL; | 443 | LLViewerObject* hit_obj = NULL; |
74 | BOOL success = raycast_for_new_obj_pos( x, y, &hit_obj, &hit_face, &b_hit_land, &ray_start_region, &ray_end_region, ®ionp ); | 444 | BOOL success = raycastForNewObjPos( x, y, &hit_obj, &hit_face, &b_hit_land, &ray_start_region, &ray_end_region, ®ionp ); |
75 | if( !success ) | 445 | if( !success ) |
76 | { | 446 | { |
77 | make_ui_sound("UISndInvalidOp"); | 447 | make_ui_sound("UISndInvalidOp"); |
@@ -123,11 +493,11 @@ BOOL LLToolPlacer::placeObject(S32 x, S32 y, MASK mask) | |||
123 | 493 | ||
124 | if (gSavedSettings.getBOOL("CreateToolCopySelection")) | 494 | if (gSavedSettings.getBOOL("CreateToolCopySelection")) |
125 | { | 495 | { |
126 | added = add_duplicate(x, y); | 496 | added = addDuplicate(x, y); |
127 | } | 497 | } |
128 | else | 498 | else |
129 | { | 499 | { |
130 | added = add_object( sObjectType, x, y, NO_PHYSICS ); | 500 | added = addObject( sObjectType, x, y, FALSE ); |
131 | } | 501 | } |
132 | 502 | ||
133 | // ...and go back to the default tool | 503 | // ...and go back to the default tool |
diff --git a/linden/indra/newview/lltoolplacer.h b/linden/indra/newview/lltoolplacer.h index d6d21cb..b016470 100644 --- a/linden/indra/newview/lltoolplacer.h +++ b/linden/indra/newview/lltoolplacer.h | |||
@@ -37,6 +37,7 @@ | |||
37 | #include "lltool.h" | 37 | #include "lltool.h" |
38 | 38 | ||
39 | class LLButton; | 39 | class LLButton; |
40 | class LLViewerRegion; | ||
40 | 41 | ||
41 | //////////////////////////////////////////////////// | 42 | //////////////////////////////////////////////////// |
42 | // LLToolPlacer | 43 | // LLToolPlacer |
@@ -57,6 +58,12 @@ public: | |||
57 | 58 | ||
58 | protected: | 59 | protected: |
59 | static LLPCode sObjectType; | 60 | static LLPCode sObjectType; |
61 | |||
62 | private: | ||
63 | BOOL addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics ); | ||
64 | BOOL raycastForNewObjPos( S32 x, S32 y, LLViewerObject** hit_obj, S32* hit_face, | ||
65 | BOOL* b_hit_land, LLVector3* ray_start_region, LLVector3* ray_end_region, LLViewerRegion** region ); | ||
66 | BOOL addDuplicate(S32 x, S32 y); | ||
60 | }; | 67 | }; |
61 | 68 | ||
62 | //////////////////////////////////////////////////// | 69 | //////////////////////////////////////////////////// |
diff --git a/linden/indra/newview/lltoolselect.cpp b/linden/indra/newview/lltoolselect.cpp index f77202f..37c8b00 100644 --- a/linden/indra/newview/lltoolselect.cpp +++ b/linden/indra/newview/lltoolselect.cpp | |||
@@ -49,7 +49,6 @@ | |||
49 | #include "llviewerwindow.h" | 49 | #include "llviewerwindow.h" |
50 | #include "llvoavatar.h" | 50 | #include "llvoavatar.h" |
51 | #include "llworld.h" | 51 | #include "llworld.h" |
52 | #include "viewer.h" // for gFPSClamped, pie menus | ||
53 | 52 | ||
54 | // Globals | 53 | // Globals |
55 | LLToolSelect *gToolSelect = NULL; | 54 | LLToolSelect *gToolSelect = NULL; |
diff --git a/linden/indra/newview/lltoolselectland.cpp b/linden/indra/newview/lltoolselectland.cpp index dae8288..bbbda58 100644 --- a/linden/indra/newview/lltoolselectland.cpp +++ b/linden/indra/newview/lltoolselectland.cpp | |||
@@ -45,7 +45,6 @@ | |||
45 | #include "lltoolview.h" | 45 | #include "lltoolview.h" |
46 | #include "llviewerparcelmgr.h" | 46 | #include "llviewerparcelmgr.h" |
47 | #include "llviewerwindow.h" | 47 | #include "llviewerwindow.h" |
48 | #include "viewer.h" | ||
49 | 48 | ||
50 | // Globals | 49 | // Globals |
51 | LLToolSelectLand *gToolParcel = NULL; | 50 | LLToolSelectLand *gToolParcel = NULL; |
diff --git a/linden/indra/newview/lltoolselectrect.cpp b/linden/indra/newview/lltoolselectrect.cpp index 505039d..dd1a01f 100644 --- a/linden/indra/newview/lltoolselectrect.cpp +++ b/linden/indra/newview/lltoolselectrect.cpp | |||
@@ -48,7 +48,6 @@ | |||
48 | #include "llviewerobjectlist.h" | 48 | #include "llviewerobjectlist.h" |
49 | #include "llviewerwindow.h" | 49 | #include "llviewerwindow.h" |
50 | #include "llviewercamera.h" | 50 | #include "llviewercamera.h" |
51 | #include "viewer.h" | ||
52 | 51 | ||
53 | #include "llglheaders.h" | 52 | #include "llglheaders.h" |
54 | 53 | ||
diff --git a/linden/indra/newview/lltracker.cpp b/linden/indra/newview/lltracker.cpp index a35d7b5..4bab922 100644 --- a/linden/indra/newview/lltracker.cpp +++ b/linden/indra/newview/lltracker.cpp | |||
@@ -45,7 +45,7 @@ | |||
45 | #include "v4color.h" | 45 | #include "v4color.h" |
46 | 46 | ||
47 | // viewer includes | 47 | // viewer includes |
48 | #include "viewer.h" | 48 | #include "llappviewer.h" |
49 | #include "lltracker.h" | 49 | #include "lltracker.h" |
50 | #include "llagent.h" | 50 | #include "llagent.h" |
51 | #include "llcallingcard.h" | 51 | #include "llcallingcard.h" |
@@ -62,6 +62,7 @@ | |||
62 | #include "llviewerinventory.h" | 62 | #include "llviewerinventory.h" |
63 | #include "llworld.h" | 63 | #include "llworld.h" |
64 | #include "llworldmapview.h" | 64 | #include "llworldmapview.h" |
65 | #include "llviewercontrol.h" | ||
65 | 66 | ||
66 | const F32 DESTINATION_REACHED_RADIUS = 3.0f; | 67 | const F32 DESTINATION_REACHED_RADIUS = 3.0f; |
67 | const F32 DESTINATION_VISITED_RADIUS = 6.0f; | 68 | const F32 DESTINATION_VISITED_RADIUS = 6.0f; |
diff --git a/linden/indra/newview/llurldispatcher.cpp b/linden/indra/newview/llurldispatcher.cpp index ad2ef62..51b9505 100644 --- a/linden/indra/newview/llurldispatcher.cpp +++ b/linden/indra/newview/llurldispatcher.cpp | |||
@@ -48,9 +48,6 @@ | |||
48 | // library includes | 48 | // library includes |
49 | #include "llsd.h" | 49 | #include "llsd.h" |
50 | 50 | ||
51 | // system includes | ||
52 | #include <boost/tokenizer.hpp> | ||
53 | |||
54 | const std::string SLURL_SL_HELP_PREFIX = "secondlife://app."; | 51 | const std::string SLURL_SL_HELP_PREFIX = "secondlife://app."; |
55 | const std::string SLURL_SL_PREFIX = "sl://"; | 52 | const std::string SLURL_SL_PREFIX = "sl://"; |
56 | const std::string SLURL_SECONDLIFE_PREFIX = "secondlife://"; | 53 | const std::string SLURL_SECONDLIFE_PREFIX = "secondlife://"; |
@@ -111,7 +108,7 @@ bool LLURLDispatcherImpl::isSLURL(const std::string& url) | |||
111 | 108 | ||
112 | // static | 109 | // static |
113 | bool LLURLDispatcherImpl::isSLURLCommand(const std::string& url) | 110 | bool LLURLDispatcherImpl::isSLURLCommand(const std::string& url) |
114 | { | 111 | { |
115 | if (matchPrefix(url, SLURL_SL_PREFIX + SLURL_APP_TOKEN) | 112 | if (matchPrefix(url, SLURL_SL_PREFIX + SLURL_APP_TOKEN) |
116 | || matchPrefix(url, SLURL_SECONDLIFE_PREFIX + "/" + SLURL_APP_TOKEN) | 113 | || matchPrefix(url, SLURL_SECONDLIFE_PREFIX + "/" + SLURL_APP_TOKEN) |
117 | || matchPrefix(url, SLURL_SLURL_PREFIX + SLURL_APP_TOKEN) ) | 114 | || matchPrefix(url, SLURL_SLURL_PREFIX + SLURL_APP_TOKEN) ) |
@@ -128,6 +125,14 @@ bool LLURLDispatcherImpl::dispatchCore(const std::string& url, bool right_mouse) | |||
128 | if (dispatchHelp(url, right_mouse)) return true; | 125 | if (dispatchHelp(url, right_mouse)) return true; |
129 | if (dispatchApp(url, right_mouse)) return true; | 126 | if (dispatchApp(url, right_mouse)) return true; |
130 | if (dispatchRegion(url, right_mouse)) return true; | 127 | if (dispatchRegion(url, right_mouse)) return true; |
128 | |||
129 | /* | ||
130 | // Inform the user we can't handle this | ||
131 | std::map<std::string, std::string> args; | ||
132 | args["[SLURL]"] = url; | ||
133 | gViewerWindow->alertXml("BadURL", args); | ||
134 | */ | ||
135 | |||
131 | return false; | 136 | return false; |
132 | } | 137 | } |
133 | 138 | ||
@@ -164,41 +169,14 @@ bool LLURLDispatcherImpl::dispatchApp(const std::string& url, BOOL right_mouse) | |||
164 | { | 169 | { |
165 | return false; | 170 | return false; |
166 | } | 171 | } |
167 | std::string s = stripProtocol(url); | ||
168 | |||
169 | // At this point, "secondlife://app/foo/bar/baz/" should be left | ||
170 | // as: "app/foo/bar/baz/" | ||
171 | typedef boost::tokenizer<boost::char_separator<char> > tokenizer; | ||
172 | boost::char_separator<char> sep("/", "", boost::drop_empty_tokens); | ||
173 | tokenizer tokens(s, sep); | ||
174 | tokenizer::iterator it = tokens.begin(); | ||
175 | tokenizer::iterator end = tokens.end(); | ||
176 | |||
177 | // Build parameter list suitable for LLDispatcher dispatch | ||
178 | if (it == end) return false; | ||
179 | if (*it != "app") return false; | ||
180 | ++it; | ||
181 | |||
182 | if (it == end) return false; | ||
183 | std::string cmd = *it; | ||
184 | ++it; | ||
185 | |||
186 | std::vector<std::string> params; | ||
187 | for ( ; it != end; ++it) | ||
188 | { | ||
189 | params.push_back(*it); | ||
190 | } | ||
191 | 172 | ||
192 | bool handled = LLCommandDispatcher::dispatch(cmd, params); | 173 | LLURI uri(url); |
193 | if (handled) return true; | 174 | LLSD pathArray = uri.pathArray(); |
194 | 175 | pathArray.erase(0); // erase "app" | |
195 | // Inform the user we can't handle this | 176 | std::string cmd = pathArray.get(0); |
196 | std::map<std::string, std::string> args; | 177 | pathArray.erase(0); // erase "cmd" |
197 | args["[SLURL]"] = url; | 178 | bool handled = LLCommandDispatcher::dispatch(cmd, pathArray, uri.queryMap()); |
198 | gViewerWindow->alertXml("BadURL", args); | 179 | return handled; |
199 | // This was a SLURL with a /app prefix, and we "handled" it by displaying an error dialog, | ||
200 | // so return true. It doesn't need to be parsed any further. | ||
201 | return true; | ||
202 | } | 180 | } |
203 | 181 | ||
204 | // static | 182 | // static |
@@ -211,14 +189,14 @@ bool LLURLDispatcherImpl::dispatchRegion(const std::string& url, BOOL right_mous | |||
211 | 189 | ||
212 | // Before we're logged in, need to update the startup screen | 190 | // Before we're logged in, need to update the startup screen |
213 | // to tell the user where they are going. | 191 | // to tell the user where they are going. |
214 | if (LLStartUp::getStartupState() < STATE_CLEANUP) | 192 | if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) |
215 | { | 193 | { |
216 | // Parse it and stash in globals, it will be dispatched in | 194 | // Parse it and stash in globals, it will be dispatched in |
217 | // STATE_CLEANUP. | 195 | // STATE_CLEANUP. |
218 | LLURLSimString::setString(url); | 196 | LLURLSimString::setString(url); |
219 | // We're at the login screen, so make sure user can see | 197 | // We're at the login screen, so make sure user can see |
220 | // the login location box to know where they are going. | 198 | // the login location box to know where they are going. |
221 | LLPanelLogin::refreshLocation( true ); | 199 | LLPanelLogin::loadLoginPage(); |
222 | return true; | 200 | return true; |
223 | } | 201 | } |
224 | 202 | ||
@@ -314,7 +292,7 @@ class LLTeleportHandler : public LLCommandHandler | |||
314 | { | 292 | { |
315 | public: | 293 | public: |
316 | LLTeleportHandler() : LLCommandHandler("teleport") { } | 294 | LLTeleportHandler() : LLCommandHandler("teleport") { } |
317 | bool handle(const std::vector<std::string>& tokens) | 295 | bool handle(const LLSD& tokens, const LLSD& queryMap) |
318 | { | 296 | { |
319 | // construct a "normal" SLURL, resolve the region to | 297 | // construct a "normal" SLURL, resolve the region to |
320 | // a global position, and teleport to it | 298 | // a global position, and teleport to it |
@@ -325,9 +303,9 @@ public: | |||
325 | 303 | ||
326 | // build secondlife://De%20Haro/123/45/67 for use in callback | 304 | // build secondlife://De%20Haro/123/45/67 for use in callback |
327 | std::string url = SLURL_SECONDLIFE_PREFIX; | 305 | std::string url = SLURL_SECONDLIFE_PREFIX; |
328 | for (size_t i = 0; i < tokens.size(); ++i) | 306 | for (int i = 0; i < tokens.size(); ++i) |
329 | { | 307 | { |
330 | url += tokens[i] + "/"; | 308 | url += tokens[i].asString() + "/"; |
331 | } | 309 | } |
332 | gWorldMap->sendNamedRegionRequest(region_name, | 310 | gWorldMap->sendNamedRegionRequest(region_name, |
333 | LLURLDispatcherImpl::regionHandleCallback, | 311 | LLURLDispatcherImpl::regionHandleCallback, |
diff --git a/linden/indra/newview/llurlsimstring.cpp b/linden/indra/newview/llurlsimstring.cpp index efa3c5a..147589c 100644 --- a/linden/indra/newview/llurlsimstring.cpp +++ b/linden/indra/newview/llurlsimstring.cpp | |||
@@ -69,7 +69,6 @@ void LLURLSimString::setString(const LLString& sim_string) | |||
69 | idx = (idx == LLString::npos) ? 0 : idx+2; | 69 | idx = (idx == LLString::npos) ? 0 : idx+2; |
70 | sInstance.mSimString = tstring.substr(idx); | 70 | sInstance.mSimString = tstring.substr(idx); |
71 | } | 71 | } |
72 | LLPanelLogin::refreshLocation( false ); // in case LLPanelLogin is visible | ||
73 | } | 72 | } |
74 | 73 | ||
75 | // "/100" -> 100 | 74 | // "/100" -> 100 |
diff --git a/linden/indra/newview/lluserauth.cpp b/linden/indra/newview/lluserauth.cpp index 0f4c108..4534e88 100644 --- a/linden/indra/newview/lluserauth.cpp +++ b/linden/indra/newview/lluserauth.cpp | |||
@@ -38,7 +38,7 @@ | |||
38 | 38 | ||
39 | #include "lldir.h" | 39 | #include "lldir.h" |
40 | #include "llversionviewer.h" | 40 | #include "llversionviewer.h" |
41 | #include "viewer.h" | 41 | #include "llappviewer.h" |
42 | #include "llviewerbuild.h" | 42 | #include "llviewerbuild.h" |
43 | #include "llviewercontrol.h" | 43 | #include "llviewercontrol.h" |
44 | #include "llxmlrpctransaction.h" | 44 | #include "llxmlrpctransaction.h" |
@@ -82,13 +82,13 @@ LLUserAuth::~LLUserAuth() | |||
82 | mTransaction = NULL; | 82 | mTransaction = NULL; |
83 | } | 83 | } |
84 | 84 | ||
85 | // passwd is already MD5 hashed by the time we get to it. | 85 | |
86 | void LLUserAuth::authenticate( | 86 | void LLUserAuth::authenticate( |
87 | const char* auth_uri, | 87 | const char* auth_uri, |
88 | const char* method, | 88 | const char* method, |
89 | const char* firstname, | 89 | const char* firstname, |
90 | const char* lastname, | 90 | const char* lastname, |
91 | const char* passwd, | 91 | LLUUID web_login_key, |
92 | const char* start, | 92 | const char* start, |
93 | BOOL skip_optional, | 93 | BOOL skip_optional, |
94 | BOOL accept_tos, | 94 | BOOL accept_tos, |
@@ -99,8 +99,6 @@ void LLUserAuth::authenticate( | |||
99 | const std::string& hashed_mac, | 99 | const std::string& hashed_mac, |
100 | const std::string& hashed_volume_serial) | 100 | const std::string& hashed_volume_serial) |
101 | { | 101 | { |
102 | std::string dpasswd("$1$"); | ||
103 | dpasswd.append(passwd); | ||
104 | llinfos << "Authenticating: " << firstname << " " << lastname << ", " | 102 | llinfos << "Authenticating: " << firstname << " " << lastname << ", " |
105 | << /*dpasswd.c_str() <<*/ llendl; | 103 | << /*dpasswd.c_str() <<*/ llendl; |
106 | std::ostringstream option_str; | 104 | std::ostringstream option_str; |
@@ -122,7 +120,7 @@ void LLUserAuth::authenticate( | |||
122 | XMLRPC_VALUE params = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct); | 120 | XMLRPC_VALUE params = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct); |
123 | XMLRPC_VectorAppendString(params, "first", firstname, 0); | 121 | XMLRPC_VectorAppendString(params, "first", firstname, 0); |
124 | XMLRPC_VectorAppendString(params, "last", lastname, 0); | 122 | XMLRPC_VectorAppendString(params, "last", lastname, 0); |
125 | XMLRPC_VectorAppendString(params, "passwd", dpasswd.c_str(), 0); | 123 | XMLRPC_VectorAppendString(params, "web_login_key", web_login_key.getString().c_str(), 0); |
126 | XMLRPC_VectorAppendString(params, "start", start, 0); | 124 | XMLRPC_VectorAppendString(params, "start", start, 0); |
127 | XMLRPC_VectorAppendString(params, "version", gCurrentVersion.c_str(), 0); // Includes channel name | 125 | XMLRPC_VectorAppendString(params, "version", gCurrentVersion.c_str(), 0); // Includes channel name |
128 | XMLRPC_VectorAppendString(params, "channel", gChannelName.c_str(), 0); | 126 | XMLRPC_VectorAppendString(params, "channel", gChannelName.c_str(), 0); |
diff --git a/linden/indra/newview/lluserauth.h b/linden/indra/newview/lluserauth.h index d6ee1da..4169a7e 100644 --- a/linden/indra/newview/lluserauth.h +++ b/linden/indra/newview/lluserauth.h | |||
@@ -35,6 +35,8 @@ | |||
35 | #include <string> | 35 | #include <string> |
36 | #include <vector> | 36 | #include <vector> |
37 | #include <map> | 37 | #include <map> |
38 | typedef struct _xmlrpc_value* XMLRPC_VALUE; | ||
39 | // forward ecl of types from xlrpc.h | ||
38 | 40 | ||
39 | class LLXMLRPCTransaction; | 41 | class LLXMLRPCTransaction; |
40 | 42 | ||
@@ -96,7 +98,7 @@ public: | |||
96 | const char* auth_method, | 98 | const char* auth_method, |
97 | const char* firstname, | 99 | const char* firstname, |
98 | const char* lastname, | 100 | const char* lastname, |
99 | const char* passwd, | 101 | LLUUID web_login_key, |
100 | const char* start, | 102 | const char* start, |
101 | BOOL skip_optional_update, | 103 | BOOL skip_optional_update, |
102 | BOOL accept_tos, | 104 | BOOL accept_tos, |
diff --git a/linden/indra/newview/llvectorperfoptions.cpp b/linden/indra/newview/llvectorperfoptions.cpp new file mode 100644 index 0000000..f8b8dd5 --- /dev/null +++ b/linden/indra/newview/llvectorperfoptions.cpp | |||
@@ -0,0 +1,121 @@ | |||
1 | /** | ||
2 | * @file llvectorperfoptions.cpp | ||
3 | * @brief Control of vector perfomance options. | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2001&license=internal$ | ||
6 | * | ||
7 | * Copyright (c) 2001-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * The following source code is PROPRIETARY AND CONFIDENTIAL. Use of | ||
10 | * this source code is governed by the Linden Lab Source Code Disclosure | ||
11 | * Agreement ("Agreement") previously entered between you and Linden | ||
12 | * Lab. By accessing, using, copying, modifying or distributing this | ||
13 | * software, you acknowledge that you have been informed of your | ||
14 | * obligations under the Agreement and agree to abide by those obligations. | ||
15 | * | ||
16 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
17 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
18 | * COMPLETENESS OR PERFORMANCE. | ||
19 | * $/LicenseInfo$ | ||
20 | */ | ||
21 | |||
22 | #include "llviewerprecompiledheaders.h" | ||
23 | |||
24 | #include "llvectorperfoptions.h" | ||
25 | #include "llviewerjointmesh.h" | ||
26 | #include "llviewercontrol.h" | ||
27 | |||
28 | // Initially, we test the performance of the vectorization code, then | ||
29 | // turn it off if it ends up being slower. JC | ||
30 | BOOL gVectorizePerfTest = TRUE; | ||
31 | BOOL gVectorizeEnable = FALSE; | ||
32 | U32 gVectorizeProcessor = 0; | ||
33 | BOOL gVectorizeSkin = FALSE; | ||
34 | |||
35 | void update_vector_performances(void) | ||
36 | { | ||
37 | char *vp; | ||
38 | |||
39 | switch(gVectorizeProcessor) | ||
40 | { | ||
41 | case 2: vp = "SSE2"; break; // *TODO: replace the magic #s | ||
42 | case 1: vp = "SSE"; break; | ||
43 | default: vp = "COMPILER DEFAULT"; break; | ||
44 | } | ||
45 | llinfos << "Vectorization : " << ( gVectorizeEnable ? "ENABLED" : "DISABLED" ) << llendl ; | ||
46 | llinfos << "Vector Processor : " << vp << llendl ; | ||
47 | llinfos << "Vectorized Skinning : " << ( gVectorizeSkin ? "ENABLED" : "DISABLED" ) << llendl ; | ||
48 | |||
49 | if(gVectorizeEnable && gVectorizeSkin) | ||
50 | { | ||
51 | switch(gVectorizeProcessor) | ||
52 | { | ||
53 | case 2: | ||
54 | LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometrySSE2; | ||
55 | break; | ||
56 | case 1: | ||
57 | LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometrySSE; | ||
58 | break; | ||
59 | default: | ||
60 | LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometryVectorized; | ||
61 | break; | ||
62 | } | ||
63 | } | ||
64 | else | ||
65 | { | ||
66 | LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometryOriginal; | ||
67 | } | ||
68 | } | ||
69 | |||
70 | |||
71 | class LLVectorizationEnableListener: public LLSimpleListener | ||
72 | { | ||
73 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
74 | { | ||
75 | gVectorizeEnable = event->getValue().asBoolean(); | ||
76 | update_vector_performances(); | ||
77 | return true; | ||
78 | } | ||
79 | }; | ||
80 | static LLVectorizationEnableListener vectorization_enable_listener; | ||
81 | |||
82 | class LLVectorizeSkinListener: public LLSimpleListener | ||
83 | { | ||
84 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
85 | { | ||
86 | gVectorizeSkin = event->getValue().asBoolean(); | ||
87 | update_vector_performances(); | ||
88 | return true; | ||
89 | } | ||
90 | }; | ||
91 | static LLVectorizeSkinListener vectorize_skin_listener; | ||
92 | |||
93 | class LLVectorProcessorListener: public LLSimpleListener | ||
94 | { | ||
95 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
96 | { | ||
97 | gVectorizeProcessor = event->getValue().asInteger(); | ||
98 | update_vector_performances(); | ||
99 | return true; | ||
100 | } | ||
101 | }; | ||
102 | static LLVectorProcessorListener vector_processor_listener; | ||
103 | |||
104 | void LLVectorPerformanceOptions::initClass() | ||
105 | { | ||
106 | gVectorizePerfTest = gSavedSettings.getBOOL("VectorizePerfTest"); | ||
107 | gVectorizeEnable = gSavedSettings.getBOOL("VectorizeEnable"); | ||
108 | gVectorizeProcessor = gSavedSettings.getU32("VectorizeProcessor"); | ||
109 | gVectorizeSkin = gSavedSettings.getBOOL("VectorizeSkin"); | ||
110 | update_vector_performances(); | ||
111 | |||
112 | // these are currently static in this file, so they can't move to settings_setup_listeners | ||
113 | gSavedSettings.getControl("VectorizeEnable")->addListener(&vectorization_enable_listener); | ||
114 | gSavedSettings.getControl("VectorizeProcessor")->addListener(&vector_processor_listener); | ||
115 | gSavedSettings.getControl("VectorizeSkin")->addListener(&vectorize_skin_listener); | ||
116 | } | ||
117 | |||
118 | void LLVectorPerformanceOptions::cleanupClass() | ||
119 | { | ||
120 | } | ||
121 | |||
diff --git a/linden/indra/newview/llvectorperfoptions.h b/linden/indra/newview/llvectorperfoptions.h new file mode 100644 index 0000000..2d9135c --- /dev/null +++ b/linden/indra/newview/llvectorperfoptions.h | |||
@@ -0,0 +1,31 @@ | |||
1 | /** | ||
2 | * @file llvectorperfoptions.h | ||
3 | * @brief Control of vector performance options | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2001&license=internal$ | ||
6 | * | ||
7 | * Copyright (c) 2001-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * The following source code is PROPRIETARY AND CONFIDENTIAL. Use of | ||
10 | * this source code is governed by the Linden Lab Source Code Disclosure | ||
11 | * Agreement ("Agreement") previously entered between you and Linden | ||
12 | * Lab. By accessing, using, copying, modifying or distributing this | ||
13 | * software, you acknowledge that you have been informed of your | ||
14 | * obligations under the Agreement and agree to abide by those obligations. | ||
15 | * | ||
16 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
17 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
18 | * COMPLETENESS OR PERFORMANCE. | ||
19 | * $/LicenseInfo$ | ||
20 | */ | ||
21 | |||
22 | #ifndef LL_VECTORPERFOPTIONS_H | ||
23 | #define LL_VECTORPERFOPTIONS_H | ||
24 | |||
25 | namespace LLVectorPerformanceOptions | ||
26 | { | ||
27 | void initClass(); // Run after configuration files are read. | ||
28 | void cleanupClass(); | ||
29 | }; | ||
30 | |||
31 | #endif | ||
diff --git a/linden/indra/newview/llvieweraudio.cpp b/linden/indra/newview/llvieweraudio.cpp new file mode 100644 index 0000000..fc11915 --- /dev/null +++ b/linden/indra/newview/llvieweraudio.cpp | |||
@@ -0,0 +1,228 @@ | |||
1 | /** | ||
2 | * @file llvieweraudio.cpp | ||
3 | * @brief Audio functions moved from viewer.cpp | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2000&license=internal$ | ||
6 | * | ||
7 | * Copyright (c) 2000-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * The following source code is PROPRIETARY AND CONFIDENTIAL. Use of | ||
10 | * this source code is governed by the Linden Lab Source Code Disclosure | ||
11 | * Agreement ("Agreement") previously entered between you and Linden | ||
12 | * Lab. By accessing, using, copying, modifying or distributing this | ||
13 | * software, you acknowledge that you have been informed of your | ||
14 | * obligations under the Agreement and agree to abide by those obligations. | ||
15 | * | ||
16 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
17 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
18 | * COMPLETENESS OR PERFORMANCE. | ||
19 | * $/LicenseInfo$ | ||
20 | */ | ||
21 | |||
22 | #include "llviewerprecompiledheaders.h" | ||
23 | |||
24 | #include "llvieweraudio.h" | ||
25 | #include "audioengine.h" | ||
26 | #include "llviewercontrol.h" | ||
27 | #include "llmediaengine.h" | ||
28 | #include "llagent.h" | ||
29 | #include "llappviewer.h" | ||
30 | #include "llvoiceclient.h" | ||
31 | #include "llviewerwindow.h" | ||
32 | #include "llviewercamera.h" | ||
33 | |||
34 | ///////////////////////////////////////////////////////// | ||
35 | |||
36 | void init_audio() | ||
37 | { | ||
38 | if (!gAudiop) | ||
39 | { | ||
40 | llwarns << "Failed to create an appropriate Audio Engine" << llendl; | ||
41 | return; | ||
42 | } | ||
43 | LLVector3d lpos_global = gAgent.getCameraPositionGlobal(); | ||
44 | LLVector3 lpos_global_f; | ||
45 | |||
46 | lpos_global_f.setVec(lpos_global); | ||
47 | |||
48 | gAudiop->setListener(lpos_global_f, | ||
49 | LLVector3::zero, // gCamera->getVelocity(), // !!! BUG need to replace this with smoothed velocity! | ||
50 | gCamera->getUpAxis(), | ||
51 | gCamera->getAtAxis()); | ||
52 | |||
53 | // load up our initial set of sounds we'll want so they're in memory and ready to be played | ||
54 | |||
55 | BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); | ||
56 | |||
57 | if (!mute_audio && gPreloadSounds) | ||
58 | { | ||
59 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert"))); | ||
60 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke"))); | ||
61 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndChatFromObject"))); | ||
62 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClick"))); | ||
63 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClickRelease"))); | ||
64 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionF"))); | ||
65 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionM"))); | ||
66 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingChat"))); | ||
67 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingIM"))); | ||
68 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvApplyToObject"))); | ||
69 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvalidOp"))); | ||
70 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInventoryCopyToInv"))); | ||
71 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeDown"))); | ||
72 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeUp"))); | ||
73 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCopyToInv"))); | ||
74 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCreate"))); | ||
75 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectDelete"))); | ||
76 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezIn"))); | ||
77 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezOut"))); | ||
78 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuAppear"))); | ||
79 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuHide"))); | ||
80 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight0"))); | ||
81 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight1"))); | ||
82 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight2"))); | ||
83 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight3"))); | ||
84 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight4"))); | ||
85 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight5"))); | ||
86 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight6"))); | ||
87 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight7"))); | ||
88 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndSnapshot"))); | ||
89 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartAutopilot"))); | ||
90 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartFollowpilot"))); | ||
91 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartIM"))); | ||
92 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStopAutopilot"))); | ||
93 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTeleportOut"))); | ||
94 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureApplyToObject"))); | ||
95 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureCopyToInv"))); | ||
96 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTyping"))); | ||
97 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose"))); | ||
98 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen"))); | ||
99 | } | ||
100 | |||
101 | audio_update_volume(true); | ||
102 | } | ||
103 | |||
104 | void audio_update_volume(bool force_update) | ||
105 | { | ||
106 | F32 master_volume = gSavedSettings.getF32("AudioLevelMaster"); | ||
107 | BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); | ||
108 | if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized"))) | ||
109 | { | ||
110 | mute_audio = TRUE; | ||
111 | } | ||
112 | F32 mute_volume = mute_audio ? 0.0f : 1.0f; | ||
113 | |||
114 | // Sound Effects | ||
115 | if (gAudiop) | ||
116 | { | ||
117 | gAudiop->setMasterGain ( master_volume ); | ||
118 | |||
119 | gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler")); | ||
120 | gAudiop->setDistanceFactor(gSavedSettings.getF32("AudioLevelDistance")); | ||
121 | gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff")); | ||
122 | #ifdef kAUDIO_ENABLE_WIND | ||
123 | gAudiop->enableWind(!mute_audio); | ||
124 | #endif | ||
125 | |||
126 | gAudiop->setMuted(mute_audio); | ||
127 | |||
128 | if (force_update) | ||
129 | { | ||
130 | audio_update_wind(true); | ||
131 | } | ||
132 | } | ||
133 | |||
134 | // Streaming Music | ||
135 | if (gAudiop) | ||
136 | { | ||
137 | F32 music_volume = gSavedSettings.getF32("AudioLevelMusic"); | ||
138 | music_volume = mute_volume * master_volume * (music_volume*music_volume); | ||
139 | gAudiop->setInternetStreamGain ( music_volume ); | ||
140 | } | ||
141 | |||
142 | // Streaming Media | ||
143 | if(LLMediaEngine::getInstance()) | ||
144 | { | ||
145 | F32 media_volume = gSavedSettings.getF32("AudioLevelMedia"); | ||
146 | media_volume = mute_volume * master_volume * (media_volume*media_volume); | ||
147 | LLMediaEngine::getInstance()->setVolume(media_volume); | ||
148 | } | ||
149 | |||
150 | // Voice | ||
151 | if (gVoiceClient) | ||
152 | { | ||
153 | F32 voice_volume = gSavedSettings.getF32("AudioLevelVoice"); | ||
154 | voice_volume = mute_volume * master_volume * voice_volume; | ||
155 | gVoiceClient->setVoiceVolume(voice_volume); | ||
156 | gVoiceClient->setMicGain(gSavedSettings.getF32("AudioLevelMic")); | ||
157 | |||
158 | if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized"))) | ||
159 | { | ||
160 | gVoiceClient->setMuteMic(true); | ||
161 | } | ||
162 | else | ||
163 | { | ||
164 | gVoiceClient->setMuteMic(false); | ||
165 | } | ||
166 | } | ||
167 | } | ||
168 | |||
169 | void audio_update_listener() | ||
170 | { | ||
171 | if (gAudiop) | ||
172 | { | ||
173 | // update listener position because agent has moved | ||
174 | LLVector3d lpos_global = gAgent.getCameraPositionGlobal(); | ||
175 | LLVector3 lpos_global_f; | ||
176 | lpos_global_f.setVec(lpos_global); | ||
177 | |||
178 | gAudiop->setListener(lpos_global_f, | ||
179 | // gCameraVelocitySmoothed, | ||
180 | // LLVector3::zero, | ||
181 | gAgent.getVelocity(), // !!! *TODO: need to replace this with smoothed velocity! | ||
182 | gCamera->getUpAxis(), | ||
183 | gCamera->getAtAxis()); | ||
184 | } | ||
185 | } | ||
186 | |||
187 | void audio_update_wind(bool force_update) | ||
188 | { | ||
189 | #ifdef kAUDIO_ENABLE_WIND | ||
190 | // | ||
191 | // Extract height above water to modulate filter by whether above/below water | ||
192 | // | ||
193 | LLViewerRegion* region = gAgent.getRegion(); | ||
194 | if (region) | ||
195 | { | ||
196 | static F32 last_camera_water_height = -1000.f; | ||
197 | LLVector3 camera_pos = gAgent.getCameraPositionAgent(); | ||
198 | F32 camera_water_height = camera_pos.mV[VZ] - region->getWaterHeight(); | ||
199 | |||
200 | // | ||
201 | // Don't update rolloff factor unless water surface has been crossed | ||
202 | // | ||
203 | if (force_update || (last_camera_water_height * camera_water_height) < 0.f) | ||
204 | { | ||
205 | if (camera_water_height < 0.f) | ||
206 | { | ||
207 | gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff") * LL_ROLLOFF_MULTIPLIER_UNDER_WATER); | ||
208 | } | ||
209 | else | ||
210 | { | ||
211 | gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff")); | ||
212 | } | ||
213 | } | ||
214 | // this line rotates the wind vector to be listener (agent) relative | ||
215 | // unfortunately we have to pre-translate to undo the translation that | ||
216 | // occurs in the transform call | ||
217 | gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal(gWindVec - gAgent.getVelocity()); | ||
218 | |||
219 | // don't use the setter setMaxWindGain() because we don't | ||
220 | // want to screw up the fade-in on startup by setting actual source gain | ||
221 | // outside the fade-in. | ||
222 | gAudiop->mMaxWindGain = gSavedSettings.getF32("AudioLevelAmbient"); | ||
223 | |||
224 | last_camera_water_height = camera_water_height; | ||
225 | gAudiop->updateWind(gRelativeWindVec, camera_water_height); | ||
226 | } | ||
227 | #endif | ||
228 | } | ||
diff --git a/linden/indra/newview/llvieweraudio.h b/linden/indra/newview/llvieweraudio.h new file mode 100644 index 0000000..c01da0e --- /dev/null +++ b/linden/indra/newview/llvieweraudio.h | |||
@@ -0,0 +1,30 @@ | |||
1 | /** | ||
2 | * @file llvieweraudio.h | ||
3 | * @brief Audio functions originally in viewer.cpp | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2000&license=internal$ | ||
6 | * | ||
7 | * Copyright (c) 2000-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * The following source code is PROPRIETARY AND CONFIDENTIAL. Use of | ||
10 | * this source code is governed by the Linden Lab Source Code Disclosure | ||
11 | * Agreement ("Agreement") previously entered between you and Linden | ||
12 | * Lab. By accessing, using, copying, modifying or distributing this | ||
13 | * software, you acknowledge that you have been informed of your | ||
14 | * obligations under the Agreement and agree to abide by those obligations. | ||
15 | * | ||
16 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
17 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
18 | * COMPLETENESS OR PERFORMANCE. | ||
19 | * $/LicenseInfo$ | ||
20 | */ | ||
21 | |||
22 | #ifndef LL_VIEWERAUDIO_H | ||
23 | #define LL_VIEWERAUDIO_H | ||
24 | |||
25 | void init_audio(); | ||
26 | void audio_update_volume(bool force_update = true); | ||
27 | void audio_update_listener(); | ||
28 | void audio_update_wind(bool force_update = true); | ||
29 | |||
30 | #endif //LL_VIEWER_H | ||
diff --git a/linden/indra/newview/llviewercamera.h b/linden/indra/newview/llviewercamera.h index a5b7b6f..5a655cb 100644 --- a/linden/indra/newview/llviewercamera.h +++ b/linden/indra/newview/llviewercamera.h | |||
@@ -47,6 +47,9 @@ const F32 OGL_TO_CFR_ROTATION[16] = { 0.f, 0.f, -1.f, 0.f, // -Z becomes X | |||
47 | 0.f, 1.f, 0.f, 0.f, // Y becomes Z | 47 | 0.f, 1.f, 0.f, 0.f, // Y becomes Z |
48 | 0.f, 0.f, 0.f, 1.f }; | 48 | 0.f, 0.f, 0.f, 1.f }; |
49 | 49 | ||
50 | const BOOL FOR_SELECTION = TRUE; | ||
51 | const BOOL NOT_FOR_SELECTION = FALSE; | ||
52 | |||
50 | class LLViewerCamera : public LLCamera | 53 | class LLViewerCamera : public LLCamera |
51 | { | 54 | { |
52 | public: | 55 | public: |
diff --git a/linden/indra/newview/llviewercontrol.cpp b/linden/indra/newview/llviewercontrol.cpp index 79ec70f..250b250 100644 --- a/linden/indra/newview/llviewercontrol.cpp +++ b/linden/indra/newview/llviewercontrol.cpp | |||
@@ -50,6 +50,10 @@ | |||
50 | #include "llspinctrl.h" | 50 | #include "llspinctrl.h" |
51 | #include "llcolorswatch.h" | 51 | #include "llcolorswatch.h" |
52 | 52 | ||
53 | #ifdef TOGGLE_HACKED_GODLIKE_VIEWER | ||
54 | BOOL gHackGodmode = FALSE; | ||
55 | #endif | ||
56 | |||
53 | LLFloaterSettingsDebug* LLFloaterSettingsDebug::sInstance = NULL; | 57 | LLFloaterSettingsDebug* LLFloaterSettingsDebug::sInstance = NULL; |
54 | 58 | ||
55 | LLControlGroup gSavedSettings; // saved at end of session | 59 | LLControlGroup gSavedSettings; // saved at end of session |
diff --git a/linden/indra/newview/llviewercontrol.h b/linden/indra/newview/llviewercontrol.h index 3151261..8a3191d 100644 --- a/linden/indra/newview/llviewercontrol.h +++ b/linden/indra/newview/llviewercontrol.h | |||
@@ -36,6 +36,13 @@ | |||
36 | #include "llfloater.h" | 36 | #include "llfloater.h" |
37 | #include "lltexteditor.h" | 37 | #include "lltexteditor.h" |
38 | 38 | ||
39 | // Enabled this definition to compile a 'hacked' viewer that | ||
40 | // allows a hacked godmode to be toggled on and off. | ||
41 | #define TOGGLE_HACKED_GODLIKE_VIEWER | ||
42 | #ifdef TOGGLE_HACKED_GODLIKE_VIEWER | ||
43 | extern BOOL gHackGodmode; | ||
44 | #endif | ||
45 | |||
39 | class LLFloaterSettingsDebug : public LLFloater | 46 | class LLFloaterSettingsDebug : public LLFloater |
40 | { | 47 | { |
41 | public: | 48 | public: |
diff --git a/linden/indra/newview/llviewerdisplay.cpp b/linden/indra/newview/llviewerdisplay.cpp index 24b8105..6018431 100644 --- a/linden/indra/newview/llviewerdisplay.cpp +++ b/linden/indra/newview/llviewerdisplay.cpp | |||
@@ -62,7 +62,7 @@ | |||
62 | #include "llvograss.h" | 62 | #include "llvograss.h" |
63 | #include "llworld.h" | 63 | #include "llworld.h" |
64 | #include "pipeline.h" | 64 | #include "pipeline.h" |
65 | #include "viewer.h" | 65 | #include "llappviewer.h" |
66 | #include "llstartup.h" | 66 | #include "llstartup.h" |
67 | #include "llfasttimer.h" | 67 | #include "llfasttimer.h" |
68 | #include "llfloatertools.h" | 68 | #include "llfloatertools.h" |
@@ -72,14 +72,11 @@ | |||
72 | #include "llviewerregion.h" | 72 | #include "llviewerregion.h" |
73 | #include "lldrawpoolwater.h" | 73 | #include "lldrawpoolwater.h" |
74 | 74 | ||
75 | extern U32 gFrameCount; | ||
76 | extern LLPointer<LLImageGL> gStartImageGL; | 75 | extern LLPointer<LLImageGL> gStartImageGL; |
77 | extern LLPointer<LLImageGL> gDisconnectedImagep; | ||
78 | extern BOOL gLogoutRequestSent; | ||
79 | extern LLTimer gLogoutTimer; | ||
80 | extern BOOL gHaveSavedSnapshot; | ||
81 | extern BOOL gDisplaySwapBuffers; | 76 | extern BOOL gDisplaySwapBuffers; |
82 | 77 | ||
78 | LLPointer<LLImageGL> gDisconnectedImagep = NULL; | ||
79 | |||
83 | // used to toggle renderer back on after teleport | 80 | // used to toggle renderer back on after teleport |
84 | const F32 TELEPORT_RENDER_DELAY = 20.f; // Max time a teleport is allowed to take before we raise the curtain | 81 | const F32 TELEPORT_RENDER_DELAY = 20.f; // Max time a teleport is allowed to take before we raise the curtain |
85 | const F32 TELEPORT_ARRIVAL_DELAY = 2.f; // Time to preload the world before raising the curtain after we've actually already arrived. | 82 | const F32 TELEPORT_ARRIVAL_DELAY = 2.f; // Time to preload the world before raising the curtain after we've actually already arrived. |
@@ -99,7 +96,7 @@ void render_ui_3d(); | |||
99 | void render_ui_2d(); | 96 | void render_ui_2d(); |
100 | void render_disconnected_background(); | 97 | void render_disconnected_background(); |
101 | 98 | ||
102 | void process_keystrokes_async(); // in viewer.cpp | 99 | void process_keystrokes_async(); |
103 | 100 | ||
104 | void display_startup() | 101 | void display_startup() |
105 | { | 102 | { |
@@ -331,7 +328,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) | |||
331 | break; | 328 | break; |
332 | } | 329 | } |
333 | } | 330 | } |
334 | else if(gLogoutRequestSent) | 331 | else if(LLAppViewer::instance()->logoutRequestSent()) |
335 | { | 332 | { |
336 | F32 percent_done = gLogoutTimer.getElapsedTimeF32() * 100.f / gLogoutMaxTime; | 333 | F32 percent_done = gLogoutTimer.getElapsedTimeF32() * 100.f / gLogoutMaxTime; |
337 | if (percent_done > 100.f) | 334 | if (percent_done > 100.f) |
@@ -339,7 +336,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) | |||
339 | percent_done = 100.f; | 336 | percent_done = 100.f; |
340 | } | 337 | } |
341 | 338 | ||
342 | if( gQuit ) | 339 | if( LLApp::isExiting() ) |
343 | { | 340 | { |
344 | percent_done = 100.f; | 341 | percent_done = 100.f; |
345 | } | 342 | } |
@@ -358,7 +355,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) | |||
358 | else | 355 | else |
359 | { | 356 | { |
360 | 357 | ||
361 | if( gQuit ) | 358 | if( LLApp::isExiting() ) |
362 | { | 359 | { |
363 | percent_done = 100.f; | 360 | percent_done = 100.f; |
364 | } | 361 | } |
@@ -554,7 +551,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) | |||
554 | // glPopMatrix(); | 551 | // glPopMatrix(); |
555 | //} | 552 | //} |
556 | 553 | ||
557 | if (!(gLogoutRequestSent && gHaveSavedSnapshot) | 554 | if (!(LLAppViewer::instance()->logoutRequestSent() && LLAppViewer::instance()->hasSavedFinalSnapshot()) |
558 | && !gRestoreGL | 555 | && !gRestoreGL |
559 | && !gDisconnected) | 556 | && !gDisconnected) |
560 | { | 557 | { |
@@ -745,6 +742,74 @@ void render_ui_and_swap() | |||
745 | } | 742 | } |
746 | } | 743 | } |
747 | 744 | ||
745 | void renderCoordinateAxes() | ||
746 | { | ||
747 | LLGLSNoTexture gls_no_texture; | ||
748 | glBegin(GL_LINES); | ||
749 | glColor3f(1.0f, 0.0f, 0.0f); // i direction = X-Axis = red | ||
750 | glVertex3f(0.0f, 0.0f, 0.0f); | ||
751 | glVertex3f(2.0f, 0.0f, 0.0f); | ||
752 | glVertex3f(3.0f, 0.0f, 0.0f); | ||
753 | glVertex3f(5.0f, 0.0f, 0.0f); | ||
754 | glVertex3f(6.0f, 0.0f, 0.0f); | ||
755 | glVertex3f(8.0f, 0.0f, 0.0f); | ||
756 | // Make an X | ||
757 | glVertex3f(11.0f, 1.0f, 1.0f); | ||
758 | glVertex3f(11.0f, -1.0f, -1.0f); | ||
759 | glVertex3f(11.0f, 1.0f, -1.0f); | ||
760 | glVertex3f(11.0f, -1.0f, 1.0f); | ||
761 | |||
762 | glColor3f(0.0f, 1.0f, 0.0f); // j direction = Y-Axis = green | ||
763 | glVertex3f(0.0f, 0.0f, 0.0f); | ||
764 | glVertex3f(0.0f, 2.0f, 0.0f); | ||
765 | glVertex3f(0.0f, 3.0f, 0.0f); | ||
766 | glVertex3f(0.0f, 5.0f, 0.0f); | ||
767 | glVertex3f(0.0f, 6.0f, 0.0f); | ||
768 | glVertex3f(0.0f, 8.0f, 0.0f); | ||
769 | // Make a Y | ||
770 | glVertex3f(1.0f, 11.0f, 1.0f); | ||
771 | glVertex3f(0.0f, 11.0f, 0.0f); | ||
772 | glVertex3f(-1.0f, 11.0f, 1.0f); | ||
773 | glVertex3f(0.0f, 11.0f, 0.0f); | ||
774 | glVertex3f(0.0f, 11.0f, 0.0f); | ||
775 | glVertex3f(0.0f, 11.0f, -1.0f); | ||
776 | |||
777 | glColor3f(0.0f, 0.0f, 1.0f); // Z-Axis = blue | ||
778 | glVertex3f(0.0f, 0.0f, 0.0f); | ||
779 | glVertex3f(0.0f, 0.0f, 2.0f); | ||
780 | glVertex3f(0.0f, 0.0f, 3.0f); | ||
781 | glVertex3f(0.0f, 0.0f, 5.0f); | ||
782 | glVertex3f(0.0f, 0.0f, 6.0f); | ||
783 | glVertex3f(0.0f, 0.0f, 8.0f); | ||
784 | // Make a Z | ||
785 | glVertex3f(-1.0f, 1.0f, 11.0f); | ||
786 | glVertex3f(1.0f, 1.0f, 11.0f); | ||
787 | glVertex3f(1.0f, 1.0f, 11.0f); | ||
788 | glVertex3f(-1.0f, -1.0f, 11.0f); | ||
789 | glVertex3f(-1.0f, -1.0f, 11.0f); | ||
790 | glVertex3f(1.0f, -1.0f, 11.0f); | ||
791 | glEnd(); | ||
792 | } | ||
793 | |||
794 | |||
795 | void draw_axes() | ||
796 | { | ||
797 | LLGLSUIDefault gls_ui; | ||
798 | LLGLSNoTexture gls_no_texture; | ||
799 | // A vertical white line at origin | ||
800 | LLVector3 v = gAgent.getPositionAgent(); | ||
801 | glBegin(GL_LINES); | ||
802 | glColor3f(1.0f, 1.0f, 1.0f); | ||
803 | glVertex3f(0.0f, 0.0f, 0.0f); | ||
804 | glVertex3f(0.0f, 0.0f, 40.0f); | ||
805 | glEnd(); | ||
806 | // Some coordinate axes | ||
807 | glPushMatrix(); | ||
808 | glTranslatef( v.mV[VX], v.mV[VY], v.mV[VZ] ); | ||
809 | renderCoordinateAxes(); | ||
810 | glPopMatrix(); | ||
811 | } | ||
812 | |||
748 | void render_ui_3d() | 813 | void render_ui_3d() |
749 | { | 814 | { |
750 | LLGLSPipeline gls_pipeline; | 815 | LLGLSPipeline gls_pipeline; |
@@ -841,73 +906,6 @@ void render_ui_2d() | |||
841 | LLFontGL::sCurOrigin.set(0, 0); | 906 | LLFontGL::sCurOrigin.set(0, 0); |
842 | } | 907 | } |
843 | 908 | ||
844 | void renderCoordinateAxes() | ||
845 | { | ||
846 | LLGLSNoTexture gls_no_texture; | ||
847 | glBegin(GL_LINES); | ||
848 | glColor3f(1.0f, 0.0f, 0.0f); // i direction = X-Axis = red | ||
849 | glVertex3f(0.0f, 0.0f, 0.0f); | ||
850 | glVertex3f(2.0f, 0.0f, 0.0f); | ||
851 | glVertex3f(3.0f, 0.0f, 0.0f); | ||
852 | glVertex3f(5.0f, 0.0f, 0.0f); | ||
853 | glVertex3f(6.0f, 0.0f, 0.0f); | ||
854 | glVertex3f(8.0f, 0.0f, 0.0f); | ||
855 | // Make an X | ||
856 | glVertex3f(11.0f, 1.0f, 1.0f); | ||
857 | glVertex3f(11.0f, -1.0f, -1.0f); | ||
858 | glVertex3f(11.0f, 1.0f, -1.0f); | ||
859 | glVertex3f(11.0f, -1.0f, 1.0f); | ||
860 | |||
861 | glColor3f(0.0f, 1.0f, 0.0f); // j direction = Y-Axis = green | ||
862 | glVertex3f(0.0f, 0.0f, 0.0f); | ||
863 | glVertex3f(0.0f, 2.0f, 0.0f); | ||
864 | glVertex3f(0.0f, 3.0f, 0.0f); | ||
865 | glVertex3f(0.0f, 5.0f, 0.0f); | ||
866 | glVertex3f(0.0f, 6.0f, 0.0f); | ||
867 | glVertex3f(0.0f, 8.0f, 0.0f); | ||
868 | // Make a Y | ||
869 | glVertex3f(1.0f, 11.0f, 1.0f); | ||
870 | glVertex3f(0.0f, 11.0f, 0.0f); | ||
871 | glVertex3f(-1.0f, 11.0f, 1.0f); | ||
872 | glVertex3f(0.0f, 11.0f, 0.0f); | ||
873 | glVertex3f(0.0f, 11.0f, 0.0f); | ||
874 | glVertex3f(0.0f, 11.0f, -1.0f); | ||
875 | |||
876 | glColor3f(0.0f, 0.0f, 1.0f); // Z-Axis = blue | ||
877 | glVertex3f(0.0f, 0.0f, 0.0f); | ||
878 | glVertex3f(0.0f, 0.0f, 2.0f); | ||
879 | glVertex3f(0.0f, 0.0f, 3.0f); | ||
880 | glVertex3f(0.0f, 0.0f, 5.0f); | ||
881 | glVertex3f(0.0f, 0.0f, 6.0f); | ||
882 | glVertex3f(0.0f, 0.0f, 8.0f); | ||
883 | // Make a Z | ||
884 | glVertex3f(-1.0f, 1.0f, 11.0f); | ||
885 | glVertex3f(1.0f, 1.0f, 11.0f); | ||
886 | glVertex3f(1.0f, 1.0f, 11.0f); | ||
887 | glVertex3f(-1.0f, -1.0f, 11.0f); | ||
888 | glVertex3f(-1.0f, -1.0f, 11.0f); | ||
889 | glVertex3f(1.0f, -1.0f, 11.0f); | ||
890 | glEnd(); | ||
891 | } | ||
892 | |||
893 | void draw_axes() | ||
894 | { | ||
895 | LLGLSUIDefault gls_ui; | ||
896 | LLGLSNoTexture gls_no_texture; | ||
897 | // A vertical white line at origin | ||
898 | LLVector3 v = gAgent.getPositionAgent(); | ||
899 | glBegin(GL_LINES); | ||
900 | glColor3f(1.0f, 1.0f, 1.0f); | ||
901 | glVertex3f(0.0f, 0.0f, 0.0f); | ||
902 | glVertex3f(0.0f, 0.0f, 40.0f); | ||
903 | glEnd(); | ||
904 | // Some coordinate axes | ||
905 | glPushMatrix(); | ||
906 | glTranslatef( v.mV[VX], v.mV[VY], v.mV[VZ] ); | ||
907 | renderCoordinateAxes(); | ||
908 | glPopMatrix(); | ||
909 | } | ||
910 | |||
911 | 909 | ||
912 | void render_disconnected_background() | 910 | void render_disconnected_background() |
913 | { | 911 | { |
@@ -984,3 +982,48 @@ void render_disconnected_background() | |||
984 | glPopMatrix(); | 982 | glPopMatrix(); |
985 | } | 983 | } |
986 | } | 984 | } |
985 | |||
986 | void display_cleanup() | ||
987 | { | ||
988 | gDisconnectedImagep = NULL; | ||
989 | } | ||
990 | |||
991 | void process_keystrokes_async() | ||
992 | { | ||
993 | #if LL_WINDOWS | ||
994 | MSG msg; | ||
995 | // look through all input messages, leaving them in the event queue | ||
996 | while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE | PM_NOYIELD)) | ||
997 | { | ||
998 | // on first mouse message, break out | ||
999 | if (msg.message >= WM_MOUSEFIRST && | ||
1000 | msg.message <= WM_MOUSELAST || | ||
1001 | msg.message == WM_QUIT) | ||
1002 | { | ||
1003 | break; | ||
1004 | } | ||
1005 | |||
1006 | // this is a message we want to handle now, so remove it from the event queue | ||
1007 | PeekMessage(&msg, NULL, msg.message, msg.message, PM_REMOVE | PM_NOYIELD); | ||
1008 | // if (msg.message == WM_KEYDOWN) | ||
1009 | // { | ||
1010 | // llinfos << "Process async key down " << (U32)msg.wParam << llendl; | ||
1011 | // } | ||
1012 | TranslateMessage(&msg); | ||
1013 | DispatchMessage(&msg); | ||
1014 | } | ||
1015 | |||
1016 | // Scan keyboard for movement keys. Command keys and typing | ||
1017 | // are handled by windows callbacks. Don't do this until we're | ||
1018 | // done initializing. JC | ||
1019 | if (gViewerWindow->mWindow->getVisible() | ||
1020 | && gViewerWindow->getActive() | ||
1021 | && !gViewerWindow->mWindow->getMinimized() | ||
1022 | && LLStartUp::getStartupState() == STATE_STARTED | ||
1023 | && !gViewerWindow->getShowProgress() | ||
1024 | && !gFocusMgr.focusLocked()) | ||
1025 | { | ||
1026 | gKeyboard->scanKeyboard(); | ||
1027 | } | ||
1028 | #endif | ||
1029 | } | ||
diff --git a/linden/indra/newview/llviewerdisplay.h b/linden/indra/newview/llviewerdisplay.h index b42c6e9..2bf784c 100644 --- a/linden/indra/newview/llviewerdisplay.h +++ b/linden/indra/newview/llviewerdisplay.h | |||
@@ -33,8 +33,13 @@ | |||
33 | #define LL_LLVIEWERDISPLAY_H | 33 | #define LL_LLVIEWERDISPLAY_H |
34 | 34 | ||
35 | void display_startup(); | 35 | void display_startup(); |
36 | void display_cleanup(); | ||
36 | 37 | ||
37 | extern BOOL gDisplaySwapBuffers; | 38 | void display(BOOL rebuild = TRUE, F32 zoom_factor = 1.f, int subfield = 0); |
38 | 39 | ||
40 | extern BOOL gDisplaySwapBuffers; | ||
41 | extern BOOL gTeleportDisplay; | ||
42 | extern LLFrameTimer gTeleportDisplayTimer; | ||
43 | extern BOOL gForceRenderLandFence; | ||
39 | 44 | ||
40 | #endif // LL_LLVIEWERDISPLAY_H | 45 | #endif // LL_LLVIEWERDISPLAY_H |
diff --git a/linden/indra/newview/llviewerimage.cpp b/linden/indra/newview/llviewerimage.cpp index 240ffa5..d67bec1 100644 --- a/linden/indra/newview/llviewerimage.cpp +++ b/linden/indra/newview/llviewerimage.cpp | |||
@@ -57,8 +57,7 @@ | |||
57 | #include "llviewerimagelist.h" | 57 | #include "llviewerimagelist.h" |
58 | #include "llviewercontrol.h" | 58 | #include "llviewercontrol.h" |
59 | #include "pipeline.h" | 59 | #include "pipeline.h" |
60 | #include "viewer.h" | 60 | #include "llappviewer.h" |
61 | |||
62 | /////////////////////////////////////////////////////////////////////////////// | 61 | /////////////////////////////////////////////////////////////////////////////// |
63 | 62 | ||
64 | // statics | 63 | // statics |
@@ -294,7 +293,7 @@ LLViewerImage::~LLViewerImage() | |||
294 | { | 293 | { |
295 | if (mHasFetcher) | 294 | if (mHasFetcher) |
296 | { | 295 | { |
297 | gTextureFetch->deleteRequest(getID(), true); | 296 | LLAppViewer::getTextureFetch()->deleteRequest(getID(), true); |
298 | } | 297 | } |
299 | // Explicitly call LLViewerImage::cleanup since we're in a destructor and cleanup is virtual | 298 | // Explicitly call LLViewerImage::cleanup since we're in a destructor and cleanup is virtual |
300 | LLViewerImage::cleanup(); | 299 | LLViewerImage::cleanup(); |
@@ -557,9 +556,9 @@ void LLViewerImage::processTextureStats() | |||
557 | F32 LLViewerImage::calcDecodePriority() | 556 | F32 LLViewerImage::calcDecodePriority() |
558 | { | 557 | { |
559 | #ifndef LL_RELEASE_FOR_DOWNLOAD | 558 | #ifndef LL_RELEASE_FOR_DOWNLOAD |
560 | if (mID == gTextureFetch->mDebugID) | 559 | if (mID == LLAppViewer::getTextureFetch()->mDebugID) |
561 | { | 560 | { |
562 | gTextureFetch->mDebugCount++; // for setting breakpoints | 561 | LLAppViewer::getTextureFetch()->mDebugCount++; // for setting breakpoints |
563 | } | 562 | } |
564 | #endif | 563 | #endif |
565 | 564 | ||
@@ -695,9 +694,9 @@ bool LLViewerImage::updateFetch() | |||
695 | mRequestDeltaTime = 999999.f; | 694 | mRequestDeltaTime = 999999.f; |
696 | 695 | ||
697 | #ifndef LL_RELEASE_FOR_DOWNLOAD | 696 | #ifndef LL_RELEASE_FOR_DOWNLOAD |
698 | if (mID == gTextureFetch->mDebugID) | 697 | if (mID == LLAppViewer::getTextureFetch()->mDebugID) |
699 | { | 698 | { |
700 | gTextureFetch->mDebugCount++; // for setting breakpoints | 699 | LLAppViewer::getTextureFetch()->mDebugCount++; // for setting breakpoints |
701 | } | 700 | } |
702 | #endif | 701 | #endif |
703 | 702 | ||
@@ -735,14 +734,14 @@ bool LLViewerImage::updateFetch() | |||
735 | { | 734 | { |
736 | // Sets mRawDiscardLevel, mRawImage, mAuxRawImage | 735 | // Sets mRawDiscardLevel, mRawImage, mAuxRawImage |
737 | S32 fetch_discard = current_discard; | 736 | S32 fetch_discard = current_discard; |
738 | bool finished = gTextureFetch->getRequestFinished(getID(), fetch_discard, mRawImage, mAuxRawImage); | 737 | bool finished = LLAppViewer::getTextureFetch()->getRequestFinished(getID(), fetch_discard, mRawImage, mAuxRawImage); |
739 | if (finished) | 738 | if (finished) |
740 | { | 739 | { |
741 | mIsFetching = FALSE; | 740 | mIsFetching = FALSE; |
742 | } | 741 | } |
743 | else | 742 | else |
744 | { | 743 | { |
745 | mFetchState = gTextureFetch->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, | 744 | mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, |
746 | mFetchPriority, mFetchDeltaTime, mRequestDeltaTime); | 745 | mFetchPriority, mFetchDeltaTime, mRequestDeltaTime); |
747 | } | 746 | } |
748 | 747 | ||
@@ -803,7 +802,7 @@ bool LLViewerImage::updateFetch() | |||
803 | } | 802 | } |
804 | else if (mDecodePriority >= 0.f) | 803 | else if (mDecodePriority >= 0.f) |
805 | { | 804 | { |
806 | gTextureFetch->updateRequestPriority(mID, mDecodePriority); | 805 | LLAppViewer::getTextureFetch()->updateRequestPriority(mID, mDecodePriority); |
807 | } | 806 | } |
808 | } | 807 | } |
809 | 808 | ||
@@ -859,14 +858,14 @@ bool LLViewerImage::updateFetch() | |||
859 | desired_discard = llmax(desired_discard, current_discard-2); | 858 | desired_discard = llmax(desired_discard, current_discard-2); |
860 | } | 859 | } |
861 | } | 860 | } |
862 | if (gTextureFetch->createRequest(getID(),getTargetHost(), decode_priority, | 861 | if (LLAppViewer::getTextureFetch()->createRequest(getID(),getTargetHost(), decode_priority, |
863 | w, h, c, desired_discard, | 862 | w, h, c, desired_discard, |
864 | needsAux())) | 863 | needsAux())) |
865 | { | 864 | { |
866 | mHasFetcher = TRUE; | 865 | mHasFetcher = TRUE; |
867 | mIsFetching = TRUE; | 866 | mIsFetching = TRUE; |
868 | mRequestedDiscardLevel = desired_discard; | 867 | mRequestedDiscardLevel = desired_discard; |
869 | mFetchState = gTextureFetch->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, | 868 | mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, |
870 | mFetchPriority, mFetchDeltaTime, mRequestDeltaTime); | 869 | mFetchPriority, mFetchDeltaTime, mRequestDeltaTime); |
871 | } | 870 | } |
872 | // if createRequest() failed, we're finishing up a request for this UUID, | 871 | // if createRequest() failed, we're finishing up a request for this UUID, |
@@ -879,7 +878,7 @@ bool LLViewerImage::updateFetch() | |||
879 | if (mLastPacketTimer.getElapsedTimeF32() > FETCH_IDLE_TIME) | 878 | if (mLastPacketTimer.getElapsedTimeF32() > FETCH_IDLE_TIME) |
880 | { | 879 | { |
881 | // llinfos << "Deleting request: " << getID() << " Discard: " << current_discard << " <= min:" << mMinDiscardLevel << " or priority == 0: " << decode_priority << llendl; | 880 | // llinfos << "Deleting request: " << getID() << " Discard: " << current_discard << " <= min:" << mMinDiscardLevel << " or priority == 0: " << decode_priority << llendl; |
882 | gTextureFetch->deleteRequest(getID(), true); | 881 | LLAppViewer::getTextureFetch()->deleteRequest(getID(), true); |
883 | mHasFetcher = FALSE; | 882 | mHasFetcher = FALSE; |
884 | } | 883 | } |
885 | } | 884 | } |
@@ -893,7 +892,7 @@ void LLViewerImage::setIsMissingAsset() | |||
893 | { | 892 | { |
894 | if (mHasFetcher) | 893 | if (mHasFetcher) |
895 | { | 894 | { |
896 | gTextureFetch->deleteRequest(getID(), true); | 895 | LLAppViewer::getTextureFetch()->deleteRequest(getID(), true); |
897 | mHasFetcher = FALSE; | 896 | mHasFetcher = FALSE; |
898 | mIsFetching = FALSE; | 897 | mIsFetching = FALSE; |
899 | mFetchState = 0; | 898 | mFetchState = 0; |
diff --git a/linden/indra/newview/llviewerimagelist.cpp b/linden/indra/newview/llviewerimagelist.cpp index a31ed86..43ac967 100644 --- a/linden/indra/newview/llviewerimagelist.cpp +++ b/linden/indra/newview/llviewerimagelist.cpp | |||
@@ -58,7 +58,7 @@ | |||
58 | #include "llviewerimage.h" | 58 | #include "llviewerimage.h" |
59 | #include "llviewerregion.h" | 59 | #include "llviewerregion.h" |
60 | #include "pipeline.h" | 60 | #include "pipeline.h" |
61 | #include "viewer.h" | 61 | #include "llappviewer.h" |
62 | 62 | ||
63 | //////////////////////////////////////////////////////////////////////////// | 63 | //////////////////////////////////////////////////////////////////////////// |
64 | 64 | ||
@@ -327,7 +327,7 @@ static std::string get_texture_list_name() | |||
327 | 327 | ||
328 | void LLViewerImageList::doPrefetchImages() | 328 | void LLViewerImageList::doPrefetchImages() |
329 | { | 329 | { |
330 | if (gPurgeCache) | 330 | if (LLAppViewer::instance()->getPurgeCache()) |
331 | { | 331 | { |
332 | // cache was purged, no point | 332 | // cache was purged, no point |
333 | return; | 333 | return; |
@@ -1028,9 +1028,9 @@ void LLViewerImageList::decodeAllImages(F32 max_time) | |||
1028 | S32 fetch_pending = 0; | 1028 | S32 fetch_pending = 0; |
1029 | while (1) | 1029 | while (1) |
1030 | { | 1030 | { |
1031 | gTextureCache->update(1); // unpauses the texture cache thread | 1031 | LLAppViewer::instance()->getTextureCache()->update(1); // unpauses the texture cache thread |
1032 | gImageDecodeThread->update(1); // unpauses the image thread | 1032 | LLAppViewer::instance()->getImageDecodeThread()->update(1); // unpauses the image thread |
1033 | fetch_pending = gTextureFetch->update(1); // unpauses the texture fetch thread | 1033 | fetch_pending = LLAppViewer::instance()->getTextureFetch()->update(1); // unpauses the texture fetch thread |
1034 | if (fetch_pending == 0 || timer.getElapsedTimeF32() > max_time) | 1034 | if (fetch_pending == 0 || timer.getElapsedTimeF32() > max_time) |
1035 | { | 1035 | { |
1036 | break; | 1036 | break; |
@@ -1324,7 +1324,7 @@ void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_dat | |||
1324 | return; | 1324 | return; |
1325 | } | 1325 | } |
1326 | image->mLastPacketTimer.reset(); | 1326 | image->mLastPacketTimer.reset(); |
1327 | bool res = gTextureFetch->receiveImageHeader(msg->getSender(), id, codec, packets, totalbytes, data_size, data); | 1327 | bool res = LLAppViewer::getTextureFetch()->receiveImageHeader(msg->getSender(), id, codec, packets, totalbytes, data_size, data); |
1328 | if (!res) | 1328 | if (!res) |
1329 | { | 1329 | { |
1330 | delete[] data; | 1330 | delete[] data; |
@@ -1388,7 +1388,7 @@ void LLViewerImageList::receiveImagePacket(LLMessageSystem *msg, void **user_dat | |||
1388 | return; | 1388 | return; |
1389 | } | 1389 | } |
1390 | image->mLastPacketTimer.reset(); | 1390 | image->mLastPacketTimer.reset(); |
1391 | bool res = gTextureFetch->receiveImagePacket(msg->getSender(), id, packet_num, data_size, data); | 1391 | bool res = LLAppViewer::getTextureFetch()->receiveImagePacket(msg->getSender(), id, packet_num, data_size, data); |
1392 | if (!res) | 1392 | if (!res) |
1393 | { | 1393 | { |
1394 | delete[] data; | 1394 | delete[] data; |
diff --git a/linden/indra/newview/llviewerinventory.cpp b/linden/indra/newview/llviewerinventory.cpp index b436465..43e8589 100644 --- a/linden/indra/newview/llviewerinventory.cpp +++ b/linden/indra/newview/llviewerinventory.cpp | |||
@@ -41,7 +41,6 @@ | |||
41 | #include "llinventorymodel.h" | 41 | #include "llinventorymodel.h" |
42 | #include "llnotify.h" | 42 | #include "llnotify.h" |
43 | #include "llimview.h" | 43 | #include "llimview.h" |
44 | #include "viewer.h" | ||
45 | #include "llgesturemgr.h" | 44 | #include "llgesturemgr.h" |
46 | 45 | ||
47 | #include "llinventoryview.h" | 46 | #include "llinventoryview.h" |
diff --git a/linden/indra/newview/llviewerjoystick.cpp b/linden/indra/newview/llviewerjoystick.cpp index c3c504f..27e71c2 100644 --- a/linden/indra/newview/llviewerjoystick.cpp +++ b/linden/indra/newview/llviewerjoystick.cpp | |||
@@ -34,7 +34,7 @@ | |||
34 | #include "llviewerwindow.h" | 34 | #include "llviewerwindow.h" |
35 | #include "llviewercamera.h" | 35 | #include "llviewercamera.h" |
36 | #include "llviewerjoystick.h" | 36 | #include "llviewerjoystick.h" |
37 | #include "viewer.h" | 37 | #include "llappviewer.h" |
38 | #include "llkeyboard.h" | 38 | #include "llkeyboard.h" |
39 | 39 | ||
40 | static LLQuaternion sFlycamRotation; | 40 | static LLQuaternion sFlycamRotation; |
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp index 8faa72c..a6fb7fa 100644 --- a/linden/indra/newview/llviewermenu.cpp +++ b/linden/indra/newview/llviewermenu.cpp | |||
@@ -191,7 +191,7 @@ | |||
191 | #include "llworldmap.h" | 191 | #include "llworldmap.h" |
192 | #include "object_flags.h" | 192 | #include "object_flags.h" |
193 | #include "pipeline.h" | 193 | #include "pipeline.h" |
194 | #include "viewer.h" | 194 | #include "llappviewer.h" |
195 | #include "roles_constants.h" | 195 | #include "roles_constants.h" |
196 | #include "llviewerjoystick.h" | 196 | #include "llviewerjoystick.h" |
197 | 197 | ||
@@ -218,8 +218,6 @@ LLVOAvatar* find_avatar_from_object( const LLUUID& object_id ); | |||
218 | 218 | ||
219 | void handle_test_load_url(void*); | 219 | void handle_test_load_url(void*); |
220 | 220 | ||
221 | extern void disconnect_viewer(void *); | ||
222 | |||
223 | // | 221 | // |
224 | // Evil hackish imported globals | 222 | // Evil hackish imported globals |
225 | // | 223 | // |
@@ -227,8 +225,6 @@ extern BOOL gRenderLightGlows; | |||
227 | extern BOOL gRenderAvatar; | 225 | extern BOOL gRenderAvatar; |
228 | extern BOOL gHideSelectedObjects; | 226 | extern BOOL gHideSelectedObjects; |
229 | extern BOOL gShowOverlayTitle; | 227 | extern BOOL gShowOverlayTitle; |
230 | extern BOOL gRandomizeFramerate; | ||
231 | extern BOOL gPeriodicSlowFrame; | ||
232 | extern BOOL gOcclusionCull; | 228 | extern BOOL gOcclusionCull; |
233 | extern BOOL gAllowSelectAvatar; | 229 | extern BOOL gAllowSelectAvatar; |
234 | 230 | ||
@@ -239,6 +235,7 @@ extern BOOL gAllowSelectAvatar; | |||
239 | LLMenuBarGL *gMenuBarView = NULL; | 235 | LLMenuBarGL *gMenuBarView = NULL; |
240 | LLViewerMenuHolderGL *gMenuHolder = NULL; | 236 | LLViewerMenuHolderGL *gMenuHolder = NULL; |
241 | LLMenuGL *gPopupMenuView = NULL; | 237 | LLMenuGL *gPopupMenuView = NULL; |
238 | LLMenuBarGL *gLoginMenuBarView = NULL; | ||
242 | 239 | ||
243 | // Pie menus | 240 | // Pie menus |
244 | LLPieMenu *gPieSelf = NULL; | 241 | LLPieMenu *gPieSelf = NULL; |
@@ -408,11 +405,16 @@ void handle_claim_public_land(void*); | |||
408 | void handle_god_request_havok(void *); | 405 | void handle_god_request_havok(void *); |
409 | void handle_god_request_avatar_geometry(void *); // Hack for easy testing of new avatar geometry | 406 | void handle_god_request_avatar_geometry(void *); // Hack for easy testing of new avatar geometry |
410 | void reload_personal_settings_overrides(void *); | 407 | void reload_personal_settings_overrides(void *); |
411 | void force_breakpoint(void *); | ||
412 | void reload_vertex_shader(void *); | 408 | void reload_vertex_shader(void *); |
413 | void slow_mo_animations(void *); | 409 | void slow_mo_animations(void *); |
414 | void handle_disconnect_viewer(void *); | 410 | void handle_disconnect_viewer(void *); |
415 | 411 | ||
412 | void force_error_breakpoint(void *); | ||
413 | void force_error_llerror(void *); | ||
414 | void force_error_bad_memory_access(void *); | ||
415 | void force_error_infinite_loop(void *); | ||
416 | void force_error_software_exception(void *); | ||
417 | |||
416 | void handle_stopall(void*); | 418 | void handle_stopall(void*); |
417 | //void handle_hinge(void*); | 419 | //void handle_hinge(void*); |
418 | //void handle_ptop(void*); | 420 | //void handle_ptop(void*); |
@@ -422,6 +424,7 @@ void handle_stopall(void*); | |||
422 | BOOL enable_dehinge(void*); | 424 | BOOL enable_dehinge(void*); |
423 | void handle_force_delete(void*); | 425 | void handle_force_delete(void*); |
424 | void print_object_info(void*); | 426 | void print_object_info(void*); |
427 | void print_agent_nvpairs(void*); | ||
425 | void show_debug_menus(); | 428 | void show_debug_menus(); |
426 | void toggle_debug_menus(void*); | 429 | void toggle_debug_menus(void*); |
427 | void toggle_map( void* user_data ); | 430 | void toggle_map( void* user_data ); |
@@ -446,7 +449,6 @@ void handle_force_unlock(void*); | |||
446 | void handle_selected_texture_info(void*); | 449 | void handle_selected_texture_info(void*); |
447 | void handle_dump_image_list(void*); | 450 | void handle_dump_image_list(void*); |
448 | 451 | ||
449 | void handle_fullscreen_debug(void*); | ||
450 | void handle_crash(void*); | 452 | void handle_crash(void*); |
451 | void handle_dump_followcam(void*); | 453 | void handle_dump_followcam(void*); |
452 | void handle_toggle_flycam(void*); | 454 | void handle_toggle_flycam(void*); |
@@ -749,6 +751,15 @@ void init_menus() | |||
749 | // Debug menu visiblity | 751 | // Debug menu visiblity |
750 | // | 752 | // |
751 | show_debug_menus(); | 753 | show_debug_menus(); |
754 | |||
755 | gLoginMenuBarView = (LLMenuBarGL*)gUICtrlFactory->buildMenu("menu_login.xml", gMenuHolder); | ||
756 | LLRect menuBarRect = gLoginMenuBarView->getRect(); | ||
757 | gLoginMenuBarView->setRect(LLRect(menuBarRect.mLeft, menuBarRect.mTop, gViewerWindow->getRootView()->getRect().getWidth() - menuBarRect.mLeft, menuBarRect.mBottom)); | ||
758 | |||
759 | gLoginMenuBarView->setBackgroundColor( color ); | ||
760 | |||
761 | gMenuHolder->addChild(gLoginMenuBarView); | ||
762 | |||
752 | } | 763 | } |
753 | 764 | ||
754 | void init_landmark_menu(LLMenuGL* menu) | 765 | void init_landmark_menu(LLMenuGL* menu) |
@@ -1061,16 +1072,18 @@ void init_client_menu(LLMenuGL* menu) | |||
1061 | &menu_check_control, | 1072 | &menu_check_control, |
1062 | (void*)"ShowConsoleWindow")); | 1073 | (void*)"ShowConsoleWindow")); |
1063 | 1074 | ||
1064 | #ifndef LL_RELEASE_FOR_DOWNLOAD | 1075 | if(gQAMode && !gInProductionGrid) |
1065 | { | 1076 | { |
1066 | LLMenuGL* sub = NULL; | 1077 | LLMenuGL* sub = NULL; |
1067 | sub = new LLMenuGL("Debugging"); | 1078 | sub = new LLMenuGL("Debugging"); |
1068 | sub->append(new LLMenuItemCallGL("Force Breakpoint", &force_breakpoint, NULL, NULL, 'B', MASK_CONTROL | MASK_ALT)); | 1079 | sub->append(new LLMenuItemCallGL("Force Breakpoint", &force_error_breakpoint, NULL, NULL, 'B', MASK_CONTROL | MASK_ALT)); |
1069 | sub->append(new LLMenuItemCallGL("LLError And Crash", &handle_crash)); | 1080 | sub->append(new LLMenuItemCallGL("Force LLError And Crash", &force_error_llerror)); |
1081 | sub->append(new LLMenuItemCallGL("Force Bad Memory Access", &force_error_bad_memory_access)); | ||
1082 | sub->append(new LLMenuItemCallGL("Force Infinite Loop", &force_error_infinite_loop)); | ||
1083 | // *NOTE:Mani this isn't handled yet... sub->append(new LLMenuItemCallGL("Force Software Exception", &force_error_unhandled_exception)); | ||
1070 | sub->createJumpKeys(); | 1084 | sub->createJumpKeys(); |
1071 | menu->appendMenu(sub); | 1085 | menu->appendMenu(sub); |
1072 | } | 1086 | } |
1073 | #endif | ||
1074 | 1087 | ||
1075 | // TomY Temporary menu item so we can test this floater | 1088 | // TomY Temporary menu item so we can test this floater |
1076 | menu->append(new LLMenuItemCheckGL("Clothing...", | 1089 | menu->append(new LLMenuItemCheckGL("Clothing...", |
@@ -2372,7 +2385,6 @@ void callback_leave_group(S32 option, void *userdata) | |||
2372 | msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); | 2385 | msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); |
2373 | msg->nextBlockFast(_PREHASH_GroupData); | 2386 | msg->nextBlockFast(_PREHASH_GroupData); |
2374 | msg->addUUIDFast(_PREHASH_GroupID, gAgent.mGroupID ); | 2387 | msg->addUUIDFast(_PREHASH_GroupID, gAgent.mGroupID ); |
2375 | //msg->sendReliable( gUserServer ); | ||
2376 | gAgent.sendReliableMessage(); | 2388 | gAgent.sendReliableMessage(); |
2377 | } | 2389 | } |
2378 | } | 2390 | } |
@@ -4689,6 +4701,24 @@ void print_object_info(void*) | |||
4689 | gSelectMgr->selectionDump(); | 4701 | gSelectMgr->selectionDump(); |
4690 | } | 4702 | } |
4691 | 4703 | ||
4704 | void print_agent_nvpairs(void*) | ||
4705 | { | ||
4706 | LLViewerObject *objectp; | ||
4707 | |||
4708 | llinfos << "Agent Name Value Pairs" << llendl; | ||
4709 | |||
4710 | objectp = gObjectList.findObject(gAgentID); | ||
4711 | if (objectp) | ||
4712 | { | ||
4713 | objectp->printNameValuePairs(); | ||
4714 | } | ||
4715 | else | ||
4716 | { | ||
4717 | llinfos << "Can't find agent object" << llendl; | ||
4718 | } | ||
4719 | |||
4720 | llinfos << "Camera at " << gAgent.getCameraPositionGlobal() << llendl; | ||
4721 | } | ||
4692 | 4722 | ||
4693 | void show_debug_menus() | 4723 | void show_debug_menus() |
4694 | { | 4724 | { |
@@ -5174,18 +5204,6 @@ void handle_force_unlock(void*) | |||
5174 | gSelectMgr->getSelection()->applyToObjects(&func); | 5204 | gSelectMgr->getSelection()->applyToObjects(&func); |
5175 | } | 5205 | } |
5176 | 5206 | ||
5177 | // Fullscreen debug stuff | ||
5178 | void handle_fullscreen_debug(void*) | ||
5179 | { | ||
5180 | llinfos << "Width " << gViewerWindow->getWindowWidth() << " Height " << gViewerWindow->getWindowHeight() << llendl; | ||
5181 | llinfos << "mouse_x_from_center(100) " << mouse_x_from_center(100) << " y " << mouse_y_from_center(100) << llendl; | ||
5182 | } | ||
5183 | |||
5184 | void handle_crash(void*) | ||
5185 | { | ||
5186 | llerrs << "This is an llerror" << llendl; | ||
5187 | } | ||
5188 | |||
5189 | class LLWorldForceSun : public view_listener_t | 5207 | class LLWorldForceSun : public view_listener_t |
5190 | { | 5208 | { |
5191 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | 5209 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) |
@@ -6811,13 +6829,6 @@ void reload_personal_settings_overrides(void *) | |||
6811 | gSavedSettings.loadFromFile(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,"overrides.xml")); | 6829 | gSavedSettings.loadFromFile(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,"overrides.xml")); |
6812 | } | 6830 | } |
6813 | 6831 | ||
6814 | void force_breakpoint(void *) | ||
6815 | { | ||
6816 | #if LL_WINDOWS // Forcing a breakpoint | ||
6817 | DebugBreak(); | ||
6818 | #endif | ||
6819 | } | ||
6820 | |||
6821 | void reload_vertex_shader(void *) | 6832 | void reload_vertex_shader(void *) |
6822 | { | 6833 | { |
6823 | //THIS WOULD BE AN AWESOME PLACE TO RELOAD SHADERS... just a thought - DaveP | 6834 | //THIS WOULD BE AN AWESOME PLACE TO RELOAD SHADERS... just a thought - DaveP |
@@ -6994,9 +7005,33 @@ void handle_disconnect_viewer(void *) | |||
6994 | 7005 | ||
6995 | snprintf(message, sizeof(message), "Testing viewer disconnect"); /* Flawfinder: ignore */ | 7006 | snprintf(message, sizeof(message), "Testing viewer disconnect"); /* Flawfinder: ignore */ |
6996 | 7007 | ||
6997 | do_disconnect(message); | 7008 | LLAppViewer::instance()->forceDisconnect(message); |
6998 | } | 7009 | } |
6999 | 7010 | ||
7011 | void force_error_breakpoint(void *) | ||
7012 | { | ||
7013 | LLAppViewer::instance()->forceErrorBreakpoint(); | ||
7014 | } | ||
7015 | |||
7016 | void force_error_llerror(void *) | ||
7017 | { | ||
7018 | LLAppViewer::instance()->forceErrorLLError(); | ||
7019 | } | ||
7020 | |||
7021 | void force_error_bad_memory_access(void *) | ||
7022 | { | ||
7023 | LLAppViewer::instance()->forceErrorBadMemoryAccess(); | ||
7024 | } | ||
7025 | |||
7026 | void force_error_infinite_loop(void *) | ||
7027 | { | ||
7028 | LLAppViewer::instance()->forceErrorInifiniteLoop(); | ||
7029 | } | ||
7030 | |||
7031 | void force_error_software_exception(void *) | ||
7032 | { | ||
7033 | LLAppViewer::instance()->forceErrorSoftwareException(); | ||
7034 | } | ||
7000 | 7035 | ||
7001 | class LLToolsUseSelectionForGrid : public view_listener_t | 7036 | class LLToolsUseSelectionForGrid : public view_listener_t |
7002 | { | 7037 | { |
diff --git a/linden/indra/newview/llviewermenu.h b/linden/indra/newview/llviewermenu.h index 55fab86..6814c31 100644 --- a/linden/indra/newview/llviewermenu.h +++ b/linden/indra/newview/llviewermenu.h | |||
@@ -141,6 +141,7 @@ extern LLMenuBarGL* gMenuBarView; | |||
141 | //extern LLView* gMenuBarHolder; | 141 | //extern LLView* gMenuBarHolder; |
142 | extern LLMenuGL* gPopupMenuView; | 142 | extern LLMenuGL* gPopupMenuView; |
143 | extern LLViewerMenuHolderGL* gMenuHolder; | 143 | extern LLViewerMenuHolderGL* gMenuHolder; |
144 | extern LLMenuBarGL* gLoginMenuBarView; | ||
144 | 145 | ||
145 | // Pie menus | 146 | // Pie menus |
146 | extern LLPieMenu *gPieSelf; | 147 | extern LLPieMenu *gPieSelf; |
diff --git a/linden/indra/newview/llviewermenufile.cpp b/linden/indra/newview/llviewermenufile.cpp index 97b11fd..13ff55c 100644 --- a/linden/indra/newview/llviewermenufile.cpp +++ b/linden/indra/newview/llviewermenufile.cpp | |||
@@ -52,7 +52,8 @@ | |||
52 | #include "llviewerregion.h" | 52 | #include "llviewerregion.h" |
53 | #include "llviewerstats.h" | 53 | #include "llviewerstats.h" |
54 | #include "llviewerwindow.h" | 54 | #include "llviewerwindow.h" |
55 | #include "viewer.h" // app_request_quit() | 55 | #include "llappviewer.h" |
56 | |||
56 | 57 | ||
57 | // linden libraries | 58 | // linden libraries |
58 | #include "llassetuploadresponders.h" | 59 | #include "llassetuploadresponders.h" |
@@ -347,6 +348,16 @@ class LLFileCloseWindow : public view_listener_t | |||
347 | } | 348 | } |
348 | }; | 349 | }; |
349 | 350 | ||
351 | class LLFileEnableCloseAllWindows : public view_listener_t | ||
352 | { | ||
353 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
354 | { | ||
355 | bool open_children = gFloaterView->allChildrenClosed(); | ||
356 | gMenuHolder->findControl(userdata["control"].asString())->setValue(!open_children); | ||
357 | return true; | ||
358 | } | ||
359 | }; | ||
360 | |||
350 | class LLFileCloseAllWindows : public view_listener_t | 361 | class LLFileCloseAllWindows : public view_listener_t |
351 | { | 362 | { |
352 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | 363 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) |
@@ -439,7 +450,7 @@ class LLFileQuit : public view_listener_t | |||
439 | { | 450 | { |
440 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | 451 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) |
441 | { | 452 | { |
442 | app_user_quit(); | 453 | LLAppViewer::instance()->userQuit(); |
443 | return true; | 454 | return true; |
444 | } | 455 | } |
445 | }; | 456 | }; |
@@ -1035,6 +1046,7 @@ void init_menu_file() | |||
1035 | (new LLFileCloseWindow())->registerListener(gMenuHolder, "File.CloseWindow"); | 1046 | (new LLFileCloseWindow())->registerListener(gMenuHolder, "File.CloseWindow"); |
1036 | (new LLFileCloseAllWindows())->registerListener(gMenuHolder, "File.CloseAllWindows"); | 1047 | (new LLFileCloseAllWindows())->registerListener(gMenuHolder, "File.CloseAllWindows"); |
1037 | (new LLFileEnableCloseWindow())->registerListener(gMenuHolder, "File.EnableCloseWindow"); | 1048 | (new LLFileEnableCloseWindow())->registerListener(gMenuHolder, "File.EnableCloseWindow"); |
1049 | (new LLFileEnableCloseAllWindows())->registerListener(gMenuHolder, "File.EnableCloseAllWindows"); | ||
1038 | (new LLFileSaveTexture())->registerListener(gMenuHolder, "File.SaveTexture"); | 1050 | (new LLFileSaveTexture())->registerListener(gMenuHolder, "File.SaveTexture"); |
1039 | (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot"); | 1051 | (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot"); |
1040 | (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk"); | 1052 | (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk"); |
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp index c337044..2011275 100644 --- a/linden/indra/newview/llviewermessage.cpp +++ b/linden/indra/newview/llviewermessage.cpp | |||
@@ -129,8 +129,9 @@ | |||
129 | #include "llweb.h" | 129 | #include "llweb.h" |
130 | #include "llworld.h" | 130 | #include "llworld.h" |
131 | #include "pipeline.h" | 131 | #include "pipeline.h" |
132 | #include "viewer.h" | 132 | #include "llappviewer.h" |
133 | #include "llfloaterworldmap.h" | 133 | #include "llfloaterworldmap.h" |
134 | #include "llviewerdisplay.h" | ||
134 | #include "llkeythrottle.h" | 135 | #include "llkeythrottle.h" |
135 | 136 | ||
136 | #include <boost/tokenizer.hpp> | 137 | #include <boost/tokenizer.hpp> |
@@ -153,8 +154,6 @@ static const F32 LLREQUEST_PERMISSION_THROTTLE_INTERVAL = 10.0f; // seconds | |||
153 | 154 | ||
154 | extern BOOL gDebugClicks; | 155 | extern BOOL gDebugClicks; |
155 | 156 | ||
156 | extern void bad_network_handler(); | ||
157 | |||
158 | // function prototypes | 157 | // function prototypes |
159 | void open_offer(const std::vector<LLUUID>& items, const std::string& from_name); | 158 | void open_offer(const std::vector<LLUUID>& items, const std::string& from_name); |
160 | void friendship_offer_callback(S32 option, void* user_data); | 159 | void friendship_offer_callback(S32 option, void* user_data); |
@@ -209,8 +208,8 @@ void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_ | |||
209 | LLMessageSystem* msg = gMessageSystem; | 208 | LLMessageSystem* msg = gMessageSystem; |
210 | msg->newMessageFast(_PREHASH_MoneyTransferRequest); | 209 | msg->newMessageFast(_PREHASH_MoneyTransferRequest); |
211 | msg->nextBlockFast(_PREHASH_AgentData); | 210 | msg->nextBlockFast(_PREHASH_AgentData); |
212 | msg->addUUIDFast(_PREHASH_AgentID, agent_get_id()); | 211 | msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); |
213 | msg->addUUIDFast(_PREHASH_SessionID, agent_get_session_id()); | 212 | msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); |
214 | msg->nextBlockFast(_PREHASH_MoneyData); | 213 | msg->nextBlockFast(_PREHASH_MoneyData); |
215 | msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID() ); | 214 | msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID() ); |
216 | msg->addUUIDFast(_PREHASH_DestID, uuid); | 215 | msg->addUUIDFast(_PREHASH_DestID, uuid); |
@@ -248,7 +247,7 @@ void process_logout_reply(LLMessageSystem* msg, void**) | |||
248 | msg->getUUID("AgentData", "AgentID", agent_id); | 247 | msg->getUUID("AgentData", "AgentID", agent_id); |
249 | LLUUID session_id; | 248 | LLUUID session_id; |
250 | msg->getUUID("AgentData", "SessionID", session_id); | 249 | msg->getUUID("AgentData", "SessionID", session_id); |
251 | if((agent_id != agent_get_id()) || (session_id != agent_get_session_id())) | 250 | if((agent_id != gAgent.getID()) || (session_id != gAgent.getSessionID())) |
252 | { | 251 | { |
253 | llwarns << "Bogus Logout Reply" << llendl; | 252 | llwarns << "Bogus Logout Reply" << llendl; |
254 | } | 253 | } |
@@ -285,7 +284,7 @@ void process_logout_reply(LLMessageSystem* msg, void**) | |||
285 | gInventory.accountForUpdate(parents); | 284 | gInventory.accountForUpdate(parents); |
286 | gInventory.notifyObservers(); | 285 | gInventory.notifyObservers(); |
287 | } | 286 | } |
288 | app_force_quit(NULL); | 287 | LLAppViewer::instance()->forceQuit(); |
289 | } | 288 | } |
290 | 289 | ||
291 | void process_layer_data(LLMessageSystem *mesgsys, void **user_data) | 290 | void process_layer_data(LLMessageSystem *mesgsys, void **user_data) |
@@ -789,7 +788,7 @@ bool check_offer_throttle(const std::string& from_name, bool check_only) | |||
789 | // Use the name of the last item giver, who is probably the person | 788 | // Use the name of the last item giver, who is probably the person |
790 | // spamming you. JC | 789 | // spamming you. JC |
791 | std::ostringstream message; | 790 | std::ostringstream message; |
792 | message << gSecondLife; | 791 | message << LLAppViewer::instance()->getSecondLifeTitle(); |
793 | if (!from_name.empty()) | 792 | if (!from_name.empty()) |
794 | { | 793 | { |
795 | message << ": Items coming in too fast from " << from_name; | 794 | message << ": Items coming in too fast from " << from_name; |
@@ -2715,7 +2714,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) | |||
2715 | << x << ":" << y | 2714 | << x << ":" << y |
2716 | << " current pos " << gAgent.getPositionGlobal() | 2715 | << " current pos " << gAgent.getPositionGlobal() |
2717 | << llendl; | 2716 | << llendl; |
2718 | do_disconnect("You were sent to an invalid region."); | 2717 | LLAppViewer::instance()->forceDisconnect("You were sent to an invalid region."); |
2719 | return; | 2718 | return; |
2720 | 2719 | ||
2721 | } | 2720 | } |
@@ -2895,7 +2894,7 @@ void send_agent_update(BOOL force_send, BOOL send_reliable) | |||
2895 | } | 2894 | } |
2896 | 2895 | ||
2897 | // We have already requested to log out. Don't send agent updates. | 2896 | // We have already requested to log out. Don't send agent updates. |
2898 | if(gLogoutRequestSent) | 2897 | if(LLAppViewer::instance()->logoutRequestSent()) |
2899 | { | 2898 | { |
2900 | return; | 2899 | return; |
2901 | } | 2900 | } |
@@ -3242,10 +3241,13 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data) | |||
3242 | F32 phase; | 3241 | F32 phase; |
3243 | U64 space_time_usec; | 3242 | U64 space_time_usec; |
3244 | 3243 | ||
3244 | U32 seconds_per_day; | ||
3245 | U32 seconds_per_year; | ||
3246 | |||
3245 | // "SimulatorViewerTimeMessage" | 3247 | // "SimulatorViewerTimeMessage" |
3246 | mesgsys->getU64Fast(_PREHASH_TimeInfo, _PREHASH_UsecSinceStart, space_time_usec); | 3248 | mesgsys->getU64Fast(_PREHASH_TimeInfo, _PREHASH_UsecSinceStart, space_time_usec); |
3247 | mesgsys->getU32Fast(_PREHASH_TimeInfo, _PREHASH_SecPerDay, gSecondsPerDay); | 3249 | mesgsys->getU32Fast(_PREHASH_TimeInfo, _PREHASH_SecPerDay, seconds_per_day); |
3248 | mesgsys->getU32Fast(_PREHASH_TimeInfo, _PREHASH_SecPerYear, gSecondsPerYear); | 3250 | mesgsys->getU32Fast(_PREHASH_TimeInfo, _PREHASH_SecPerYear, seconds_per_year); |
3249 | 3251 | ||
3250 | // This should eventually be moved to an "UpdateHeavenlyBodies" message | 3252 | // This should eventually be moved to an "UpdateHeavenlyBodies" message |
3251 | mesgsys->getF32Fast(_PREHASH_TimeInfo, _PREHASH_SunPhase, phase); | 3253 | mesgsys->getF32Fast(_PREHASH_TimeInfo, _PREHASH_SunPhase, phase); |
@@ -3930,7 +3932,7 @@ void process_kick_user(LLMessageSystem *msg, void** /*user_data*/) | |||
3930 | 3932 | ||
3931 | msg->getStringFast(_PREHASH_UserInfo, _PREHASH_Reason, 2048, message); | 3933 | msg->getStringFast(_PREHASH_UserInfo, _PREHASH_Reason, 2048, message); |
3932 | 3934 | ||
3933 | do_disconnect(message); | 3935 | LLAppViewer::instance()->forceDisconnect(message); |
3934 | } | 3936 | } |
3935 | 3937 | ||
3936 | 3938 | ||
@@ -4069,18 +4071,18 @@ void process_alert_message(LLMessageSystem *msgsystem, void **user_data) | |||
4069 | process_alert_core(buffer, modal); | 4071 | process_alert_core(buffer, modal); |
4070 | } | 4072 | } |
4071 | 4073 | ||
4072 | void process_alert_core(const char* buffer, BOOL modal) | 4074 | void process_alert_core(const std::string& message, BOOL modal) |
4073 | { | 4075 | { |
4074 | // make sure the cursor is back to the usual default since the | 4076 | // make sure the cursor is back to the usual default since the |
4075 | // alert is probably due to some kind of error. | 4077 | // alert is probably due to some kind of error. |
4076 | gViewerWindow->getWindow()->resetBusyCount(); | 4078 | gViewerWindow->getWindow()->resetBusyCount(); |
4077 | 4079 | ||
4078 | // HACK -- handle callbacks for specific alerts | 4080 | // HACK -- handle callbacks for specific alerts |
4079 | if( !strcmp( buffer, "You died and have been teleported to your home location" ) ) | 4081 | if ( message == "You died and have been teleported to your home location") |
4080 | { | 4082 | { |
4081 | gViewerStats->incStat(LLViewerStats::ST_KILLED_COUNT); | 4083 | gViewerStats->incStat(LLViewerStats::ST_KILLED_COUNT); |
4082 | } | 4084 | } |
4083 | else if( !strcmp( buffer, "Home position set." ) ) | 4085 | else if( message == "Home position set." ) |
4084 | { | 4086 | { |
4085 | // save the home location image to disk | 4087 | // save the home location image to disk |
4086 | LLString snap_filename = gDirUtilp->getLindenUserDir(); | 4088 | LLString snap_filename = gDirUtilp->getLindenUserDir(); |
@@ -4089,19 +4091,26 @@ void process_alert_core(const char* buffer, BOOL modal) | |||
4089 | gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidth(), gViewerWindow->getWindowHeight(), FALSE, FALSE); | 4091 | gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidth(), gViewerWindow->getWindowHeight(), FALSE, FALSE); |
4090 | } | 4092 | } |
4091 | 4093 | ||
4092 | const char ALERT_PREFIX[] = "ALERT: "; | 4094 | const std::string ALERT_PREFIX("ALERT: "); |
4093 | const size_t ALERT_PREFIX_LEN = sizeof(ALERT_PREFIX) - 1; | 4095 | const std::string NOTIFY_PREFIX("NOTIFY: "); |
4094 | if (!strncmp(buffer, ALERT_PREFIX, ALERT_PREFIX_LEN)) | 4096 | if (message.find(ALERT_PREFIX) == 0) |
4095 | { | 4097 | { |
4096 | // Allow the server to spawn a named alert so that server alerts can be | 4098 | // Allow the server to spawn a named alert so that server alerts can be |
4097 | // translated out of English. JC | 4099 | // translated out of English. |
4098 | std::string alert_name(buffer + ALERT_PREFIX_LEN); | 4100 | std::string alert_name(message.substr(ALERT_PREFIX.length())); |
4099 | LLAlertDialog::showXml(alert_name); | 4101 | LLAlertDialog::showXml(alert_name); |
4100 | } | 4102 | } |
4101 | else if (buffer[0] == '/') | 4103 | else if (message.find(NOTIFY_PREFIX) == 0) |
4104 | { | ||
4105 | // Allow the server to spawn a named notification so that server notifications can be | ||
4106 | // translated out of English. | ||
4107 | std::string notify_name(message.substr(NOTIFY_PREFIX.length())); | ||
4108 | LLNotifyBox::showXml(notify_name); | ||
4109 | } | ||
4110 | else if (message[0] == '/') | ||
4102 | { | 4111 | { |
4103 | // System message is important, show in upper-right box not tip | 4112 | // System message is important, show in upper-right box not tip |
4104 | LLString text(buffer+1); | 4113 | LLString text(message.substr(1)); |
4105 | LLString::format_map_t args; | 4114 | LLString::format_map_t args; |
4106 | if (text.substr(0,17) == "RESTART_X_MINUTES") | 4115 | if (text.substr(0,17) == "RESTART_X_MINUTES") |
4107 | { | 4116 | { |
@@ -4128,14 +4137,14 @@ void process_alert_core(const char* buffer, BOOL modal) | |||
4128 | { | 4137 | { |
4129 | // *TODO:translate | 4138 | // *TODO:translate |
4130 | LLString::format_map_t args; | 4139 | LLString::format_map_t args; |
4131 | args["[ERROR_MESSAGE]"] = buffer; | 4140 | args["[ERROR_MESSAGE]"] = message; |
4132 | gViewerWindow->alertXml("ErrorMessage", args); | 4141 | gViewerWindow->alertXml("ErrorMessage", args); |
4133 | } | 4142 | } |
4134 | else | 4143 | else |
4135 | { | 4144 | { |
4136 | // *TODO:translate | 4145 | // *TODO:translate |
4137 | LLString::format_map_t args; | 4146 | LLString::format_map_t args; |
4138 | args["[MESSAGE]"] = buffer; | 4147 | args["[MESSAGE]"] = message; |
4139 | LLNotifyBox::showXml("SystemMessageTip", args); | 4148 | LLNotifyBox::showXml("SystemMessageTip", args); |
4140 | } | 4149 | } |
4141 | } | 4150 | } |
@@ -5365,7 +5374,7 @@ void invalid_message_callback(LLMessageSystem* msg, | |||
5365 | void*, | 5374 | void*, |
5366 | EMessageException exception) | 5375 | EMessageException exception) |
5367 | { | 5376 | { |
5368 | bad_network_handler(); | 5377 | LLAppViewer::instance()->badNetworkHandler(); |
5369 | } | 5378 | } |
5370 | 5379 | ||
5371 | // Please do not add more message handlers here. This file is huge. | 5380 | // Please do not add more message handlers here. This file is huge. |
diff --git a/linden/indra/newview/llviewermessage.h b/linden/indra/newview/llviewermessage.h index 2cbd163..2c5005c 100644 --- a/linden/indra/newview/llviewermessage.h +++ b/linden/indra/newview/llviewermessage.h | |||
@@ -110,7 +110,7 @@ void process_adjust_balance(LLMessageSystem* msg_system, void**); | |||
110 | 110 | ||
111 | void process_alert_message(LLMessageSystem* msg, void**); | 111 | void process_alert_message(LLMessageSystem* msg, void**); |
112 | void process_agent_alert_message(LLMessageSystem* msgsystem, void** user_data); | 112 | void process_agent_alert_message(LLMessageSystem* msgsystem, void** user_data); |
113 | void process_alert_core(const char* buffer, BOOL modal); | 113 | void process_alert_core(const std::string& message, BOOL modal); |
114 | 114 | ||
115 | // "Mean" or player-vs-player abuse | 115 | // "Mean" or player-vs-player abuse |
116 | void handle_show_mean_events(void *); | 116 | void handle_show_mean_events(void *); |
diff --git a/linden/indra/newview/llviewernetwork.cpp b/linden/indra/newview/llviewernetwork.cpp index 046f1f6..caa61d6 100644 --- a/linden/indra/newview/llviewernetwork.cpp +++ b/linden/indra/newview/llviewernetwork.cpp | |||
@@ -34,47 +34,47 @@ | |||
34 | 34 | ||
35 | #include "llviewernetwork.h" | 35 | #include "llviewernetwork.h" |
36 | 36 | ||
37 | LLUserServerData gUserServerDomainName[USERSERVER_COUNT] = | 37 | LLGridData gGridInfo[GRID_INFO_COUNT] = |
38 | { | 38 | { |
39 | { "None", "", "", ""}, | 39 | { "None", "", "", ""}, |
40 | { "Aditi", | 40 | { "Aditi", |
41 | "userserver.aditi.lindenlab.com", | 41 | "util.aditi.lindenlab.com", |
42 | "https://login.aditi.lindenlab.com/cgi-bin/login.cgi", | 42 | "https://login.aditi.lindenlab.com/cgi-bin/login.cgi", |
43 | "http://aditi-secondlife.webdev.lindenlab.com/helpers/" }, | 43 | "http://aditi-secondlife.webdev.lindenlab.com/helpers/" }, |
44 | { "Agni", | 44 | { "Agni", |
45 | "userserver.agni.lindenlab.com", | 45 | "util.agni.lindenlab.com", |
46 | "https://login.agni.lindenlab.com/cgi-bin/login.cgi", | 46 | "https://login.agni.lindenlab.com/cgi-bin/login.cgi", |
47 | "https://secondlife.com/helpers/" }, | 47 | "https://secondlife.com/helpers/" }, |
48 | { "DMZ", | 48 | { "DMZ", |
49 | "userserver.dmz.lindenlab.com", | 49 | "util.dmz.lindenlab.com", |
50 | "https://login.dmz.lindenlab.com/cgi-bin/login.cgi", | 50 | "https://login.dmz.lindenlab.com/cgi-bin/login.cgi", |
51 | "http://dmz-secondlife.webdev.lindenlab.com/helpers/" }, | 51 | "http://dmz-secondlife.webdev.lindenlab.com/helpers/" }, |
52 | { "Siva", | 52 | { "Siva", |
53 | "userserver.siva.lindenlab.com", | 53 | "util.siva.lindenlab.com", |
54 | "https://login.siva.lindenlab.com/cgi-bin/login.cgi", | 54 | "https://login.siva.lindenlab.com/cgi-bin/login.cgi", |
55 | "http://siva-secondlife.webdev.lindenlab.com/helpers/" }, | 55 | "http://siva-secondlife.webdev.lindenlab.com/helpers/" }, |
56 | { "Durga", | 56 | { "Durga", |
57 | "userserver.durga.lindenlab.com", | 57 | "util.durga.lindenlab.com", |
58 | "https://login.durga.lindenlab.com/cgi-bin/login.cgi", | 58 | "https://login.durga.lindenlab.com/cgi-bin/login.cgi", |
59 | "http://durga-secondlife.webdev.lindenlab.com/helpers/" }, | 59 | "http://durga-secondlife.webdev.lindenlab.com/helpers/" }, |
60 | { "Shakti", | 60 | { "Shakti", |
61 | "userserver.shakti.lindenlab.com", | 61 | "util.shakti.lindenlab.com", |
62 | "https://login.shakti.lindenlab.com/cgi-bin/login.cgi", | 62 | "https://login.shakti.lindenlab.com/cgi-bin/login.cgi", |
63 | "http://shakti-secondlife.webdev.lindenlab.com/helpers/" }, | 63 | "http://shakti-secondlife.webdev.lindenlab.com/helpers/" }, |
64 | { "Soma", | 64 | { "Soma", |
65 | "userserver.soma.lindenlab.com", | 65 | "util.soma.lindenlab.com", |
66 | "https://login.soma.lindenlab.com/cgi-bin/login.cgi", | 66 | "https://login.soma.lindenlab.com/cgi-bin/login.cgi", |
67 | "http://soma-secondlife.webdev.lindenlab.com/helpers/" }, | 67 | "http://soma-secondlife.webdev.lindenlab.com/helpers/" }, |
68 | { "Ganga", | 68 | { "Ganga", |
69 | "userserver.ganga.lindenlab.com", | 69 | "util.ganga.lindenlab.com", |
70 | "https://login.ganga.lindenlab.com/cgi-bin/login.cgi", | 70 | "https://login.ganga.lindenlab.com/cgi-bin/login.cgi", |
71 | "http://ganga-secondlife.webdev.lindenlab.com/helpers/" }, | 71 | "http://ganga-secondlife.webdev.lindenlab.com/helpers/" }, |
72 | { "Vaak", | 72 | { "Vaak", |
73 | "userserver.vaak.lindenlab.com", | 73 | "util.vaak.lindenlab.com", |
74 | "https://login.vaak.lindenlab.com/cgi-bin/login.cgi", | 74 | "https://login.vaak.lindenlab.com/cgi-bin/login.cgi", |
75 | "http://vaak-secondlife.webdev.lindenlab.com/helpers/" }, | 75 | "http://vaak-secondlife.webdev.lindenlab.com/helpers/" }, |
76 | { "Uma", | 76 | { "Uma", |
77 | "userserver.uma.lindenlab.com", | 77 | "util.uma.lindenlab.com", |
78 | "https://login.uma.lindenlab.com/cgi-bin/login.cgi", | 78 | "https://login.uma.lindenlab.com/cgi-bin/login.cgi", |
79 | "http://uma-secondlife.webdev.lindenlab.com/helpers/" }, | 79 | "http://uma-secondlife.webdev.lindenlab.com/helpers/" }, |
80 | { "Local", | 80 | { "Local", |
@@ -89,10 +89,8 @@ LLUserServerData gUserServerDomainName[USERSERVER_COUNT] = | |||
89 | 89 | ||
90 | // Use this to figure out which domain name and login URI to use. | 90 | // Use this to figure out which domain name and login URI to use. |
91 | 91 | ||
92 | EUserServerDomain gUserServerChoice = USERSERVER_NONE; | 92 | EGridInfo gGridChoice = GRID_INFO_NONE; |
93 | char gUserServerName[MAX_STRING]; /* Flawfinder: ignore */ | 93 | char gGridName[MAX_STRING]; /* Flawfinder: ignore */ |
94 | |||
95 | LLHost gUserServer; | ||
96 | 94 | ||
97 | F32 gPacketDropPercentage = 0.f; | 95 | F32 gPacketDropPercentage = 0.f; |
98 | F32 gInBandwidth = 0.f; | 96 | F32 gInBandwidth = 0.f; |
diff --git a/linden/indra/newview/llviewernetwork.h b/linden/indra/newview/llviewernetwork.h index 1f73fe2..118897a 100644 --- a/linden/indra/newview/llviewernetwork.h +++ b/linden/indra/newview/llviewernetwork.h | |||
@@ -35,26 +35,26 @@ | |||
35 | 35 | ||
36 | class LLHost; | 36 | class LLHost; |
37 | 37 | ||
38 | enum EUserServerDomain | 38 | enum EGridInfo |
39 | { | 39 | { |
40 | USERSERVER_NONE, | 40 | GRID_INFO_NONE, |
41 | USERSERVER_ADITI, | 41 | GRID_INFO_ADITI, |
42 | USERSERVER_AGNI, | 42 | GRID_INFO_AGNI, |
43 | USERSERVER_DMZ, | 43 | GRID_INFO_DMZ, |
44 | USERSERVER_SIVA, | 44 | GRID_INFO_SIVA, |
45 | USERSERVER_DURGA, | 45 | GRID_INFO_DURGA, |
46 | USERSERVER_SHAKTI, | 46 | GRID_INFO_SHAKTI, |
47 | USERSERVER_SOMA, | 47 | GRID_INFO_SOMA, |
48 | USERSERVER_GANGA, | 48 | GRID_INFO_GANGA, |
49 | USERSERVER_VAAK, | 49 | GRID_INFO_VAAK, |
50 | USERSERVER_UMA, | 50 | GRID_INFO_UMA, |
51 | USERSERVER_LOCAL, | 51 | GRID_INFO_LOCAL, |
52 | USERSERVER_OTHER, // IP address set via -user or other command line option | 52 | GRID_INFO_OTHER, // IP address set via -user or other command line option |
53 | USERSERVER_COUNT | 53 | GRID_INFO_COUNT |
54 | }; | 54 | }; |
55 | 55 | ||
56 | 56 | ||
57 | struct LLUserServerData | 57 | struct LLGridData |
58 | { | 58 | { |
59 | const char* mLabel; | 59 | const char* mLabel; |
60 | const char* mName; | 60 | const char* mName; |
@@ -65,9 +65,9 @@ struct LLUserServerData | |||
65 | extern F32 gPacketDropPercentage; | 65 | extern F32 gPacketDropPercentage; |
66 | extern F32 gInBandwidth; | 66 | extern F32 gInBandwidth; |
67 | extern F32 gOutBandwidth; | 67 | extern F32 gOutBandwidth; |
68 | extern EUserServerDomain gUserServerChoice; | 68 | extern EGridInfo gGridChoice; |
69 | extern LLUserServerData gUserServerDomainName[]; | 69 | extern LLGridData gGridInfo[]; |
70 | extern char gUserServerName[MAX_STRING]; /* Flawfinder: ignore */ | 70 | extern char gGridName[MAX_STRING]; /* Flawfinder: ignore */ |
71 | 71 | ||
72 | const S32 MAC_ADDRESS_BYTES = 6; | 72 | const S32 MAC_ADDRESS_BYTES = 6; |
73 | extern unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */ | 73 | extern unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */ |
diff --git a/linden/indra/newview/llviewerobject.cpp b/linden/indra/newview/llviewerobject.cpp index 0c9ca01..4c6f279 100644 --- a/linden/indra/newview/llviewerobject.cpp +++ b/linden/indra/newview/llviewerobject.cpp | |||
@@ -95,13 +95,12 @@ | |||
95 | #include "llworld.h" | 95 | #include "llworld.h" |
96 | #include "llui.h" | 96 | #include "llui.h" |
97 | #include "pipeline.h" | 97 | #include "pipeline.h" |
98 | #include "viewer.h" | 98 | #include "llappviewer.h" |
99 | 99 | ||
100 | //#define DEBUG_UPDATE_TYPE | 100 | //#define DEBUG_UPDATE_TYPE |
101 | 101 | ||
102 | extern BOOL gVelocityInterpolate; | 102 | BOOL gVelocityInterpolate = TRUE; |
103 | extern BOOL gPingInterpolate; | 103 | BOOL gPingInterpolate = TRUE; |
104 | extern U32 gFrameCount; | ||
105 | 104 | ||
106 | U32 LLViewerObject::sNumZombieObjects = 0; | 105 | U32 LLViewerObject::sNumZombieObjects = 0; |
107 | S32 LLViewerObject::sNumObjects = 0; | 106 | S32 LLViewerObject::sNumObjects = 0; |
diff --git a/linden/indra/newview/llviewerobject.h b/linden/indra/newview/llviewerobject.h index 9ce417d..b30bf7e 100644 --- a/linden/indra/newview/llviewerobject.h +++ b/linden/indra/newview/llviewerobject.h | |||
@@ -692,4 +692,7 @@ public: | |||
692 | virtual void updateDrawable(BOOL force_damped); | 692 | virtual void updateDrawable(BOOL force_damped); |
693 | }; | 693 | }; |
694 | 694 | ||
695 | extern BOOL gVelocityInterpolate; | ||
696 | extern BOOL gPingInterpolate; | ||
697 | |||
695 | #endif | 698 | #endif |
diff --git a/linden/indra/newview/llviewerobjectlist.cpp b/linden/indra/newview/llviewerobjectlist.cpp index 967f018..38efb5d 100644 --- a/linden/indra/newview/llviewerobjectlist.cpp +++ b/linden/indra/newview/llviewerobjectlist.cpp | |||
@@ -42,7 +42,6 @@ | |||
42 | #include "llvoavatar.h" | 42 | #include "llvoavatar.h" |
43 | #include "llviewerobject.h" | 43 | #include "llviewerobject.h" |
44 | #include "llviewerwindow.h" | 44 | #include "llviewerwindow.h" |
45 | #include "viewer.h" | ||
46 | #include "llnetmap.h" | 45 | #include "llnetmap.h" |
47 | #include "llagent.h" | 46 | #include "llagent.h" |
48 | #include "pipeline.h" | 47 | #include "pipeline.h" |
@@ -71,11 +70,9 @@ | |||
71 | #endif | 70 | #endif |
72 | #include "object_flags.h" | 71 | #include "object_flags.h" |
73 | 72 | ||
74 | extern BOOL gVelocityInterpolate; | 73 | #include "llappviewer.h" |
75 | extern BOOL gPingInterpolate; | 74 | |
76 | extern F32 gMinObjectDistance; | 75 | extern F32 gMinObjectDistance; |
77 | extern U32 gFrameCount; | ||
78 | extern LLTimer gRenderStartTime; | ||
79 | extern BOOL gAnimateTextures; | 76 | extern BOOL gAnimateTextures; |
80 | 77 | ||
81 | void dialog_refresh_all(); | 78 | void dialog_refresh_all(); |
diff --git a/linden/indra/newview/llviewerparcelmgr.cpp b/linden/indra/newview/llviewerparcelmgr.cpp index d5fc9fa..f0d6fd1 100644 --- a/linden/indra/newview/llviewerparcelmgr.cpp +++ b/linden/indra/newview/llviewerparcelmgr.cpp | |||
@@ -1398,8 +1398,9 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use | |||
1398 | F32 parcel_prim_bonus = 1.f; | 1398 | F32 parcel_prim_bonus = 1.f; |
1399 | BOOL region_push_override = false; | 1399 | BOOL region_push_override = false; |
1400 | BOOL region_deny_anonymous_override = false; | 1400 | BOOL region_deny_anonymous_override = false; |
1401 | BOOL region_deny_identified_override = false; | 1401 | BOOL region_deny_identified_override = false; // Deprecated |
1402 | BOOL region_deny_transacted_override = false; | 1402 | BOOL region_deny_transacted_override = false; // Deprecated |
1403 | BOOL region_deny_age_unverified_override = false; | ||
1403 | 1404 | ||
1404 | S32 other_clean_time = 0; | 1405 | S32 other_clean_time = 0; |
1405 | 1406 | ||
@@ -1474,8 +1475,9 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use | |||
1474 | msg->getF32Fast(_PREHASH_ParcelData, _PREHASH_ParcelPrimBonus, parcel_prim_bonus ); | 1475 | msg->getF32Fast(_PREHASH_ParcelData, _PREHASH_ParcelPrimBonus, parcel_prim_bonus ); |
1475 | msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionPushOverride, region_push_override ); | 1476 | msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionPushOverride, region_push_override ); |
1476 | msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionDenyAnonymous, region_deny_anonymous_override ); | 1477 | msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionDenyAnonymous, region_deny_anonymous_override ); |
1477 | msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionDenyIdentified, region_deny_identified_override ); | 1478 | msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionDenyIdentified, region_deny_identified_override ); // Deprecated |
1478 | msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionDenyTransacted, region_deny_transacted_override ); | 1479 | msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionDenyTransacted, region_deny_transacted_override ); // Deprecated |
1480 | msg->getBOOLFast(_PREHASH_AgeVerificationBlock, _PREHASH_RegionDenyAgeUnverified, region_deny_age_unverified_override ); | ||
1479 | 1481 | ||
1480 | msg->getS32("ParcelData", "OtherCleanTime", other_clean_time ); | 1482 | msg->getS32("ParcelData", "OtherCleanTime", other_clean_time ); |
1481 | 1483 | ||
@@ -1505,8 +1507,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use | |||
1505 | parcel->setCleanOtherTime(other_clean_time); | 1507 | parcel->setCleanOtherTime(other_clean_time); |
1506 | parcel->setRegionPushOverride(region_push_override); | 1508 | parcel->setRegionPushOverride(region_push_override); |
1507 | parcel->setRegionDenyAnonymousOverride(region_deny_anonymous_override); | 1509 | parcel->setRegionDenyAnonymousOverride(region_deny_anonymous_override); |
1508 | parcel->setRegionDenyIdentifiedOverride(region_deny_identified_override); | 1510 | parcel->setRegionDenyAgeUnverifiedOverride(region_deny_age_unverified_override); |
1509 | parcel->setRegionDenyTransactedOverride(region_deny_transacted_override); | ||
1510 | parcel->unpackMessage(msg); | 1511 | parcel->unpackMessage(msg); |
1511 | 1512 | ||
1512 | if (parcel == gParcelMgr->mAgentParcel) | 1513 | if (parcel == gParcelMgr->mAgentParcel) |
diff --git a/linden/indra/newview/llviewerregion.cpp b/linden/indra/newview/llviewerregion.cpp index 643df1e..0022212 100644 --- a/linden/indra/newview/llviewerregion.cpp +++ b/linden/indra/newview/llviewerregion.cpp | |||
@@ -63,7 +63,6 @@ | |||
63 | #include "llvocache.h" | 63 | #include "llvocache.h" |
64 | #include "llvoclouds.h" | 64 | #include "llvoclouds.h" |
65 | #include "llworld.h" | 65 | #include "llworld.h" |
66 | #include "viewer.h" | ||
67 | 66 | ||
68 | // Viewer object cache version, change if object update | 67 | // Viewer object cache version, change if object update |
69 | // format changes. JC | 68 | // format changes. JC |
@@ -969,28 +968,16 @@ void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg) | |||
969 | } | 968 | } |
970 | } | 969 | } |
971 | 970 | ||
972 | LLString LLViewerRegion::getInfoString() | 971 | void LLViewerRegion::getInfo(LLSD& info) |
973 | { | 972 | { |
974 | char tmp_buf[256]; /* Flawfinder: ignore */ | 973 | info["Region"]["Host"] = getHost().getIPandPort(); |
975 | LLString info; | 974 | info["Region"]["Name"] = getName(); |
976 | |||
977 | info = "Region: "; | ||
978 | getHost().getString(tmp_buf, 256); | ||
979 | info += tmp_buf; | ||
980 | info += ":"; | ||
981 | info += getName(); | ||
982 | info += "\n"; | ||
983 | |||
984 | U32 x, y; | 975 | U32 x, y; |
985 | from_region_handle(getHandle(), &x, &y); | 976 | from_region_handle(getHandle(), &x, &y); |
986 | snprintf(tmp_buf, sizeof(tmp_buf), "%d:%d", x, y); /* Flawfinder: ignore */ | 977 | info["Region"]["Handle"]["x"] = (LLSD::Integer)x; |
987 | info += "Handle:"; | 978 | info["Region"]["Handle"]["y"] = (LLSD::Integer)y; |
988 | info += tmp_buf; | ||
989 | info += "\n"; | ||
990 | return info; | ||
991 | } | 979 | } |
992 | 980 | ||
993 | |||
994 | void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp) | 981 | void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp) |
995 | { | 982 | { |
996 | U32 local_id = objectp->getLocalID(); | 983 | U32 local_id = objectp->getLocalID(); |
diff --git a/linden/indra/newview/llviewerregion.h b/linden/indra/newview/llviewerregion.h index 013a96f..a0953e5 100644 --- a/linden/indra/newview/llviewerregion.h +++ b/linden/indra/newview/llviewerregion.h | |||
@@ -223,7 +223,7 @@ public: | |||
223 | 223 | ||
224 | F32 getLandHeightRegion(const LLVector3& region_pos); | 224 | F32 getLandHeightRegion(const LLVector3& region_pos); |
225 | 225 | ||
226 | LLString getInfoString(); | 226 | void getInfo(LLSD& info); |
227 | 227 | ||
228 | // handle a full update message | 228 | // handle a full update message |
229 | void cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp); | 229 | void cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp); |
diff --git a/linden/indra/newview/llviewerstats.cpp b/linden/indra/newview/llviewerstats.cpp index 96f52a1..2b278c7 100644 --- a/linden/indra/newview/llviewerstats.cpp +++ b/linden/indra/newview/llviewerstats.cpp | |||
@@ -37,10 +37,29 @@ | |||
37 | #include "message.h" | 37 | #include "message.h" |
38 | #include "lltimer.h" | 38 | #include "lltimer.h" |
39 | 39 | ||
40 | LLViewerStats *gViewerStats = NULL; | 40 | #include "llappviewer.h" |
41 | |||
42 | #include "pipeline.h" | ||
43 | #include "llviewerobjectlist.h" | ||
44 | #include "llviewerimagelist.h" | ||
45 | #include "lltexlayer.h" | ||
46 | #include "llsurface.h" | ||
47 | #include "llvlmanager.h" | ||
48 | #include "llagent.h" | ||
49 | #include "llviewercontrol.h" | ||
50 | #include "llfloaterdirectory.h" | ||
51 | #include "llfloatertools.h" | ||
52 | #include "lldebugview.h" | ||
53 | #include "llfasttimerview.h" | ||
54 | #include "llviewerregion.h" | ||
55 | #include "llfloaterhtmlhelp.h" | ||
56 | #include "llworld.h" | ||
57 | #include "llfeaturemanager.h" | ||
58 | #if LL_WINDOWS && LL_LCD_COMPILE | ||
59 | #include "lllcd.h" | ||
60 | #endif | ||
41 | 61 | ||
42 | extern U32 gFrameCount; | 62 | LLViewerStats *gViewerStats = NULL; |
43 | extern LLTimer gRenderStartTime; | ||
44 | 63 | ||
45 | class StatAttributes | 64 | class StatAttributes |
46 | { | 65 | { |
@@ -323,3 +342,427 @@ const char *LLViewerStats::statTypeToText(EStatType type) | |||
323 | return "Unknown statistic"; | 342 | return "Unknown statistic"; |
324 | } | 343 | } |
325 | } | 344 | } |
345 | |||
346 | // *NOTE:Mani The following methods used to exist in viewer.cpp | ||
347 | // Moving them here, but not merging them into LLViewerStats yet. | ||
348 | void reset_statistics() | ||
349 | { | ||
350 | gPipeline.resetFrameStats(); // Reset per-frame statistics. | ||
351 | if (LLSurface::sTextureUpdateTime) | ||
352 | { | ||
353 | LLSurface::sTexelsUpdatedPerSecStat.addValue(0.001f*(LLSurface::sTexelsUpdated / LLSurface::sTextureUpdateTime)); | ||
354 | LLSurface::sTexelsUpdated = 0; | ||
355 | LLSurface::sTextureUpdateTime = 0.f; | ||
356 | } | ||
357 | } | ||
358 | |||
359 | |||
360 | void output_statistics(void*) | ||
361 | { | ||
362 | llinfos << "Number of orphans: " << gObjectList.getOrphanCount() << llendl; | ||
363 | llinfos << "Number of dead objects: " << gObjectList.mNumDeadObjects << llendl; | ||
364 | llinfos << "Num images: " << gImageList.getNumImages() << llendl; | ||
365 | llinfos << "Texture usage: " << LLImageGL::sGlobalTextureMemory << llendl; | ||
366 | llinfos << "Texture working set: " << LLImageGL::sBoundTextureMemory << llendl; | ||
367 | llinfos << "Raw usage: " << LLImageRaw::sGlobalRawMemory << llendl; | ||
368 | llinfos << "Formatted usage: " << LLImageFormatted::sGlobalFormattedMemory << llendl; | ||
369 | llinfos << "Zombie Viewer Objects: " << LLViewerObject::getNumZombieObjects() << llendl; | ||
370 | llinfos << "Number of lights: " << gPipeline.getLightCount() << llendl; | ||
371 | |||
372 | llinfos << "Memory Usage:" << llendl; | ||
373 | llinfos << "--------------------------------" << llendl; | ||
374 | llinfos << "Pipeline:" << llendl; | ||
375 | llinfos << llendl; | ||
376 | |||
377 | #if LL_SMARTHEAP | ||
378 | llinfos << "--------------------------------" << llendl; | ||
379 | { | ||
380 | llinfos << "sizeof(LLVOVolume) = " << sizeof(LLVOVolume) << llendl; | ||
381 | |||
382 | U32 total_pool_size = 0; | ||
383 | U32 total_used_size = 0; | ||
384 | MEM_POOL_INFO pool_info; | ||
385 | MEM_POOL_STATUS pool_status; | ||
386 | U32 pool_num = 0; | ||
387 | for(pool_status = MemPoolFirst( &pool_info, 1 ); | ||
388 | pool_status != MEM_POOL_END; | ||
389 | pool_status = MemPoolNext( &pool_info, 1 ) ) | ||
390 | { | ||
391 | llinfos << "Pool #" << pool_num << llendl; | ||
392 | if( MEM_POOL_OK != pool_status ) | ||
393 | { | ||
394 | llwarns << "Pool not ok" << llendl; | ||
395 | continue; | ||
396 | } | ||
397 | |||
398 | llinfos << "Pool blockSizeFS " << pool_info.blockSizeFS | ||
399 | << " pageSize " << pool_info.pageSize | ||
400 | << llendl; | ||
401 | |||
402 | U32 pool_count = MemPoolCount(pool_info.pool); | ||
403 | llinfos << "Blocks " << pool_count << llendl; | ||
404 | |||
405 | U32 pool_size = MemPoolSize( pool_info.pool ); | ||
406 | if( pool_size == MEM_ERROR_RET ) | ||
407 | { | ||
408 | llinfos << "MemPoolSize() failed (" << pool_num << ")" << llendl; | ||
409 | } | ||
410 | else | ||
411 | { | ||
412 | llinfos << "MemPool Size " << pool_size / 1024 << "K" << llendl; | ||
413 | } | ||
414 | |||
415 | total_pool_size += pool_size; | ||
416 | |||
417 | if( !MemPoolLock( pool_info.pool ) ) | ||
418 | { | ||
419 | llinfos << "MemPoolLock failed (" << pool_num << ") " << llendl; | ||
420 | continue; | ||
421 | } | ||
422 | |||
423 | U32 used_size = 0; | ||
424 | MEM_POOL_ENTRY entry; | ||
425 | entry.entry = NULL; | ||
426 | while( MemPoolWalk( pool_info.pool, &entry ) == MEM_POOL_OK ) | ||
427 | { | ||
428 | if( entry.isInUse ) | ||
429 | { | ||
430 | used_size += entry.size; | ||
431 | } | ||
432 | } | ||
433 | |||
434 | MemPoolUnlock( pool_info.pool ); | ||
435 | |||
436 | llinfos << "MemPool Used " << used_size/1024 << "K" << llendl; | ||
437 | total_used_size += used_size; | ||
438 | pool_num++; | ||
439 | } | ||
440 | |||
441 | llinfos << "Total Pool Size " << total_pool_size/1024 << "K" << llendl; | ||
442 | llinfos << "Total Used Size " << total_used_size/1024 << "K" << llendl; | ||
443 | |||
444 | } | ||
445 | #endif | ||
446 | |||
447 | llinfos << "--------------------------------" << llendl; | ||
448 | llinfos << "Avatar Memory (partly overlaps with above stats):" << llendl; | ||
449 | gTexStaticImageList.dumpByteCount(); | ||
450 | LLVOAvatar::dumpScratchTextureByteCount(); | ||
451 | LLTexLayerSetBuffer::dumpTotalByteCount(); | ||
452 | LLVOAvatar::dumpTotalLocalTextureByteCount(); | ||
453 | LLTexLayerParamAlpha::dumpCacheByteCount(); | ||
454 | LLVOAvatar::dumpBakedStatus(); | ||
455 | |||
456 | llinfos << llendl; | ||
457 | |||
458 | llinfos << "Object counts:" << llendl; | ||
459 | S32 i; | ||
460 | S32 obj_counts[256]; | ||
461 | // S32 app_angles[256]; | ||
462 | for (i = 0; i < 256; i++) | ||
463 | { | ||
464 | obj_counts[i] = 0; | ||
465 | } | ||
466 | for (i = 0; i < gObjectList.getNumObjects(); i++) | ||
467 | { | ||
468 | LLViewerObject *objectp = gObjectList.getObject(i); | ||
469 | if (objectp) | ||
470 | { | ||
471 | obj_counts[objectp->getPCode()]++; | ||
472 | } | ||
473 | } | ||
474 | for (i = 0; i < 256; i++) | ||
475 | { | ||
476 | if (obj_counts[i]) | ||
477 | { | ||
478 | llinfos << LLPrimitive::pCodeToString(i) << ":" << obj_counts[i] << llendl; | ||
479 | } | ||
480 | } | ||
481 | } | ||
482 | |||
483 | |||
484 | U32 gTotalLandIn = 0, gTotalLandOut = 0; | ||
485 | U32 gTotalWaterIn = 0, gTotalWaterOut = 0; | ||
486 | |||
487 | F32 gAveLandCompression = 0.f, gAveWaterCompression = 0.f; | ||
488 | F32 gBestLandCompression = 1.f, gBestWaterCompression = 1.f; | ||
489 | F32 gWorstLandCompression = 0.f, gWorstWaterCompression = 0.f; | ||
490 | |||
491 | |||
492 | |||
493 | U32 gTotalWorldBytes = 0, gTotalObjectBytes = 0, gTotalTextureBytes = 0, gSimPingCount = 0; | ||
494 | U32 gObjectBits = 0; | ||
495 | F32 gAvgSimPing = 0.f; | ||
496 | |||
497 | |||
498 | extern U32 gVisCompared; | ||
499 | extern U32 gVisTested; | ||
500 | |||
501 | std::map<S32,LLFrameTimer> gDebugTimers; | ||
502 | |||
503 | void update_statistics(U32 frame_count) | ||
504 | { | ||
505 | gTotalWorldBytes += gVLManager.getTotalBytes(); | ||
506 | gTotalObjectBytes += gObjectBits / 8; | ||
507 | gTotalTextureBytes += LLViewerImageList::sTextureBits / 8; | ||
508 | |||
509 | // make sure we have a valid time delta for this frame | ||
510 | if (gFrameIntervalSeconds > 0.f) | ||
511 | { | ||
512 | if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) | ||
513 | { | ||
514 | gViewerStats->incStat(LLViewerStats::ST_MOUSELOOK_SECONDS, gFrameIntervalSeconds); | ||
515 | } | ||
516 | else if (gAgent.getCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR) | ||
517 | { | ||
518 | gViewerStats->incStat(LLViewerStats::ST_AVATAR_EDIT_SECONDS, gFrameIntervalSeconds); | ||
519 | } | ||
520 | else if (gFloaterTools && gFloaterTools->getVisible()) | ||
521 | { | ||
522 | gViewerStats->incStat(LLViewerStats::ST_TOOLBOX_SECONDS, gFrameIntervalSeconds); | ||
523 | } | ||
524 | } | ||
525 | gViewerStats->setStat(LLViewerStats::ST_ENABLE_VBO, (F64)gSavedSettings.getBOOL("RenderVBOEnable")); | ||
526 | gViewerStats->setStat(LLViewerStats::ST_LIGHTING_DETAIL, (F64)gSavedSettings.getS32("RenderLightingDetail")); | ||
527 | gViewerStats->setStat(LLViewerStats::ST_DRAW_DIST, (F64)gSavedSettings.getF32("RenderFarClip")); | ||
528 | gViewerStats->setStat(LLViewerStats::ST_CHAT_BUBBLES, (F64)gSavedSettings.getBOOL("UseChatBubbles")); | ||
529 | #if 0 // 1.9.2 | ||
530 | gViewerStats->setStat(LLViewerStats::ST_SHADER_OBJECTS, (F64)gSavedSettings.getS32("VertexShaderLevelObject")); | ||
531 | gViewerStats->setStat(LLViewerStats::ST_SHADER_AVATAR, (F64)gSavedSettings.getBOOL("VertexShaderLevelAvatar")); | ||
532 | gViewerStats->setStat(LLViewerStats::ST_SHADER_ENVIRONMENT, (F64)gSavedSettings.getBOOL("VertexShaderLevelEnvironment")); | ||
533 | #endif | ||
534 | gViewerStats->setStat(LLViewerStats::ST_FRAME_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_FRAME)); | ||
535 | F64 idle_secs = gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_IDLE); | ||
536 | F64 network_secs = gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_NETWORK); | ||
537 | gViewerStats->setStat(LLViewerStats::ST_UPDATE_SECS, idle_secs - network_secs); | ||
538 | gViewerStats->setStat(LLViewerStats::ST_NETWORK_SECS, network_secs); | ||
539 | gViewerStats->setStat(LLViewerStats::ST_IMAGE_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_IMAGE_UPDATE)); | ||
540 | gViewerStats->setStat(LLViewerStats::ST_REBUILD_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_REBUILD)); | ||
541 | gViewerStats->setStat(LLViewerStats::ST_RENDER_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_RENDER_GEOMETRY)); | ||
542 | |||
543 | LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(gAgent.getRegion()->getHost()); | ||
544 | if (cdp) | ||
545 | { | ||
546 | gViewerStats->mSimPingStat.addValue(cdp->getPingDelay()); | ||
547 | gAvgSimPing = ((gAvgSimPing * (F32)gSimPingCount) + (F32)(cdp->getPingDelay())) / ((F32)gSimPingCount + 1); | ||
548 | gSimPingCount++; | ||
549 | } | ||
550 | else | ||
551 | { | ||
552 | gViewerStats->mSimPingStat.addValue(10000); | ||
553 | } | ||
554 | |||
555 | gViewerStats->mFPSStat.addValue(1); | ||
556 | F32 layer_bits = (F32)(gVLManager.getLandBits() + gVLManager.getWindBits() + gVLManager.getCloudBits()); | ||
557 | gViewerStats->mLayersKBitStat.addValue(layer_bits/1024.f); | ||
558 | gViewerStats->mObjectKBitStat.addValue(gObjectBits/1024.f); | ||
559 | gViewerStats->mTextureKBitStat.addValue(LLViewerImageList::sTextureBits/1024.f); | ||
560 | gViewerStats->mVFSPendingOperations.addValue(LLVFile::getVFSThread()->getPending()); | ||
561 | gViewerStats->mAssetKBitStat.addValue(gTransferManager.getTransferBitsIn(LLTCT_ASSET)/1024.f); | ||
562 | gTransferManager.resetTransferBitsIn(LLTCT_ASSET); | ||
563 | |||
564 | static S32 tex_bits_idle_count = 0; | ||
565 | if (LLViewerImageList::sTextureBits == 0) | ||
566 | { | ||
567 | if (++tex_bits_idle_count >= 30) | ||
568 | gDebugTimers[0].pause(); | ||
569 | } | ||
570 | else | ||
571 | { | ||
572 | tex_bits_idle_count = 0; | ||
573 | gDebugTimers[0].unpause(); | ||
574 | } | ||
575 | |||
576 | gViewerStats->mTexturePacketsStat.addValue(LLViewerImageList::sTexturePackets); | ||
577 | |||
578 | // log when the LibXUL (aka Mozilla) widget is used and opened so we can monitor framerate changes | ||
579 | #if LL_LIBXUL_ENABLED | ||
580 | { | ||
581 | BOOL result = gViewerHtmlHelp.getFloaterOpened(); | ||
582 | gViewerStats->setStat(LLViewerStats::ST_LIBXUL_WIDGET_USED, (F64)result); | ||
583 | } | ||
584 | #endif | ||
585 | |||
586 | { | ||
587 | static F32 visible_avatar_frames = 0.f; | ||
588 | static F32 avg_visible_avatars = 0; | ||
589 | F32 visible_avatars = (F32)LLVOAvatar::sNumVisibleAvatars; | ||
590 | if (visible_avatars > 0.f) | ||
591 | { | ||
592 | visible_avatar_frames = 1.f; | ||
593 | avg_visible_avatars = (avg_visible_avatars * (F32)(visible_avatar_frames - 1.f) + visible_avatars) / visible_avatar_frames; | ||
594 | } | ||
595 | gViewerStats->setStat(LLViewerStats::ST_VISIBLE_AVATARS, (F64)avg_visible_avatars); | ||
596 | } | ||
597 | gWorldp->updateNetStats(); | ||
598 | gWorldp->requestCacheMisses(); | ||
599 | |||
600 | // Reset all of these values. | ||
601 | gVLManager.resetBitCounts(); | ||
602 | gObjectBits = 0; | ||
603 | // gDecodedBits = 0; | ||
604 | |||
605 | LLViewerImageList::sTextureBits = 0; | ||
606 | LLViewerImageList::sTexturePackets = 0; | ||
607 | |||
608 | #if LL_WINDOWS && LL_LCD_COMPILE | ||
609 | bool LCDenabled = gLcdScreen->Enabled(); | ||
610 | gViewerStats->setStat(LLViewerStats::ST_LOGITECH_LCD, LCDenabled); | ||
611 | #else | ||
612 | gViewerStats->setStat(LLViewerStats::ST_LOGITECH_LCD, false); | ||
613 | #endif | ||
614 | } | ||
615 | |||
616 | class ViewerStatsResponder : public LLHTTPClient::Responder | ||
617 | { | ||
618 | public: | ||
619 | ViewerStatsResponder() { } | ||
620 | |||
621 | void error(U32 statusNum, const std::string& reason) | ||
622 | { | ||
623 | llinfos << "ViewerStatsResponder::error " << statusNum << " " | ||
624 | << reason << llendl; | ||
625 | } | ||
626 | |||
627 | void result(const LLSD& content) | ||
628 | { | ||
629 | llinfos << "ViewerStatsResponder::result" << llendl; | ||
630 | } | ||
631 | }; | ||
632 | |||
633 | /* | ||
634 | * The sim-side LLSD is in newsim/llagentinfo.cpp:forwardViewerStats. | ||
635 | * | ||
636 | * There's also a compatibility shim for the old fixed-format sim | ||
637 | * stats in newsim/llagentinfo.cpp:processViewerStats. | ||
638 | * | ||
639 | * If you move stats around here, make the corresponding changes in | ||
640 | * those locations, too. | ||
641 | */ | ||
642 | void send_stats() | ||
643 | { | ||
644 | // IW 9/23/02 I elected not to move this into LLViewerStats | ||
645 | // because it depends on too many viewer.cpp globals. | ||
646 | // Someday we may want to merge all our stats into a central place | ||
647 | // but that day is not today. | ||
648 | |||
649 | // Only send stats if the agent is connected to a region. | ||
650 | if (!gAgent.getRegion() || gNoRender) | ||
651 | { | ||
652 | return; | ||
653 | } | ||
654 | |||
655 | LLSD body; | ||
656 | std::string url = gAgent.getRegion()->getCapability("ViewerStats"); | ||
657 | |||
658 | if (url.empty()) { | ||
659 | llwarns << "Could not get ViewerStats capability" << llendl; | ||
660 | return; | ||
661 | } | ||
662 | |||
663 | body["session_id"] = gAgentSessionID; | ||
664 | |||
665 | LLSD &agent = body["agent"]; | ||
666 | |||
667 | time_t ltime; | ||
668 | time(<ime); | ||
669 | F32 run_time = F32(LLFrameTimer::getElapsedSeconds()); | ||
670 | |||
671 | agent["start_time"] = ltime - run_time; | ||
672 | |||
673 | // The first stat set must have a 0 run time if it doesn't actually | ||
674 | // contain useful data in terms of FPS, etc. We use half the | ||
675 | // SEND_STATS_PERIOD seconds as the point at which these statistics become | ||
676 | // valid. Data warehouse uses a 0 value here to easily discard these | ||
677 | // records with non-useful FPS values etc. | ||
678 | if (run_time < (SEND_STATS_PERIOD / 2)) | ||
679 | { | ||
680 | agent["run_time"] = 0.0f; | ||
681 | } | ||
682 | else | ||
683 | { | ||
684 | agent["run_time"] = run_time; | ||
685 | } | ||
686 | |||
687 | // send fps only for time app spends in foreground | ||
688 | agent["fps"] = (F32)gForegroundFrameCount / gForegroundTime.getElapsedTimeF32(); | ||
689 | agent["version"] = gCurrentVersion; | ||
690 | LLString language(gSavedSettings.getString("Language")); | ||
691 | if(language == "default") language = gSavedSettings.getString("SystemLanguage"); | ||
692 | agent["language"] = language; | ||
693 | |||
694 | agent["sim_fps"] = ((F32) gFrameCount - gSimFrames) / | ||
695 | (F32) (gRenderStartTime.getElapsedTimeF32() - gSimLastTime); | ||
696 | |||
697 | gSimLastTime = gRenderStartTime.getElapsedTimeF32(); | ||
698 | gSimFrames = (F32) gFrameCount; | ||
699 | |||
700 | agent["agents_in_view"] = LLVOAvatar::sNumVisibleAvatars; | ||
701 | agent["ping"] = gAvgSimPing; | ||
702 | agent["meters_traveled"] = gAgent.getDistanceTraveled(); | ||
703 | agent["regions_visited"] = gAgent.getRegionsVisited(); | ||
704 | agent["mem_use"] = getCurrentRSS() / 1024.0; | ||
705 | |||
706 | LLSD &system = body["system"]; | ||
707 | |||
708 | system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB(); | ||
709 | system["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); | ||
710 | system["cpu"] = gSysCPU.getCPUString(); | ||
711 | |||
712 | std::string gpu_desc = llformat( | ||
713 | "%-6s Class %d ", | ||
714 | gGLManager.mGLVendorShort.substr(0,6).c_str(), | ||
715 | gFeatureManagerp->getGPUClass()) | ||
716 | + gFeatureManagerp->getGPUString(); | ||
717 | |||
718 | system["gpu"] = gpu_desc; | ||
719 | system["gpu_class"] = gFeatureManagerp->getGPUClass(); | ||
720 | system["gpu_vendor"] = gGLManager.mGLVendorShort; | ||
721 | system["gpu_version"] = gGLManager.mDriverVersionVendorString; | ||
722 | |||
723 | LLSD &download = body["downloads"]; | ||
724 | |||
725 | download["world_kbytes"] = gTotalWorldBytes / 1024.0; | ||
726 | download["object_kbytes"] = gTotalObjectBytes / 1024.0; | ||
727 | download["texture_kbytes"] = gTotalTextureBytes / 1024.0; | ||
728 | |||
729 | LLSD &in = body["stats"]["net"]["in"]; | ||
730 | |||
731 | in["kbytes"] = gMessageSystem->mTotalBytesIn / 1024.0; | ||
732 | in["packets"] = (S32) gMessageSystem->mPacketsIn; | ||
733 | in["compressed_packets"] = (S32) gMessageSystem->mCompressedPacketsIn; | ||
734 | in["savings"] = (gMessageSystem->mUncompressedBytesIn - | ||
735 | gMessageSystem->mCompressedBytesIn) / 1024.0; | ||
736 | |||
737 | LLSD &out = body["stats"]["net"]["out"]; | ||
738 | |||
739 | out["kbytes"] = gMessageSystem->mTotalBytesOut / 1024.0; | ||
740 | out["packets"] = (S32) gMessageSystem->mPacketsOut; | ||
741 | out["compressed_packets"] = (S32) gMessageSystem->mCompressedPacketsOut; | ||
742 | out["savings"] = (gMessageSystem->mUncompressedBytesOut - | ||
743 | gMessageSystem->mCompressedBytesOut) / 1024.0; | ||
744 | |||
745 | LLSD &fail = body["stats"]["failures"]; | ||
746 | |||
747 | fail["send_packet"] = (S32) gMessageSystem->mSendPacketFailureCount; | ||
748 | fail["dropped"] = (S32) gMessageSystem->mDroppedPackets; | ||
749 | fail["resent"] = (S32) gMessageSystem->mResentPackets; | ||
750 | fail["failed_resends"] = (S32) gMessageSystem->mFailedResendPackets; | ||
751 | fail["off_circuit"] = (S32) gMessageSystem->mOffCircuitPackets; | ||
752 | fail["invalid"] = (S32) gMessageSystem->mInvalidOnCircuitPackets; | ||
753 | |||
754 | // Misc stats, two strings and two ints | ||
755 | // These are not expecticed to persist across multiple releases | ||
756 | // Comment any changes with your name and the expected release revision | ||
757 | // If the current revision is recent, ping the previous author before overriding | ||
758 | LLSD &misc = body["stats"]["misc"]; | ||
759 | |||
760 | // misc["string_1"] = | ||
761 | // misc["string_2"] = | ||
762 | misc["int_1"] = LLFloaterDirectory::sOldSearchCount; // Steve: 1.18.6 | ||
763 | misc["int_2"] = LLFloaterDirectory::sNewSearchCount; // Steve: 1.18.6 | ||
764 | |||
765 | gViewerStats->addToMessage(body); | ||
766 | |||
767 | LLHTTPClient::post(url, body, new ViewerStatsResponder()); | ||
768 | } | ||
diff --git a/linden/indra/newview/llviewerstats.h b/linden/indra/newview/llviewerstats.h index 3c959a5..0ce4e79 100644 --- a/linden/indra/newview/llviewerstats.h +++ b/linden/indra/newview/llviewerstats.h | |||
@@ -94,7 +94,6 @@ public: | |||
94 | 94 | ||
95 | 95 | ||
96 | LLStat mSimPingStat; | 96 | LLStat mSimPingStat; |
97 | LLStat mUserserverPingStat; | ||
98 | 97 | ||
99 | void resetStats(); | 98 | void resetStats(); |
100 | public: | 99 | public: |
@@ -188,4 +187,13 @@ private: | |||
188 | 187 | ||
189 | extern LLViewerStats *gViewerStats; | 188 | extern LLViewerStats *gViewerStats; |
190 | 189 | ||
190 | static const F32 SEND_STATS_PERIOD = 300.0f; | ||
191 | |||
192 | // The following are from (older?) statistics code found in appviewer. | ||
193 | void reset_statistics(); | ||
194 | void output_statistics(void*); | ||
195 | void update_statistics(U32 frame_count); | ||
196 | void send_stats(); | ||
197 | |||
198 | extern std::map<S32,LLFrameTimer> gDebugTimers; | ||
191 | #endif // LL_LLVIEWERSTATS_H | 199 | #endif // LL_LLVIEWERSTATS_H |
diff --git a/linden/indra/newview/llviewertexteditor.cpp b/linden/indra/newview/llviewertexteditor.cpp index 1e75e42..e89f3f9 100644 --- a/linden/indra/newview/llviewertexteditor.cpp +++ b/linden/indra/newview/llviewertexteditor.cpp | |||
@@ -37,6 +37,7 @@ | |||
37 | #include "llinventory.h" | 37 | #include "llinventory.h" |
38 | #include "llinventorymodel.h" | 38 | #include "llinventorymodel.h" |
39 | #include "llinventoryview.h" | 39 | #include "llinventoryview.h" |
40 | #include "llinventorybridge.h" // for landmark prefix string | ||
40 | 41 | ||
41 | #include "llviewertexteditor.h" | 42 | #include "llviewertexteditor.h" |
42 | 43 | ||
@@ -58,7 +59,7 @@ | |||
58 | #include "llmemorystream.h" | 59 | #include "llmemorystream.h" |
59 | #include "llmenugl.h" | 60 | #include "llmenugl.h" |
60 | 61 | ||
61 | extern BOOL gPacificDaylightTime; | 62 | #include "llappviewer.h" // for gPacificDaylightTime |
62 | 63 | ||
63 | ///---------------------------------------------------------------------------- | 64 | ///---------------------------------------------------------------------------- |
64 | /// Class LLEmbeddedNotecardOpener | 65 | /// Class LLEmbeddedNotecardOpener |
@@ -1399,7 +1400,9 @@ void LLViewerTextEditor::openEmbeddedSound( LLInventoryItem* item ) | |||
1399 | 1400 | ||
1400 | void LLViewerTextEditor::openEmbeddedLandmark( LLInventoryItem* item ) | 1401 | void LLViewerTextEditor::openEmbeddedLandmark( LLInventoryItem* item ) |
1401 | { | 1402 | { |
1402 | open_landmark((LLViewerInventoryItem*)item, " preview landmark", FALSE, item->getUUID(), TRUE); | 1403 | LLString title = |
1404 | LLString(" ") + LLLandmarkBridge::prefix() + item->getName(); | ||
1405 | open_landmark((LLViewerInventoryItem*)item, title, FALSE, item->getUUID(), TRUE); | ||
1403 | } | 1406 | } |
1404 | 1407 | ||
1405 | void LLViewerTextEditor::openEmbeddedNotecard( LLInventoryItem* item, BOOL saved ) | 1408 | void LLViewerTextEditor::openEmbeddedNotecard( LLInventoryItem* item, BOOL saved ) |
diff --git a/linden/indra/newview/llviewerwindow.cpp b/linden/indra/newview/llviewerwindow.cpp index 7aaf9c0..d8f182c 100644 --- a/linden/indra/newview/llviewerwindow.cpp +++ b/linden/indra/newview/llviewerwindow.cpp | |||
@@ -31,6 +31,7 @@ | |||
31 | 31 | ||
32 | #include "llviewerprecompiledheaders.h" | 32 | #include "llviewerprecompiledheaders.h" |
33 | 33 | ||
34 | #include "llpanellogin.h" | ||
34 | #include "llviewerwindow.h" | 35 | #include "llviewerwindow.h" |
35 | 36 | ||
36 | // system library includes | 37 | // system library includes |
@@ -105,6 +106,7 @@ | |||
105 | #include "llfloatermap.h" | 106 | #include "llfloatermap.h" |
106 | #include "llfloatermute.h" | 107 | #include "llfloatermute.h" |
107 | #include "llfloaternamedesc.h" | 108 | #include "llfloaternamedesc.h" |
109 | #include "llfloaterpreference.h" | ||
108 | #include "llfloatersnapshot.h" | 110 | #include "llfloatersnapshot.h" |
109 | #include "llfloatertools.h" | 111 | #include "llfloatertools.h" |
110 | #include "llfloaterworldmap.h" | 112 | #include "llfloaterworldmap.h" |
@@ -161,6 +163,7 @@ | |||
161 | #include "llvieweruictrlfactory.h" | 163 | #include "llvieweruictrlfactory.h" |
162 | #include "lluploaddialog.h" | 164 | #include "lluploaddialog.h" |
163 | #include "llurldispatcher.h" // SLURL from other app instance | 165 | #include "llurldispatcher.h" // SLURL from other app instance |
166 | #include "llvieweraudio.h" | ||
164 | #include "llviewercamera.h" | 167 | #include "llviewercamera.h" |
165 | #include "llviewergesture.h" | 168 | #include "llviewergesture.h" |
166 | #include "llviewerimagelist.h" | 169 | #include "llviewerimagelist.h" |
@@ -178,7 +181,9 @@ | |||
178 | #include "llworldmapview.h" | 181 | #include "llworldmapview.h" |
179 | #include "moviemaker.h" | 182 | #include "moviemaker.h" |
180 | #include "pipeline.h" | 183 | #include "pipeline.h" |
181 | #include "viewer.h" | 184 | #include "llappviewer.h" |
185 | #include "llurlsimstring.h" | ||
186 | #include "llviewerdisplay.h" | ||
182 | 187 | ||
183 | #if LL_WINDOWS | 188 | #if LL_WINDOWS |
184 | #include "llwindebug.h" | 189 | #include "llwindebug.h" |
@@ -240,6 +245,12 @@ BOOL gbCapturing = FALSE; | |||
240 | MovieMaker gMovieMaker; | 245 | MovieMaker gMovieMaker; |
241 | #endif | 246 | #endif |
242 | 247 | ||
248 | // HUD display lines in lower right | ||
249 | BOOL gDisplayWindInfo = FALSE; | ||
250 | BOOL gDisplayCameraPos = FALSE; | ||
251 | BOOL gDisplayNearestWater = FALSE; | ||
252 | BOOL gDisplayFOV = FALSE; | ||
253 | |||
243 | S32 CHAT_BAR_HEIGHT = 28; | 254 | S32 CHAT_BAR_HEIGHT = 28; |
244 | S32 OVERLAY_BAR_HEIGHT = 20; | 255 | S32 OVERLAY_BAR_HEIGHT = 20; |
245 | 256 | ||
@@ -1192,14 +1203,14 @@ BOOL LLViewerWindow::handleCloseRequest(LLWindow *window) | |||
1192 | { | 1203 | { |
1193 | // User has indicated they want to close, but we may need to ask | 1204 | // User has indicated they want to close, but we may need to ask |
1194 | // about modified documents. | 1205 | // about modified documents. |
1195 | app_user_quit(); | 1206 | LLAppViewer::instance()->userQuit(); |
1196 | // Don't quit immediately | 1207 | // Don't quit immediately |
1197 | return FALSE; | 1208 | return FALSE; |
1198 | } | 1209 | } |
1199 | 1210 | ||
1200 | void LLViewerWindow::handleQuit(LLWindow *window) | 1211 | void LLViewerWindow::handleQuit(LLWindow *window) |
1201 | { | 1212 | { |
1202 | app_force_quit(NULL); | 1213 | LLAppViewer::instance()->forceQuit(); |
1203 | } | 1214 | } |
1204 | 1215 | ||
1205 | void LLViewerWindow::handleResize(LLWindow *window, S32 width, S32 height) | 1216 | void LLViewerWindow::handleResize(LLWindow *window, S32 width, S32 height) |
@@ -1212,6 +1223,8 @@ void LLViewerWindow::handleFocus(LLWindow *window) | |||
1212 | { | 1223 | { |
1213 | gFocusMgr.setAppHasFocus(TRUE); | 1224 | gFocusMgr.setAppHasFocus(TRUE); |
1214 | LLModalDialog::onAppFocusGained(); | 1225 | LLModalDialog::onAppFocusGained(); |
1226 | |||
1227 | gAgent.onAppFocusGained(); | ||
1215 | if (gToolMgr) | 1228 | if (gToolMgr) |
1216 | { | 1229 | { |
1217 | gToolMgr->onAppFocusGained(); | 1230 | gToolMgr->onAppFocusGained(); |
@@ -1315,7 +1328,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated) | |||
1315 | gAgent.clearAFK(); | 1328 | gAgent.clearAFK(); |
1316 | if (mWindow->getFullscreen() && !mIgnoreActivate) | 1329 | if (mWindow->getFullscreen() && !mIgnoreActivate) |
1317 | { | 1330 | { |
1318 | if (!gQuit) | 1331 | if (!LLApp::isExiting() ) |
1319 | { | 1332 | { |
1320 | if (LLStartUp::getStartupState() >= STATE_STARTED) | 1333 | if (LLStartUp::getStartupState() >= STATE_STARTED) |
1321 | { | 1334 | { |
@@ -1505,7 +1518,7 @@ LLViewerWindow::LLViewerWindow( | |||
1505 | llwarns << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings" | 1518 | llwarns << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings" |
1506 | << llendl; | 1519 | << llendl; |
1507 | #endif | 1520 | #endif |
1508 | app_force_exit(1); | 1521 | LLAppViewer::instance()->forceExit(1); |
1509 | } | 1522 | } |
1510 | 1523 | ||
1511 | // Get the real window rect the window was created with (since there are various OS-dependent reasons why | 1524 | // Get the real window rect the window was created with (since there are various OS-dependent reasons why |
@@ -1892,7 +1905,6 @@ void LLViewerWindow::initWorldUI() | |||
1892 | // TODO: Move instance management into class | 1905 | // TODO: Move instance management into class |
1893 | gFloaterMap = new LLFloaterMap("Map"); | 1906 | gFloaterMap = new LLFloaterMap("Map"); |
1894 | gFloaterMap->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT); | 1907 | gFloaterMap->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT); |
1895 | gFloaterMap->setVisible( gSavedSettings.getBOOL("ShowMiniMap") ); | ||
1896 | 1908 | ||
1897 | // keep onscreen | 1909 | // keep onscreen |
1898 | gFloaterView->adjustToFitScreen(gFloaterMap, FALSE); | 1910 | gFloaterView->adjustToFitScreen(gFloaterMap, FALSE); |
@@ -2107,7 +2119,7 @@ void LLViewerWindow::reshape(S32 width, S32 height) | |||
2107 | // reshape messages. We don't care about these, and we | 2119 | // reshape messages. We don't care about these, and we |
2108 | // don't want to send messages because the message system | 2120 | // don't want to send messages because the message system |
2109 | // may have been destructed. | 2121 | // may have been destructed. |
2110 | if (!gQuit) | 2122 | if (!LLApp::isExiting()) |
2111 | { | 2123 | { |
2112 | if (gNoRender) | 2124 | if (gNoRender) |
2113 | { | 2125 | { |
@@ -2193,13 +2205,22 @@ void LLViewerWindow::reshape(S32 width, S32 height) | |||
2193 | void LLViewerWindow::setNormalControlsVisible( BOOL visible ) | 2205 | void LLViewerWindow::setNormalControlsVisible( BOOL visible ) |
2194 | { | 2206 | { |
2195 | if ( gBottomPanel ) | 2207 | if ( gBottomPanel ) |
2208 | { | ||
2196 | gBottomPanel->setVisible( visible ); | 2209 | gBottomPanel->setVisible( visible ); |
2210 | gBottomPanel->setEnabled( visible ); | ||
2211 | } | ||
2197 | 2212 | ||
2198 | if ( gMenuBarView ) | 2213 | if ( gMenuBarView ) |
2214 | { | ||
2199 | gMenuBarView->setVisible( visible ); | 2215 | gMenuBarView->setVisible( visible ); |
2200 | 2216 | gMenuBarView->setEnabled( visible ); | |
2217 | } | ||
2218 | |||
2201 | if ( gStatusBar ) | 2219 | if ( gStatusBar ) |
2202 | gStatusBar->setVisible( visible ); | 2220 | { |
2221 | gStatusBar->setVisible( visible ); | ||
2222 | gStatusBar->setEnabled( visible ); | ||
2223 | } | ||
2203 | } | 2224 | } |
2204 | 2225 | ||
2205 | 2226 | ||
@@ -2408,6 +2429,18 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) | |||
2408 | toggle_debug_menus(NULL); | 2429 | toggle_debug_menus(NULL); |
2409 | } | 2430 | } |
2410 | 2431 | ||
2432 | // Explicit hack for debug menu. | ||
2433 | if ((mask == (MASK_SHIFT | MASK_CONTROL)) && | ||
2434 | ('G' == key || 'g' == key)) | ||
2435 | { | ||
2436 | if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) //on splash page | ||
2437 | { | ||
2438 | BOOL visible = ! gSavedSettings.getBOOL("ForceShowGrid"); | ||
2439 | gSavedSettings.setBOOL("ForceShowGrid", visible); | ||
2440 | LLPanelLogin::loadLoginPage(); | ||
2441 | } | ||
2442 | } | ||
2443 | |||
2411 | // Example "bug" for bug reporter web page | 2444 | // Example "bug" for bug reporter web page |
2412 | if ((MASK_SHIFT & mask) | 2445 | if ((MASK_SHIFT & mask) |
2413 | && (MASK_ALT & mask) | 2446 | && (MASK_ALT & mask) |
@@ -2439,6 +2472,11 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) | |||
2439 | { | 2472 | { |
2440 | return TRUE; | 2473 | return TRUE; |
2441 | } | 2474 | } |
2475 | // let menus handle navigation keys | ||
2476 | if (gLoginMenuBarView && gLoginMenuBarView->handleKey(key, mask, TRUE)) | ||
2477 | { | ||
2478 | return TRUE; | ||
2479 | } | ||
2442 | 2480 | ||
2443 | // Traverses up the hierarchy | 2481 | // Traverses up the hierarchy |
2444 | LLUICtrl* keyboard_focus = gFocusMgr.getKeyboardFocus(); | 2482 | LLUICtrl* keyboard_focus = gFocusMgr.getKeyboardFocus(); |
@@ -2544,6 +2582,12 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) | |||
2544 | { | 2582 | { |
2545 | return TRUE; | 2583 | return TRUE; |
2546 | } | 2584 | } |
2585 | |||
2586 | // give menus a chance to handle keys | ||
2587 | if (gLoginMenuBarView && gLoginMenuBarView->handleAcceleratorKey(key, mask)) | ||
2588 | { | ||
2589 | return TRUE; | ||
2590 | } | ||
2547 | 2591 | ||
2548 | // don't pass keys on to world when something in ui has focus | 2592 | // don't pass keys on to world when something in ui has focus |
2549 | return gFocusMgr.childHasKeyboardFocus(mRootView) | 2593 | return gFocusMgr.childHasKeyboardFocus(mRootView) |
@@ -2831,7 +2875,7 @@ BOOL LLViewerWindow::handlePerFrameHover() | |||
2831 | // *NOTE: sometimes tools handle the mouse as a captor, so this | 2875 | // *NOTE: sometimes tools handle the mouse as a captor, so this |
2832 | // logic is a little confusing | 2876 | // logic is a little confusing |
2833 | LLTool *tool = NULL; | 2877 | LLTool *tool = NULL; |
2834 | if (gToolMgr && gHoverView) | 2878 | if (gToolMgr && gHoverView && gCamera) |
2835 | { | 2879 | { |
2836 | tool = gToolMgr->getCurrentTool(); | 2880 | tool = gToolMgr->getCurrentTool(); |
2837 | 2881 | ||
@@ -2904,8 +2948,8 @@ BOOL LLViewerWindow::handlePerFrameHover() | |||
2904 | mToolTip->setVisible( TRUE ); | 2948 | mToolTip->setVisible( TRUE ); |
2905 | } | 2949 | } |
2906 | } | 2950 | } |
2907 | 2951 | ||
2908 | if (tool != gToolNull && tool != gToolInspect && tool != gToolDragAndDrop && !gSavedSettings.getBOOL("FreezeTime")) | 2952 | if (tool && tool != gToolNull && tool != gToolInspect && tool != gToolDragAndDrop && !gSavedSettings.getBOOL("FreezeTime")) |
2909 | { | 2953 | { |
2910 | LLMouseHandler *captor = gFocusMgr.getMouseCapture(); | 2954 | LLMouseHandler *captor = gFocusMgr.getMouseCapture(); |
2911 | // With the null, inspect, or drag and drop tool, don't muck | 2955 | // With the null, inspect, or drag and drop tool, don't muck |
@@ -4715,9 +4759,9 @@ void LLViewerWindow::stopGL(BOOL save_state) | |||
4715 | llinfos << "Shutting down GL..." << llendl; | 4759 | llinfos << "Shutting down GL..." << llendl; |
4716 | 4760 | ||
4717 | // Pause texture decode threads (will get unpaused during main loop) | 4761 | // Pause texture decode threads (will get unpaused during main loop) |
4718 | gTextureCache->pause(); | 4762 | LLAppViewer::getTextureCache()->pause(); |
4719 | gImageDecodeThread->pause(); | 4763 | LLAppViewer::getImageDecodeThread()->pause(); |
4720 | gTextureFetch->pause(); | 4764 | LLAppViewer::getTextureFetch()->pause(); |
4721 | 4765 | ||
4722 | gSky.destroyGL(); | 4766 | gSky.destroyGL(); |
4723 | stop_glerror(); | 4767 | stop_glerror(); |
diff --git a/linden/indra/newview/llviewerwindow.h b/linden/indra/newview/llviewerwindow.h index fcd1597..faab518 100644 --- a/linden/indra/newview/llviewerwindow.h +++ b/linden/indra/newview/llviewerwindow.h | |||
@@ -416,4 +416,10 @@ extern BOOL gPickTransparent; | |||
416 | 416 | ||
417 | extern BOOL gDebugFastUIRender; | 417 | extern BOOL gDebugFastUIRender; |
418 | extern S32 CHAT_BAR_HEIGHT; | 418 | extern S32 CHAT_BAR_HEIGHT; |
419 | |||
420 | extern BOOL gDisplayCameraPos; | ||
421 | extern BOOL gDisplayWindInfo; | ||
422 | extern BOOL gDisplayNearestWater; | ||
423 | extern BOOL gDisplayFOV; | ||
424 | |||
419 | #endif | 425 | #endif |
diff --git a/linden/indra/newview/llvoavatar.cpp b/linden/indra/newview/llvoavatar.cpp index 4905ff8..7a225c8 100644 --- a/linden/indra/newview/llvoavatar.cpp +++ b/linden/indra/newview/llvoavatar.cpp | |||
@@ -114,7 +114,7 @@ | |||
114 | #include "llworld.h" | 114 | #include "llworld.h" |
115 | #include "pipeline.h" | 115 | #include "pipeline.h" |
116 | #include "llglslshader.h" | 116 | #include "llglslshader.h" |
117 | #include "viewer.h" | 117 | #include "llappviewer.h" |
118 | #include "lscript_byteformat.h" | 118 | #include "lscript_byteformat.h" |
119 | 119 | ||
120 | //#include "vtune/vtuneapi.h" | 120 | //#include "vtune/vtuneapi.h" |
@@ -1622,7 +1622,6 @@ BOOL LLVOAvatar::buildSkeleton(LLVOAvatarSkeletonInfo *info) | |||
1622 | // LLVOAvatar::buildCharacter() | 1622 | // LLVOAvatar::buildCharacter() |
1623 | // Deferred initialization and rebuild of the avatar. | 1623 | // Deferred initialization and rebuild of the avatar. |
1624 | //----------------------------------------------------------------------------- | 1624 | //----------------------------------------------------------------------------- |
1625 | extern BOOL gPrintMessagesThisFrame; | ||
1626 | void LLVOAvatar::buildCharacter() | 1625 | void LLVOAvatar::buildCharacter() |
1627 | { | 1626 | { |
1628 | LLMemType mt(LLMemType::MTYPE_AVATAR); | 1627 | LLMemType mt(LLMemType::MTYPE_AVATAR); |
@@ -7439,7 +7438,7 @@ void LLVOAvatar::onCustomizeEnd() | |||
7439 | 7438 | ||
7440 | avatar->updateMeshTextures(); | 7439 | avatar->updateMeshTextures(); |
7441 | 7440 | ||
7442 | if( !gQuit ) | 7441 | if( !LLApp::isExiting()) |
7443 | { | 7442 | { |
7444 | avatar->requestLayerSetUploads(); | 7443 | avatar->requestLayerSetUploads(); |
7445 | } | 7444 | } |
diff --git a/linden/indra/newview/llvoclouds.cpp b/linden/indra/newview/llvoclouds.cpp index 07cfcea..7a2ba60 100644 --- a/linden/indra/newview/llvoclouds.cpp +++ b/linden/indra/newview/llvoclouds.cpp | |||
@@ -49,7 +49,9 @@ | |||
49 | #include "llvosky.h" | 49 | #include "llvosky.h" |
50 | #include "llworld.h" | 50 | #include "llworld.h" |
51 | #include "pipeline.h" | 51 | #include "pipeline.h" |
52 | #include "viewer.h" | 52 | |
53 | LLUUID gCloudTextureID = IMG_CLOUD_POOF; | ||
54 | |||
53 | 55 | ||
54 | LLVOClouds::LLVOClouds(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) | 56 | LLVOClouds::LLVOClouds(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) |
55 | : LLAlphaObject(id, LL_VO_CLOUDS, regionp) | 57 | : LLAlphaObject(id, LL_VO_CLOUDS, regionp) |
diff --git a/linden/indra/newview/llvoiceclient.cpp b/linden/indra/newview/llvoiceclient.cpp index f6f7ce7..cf6b13e 100644 --- a/linden/indra/newview/llvoiceclient.cpp +++ b/linden/indra/newview/llvoiceclient.cpp | |||
@@ -42,12 +42,12 @@ | |||
42 | #include "expat/expat.h" | 42 | #include "expat/expat.h" |
43 | #include "llcallbacklist.h" | 43 | #include "llcallbacklist.h" |
44 | #include "llviewerregion.h" | 44 | #include "llviewerregion.h" |
45 | #include "llviewernetwork.h" // for gUserServerChoice | 45 | #include "llviewernetwork.h" // for gGridChoice |
46 | #include "llfloateractivespeakers.h" // for LLSpeakerMgr | 46 | #include "llfloateractivespeakers.h" // for LLSpeakerMgr |
47 | #include "llbase64.h" | 47 | #include "llbase64.h" |
48 | #include "llviewercontrol.h" | 48 | #include "llviewercontrol.h" |
49 | #include "llkeyboard.h" | 49 | #include "llkeyboard.h" |
50 | #include "viewer.h" // for gDisconnected, gDisableVoice | 50 | #include "llappviewer.h" // for gDisconnected, gDisableVoice |
51 | #include "llmutelist.h" // to check for muted avatars | 51 | #include "llmutelist.h" // to check for muted avatars |
52 | #include "llagent.h" | 52 | #include "llagent.h" |
53 | #include "llcachename.h" | 53 | #include "llcachename.h" |
@@ -1052,10 +1052,10 @@ void LLVoiceClient::userAuthorized(const std::string& firstName, const std::stri | |||
1052 | 1052 | ||
1053 | llinfos << "name \"" << mAccountDisplayName << "\" , ID " << agentID << llendl; | 1053 | llinfos << "name \"" << mAccountDisplayName << "\" , ID " << agentID << llendl; |
1054 | 1054 | ||
1055 | std::string userserver = gUserServerName; | 1055 | std::string gridname = gGridName; |
1056 | LLString::toLower(userserver); | 1056 | LLString::toLower(gridname); |
1057 | if((gUserServerChoice == USERSERVER_AGNI) || | 1057 | if((gGridChoice == GRID_INFO_AGNI) || |
1058 | ((gUserServerChoice == USERSERVER_OTHER) && (userserver.find("agni") != std::string::npos))) | 1058 | ((gGridChoice == GRID_INFO_OTHER) && (gridname.find("agni") != std::string::npos))) |
1059 | { | 1059 | { |
1060 | sConnectingToAgni = true; | 1060 | sConnectingToAgni = true; |
1061 | } | 1061 | } |
diff --git a/linden/indra/newview/llvosky.cpp b/linden/indra/newview/llvosky.cpp index d3c24a6..b8d994d 100644 --- a/linden/indra/newview/llvosky.cpp +++ b/linden/indra/newview/llvosky.cpp | |||
@@ -53,7 +53,6 @@ | |||
53 | #include "llviewerregion.h" | 53 | #include "llviewerregion.h" |
54 | #include "llworld.h" | 54 | #include "llworld.h" |
55 | #include "pipeline.h" | 55 | #include "pipeline.h" |
56 | #include "viewer.h" // for gSunTextureID | ||
57 | 56 | ||
58 | const S32 NUM_TILES_X = 8; | 57 | const S32 NUM_TILES_X = 8; |
59 | const S32 NUM_TILES_Y = 4; | 58 | const S32 NUM_TILES_Y = 4; |
@@ -72,6 +71,10 @@ const LLVector2 TEX01 = LLVector2(0.f, 1.f); | |||
72 | const LLVector2 TEX10 = LLVector2(1.f, 0.f); | 71 | const LLVector2 TEX10 = LLVector2(1.f, 0.f); |
73 | const LLVector2 TEX11 = LLVector2(1.f, 1.f); | 72 | const LLVector2 TEX11 = LLVector2(1.f, 1.f); |
74 | 73 | ||
74 | // Exported globals | ||
75 | LLUUID gSunTextureID = IMG_SUN; | ||
76 | LLUUID gMoonTextureID = IMG_MOON; | ||
77 | |||
75 | //static | 78 | //static |
76 | LLColor3 LLHaze::sAirScaSeaLevel; | 79 | LLColor3 LLHaze::sAirScaSeaLevel; |
77 | 80 | ||
diff --git a/linden/indra/newview/llvosky.h b/linden/indra/newview/llvosky.h index 4020114..f3bceb0 100644 --- a/linden/indra/newview/llvosky.h +++ b/linden/indra/newview/llvosky.h | |||
@@ -69,6 +69,12 @@ const F32 fsigma = (6.f + 3.f * sigma) / (6.f-7.f*sigma); | |||
69 | const F64 Ndens = 2.55e25; | 69 | const F64 Ndens = 2.55e25; |
70 | const F64 Ndens2 = Ndens*Ndens; | 70 | const F64 Ndens2 = Ndens*Ndens; |
71 | 71 | ||
72 | // HACK: Allow server to change sun and moon IDs. | ||
73 | // I can't figure out how to pass the appropriate | ||
74 | // information into the LLVOSky constructor. JC | ||
75 | extern LLUUID gSunTextureID; | ||
76 | extern LLUUID gMoonTextureID; | ||
77 | |||
72 | 78 | ||
73 | LL_FORCE_INLINE LLColor3 color_div(const LLColor3 &col1, const LLColor3 &col2) | 79 | LL_FORCE_INLINE LLColor3 color_div(const LLColor3 &col1, const LLColor3 &col2) |
74 | { | 80 | { |
diff --git a/linden/indra/newview/llwearable.cpp b/linden/indra/newview/llwearable.cpp index 4222e84..b4e7910 100644 --- a/linden/indra/newview/llwearable.cpp +++ b/linden/indra/newview/llwearable.cpp | |||
@@ -48,9 +48,6 @@ | |||
48 | #include "llvoavatar.h" | 48 | #include "llvoavatar.h" |
49 | #include "llwearable.h" | 49 | #include "llwearable.h" |
50 | 50 | ||
51 | //#include "viewer.h" | ||
52 | //#include "llvfs.h" | ||
53 | |||
54 | // static | 51 | // static |
55 | S32 LLWearable::sCurrentDefinitionVersion = 1; | 52 | S32 LLWearable::sCurrentDefinitionVersion = 1; |
56 | 53 | ||
diff --git a/linden/indra/newview/llweb.cpp b/linden/indra/newview/llweb.cpp index 7ee4869..eac24ce 100644 --- a/linden/indra/newview/llweb.cpp +++ b/linden/indra/newview/llweb.cpp | |||
@@ -40,14 +40,20 @@ | |||
40 | #include "llviewercontrol.h" | 40 | #include "llviewercontrol.h" |
41 | 41 | ||
42 | // static | 42 | // static |
43 | void LLWeb::loadURL(std::string url) | 43 | void LLWeb::initClass() |
44 | { | ||
45 | LLAlertDialog::setURLLoader(&sAlertURLLoader); | ||
46 | } | ||
47 | |||
48 | // static | ||
49 | void LLWeb::loadURL(const std::string& url) | ||
44 | { | 50 | { |
45 | loadURLExternal(url); | 51 | loadURLExternal(url); |
46 | } | 52 | } |
47 | 53 | ||
48 | 54 | ||
49 | // static | 55 | // static |
50 | void LLWeb::loadURLExternal(std::string url) | 56 | void LLWeb::loadURLExternal(const std::string& url) |
51 | { | 57 | { |
52 | std::string escaped_url = escapeURL(url); | 58 | std::string escaped_url = escapeURL(url); |
53 | #if LL_LIBXUL_ENABLED | 59 | #if LL_LIBXUL_ENABLED |
@@ -57,7 +63,7 @@ void LLWeb::loadURLExternal(std::string url) | |||
57 | 63 | ||
58 | 64 | ||
59 | // static | 65 | // static |
60 | std::string LLWeb::escapeURL(std::string url) | 66 | std::string LLWeb::escapeURL(const std::string& url) |
61 | { | 67 | { |
62 | // The CURL curl_escape() function escapes colons, slashes, | 68 | // The CURL curl_escape() function escapes colons, slashes, |
63 | // and all characters but A-Z and 0-9. Do a cheesy mini-escape. | 69 | // and all characters but A-Z and 0-9. Do a cheesy mini-escape. |
@@ -81,3 +87,12 @@ std::string LLWeb::escapeURL(std::string url) | |||
81 | } | 87 | } |
82 | return escaped_url; | 88 | return escaped_url; |
83 | } | 89 | } |
90 | |||
91 | // virtual | ||
92 | void LLWeb::URLLoader::load(const std::string& url) | ||
93 | { | ||
94 | loadURL(url); | ||
95 | } | ||
96 | |||
97 | // static | ||
98 | LLWeb::URLLoader LLWeb::sAlertURLLoader; | ||
diff --git a/linden/indra/newview/llweb.h b/linden/indra/newview/llweb.h index b339f2d..318410b 100644 --- a/linden/indra/newview/llweb.h +++ b/linden/indra/newview/llweb.h | |||
@@ -34,21 +34,31 @@ | |||
34 | #define LL_LLWEB_H | 34 | #define LL_LLWEB_H |
35 | 35 | ||
36 | #include <string> | 36 | #include <string> |
37 | #include "llalertdialog.h" | ||
37 | 38 | ||
38 | class LLWeb | 39 | class LLWeb |
39 | { | 40 | { |
40 | public: | 41 | public: |
42 | static void initClass(); | ||
43 | |||
41 | // Loads unescaped url in either internal web browser or external | 44 | // Loads unescaped url in either internal web browser or external |
42 | // browser, depending on user settings. | 45 | // browser, depending on user settings. |
43 | static void loadURL(std::string url); | 46 | static void loadURL(const std::string& url); |
44 | 47 | ||
45 | static void loadURL(const char* url) { loadURL( std::string(url) ); } | 48 | static void loadURL(const char* url) { loadURL( std::string(url) ); } |
46 | 49 | ||
47 | // Loads unescaped url in external browser. | 50 | // Loads unescaped url in external browser. |
48 | static void loadURLExternal(std::string url); | 51 | static void loadURLExternal(const std::string& url); |
49 | 52 | ||
50 | // Returns escaped (eg, " " to "%20") url | 53 | // Returns escaped (eg, " " to "%20") url |
51 | static std::string escapeURL(std::string url); | 54 | static std::string escapeURL(const std::string& url); |
55 | |||
56 | class URLLoader : public LLAlertDialog::URLLoader | ||
57 | { | ||
58 | virtual void load(const std::string& url); | ||
59 | }; | ||
60 | |||
61 | static URLLoader sAlertURLLoader; | ||
52 | }; | 62 | }; |
53 | 63 | ||
54 | #endif | 64 | #endif |
diff --git a/linden/indra/newview/llwebbrowserctrl.cpp b/linden/indra/newview/llwebbrowserctrl.cpp index 7fedc4c..afd27bf 100644 --- a/linden/indra/newview/llwebbrowserctrl.cpp +++ b/linden/indra/newview/llwebbrowserctrl.cpp | |||
@@ -42,7 +42,7 @@ | |||
42 | #include "llviewerwindow.h" | 42 | #include "llviewerwindow.h" |
43 | #include "llfloaterhtml.h" | 43 | #include "llfloaterhtml.h" |
44 | #include "llweb.h" | 44 | #include "llweb.h" |
45 | #include "viewer.h" | 45 | #include "llurlsimstring.h" |
46 | 46 | ||
47 | // linden library includes | 47 | // linden library includes |
48 | #include "llfocusmgr.h" | 48 | #include "llfocusmgr.h" |
@@ -544,6 +544,15 @@ void LLWebBrowserCtrl::onStatusTextChange( const EventType& eventIn ) | |||
544 | // virtual | 544 | // virtual |
545 | void LLWebBrowserCtrl::onLocationChange( const EventType& eventIn ) | 545 | void LLWebBrowserCtrl::onLocationChange( const EventType& eventIn ) |
546 | { | 546 | { |
547 | const LLURI url(eventIn.getStringValue()); | ||
548 | LLSD queryMap(url.queryMap()); | ||
549 | std::string redirect_http_hack = queryMap["redirect-http-hack"].asString(); | ||
550 | if (!redirect_http_hack.empty()) | ||
551 | { | ||
552 | LLURLDispatcher::dispatch(redirect_http_hack); | ||
553 | return; | ||
554 | } | ||
555 | |||
547 | // chain this event on to observers of an instance of LLWebBrowserCtrl | 556 | // chain this event on to observers of an instance of LLWebBrowserCtrl |
548 | LLWebBrowserCtrlEvent event( eventIn.getStringValue() ); | 557 | LLWebBrowserCtrlEvent event( eventIn.getStringValue() ); |
549 | mEventEmitter.update( &LLWebBrowserCtrlObserver::onLocationChange, event ); | 558 | mEventEmitter.update( &LLWebBrowserCtrlObserver::onLocationChange, event ); |
@@ -554,7 +563,6 @@ void LLWebBrowserCtrl::onLocationChange( const EventType& eventIn ) | |||
554 | void LLWebBrowserCtrl::onClickLinkHref( const EventType& eventIn ) | 563 | void LLWebBrowserCtrl::onClickLinkHref( const EventType& eventIn ) |
555 | { | 564 | { |
556 | const std::string protocol( "http://" ); | 565 | const std::string protocol( "http://" ); |
557 | |||
558 | if( mOpenLinksInExternalBrowser ) | 566 | if( mOpenLinksInExternalBrowser ) |
559 | { | 567 | { |
560 | if ( eventIn.getStringValue().length() ) | 568 | if ( eventIn.getStringValue().length() ) |
diff --git a/linden/indra/newview/llwind.cpp b/linden/indra/newview/llwind.cpp index b04299b..96a985f 100644 --- a/linden/indra/newview/llwind.cpp +++ b/linden/indra/newview/llwind.cpp | |||
@@ -48,7 +48,6 @@ | |||
48 | // viewer | 48 | // viewer |
49 | #include "noise.h" | 49 | #include "noise.h" |
50 | #include "v4color.h" | 50 | #include "v4color.h" |
51 | #include "viewer.h" | ||
52 | #include "llagent.h" | 51 | #include "llagent.h" |
53 | #include "llworld.h" | 52 | #include "llworld.h" |
54 | 53 | ||
diff --git a/linden/indra/newview/llwindebug.cpp b/linden/indra/newview/llwindebug.cpp index b65262c..d0129c8 100644 --- a/linden/indra/newview/llwindebug.cpp +++ b/linden/indra/newview/llwindebug.cpp | |||
@@ -33,16 +33,69 @@ | |||
33 | 33 | ||
34 | #ifdef LL_WINDOWS | 34 | #ifdef LL_WINDOWS |
35 | 35 | ||
36 | #include <tchar.h> | ||
37 | #include <tlhelp32.h> | ||
38 | #include "llappviewer.h" | ||
36 | #include "llwindebug.h" | 39 | #include "llwindebug.h" |
37 | #include "llviewercontrol.h" | 40 | #include "llviewercontrol.h" |
38 | #include "lldir.h" | 41 | #include "lldir.h" |
42 | #include "llsd.h" | ||
43 | #include "llsdserialize.h" | ||
44 | |||
45 | #pragma warning(disable: 4200) //nonstandard extension used : zero-sized array in struct/union | ||
46 | #pragma warning(disable: 4100) //unreferenced formal parameter | ||
47 | |||
48 | /* | ||
49 | LLSD Block for Windows Dump Information | ||
50 | <llsd> | ||
51 | <map> | ||
52 | <key>Platform</key> | ||
53 | <string></string> | ||
54 | <key>Process</key> | ||
55 | <string></string> | ||
56 | <key>Module</key> | ||
57 | <string></string> | ||
58 | <key>DateModified</key> | ||
59 | <string></string> | ||
60 | <key>ExceptionCode</key> | ||
61 | <string></string> | ||
62 | <key>ExceptionRead/WriteAddress</key> | ||
63 | <string></string> | ||
64 | <key>Instruction</key> | ||
65 | <string></string> | ||
66 | <key>Registers</key> | ||
67 | <map> | ||
68 | <!-- Continued for all registers --> | ||
69 | <key>EIP</key> | ||
70 | <string>...</string> | ||
71 | <!-- ... --> | ||
72 | </map> | ||
73 | <key>Call Stack</key> | ||
74 | <array> | ||
75 | <!-- One map per stack frame --> | ||
76 | <map> | ||
77 | <key>ModuleName</key> | ||
78 | <string></string> | ||
79 | <key>ModuleBaseAddress</key> | ||
80 | <string></string> | ||
81 | <key>ModuleOffsetAddress</key> | ||
82 | <string></string> | ||
83 | <key>Parameters</key> | ||
84 | <array> | ||
85 | <string></string> | ||
86 | </array> | ||
87 | </map> | ||
88 | <!-- ... --> | ||
89 | </array> | ||
90 | </map> | ||
91 | </llsd> | ||
92 | |||
93 | */ | ||
39 | 94 | ||
40 | // From viewer.h | 95 | // From viewer.h |
41 | extern BOOL gInProductionGrid; | 96 | extern BOOL gInProductionGrid; |
42 | 97 | ||
43 | extern void (*gCrashCallback)(void); | 98 | extern void (*gCrashCallback)(void); |
44 | extern void write_debug(const char *str); | ||
45 | extern void write_debug(const std::string &str); | ||
46 | 99 | ||
47 | // based on dbghelp.h | 100 | // based on dbghelp.h |
48 | typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, | 101 | typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, |
@@ -53,6 +106,248 @@ typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hF | |||
53 | 106 | ||
54 | MINIDUMPWRITEDUMP f_mdwp = NULL; | 107 | MINIDUMPWRITEDUMP f_mdwp = NULL; |
55 | 108 | ||
109 | #undef UNICODE | ||
110 | |||
111 | HMODULE hDbgHelp; | ||
112 | |||
113 | // Tool Help functions. | ||
114 | typedef HANDLE (WINAPI * CREATE_TOOL_HELP32_SNAPSHOT)(DWORD dwFlags, DWORD th32ProcessID); | ||
115 | typedef BOOL (WINAPI * MODULE32_FIRST)(HANDLE hSnapshot, LPMODULEENTRY32 lpme); | ||
116 | typedef BOOL (WINAPI * MODULE32_NEST)(HANDLE hSnapshot, LPMODULEENTRY32 lpme); | ||
117 | |||
118 | CREATE_TOOL_HELP32_SNAPSHOT CreateToolhelp32Snapshot_; | ||
119 | MODULE32_FIRST Module32First_; | ||
120 | MODULE32_NEST Module32Next_; | ||
121 | |||
122 | #define DUMP_SIZE_MAX 8000 //max size of our dump | ||
123 | #define CALL_TRACE_MAX ((DUMP_SIZE_MAX - 2000) / (MAX_PATH + 40)) //max number of traced calls | ||
124 | #define NL L"\r\n" //new line | ||
125 | |||
126 | //Windows Call Stack Construction idea from | ||
127 | //http://www.codeproject.com/tools/minidump.asp | ||
128 | |||
129 | //**************************************************************************************** | ||
130 | BOOL WINAPI Get_Module_By_Ret_Addr(PBYTE Ret_Addr, LPWSTR Module_Name, PBYTE & Module_Addr) | ||
131 | //**************************************************************************************** | ||
132 | // Find module by Ret_Addr (address in the module). | ||
133 | // Return Module_Name (full path) and Module_Addr (start address). | ||
134 | // Return TRUE if found. | ||
135 | { | ||
136 | MODULEENTRY32 M = {sizeof(M)}; | ||
137 | HANDLE hSnapshot; | ||
138 | |||
139 | bool found = false; | ||
140 | |||
141 | if (CreateToolhelp32Snapshot_) | ||
142 | { | ||
143 | hSnapshot = CreateToolhelp32Snapshot_(TH32CS_SNAPMODULE, 0); | ||
144 | |||
145 | if ((hSnapshot != INVALID_HANDLE_VALUE) && | ||
146 | Module32First_(hSnapshot, &M)) | ||
147 | { | ||
148 | do | ||
149 | { | ||
150 | if (DWORD(Ret_Addr - M.modBaseAddr) < M.modBaseSize) | ||
151 | { | ||
152 | lstrcpyn(Module_Name, M.szExePath, MAX_PATH); | ||
153 | Module_Addr = M.modBaseAddr; | ||
154 | found = true; | ||
155 | break; | ||
156 | } | ||
157 | } while (Module32Next_(hSnapshot, &M)); | ||
158 | } | ||
159 | |||
160 | CloseHandle(hSnapshot); | ||
161 | } | ||
162 | |||
163 | return found; | ||
164 | } //Get_Module_By_Ret_Addr | ||
165 | |||
166 | //****************************************************************** | ||
167 | void WINAPI Get_Call_Stack(PEXCEPTION_POINTERS pException, LLSD& info) | ||
168 | //****************************************************************** | ||
169 | // Fill Str with call stack info. | ||
170 | // pException can be either GetExceptionInformation() or NULL. | ||
171 | // If pException = NULL - get current call stack. | ||
172 | { | ||
173 | LPWSTR Module_Name = new WCHAR[MAX_PATH]; | ||
174 | PBYTE Module_Addr = 0; | ||
175 | |||
176 | typedef struct STACK | ||
177 | { | ||
178 | STACK * Ebp; | ||
179 | PBYTE Ret_Addr; | ||
180 | DWORD Param[0]; | ||
181 | } STACK, * PSTACK; | ||
182 | |||
183 | STACK Stack = {0, 0}; | ||
184 | PSTACK Ebp; | ||
185 | |||
186 | if (pException) //fake frame for exception address | ||
187 | { | ||
188 | Stack.Ebp = (PSTACK)pException->ContextRecord->Ebp; | ||
189 | Stack.Ret_Addr = (PBYTE)pException->ExceptionRecord->ExceptionAddress; | ||
190 | Ebp = &Stack; | ||
191 | } | ||
192 | else | ||
193 | { | ||
194 | Ebp = (PSTACK)&pException - 1; //frame addr of Get_Call_Stack() | ||
195 | |||
196 | // Skip frame of Get_Call_Stack(). | ||
197 | if (!IsBadReadPtr(Ebp, sizeof(PSTACK))) | ||
198 | Ebp = Ebp->Ebp; //caller ebp | ||
199 | } | ||
200 | |||
201 | // Trace CALL_TRACE_MAX calls maximum - not to exceed DUMP_SIZE_MAX. | ||
202 | // Break trace on wrong stack frame. | ||
203 | for (int Ret_Addr_I = 0, i = 0; | ||
204 | (Ret_Addr_I < CALL_TRACE_MAX) && !IsBadReadPtr(Ebp, sizeof(PSTACK)) && !IsBadCodePtr(FARPROC(Ebp->Ret_Addr)); | ||
205 | Ret_Addr_I++, Ebp = Ebp->Ebp, ++i) | ||
206 | { | ||
207 | // If module with Ebp->Ret_Addr found. | ||
208 | |||
209 | if (Get_Module_By_Ret_Addr(Ebp->Ret_Addr, Module_Name, Module_Addr)) | ||
210 | { | ||
211 | // Save module's address and full path. | ||
212 | info["CallStack"][i]["ModuleName"] = ll_convert_wide_to_string(Module_Name); | ||
213 | info["CallStack"][i]["ModuleAddress"] = (int)Module_Addr; | ||
214 | info["CallStack"][i]["CallOffset"] = (int)(Ebp->Ret_Addr - Module_Addr); | ||
215 | |||
216 | LLSD params; | ||
217 | // Save 5 params of the call. We don't know the real number of params. | ||
218 | if (pException && !Ret_Addr_I) //fake frame for exception address | ||
219 | params[0] = "Exception Offset"; | ||
220 | else if (!IsBadReadPtr(Ebp, sizeof(PSTACK) + 5 * sizeof(DWORD))) | ||
221 | { | ||
222 | for(int j = 0; j < 5; ++j) | ||
223 | { | ||
224 | params[j] = (int)Ebp->Param[j]; | ||
225 | } | ||
226 | } | ||
227 | info["CallStack"][i]["Parameters"] = params; | ||
228 | } | ||
229 | info["CallStack"][i]["ReturnAddress"] = (int)Ebp->Ret_Addr; | ||
230 | } | ||
231 | } //Get_Call_Stack | ||
232 | |||
233 | //*********************************** | ||
234 | void WINAPI Get_Version_Str(LLSD& info) | ||
235 | //*********************************** | ||
236 | // Fill Str with Windows version. | ||
237 | { | ||
238 | OSVERSIONINFOEX V = {sizeof(OSVERSIONINFOEX)}; //EX for NT 5.0 and later | ||
239 | |||
240 | if (!GetVersionEx((POSVERSIONINFO)&V)) | ||
241 | { | ||
242 | ZeroMemory(&V, sizeof(V)); | ||
243 | V.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); | ||
244 | GetVersionEx((POSVERSIONINFO)&V); | ||
245 | } | ||
246 | |||
247 | if (V.dwPlatformId != VER_PLATFORM_WIN32_NT) | ||
248 | V.dwBuildNumber = LOWORD(V.dwBuildNumber); //for 9x HIWORD(dwBuildNumber) = 0x04xx | ||
249 | |||
250 | info["Platform"] = llformat("Windows: %d.%d.%d, SP %d.%d, Product Type %d", //SP - service pack, Product Type - VER_NT_WORKSTATION,... | ||
251 | V.dwMajorVersion, V.dwMinorVersion, V.dwBuildNumber, V.wServicePackMajor, V.wServicePackMinor, V.wProductType); | ||
252 | } //Get_Version_Str | ||
253 | |||
254 | //************************************************************* | ||
255 | LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException) | ||
256 | //************************************************************* | ||
257 | // Allocate Str[DUMP_SIZE_MAX] and return Str with dump, if !pException - just return call stack in Str. | ||
258 | { | ||
259 | LLSD info; | ||
260 | LPWSTR Str; | ||
261 | int Str_Len; | ||
262 | int i; | ||
263 | LPWSTR Module_Name = new WCHAR[MAX_PATH]; | ||
264 | PBYTE Module_Addr; | ||
265 | HANDLE hFile; | ||
266 | FILETIME Last_Write_Time; | ||
267 | FILETIME Local_File_Time; | ||
268 | SYSTEMTIME T; | ||
269 | |||
270 | Str = new WCHAR[DUMP_SIZE_MAX]; | ||
271 | Str_Len = 0; | ||
272 | if (!Str) | ||
273 | return NULL; | ||
274 | |||
275 | Get_Version_Str(info); | ||
276 | |||
277 | GetModuleFileName(NULL, Str, MAX_PATH); | ||
278 | info["Process"] = ll_convert_wide_to_string(Str); | ||
279 | |||
280 | // If exception occurred. | ||
281 | if (pException) | ||
282 | { | ||
283 | EXCEPTION_RECORD & E = *pException->ExceptionRecord; | ||
284 | CONTEXT & C = *pException->ContextRecord; | ||
285 | |||
286 | // If module with E.ExceptionAddress found - save its path and date. | ||
287 | if (Get_Module_By_Ret_Addr((PBYTE)E.ExceptionAddress, Module_Name, Module_Addr)) | ||
288 | { | ||
289 | info["Module"] = ll_convert_wide_to_string(Module_Name); | ||
290 | |||
291 | if ((hFile = CreateFile(Module_Name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, | ||
292 | FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE) | ||
293 | { | ||
294 | if (GetFileTime(hFile, NULL, NULL, &Last_Write_Time)) | ||
295 | { | ||
296 | FileTimeToLocalFileTime(&Last_Write_Time, &Local_File_Time); | ||
297 | FileTimeToSystemTime(&Local_File_Time, &T); | ||
298 | |||
299 | info["DateModified"] = llformat("%02d/%02d/%d", T.wMonth, T.wDay, T.wYear); | ||
300 | } | ||
301 | CloseHandle(hFile); | ||
302 | } | ||
303 | } | ||
304 | else | ||
305 | { | ||
306 | info["ExceptionAddr"] = (int)E.ExceptionAddress; | ||
307 | } | ||
308 | |||
309 | info["ExceptionCode"] = (int)E.ExceptionCode; | ||
310 | |||
311 | /* | ||
312 | //TODO: Fix this | ||
313 | if (E.ExceptionCode == EXCEPTION_ACCESS_VIOLATION) | ||
314 | { | ||
315 | // Access violation type - Write/Read. | ||
316 | LLSD exception_info; | ||
317 | exception_info["Type"] = E.ExceptionInformation[0] ? "Write" : "Read"; | ||
318 | exception_info["Address"] = llformat("%08x", E.ExceptionInformation[1]); | ||
319 | info["Exception Information"] = exception_info; | ||
320 | } | ||
321 | */ | ||
322 | |||
323 | |||
324 | // Save instruction that caused exception. | ||
325 | LLString str; | ||
326 | for (i = 0; i < 16; i++) | ||
327 | str += llformat(" %02X", PBYTE(E.ExceptionAddress)[i]); | ||
328 | info["Instruction"] = str; | ||
329 | |||
330 | LLSD registers; | ||
331 | registers["EAX"] = (int)C.Eax; | ||
332 | registers["EBX"] = (int)C.Ebx; | ||
333 | registers["ECX"] = (int)C.Ecx; | ||
334 | registers["EDX"] = (int)C.Edx; | ||
335 | registers["ESI"] = (int)C.Esi; | ||
336 | registers["EDI"] = (int)C.Edi; | ||
337 | registers["ESP"] = (int)C.Esp; | ||
338 | registers["EBP"] = (int)C.Ebp; | ||
339 | registers["EIP"] = (int)C.Eip; | ||
340 | registers["EFlags"] = (int)C.EFlags; | ||
341 | info["Registers"] = registers; | ||
342 | } //if (pException) | ||
343 | |||
344 | // Save call stack info. | ||
345 | Get_Call_Stack(pException, info); | ||
346 | |||
347 | return info; | ||
348 | } //Get_Exception_Info | ||
349 | |||
350 | #define UNICODE | ||
56 | 351 | ||
57 | 352 | ||
58 | class LLMemoryReserve { | 353 | class LLMemoryReserve { |
@@ -96,7 +391,6 @@ static LLMemoryReserve gEmergencyMemoryReserve; | |||
96 | // static | 391 | // static |
97 | BOOL LLWinDebug::setupExceptionHandler() | 392 | BOOL LLWinDebug::setupExceptionHandler() |
98 | { | 393 | { |
99 | #ifdef LL_RELEASE_FOR_DOWNLOAD | ||
100 | 394 | ||
101 | static BOOL s_first_run = TRUE; | 395 | static BOOL s_first_run = TRUE; |
102 | // Load the dbghelp dll now, instead of waiting for the crash. | 396 | // Load the dbghelp dll now, instead of waiting for the crash. |
@@ -123,7 +417,7 @@ BOOL LLWinDebug::setupExceptionHandler() | |||
123 | msg += local_dll_name; | 417 | msg += local_dll_name; |
124 | msg += "!\n"; | 418 | msg += "!\n"; |
125 | 419 | ||
126 | write_debug(msg.c_str()); | 420 | //write_debug(msg.c_str()); |
127 | 421 | ||
128 | ok = FALSE; | 422 | ok = FALSE; |
129 | } | 423 | } |
@@ -133,7 +427,7 @@ BOOL LLWinDebug::setupExceptionHandler() | |||
133 | 427 | ||
134 | if (!f_mdwp) | 428 | if (!f_mdwp) |
135 | { | 429 | { |
136 | write_debug("No MiniDumpWriteDump!\n"); | 430 | //write_debug("No MiniDumpWriteDump!\n"); |
137 | FreeLibrary(hDll); | 431 | FreeLibrary(hDll); |
138 | hDll = NULL; | 432 | hDll = NULL; |
139 | ok = FALSE; | 433 | ok = FALSE; |
@@ -146,6 +440,13 @@ BOOL LLWinDebug::setupExceptionHandler() | |||
146 | LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; | 440 | LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; |
147 | prev_filter = SetUnhandledExceptionFilter(LLWinDebug::handleException); | 441 | prev_filter = SetUnhandledExceptionFilter(LLWinDebug::handleException); |
148 | 442 | ||
443 | // Try to get Tool Help library functions. | ||
444 | HMODULE hKernel32; | ||
445 | hKernel32 = GetModuleHandle(_T("KERNEL32")); | ||
446 | CreateToolhelp32Snapshot_ = (CREATE_TOOL_HELP32_SNAPSHOT)GetProcAddress(hKernel32, "CreateToolhelp32Snapshot"); | ||
447 | Module32First_ = (MODULE32_FIRST)GetProcAddress(hKernel32, "Module32FirstW"); | ||
448 | Module32Next_ = (MODULE32_NEST)GetProcAddress(hKernel32, "Module32NextW"); | ||
449 | |||
149 | if (s_first_run) | 450 | if (s_first_run) |
150 | { | 451 | { |
151 | // We're fine, this is the first run. | 452 | // We're fine, this is the first run. |
@@ -162,56 +463,16 @@ BOOL LLWinDebug::setupExceptionHandler() | |||
162 | llwarns << "Our exception handler (" << (void *)LLWinDebug::handleException << ") replaced with " << prev_filter << "!" << llendl; | 463 | llwarns << "Our exception handler (" << (void *)LLWinDebug::handleException << ") replaced with " << prev_filter << "!" << llendl; |
163 | ok = FALSE; | 464 | ok = FALSE; |
164 | } | 465 | } |
466 | |||
165 | return ok; | 467 | return ok; |
166 | #else | ||
167 | // Internal builds don't mess with exception handling. | 468 | // Internal builds don't mess with exception handling. |
168 | return TRUE; | 469 | //return TRUE; |
169 | #endif | ||
170 | } | ||
171 | |||
172 | void LLWinDebug::writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const char *filename) | ||
173 | { | ||
174 | if(f_mdwp == NULL) | ||
175 | { | ||
176 | write_debug("No way to generate a minidump, no MiniDumpWriteDump function!\n"); | ||
177 | } | ||
178 | else if(gDirUtilp == NULL) | ||
179 | { | ||
180 | write_debug("No way to generate a minidump, no gDirUtilp!\n"); | ||
181 | } | ||
182 | else | ||
183 | { | ||
184 | std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, | ||
185 | filename); | ||
186 | |||
187 | HANDLE hFile = CreateFileA(dump_path.c_str(), | ||
188 | GENERIC_WRITE, | ||
189 | FILE_SHARE_WRITE, | ||
190 | NULL, | ||
191 | CREATE_ALWAYS, | ||
192 | FILE_ATTRIBUTE_NORMAL, | ||
193 | NULL); | ||
194 | |||
195 | if (hFile != INVALID_HANDLE_VALUE) | ||
196 | { | ||
197 | // Write the dump, ignoring the return value | ||
198 | f_mdwp(GetCurrentProcess(), | ||
199 | GetCurrentProcessId(), | ||
200 | hFile, | ||
201 | type, | ||
202 | ExInfop, | ||
203 | NULL, | ||
204 | NULL); | ||
205 | |||
206 | CloseHandle(hFile); | ||
207 | } | ||
208 | |||
209 | } | ||
210 | } | 470 | } |
211 | |||
212 | // static | 471 | // static |
213 | LONG LLWinDebug::handleException(struct _EXCEPTION_POINTERS *exception_infop) | 472 | LONG LLWinDebug::handleException(struct _EXCEPTION_POINTERS *exception_infop) |
214 | { | 473 | { |
474 | // *NOTE:Mani - This method is no longer the initial exception handler. | ||
475 | // It is called from viewer_windows_exception_handler() and other places. | ||
215 | 476 | ||
216 | // | 477 | // |
217 | // Let go of a bunch of reserved memory to give library calls etc | 478 | // Let go of a bunch of reserved memory to give library calls etc |
@@ -220,50 +481,34 @@ LONG LLWinDebug::handleException(struct _EXCEPTION_POINTERS *exception_infop) | |||
220 | // | 481 | // |
221 | gEmergencyMemoryReserve.release(); | 482 | gEmergencyMemoryReserve.release(); |
222 | 483 | ||
223 | BOOL userWantsMaxiDump = | ||
224 | (stricmp(gSavedSettings.getString("LastName").c_str(), "linden") == 0) | ||
225 | || (stricmp(gSavedSettings.getString("LastName").c_str(), "tester") == 0); | ||
226 | |||
227 | BOOL alsoSaveMaxiDump = userWantsMaxiDump && !gInProductionGrid; | ||
228 | |||
229 | /* Calculate alsoSaveMaxiDump here */ | ||
230 | |||
231 | if (exception_infop) | 484 | if (exception_infop) |
232 | { | 485 | { |
233 | _MINIDUMP_EXCEPTION_INFORMATION ExInfo; | ||
234 | 486 | ||
235 | ExInfo.ThreadId = ::GetCurrentThreadId(); | 487 | std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, |
236 | ExInfo.ExceptionPointers = exception_infop; | 488 | "SecondLifeException"); |
237 | ExInfo.ClientPointers = NULL; | ||
238 | 489 | ||
239 | writeDumpToFile(MiniDumpNormal, &ExInfo, "SecondLife.dmp"); | 490 | std::string log_path = dump_path + ".log"; |
240 | 491 | ||
241 | if(alsoSaveMaxiDump) | 492 | LLSD info; |
242 | writeDumpToFile((MINIDUMP_TYPE)(MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory), &ExInfo, "SecondLifePlus.dmp"); | 493 | info = Get_Exception_Info(exception_infop); |
494 | if (info) | ||
495 | { | ||
496 | std::ofstream out_file(log_path.c_str()); | ||
497 | LLSDSerialize::toPrettyXML(info, out_file); | ||
498 | out_file.close(); | ||
499 | } | ||
243 | } | 500 | } |
244 | else | 501 | else |
245 | { | 502 | { |
246 | writeDumpToFile(MiniDumpNormal, NULL, "SecondLife.dmp"); | ||
247 | |||
248 | if(alsoSaveMaxiDump) | ||
249 | writeDumpToFile((MINIDUMP_TYPE)(MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory), NULL, "SecondLifePlus.dmp"); | ||
250 | } | ||
251 | |||
252 | if (!exception_infop) | ||
253 | { | ||
254 | // We're calling this due to a network error, not due to an actual exception. | 503 | // We're calling this due to a network error, not due to an actual exception. |
255 | // It doesn't realy matter what we return. | 504 | // It doesn't realy matter what we return. |
256 | return EXCEPTION_CONTINUE_SEARCH; | 505 | return EXCEPTION_CONTINUE_SEARCH; |
257 | } | 506 | } |
258 | 507 | ||
259 | // | 508 | //handle viewer crash must be called here since |
260 | // Call the newview crash callback, which will spawn the crash | 509 | //we don't return handling of the application |
261 | // reporter. It may or may not spawn a dialog. | 510 | //back to the process. |
262 | // | 511 | LLAppViewer::handleViewerCrash(); |
263 | if (gCrashCallback) | ||
264 | { | ||
265 | gCrashCallback(); | ||
266 | } | ||
267 | 512 | ||
268 | // | 513 | // |
269 | // At this point, we always want to exit the app. There's no graceful | 514 | // At this point, we always want to exit the app. There's no graceful |
@@ -276,4 +521,3 @@ LONG LLWinDebug::handleException(struct _EXCEPTION_POINTERS *exception_infop) | |||
276 | } | 521 | } |
277 | 522 | ||
278 | #endif | 523 | #endif |
279 | |||
diff --git a/linden/indra/newview/llwindebug.h b/linden/indra/newview/llwindebug.h index bb1f11d..e420138 100644 --- a/linden/indra/newview/llwindebug.h +++ b/linden/indra/newview/llwindebug.h | |||
@@ -41,7 +41,7 @@ public: | |||
41 | static BOOL setupExceptionHandler(); | 41 | static BOOL setupExceptionHandler(); |
42 | 42 | ||
43 | static LONG WINAPI handleException(struct _EXCEPTION_POINTERS *pExceptionInfo); | 43 | static LONG WINAPI handleException(struct _EXCEPTION_POINTERS *pExceptionInfo); |
44 | static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const char *filename); | 44 | //static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const char *filename); |
45 | }; | 45 | }; |
46 | 46 | ||
47 | #endif // LL_LLWINDEBUG_H | 47 | #endif // LL_LLWINDEBUG_H |
diff --git a/linden/indra/newview/llworld.cpp b/linden/indra/newview/llworld.cpp index dd3223c..e761235 100644 --- a/linden/indra/newview/llworld.cpp +++ b/linden/indra/newview/llworld.cpp | |||
@@ -56,7 +56,7 @@ | |||
56 | #include "llvowater.h" | 56 | #include "llvowater.h" |
57 | #include "message.h" | 57 | #include "message.h" |
58 | #include "pipeline.h" | 58 | #include "pipeline.h" |
59 | #include "viewer.h" // for do_disconnect() | 59 | #include "llappviewer.h" // for do_disconnect() |
60 | 60 | ||
61 | // | 61 | // |
62 | // Globals | 62 | // Globals |
@@ -248,7 +248,7 @@ void LLWorld::removeRegion(const LLHost &host) | |||
248 | llwarns << "gFrameTimeSeconds " << gFrameTimeSeconds << llendl; | 248 | llwarns << "gFrameTimeSeconds " << gFrameTimeSeconds << llendl; |
249 | 249 | ||
250 | llwarns << "Disabling region " << regionp->getName() << " that agent is in!" << llendl; | 250 | llwarns << "Disabling region " << regionp->getName() << " that agent is in!" << llendl; |
251 | do_disconnect("You have been disconnected from the region you were in."); | 251 | LLAppViewer::instance()->forceDisconnect("You have been disconnected from the region you were in."); |
252 | return; | 252 | return; |
253 | } | 253 | } |
254 | 254 | ||
@@ -972,16 +972,16 @@ void LLWorld::requestCacheMisses() | |||
972 | } | 972 | } |
973 | } | 973 | } |
974 | 974 | ||
975 | LLString LLWorld::getInfoString() | 975 | void LLWorld::getInfo(LLSD& info) |
976 | { | 976 | { |
977 | LLString info_string("World Info:\n"); | 977 | LLSD region_info; |
978 | for (region_list_t::iterator iter = mRegionList.begin(); | 978 | for (region_list_t::iterator iter = mRegionList.begin(); |
979 | iter != mRegionList.end(); ++iter) | 979 | iter != mRegionList.end(); ++iter) |
980 | { | 980 | { |
981 | LLViewerRegion* regionp = *iter; | 981 | LLViewerRegion* regionp = *iter; |
982 | info_string += regionp->getInfoString(); | 982 | regionp->getInfo(region_info); |
983 | info["World"].append(region_info); | ||
983 | } | 984 | } |
984 | return info_string; | ||
985 | } | 985 | } |
986 | 986 | ||
987 | void LLWorld::disconnectRegions() | 987 | void LLWorld::disconnectRegions() |
diff --git a/linden/indra/newview/llworld.h b/linden/indra/newview/llworld.h index 91685cd..e634459 100644 --- a/linden/indra/newview/llworld.h +++ b/linden/indra/newview/llworld.h | |||
@@ -142,7 +142,7 @@ public: | |||
142 | void setSpaceTimeUSec(const U64 space_time_usec); | 142 | void setSpaceTimeUSec(const U64 space_time_usec); |
143 | U64 getSpaceTimeUSec() const; | 143 | U64 getSpaceTimeUSec() const; |
144 | 144 | ||
145 | LLString getInfoString(); | 145 | void getInfo(LLSD& info); |
146 | 146 | ||
147 | public: | 147 | public: |
148 | typedef std::list<LLViewerRegion*> region_list_t; | 148 | typedef std::list<LLViewerRegion*> region_list_t; |
diff --git a/linden/indra/newview/llworldmap.cpp b/linden/indra/newview/llworldmap.cpp index 6ba10ea..50c9cee 100644 --- a/linden/indra/newview/llworldmap.cpp +++ b/linden/indra/newview/llworldmap.cpp | |||
@@ -36,7 +36,7 @@ | |||
36 | #include "llregionhandle.h" | 36 | #include "llregionhandle.h" |
37 | #include "message.h" | 37 | #include "message.h" |
38 | 38 | ||
39 | #include "viewer.h" // for gPacificDaylightTime | 39 | #include "llappviewer.h" // for gPacificDaylightTime |
40 | #include "llagent.h" | 40 | #include "llagent.h" |
41 | #include "llmapresponders.h" | 41 | #include "llmapresponders.h" |
42 | #include "llviewercontrol.h" | 42 | #include "llviewercontrol.h" |
diff --git a/linden/indra/newview/llworldmapview.cpp b/linden/indra/newview/llworldmapview.cpp index dc68910..dac6938 100644 --- a/linden/indra/newview/llworldmapview.cpp +++ b/linden/indra/newview/llworldmapview.cpp | |||
@@ -61,7 +61,7 @@ | |||
61 | #include "llviewerwindow.h" | 61 | #include "llviewerwindow.h" |
62 | #include "llworld.h" | 62 | #include "llworld.h" |
63 | #include "llworldmap.h" | 63 | #include "llworldmap.h" |
64 | #include "viewer.h" // Only for constants! | 64 | #include "llappviewer.h" // Only for constants! |
65 | 65 | ||
66 | #include "llglheaders.h" | 66 | #include "llglheaders.h" |
67 | 67 | ||
diff --git a/linden/indra/newview/llxmlrpctransaction.cpp b/linden/indra/newview/llxmlrpctransaction.cpp index 905e35c..3df2073 100644 --- a/linden/indra/newview/llxmlrpctransaction.cpp +++ b/linden/indra/newview/llxmlrpctransaction.cpp | |||
@@ -39,7 +39,7 @@ | |||
39 | #include <curl/curl.h> | 39 | #include <curl/curl.h> |
40 | #include <xmlrpc-epi/xmlrpc.h> | 40 | #include <xmlrpc-epi/xmlrpc.h> |
41 | 41 | ||
42 | #include "viewer.h" | 42 | #include "llappviewer.h" |
43 | 43 | ||
44 | LLXMLRPCValue LLXMLRPCValue::operator[](const char* id) const | 44 | LLXMLRPCValue LLXMLRPCValue::operator[](const char* id) const |
45 | { | 45 | { |
diff --git a/linden/indra/newview/macutil_Prefix.h b/linden/indra/newview/macutil_Prefix.h index f8050c8..145a01c 100644 --- a/linden/indra/newview/macutil_Prefix.h +++ b/linden/indra/newview/macutil_Prefix.h | |||
@@ -39,3 +39,6 @@ | |||
39 | 39 | ||
40 | #include <Carbon/Carbon.h> | 40 | #include <Carbon/Carbon.h> |
41 | 41 | ||
42 | #undef check | ||
43 | #undef verify | ||
44 | #undef require | ||
diff --git a/linden/indra/newview/macview.xcodeproj/default.pbxuser b/linden/indra/newview/macview.xcodeproj/default.pbxuser new file mode 100644 index 0000000..62e730f --- /dev/null +++ b/linden/indra/newview/macview.xcodeproj/default.pbxuser | |||
@@ -0,0 +1,183 @@ | |||
1 | // !$*UTF8*$! | ||
2 | { | ||
3 | 20286C28FDCF999611CA2CEA /* Project object */ = { | ||
4 | activeBuildConfigurationName = Development; | ||
5 | activeExecutable = E3C7DAB60CFF871100AD076D /* newview */; | ||
6 | activeTarget = 5503B89E05446B1F003D051F /* newview */; | ||
7 | breakpointsGroup = E3C7DAE10CFF885000AD076D /* XCBreakpointsBucket */; | ||
8 | codeSenseManager = E3C7DAC70CFF874400AD076D /* Code sense */; | ||
9 | executables = ( | ||
10 | E3C7DAB40CFF871100AD076D /* AutoUpdater */, | ||
11 | E3C7DAB50CFF871100AD076D /* crashreporter */, | ||
12 | E3C7DAB60CFF871100AD076D /* newview */, | ||
13 | ); | ||
14 | perUserDictionary = { | ||
15 | PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { | ||
16 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; | ||
17 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; | ||
18 | PBXFileTableDataSourceColumnWidthsKey = ( | ||
19 | 20, | ||
20 | 243, | ||
21 | 20, | ||
22 | 48, | ||
23 | 43, | ||
24 | 43, | ||
25 | 20, | ||
26 | ); | ||
27 | PBXFileTableDataSourceColumnsKey = ( | ||
28 | PBXFileDataSource_FiletypeID, | ||
29 | PBXFileDataSource_Filename_ColumnID, | ||
30 | PBXFileDataSource_Built_ColumnID, | ||
31 | PBXFileDataSource_ObjectSize_ColumnID, | ||
32 | PBXFileDataSource_Errors_ColumnID, | ||
33 | PBXFileDataSource_Warnings_ColumnID, | ||
34 | PBXFileDataSource_Target_ColumnID, | ||
35 | ); | ||
36 | }; | ||
37 | PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { | ||
38 | PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; | ||
39 | PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; | ||
40 | PBXFileTableDataSourceColumnWidthsKey = ( | ||
41 | 20, | ||
42 | 200, | ||
43 | 131, | ||
44 | 20, | ||
45 | 48.1626, | ||
46 | 43, | ||
47 | 43, | ||
48 | ); | ||
49 | PBXFileTableDataSourceColumnsKey = ( | ||
50 | PBXFileDataSource_FiletypeID, | ||
51 | PBXFileDataSource_Filename_ColumnID, | ||
52 | PBXTargetDataSource_PrimaryAttribute, | ||
53 | PBXFileDataSource_Built_ColumnID, | ||
54 | PBXFileDataSource_ObjectSize_ColumnID, | ||
55 | PBXFileDataSource_Errors_ColumnID, | ||
56 | PBXFileDataSource_Warnings_ColumnID, | ||
57 | ); | ||
58 | }; | ||
59 | PBXPerProjectTemplateStateSaveDate = 218073202; | ||
60 | PBXWorkspaceStateSaveDate = 218073202; | ||
61 | }; | ||
62 | sourceControlManager = E3C7DAC60CFF874400AD076D /* Source Control */; | ||
63 | userBuildSettings = { | ||
64 | }; | ||
65 | }; | ||
66 | 5503B89E05446B1F003D051F /* newview */ = { | ||
67 | activeExec = 0; | ||
68 | executables = ( | ||
69 | E3C7DAB60CFF871100AD076D /* newview */, | ||
70 | ); | ||
71 | }; | ||
72 | 9932ED1E056C1F0900554101 /* crashreporter */ = { | ||
73 | activeExec = 0; | ||
74 | executables = ( | ||
75 | E3C7DAB50CFF871100AD076D /* crashreporter */, | ||
76 | ); | ||
77 | }; | ||
78 | 9967E9080B37533F0087BD1B /* fmodwrapper */ = { | ||
79 | activeExec = 0; | ||
80 | }; | ||
81 | 99CDED4905E70BAB0000F8AA /* llcommon */ = { | ||
82 | activeExec = 0; | ||
83 | }; | ||
84 | 99D5703205BDEFD7004DE704 /* AutoUpdater */ = { | ||
85 | activeExec = 0; | ||
86 | executables = ( | ||
87 | E3C7DAB40CFF871100AD076D /* AutoUpdater */, | ||
88 | ); | ||
89 | }; | ||
90 | D64593550B3B4D7D00FAB68F /* llkdu */ = { | ||
91 | activeExec = 0; | ||
92 | }; | ||
93 | E3C7DAB40CFF871100AD076D /* AutoUpdater */ = { | ||
94 | isa = PBXExecutable; | ||
95 | activeArgIndex = 2147483647; | ||
96 | activeArgIndices = ( | ||
97 | ); | ||
98 | argumentStrings = ( | ||
99 | ); | ||
100 | autoAttachOnCrash = 1; | ||
101 | configStateDict = { | ||
102 | }; | ||
103 | customDataFormattersEnabled = 1; | ||
104 | debuggerPlugin = GDBDebugging; | ||
105 | disassemblyDisplayState = 0; | ||
106 | enableDebugStr = 1; | ||
107 | environmentEntries = ( | ||
108 | ); | ||
109 | executableSystemSymbolLevel = 0; | ||
110 | executableUserSymbolLevel = 0; | ||
111 | libgmallocEnabled = 0; | ||
112 | name = AutoUpdater; | ||
113 | sourceDirectories = ( | ||
114 | ); | ||
115 | }; | ||
116 | E3C7DAB50CFF871100AD076D /* crashreporter */ = { | ||
117 | isa = PBXExecutable; | ||
118 | activeArgIndex = 2147483647; | ||
119 | activeArgIndices = ( | ||
120 | ); | ||
121 | argumentStrings = ( | ||
122 | ); | ||
123 | autoAttachOnCrash = 1; | ||
124 | configStateDict = { | ||
125 | }; | ||
126 | customDataFormattersEnabled = 1; | ||
127 | debuggerPlugin = GDBDebugging; | ||
128 | disassemblyDisplayState = 0; | ||
129 | enableDebugStr = 1; | ||
130 | environmentEntries = ( | ||
131 | ); | ||
132 | executableSystemSymbolLevel = 0; | ||
133 | executableUserSymbolLevel = 0; | ||
134 | libgmallocEnabled = 0; | ||
135 | name = crashreporter; | ||
136 | sourceDirectories = ( | ||
137 | ); | ||
138 | }; | ||
139 | E3C7DAB60CFF871100AD076D /* newview */ = { | ||
140 | isa = PBXExecutable; | ||
141 | activeArgIndex = 2147483647; | ||
142 | activeArgIndices = ( | ||
143 | ); | ||
144 | argumentStrings = ( | ||
145 | ); | ||
146 | autoAttachOnCrash = 1; | ||
147 | configStateDict = { | ||
148 | }; | ||
149 | customDataFormattersEnabled = 1; | ||
150 | debuggerPlugin = GDBDebugging; | ||
151 | disassemblyDisplayState = 0; | ||
152 | enableDebugStr = 1; | ||
153 | environmentEntries = ( | ||
154 | ); | ||
155 | executableSystemSymbolLevel = 0; | ||
156 | executableUserSymbolLevel = 0; | ||
157 | libgmallocEnabled = 0; | ||
158 | name = newview; | ||
159 | sourceDirectories = ( | ||
160 | ); | ||
161 | }; | ||
162 | E3C7DAC60CFF874400AD076D /* Source Control */ = { | ||
163 | isa = PBXSourceControlManager; | ||
164 | fallbackIsa = XCSourceControlManager; | ||
165 | isSCMEnabled = 0; | ||
166 | scmConfiguration = { | ||
167 | }; | ||
168 | scmType = ""; | ||
169 | }; | ||
170 | E3C7DAC70CFF874400AD076D /* Code sense */ = { | ||
171 | isa = PBXCodeSenseManager; | ||
172 | indexTemplatePath = ""; | ||
173 | }; | ||
174 | E3C7DAE10CFF885000AD076D /* XCBreakpointsBucket */ = { | ||
175 | isa = XCBreakpointsBucket; | ||
176 | name = "Project Breakpoints"; | ||
177 | objects = ( | ||
178 | ); | ||
179 | }; | ||
180 | FD53B40509BDF9F600BFE3BC /* third party libs */ = { | ||
181 | activeExec = 0; | ||
182 | }; | ||
183 | } | ||
diff --git a/linden/indra/newview/macview.xcodeproj/project.pbxproj b/linden/indra/newview/macview.xcodeproj/project.pbxproj index c3a4b0a..2d54757 100644 --- a/linden/indra/newview/macview.xcodeproj/project.pbxproj +++ b/linden/indra/newview/macview.xcodeproj/project.pbxproj | |||
@@ -37,7 +37,6 @@ | |||
37 | 1A47B8E00860FDF100F73746 /* llpanelweb.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A47B8DE0860FDF100F73746 /* llpanelweb.cpp */; }; | 37 | 1A47B8E00860FDF100F73746 /* llpanelweb.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A47B8DE0860FDF100F73746 /* llpanelweb.cpp */; }; |
38 | 1A5104450ABF5B5A00520F6D /* llnotecard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5104440ABF5B5A00520F6D /* llnotecard.cpp */; }; | 38 | 1A5104450ABF5B5A00520F6D /* llnotecard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5104440ABF5B5A00520F6D /* llnotecard.cpp */; }; |
39 | 1A5104570ABF60A800520F6D /* llviewerassetstorage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5104560ABF60A800520F6D /* llviewerassetstorage.cpp */; }; | 39 | 1A5104570ABF60A800520F6D /* llviewerassetstorage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5104560ABF60A800520F6D /* llviewerassetstorage.cpp */; }; |
40 | 1A57CD2C0C9EFE9900B6EB24 /* llfloaterlagmeter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A57CD2B0C9EFE9900B6EB24 /* llfloaterlagmeter.cpp */; }; | ||
41 | 1A5B3B550A70147000A90391 /* llfloaterbump.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5B3B540A70147000A90391 /* llfloaterbump.cpp */; }; | 40 | 1A5B3B550A70147000A90391 /* llfloaterbump.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5B3B540A70147000A90391 /* llfloaterbump.cpp */; }; |
42 | 1A61A7F00A5ED446009FE3D2 /* llfloateravatarpicker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A61A7EF0A5ED446009FE3D2 /* llfloateravatarpicker.cpp */; }; | 41 | 1A61A7F00A5ED446009FE3D2 /* llfloateravatarpicker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A61A7EF0A5ED446009FE3D2 /* llfloateravatarpicker.cpp */; }; |
43 | 1A758C920A436FCA00589675 /* llagentdata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A758C910A436FCA00589675 /* llagentdata.cpp */; }; | 42 | 1A758C920A436FCA00589675 /* llagentdata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A758C910A436FCA00589675 /* llagentdata.cpp */; }; |
@@ -292,7 +291,6 @@ | |||
292 | 5503BC4E05446B20003D051F /* llmenucommands.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F52AD8051F61DF00A80050 /* llmenucommands.cpp */; }; | 291 | 5503BC4E05446B20003D051F /* llmenucommands.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F52AD8051F61DF00A80050 /* llmenucommands.cpp */; }; |
293 | 5503BC4F05446B20003D051F /* llhudeffectpointat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F52ADA051F61DF00A80050 /* llhudeffectpointat.cpp */; }; | 292 | 5503BC4F05446B20003D051F /* llhudeffectpointat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F52ADA051F61DF00A80050 /* llhudeffectpointat.cpp */; }; |
294 | 5503BC5005446B20003D051F /* llhudeffectlookat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F52ADB051F61DF00A80050 /* llhudeffectlookat.cpp */; }; | 293 | 5503BC5005446B20003D051F /* llhudeffectlookat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F52ADB051F61DF00A80050 /* llhudeffectlookat.cpp */; }; |
295 | 5503BCDA05446B20003D051F /* viewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26E79A760520BEC400A80050 /* viewer.cpp */; }; | ||
296 | 5503BCDC05446B20003D051F /* llnameeditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2617306405221AB700A80050 /* llnameeditor.cpp */; }; | 294 | 5503BCDC05446B20003D051F /* llnameeditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2617306405221AB700A80050 /* llnameeditor.cpp */; }; |
297 | 5503BCDD05446B20003D051F /* llnamebox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2617306805221DF400A80050 /* llnamebox.cpp */; }; | 295 | 5503BCDD05446B20003D051F /* llnamebox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2617306805221DF400A80050 /* llnamebox.cpp */; }; |
298 | 5503BCEB05446B20003D051F /* llfeaturemanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 263E02FE05239C9A00A80050 /* llfeaturemanager.cpp */; }; | 296 | 5503BCEB05446B20003D051F /* llfeaturemanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 263E02FE05239C9A00A80050 /* llfeaturemanager.cpp */; }; |
@@ -589,10 +587,124 @@ | |||
589 | AAEAAF270A8104D8005F0707 /* llscrollingpanellist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAEAAF250A8104D8005F0707 /* llscrollingpanellist.cpp */; }; | 587 | AAEAAF270A8104D8005F0707 /* llscrollingpanellist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAEAAF250A8104D8005F0707 /* llscrollingpanellist.cpp */; }; |
590 | AAF5FFD20B13F71900D28A84 /* lltexturecache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAF5FFD00B13F71900D28A84 /* lltexturecache.cpp */; }; | 588 | AAF5FFD20B13F71900D28A84 /* lltexturecache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAF5FFD00B13F71900D28A84 /* lltexturecache.cpp */; }; |
591 | C16C08500B4AE6C7009AD67F /* llfloaterinspect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C16C084E0B4AE6C7009AD67F /* llfloaterinspect.cpp */; }; | 589 | C16C08500B4AE6C7009AD67F /* llfloaterinspect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C16C084E0B4AE6C7009AD67F /* llfloaterinspect.cpp */; }; |
590 | C1E4A5760CC020FC005FB0A6 /* llcrashloggermac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C1E4A5750CC020FC005FB0A6 /* llcrashloggermac.cpp */; }; | ||
591 | C1E4A5790CC0210F005FB0A6 /* llcrashlogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C1E4A5770CC0210F005FB0A6 /* llcrashlogger.cpp */; }; | ||
592 | C1E4A57B0CC02160005FB0A6 /* lldate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD1558220A06BB5F00DE9AE5 /* lldate.cpp */; }; | ||
593 | C1E4A57C0CC02160005FB0A6 /* llthread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9159DDD607662E7900F15AA1 /* llthread.cpp */; }; | ||
594 | C1E4A57D0CC02160005FB0A6 /* u64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 616C4A8F0752C3D1006C2C65 /* u64.cpp */; }; | ||
595 | C1E4A57E0CC02160005FB0A6 /* llerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192212F074A9B57005E1F34 /* llerror.cpp */; }; | ||
596 | C1E4A57F0CC02160005FB0A6 /* llstreamtools.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0633E5D309E3421500712406 /* llstreamtools.cpp */; }; | ||
597 | C1E4A5800CC02160005FB0A6 /* llapp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3336D0ABB5379004351DE /* llapp.cpp */; }; | ||
598 | C1E4A5810CC02160005FB0A6 /* llfasttimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922135074A9B57005E1F34 /* llfasttimer.cpp */; }; | ||
599 | C1E4A5820CC02160005FB0A6 /* llfixedbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922137074A9B57005E1F34 /* llfixedbuffer.cpp */; }; | ||
600 | C1E4A5830CC02160005FB0A6 /* llstat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192214B074A9B57005E1F34 /* llstat.cpp */; }; | ||
601 | C1E4A5840CC02160005FB0A6 /* llmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192213E074A9B57005E1F34 /* llmemory.cpp */; }; | ||
602 | C1E4A5850CC02160005FB0A6 /* llsd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 918B123A07B19605008CD6CD /* llsd.cpp */; }; | ||
603 | C1E4A5860CC02160005FB0A6 /* llcommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99E43519092D6535003AE728 /* llcommon.cpp */; }; | ||
604 | C1E4A5870CC02160005FB0A6 /* llares.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8849626B0C7B3E8A00A777FB /* llares.cpp */; }; | ||
605 | C1E4A5880CC02160005FB0A6 /* llbase32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A9897E80B98E2F4005C45D7 /* llbase32.cpp */; }; | ||
606 | C1E4A5890CC02160005FB0A6 /* llbase64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A02016D0B7A85DE00D5C589 /* llbase64.cpp */; }; | ||
607 | C1E4A58A0CC02160005FB0A6 /* llmortician.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99E4350B092D644F003AE728 /* llmortician.cpp */; }; | ||
608 | C1E4A58B0CC02160005FB0A6 /* llprocessor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922143074A9B57005E1F34 /* llprocessor.cpp */; }; | ||
609 | C1E4A58C0CC02160005FB0A6 /* llformat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DA9C40DF0B54B4BA00DD6F44 /* llformat.cpp */; }; | ||
610 | C1E4A58D0CC02160005FB0A6 /* llsecondlifeurls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93AE41CB08F4842F00141675 /* llsecondlifeurls.cpp */; }; | ||
611 | C1E4A58E0CC02160005FB0A6 /* llstringtable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922151074A9B58005E1F34 /* llstringtable.cpp */; }; | ||
612 | C1E4A58F0CC02160005FB0A6 /* llsdutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 913ADF0D0A250C750055AB21 /* llsdutil.cpp */; }; | ||
613 | C1E4A5900CC02160005FB0A6 /* llstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192214F074A9B58005E1F34 /* llstring.cpp */; }; | ||
614 | C1E4A5910CC02160005FB0A6 /* lluri.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD1558280A06BB5F00DE9AE5 /* lluri.cpp */; }; | ||
615 | C1E4A5920CC02160005FB0A6 /* llevent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A3AF6BC80A544C71005B5E2C /* llevent.cpp */; }; | ||
616 | C1E4A5930CC02160005FB0A6 /* llapr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 915862D8075D2CE400F6A924 /* llapr.cpp */; }; | ||
617 | C1E4A5940CC02160005FB0A6 /* llworkerthread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99321B12081DD26000678159 /* llworkerthread.cpp */; }; | ||
618 | C1E4A5960CC02160005FB0A6 /* llerrorthread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2863B00ABF637200A05D7C /* llerrorthread.cpp */; }; | ||
619 | C1E4A5970CC02160005FB0A6 /* llsdserialize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD1558260A06BB5F00DE9AE5 /* llsdserialize.cpp */; }; | ||
620 | C1E4A5980CC02160005FB0A6 /* llrun.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E333730ABB79AC004351DE /* llrun.cpp */; }; | ||
621 | C1E4A59A0CC02160005FB0A6 /* llframetimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922139074A9B57005E1F34 /* llframetimer.cpp */; }; | ||
622 | C1E4A59B0CC02160005FB0A6 /* llmemorystream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD6C9A3E09C75B3A00AA1849 /* llmemorystream.cpp */; }; | ||
623 | C1E4A59C0CC02160005FB0A6 /* metaproperty.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA39C6E0A37203E006E8A2D /* metaproperty.cpp */; }; | ||
624 | C1E4A59D0CC02160005FB0A6 /* llfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0633E5D009E341F500712406 /* llfile.cpp */; }; | ||
625 | C1E4A59E0CC02160005FB0A6 /* llcriticaldamp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922127074A9B57005E1F34 /* llcriticaldamp.cpp */; }; | ||
626 | C1E4A59F0CC02160005FB0A6 /* llsdserialize_xml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD1558240A06BB5F00DE9AE5 /* llsdserialize_xml.cpp */; }; | ||
627 | C1E4A5A00CC02160005FB0A6 /* metaclass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA39C6B0A37203E006E8A2D /* metaclass.cpp */; }; | ||
628 | C1E4A5A10CC02160005FB0A6 /* reflective.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA39C710A37203E006E8A2D /* reflective.cpp */; }; | ||
629 | C1E4A5A20CC02160005FB0A6 /* llsys.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922153074A9B58005E1F34 /* llsys.cpp */; }; | ||
630 | C1E4A5A30CC02160005FB0A6 /* llassettype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99E4326B092D5996003AE728 /* llassettype.cpp */; }; | ||
631 | C1E4A5A40CC02160005FB0A6 /* lltimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 616C4A8E0752C3D1006C2C65 /* lltimer.cpp */; }; | ||
632 | C1E4A5A50CC02160005FB0A6 /* timing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922161074A9B58005E1F34 /* timing.cpp */; }; | ||
633 | C1E4A5A60CC02160005FB0A6 /* llliveappconfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A97C4540B8BCF9C00331A24 /* llliveappconfig.cpp */; }; | ||
634 | C1E4A5A70CC0216F005FB0A6 /* llnullcipher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221DF074A9B59005E1F34 /* llnullcipher.cpp */; }; | ||
635 | C1E4A5A80CC0216F005FB0A6 /* llurlrequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B39350F0AD6F9F400F57245 /* llurlrequest.cpp */; }; | ||
636 | C1E4A5AA0CC0216F005FB0A6 /* lltransfersourceasset.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221F0074A9B59005E1F34 /* lltransfersourceasset.cpp */; }; | ||
637 | C1E4A5AB0CC0216F005FB0A6 /* llhost.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221D3074A9B59005E1F34 /* llhost.cpp */; }; | ||
638 | C1E4A5AC0CC0216F005FB0A6 /* llmessageconfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9C659A850BAB0B6E00D2EB60 /* llmessageconfig.cpp */; }; | ||
639 | C1E4A5AD0CC0216F005FB0A6 /* partsyspacket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922211074A9B59005E1F34 /* partsyspacket.cpp */; }; | ||
640 | C1E4A5AE0CC0216F005FB0A6 /* lltemplatemessagebuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38D0FA690B4BF897003323BA /* lltemplatemessagebuilder.cpp */; }; | ||
641 | C1E4A5AF0CC0216F005FB0A6 /* message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922208074A9B59005E1F34 /* message.cpp */; }; | ||
642 | C1E4A5B00CC0216F005FB0A6 /* llbufferstream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD6C9A3A09C75B0500AA1849 /* llbufferstream.cpp */; }; | ||
643 | C1E4A5B10CC0216F005FB0A6 /* llhttpnode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDCB54F40AFBC5060033B433 /* llhttpnode.cpp */; }; | ||
644 | C1E4A5B20CC0216F005FB0A6 /* lltransfersourcefile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221F2074A9B59005E1F34 /* lltransfersourcefile.cpp */; }; | ||
645 | C1E4A5B30CC0216F005FB0A6 /* llchainio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD835B800AD1CB6700038B74 /* llchainio.cpp */; }; | ||
646 | C1E4A5B40CC0216F005FB0A6 /* llhttpclient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B39350B0AD6F96900F57245 /* llhttpclient.cpp */; }; | ||
647 | C1E4A5B50CC0216F005FB0A6 /* llxfer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221FB074A9B59005E1F34 /* llxfer.cpp */; }; | ||
648 | C1E4A5B60CC0216F005FB0A6 /* network.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192220F074A9B59005E1F34 /* network.cpp */; }; | ||
649 | C1E4A5B70CC0216F005FB0A6 /* llpacketring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221E3074A9B59005E1F34 /* llpacketring.cpp */; }; | ||
650 | C1E4A5B80CC0216F005FB0A6 /* llxfer_vfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922201074A9B59005E1F34 /* llxfer_vfile.cpp */; }; | ||
651 | C1E4A5B90CC0216F005FB0A6 /* llsdmessagereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DA4B14190B978815003F64DE /* llsdmessagereader.cpp */; }; | ||
652 | C1E4A5BA0CC0216F005FB0A6 /* llxfermanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922203074A9B59005E1F34 /* llxfermanager.cpp */; }; | ||
653 | C1E4A5BB0CC0216F005FB0A6 /* llmessagethrottle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A241CB8E07B3E383001A39E3 /* llmessagethrottle.cpp */; }; | ||
654 | C1E4A5BC0CC0216F005FB0A6 /* llsdmessagebuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DA4B14170B978815003F64DE /* llsdmessagebuilder.cpp */; }; | ||
655 | C1E4A5BD0CC0216F005FB0A6 /* message_string_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192220C074A9B59005E1F34 /* message_string_table.cpp */; }; | ||
656 | C1E4A5BE0CC0216F005FB0A6 /* message_prehash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192220A074A9B59005E1F34 /* message_prehash.cpp */; }; | ||
657 | C1E4A5BF0CC0216F005FB0A6 /* llmessagetemplate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38D0FA6A0B4BF898003323BA /* llmessagetemplate.cpp */; }; | ||
658 | C1E4A5C00CC0216F005FB0A6 /* llxfer_file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221FD074A9B59005E1F34 /* llxfer_file.cpp */; }; | ||
659 | C1E4A5C10CC0216F005FB0A6 /* llmime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91469E790B4486C10009E8F9 /* llmime.cpp */; }; | ||
660 | C1E4A5C20CC0216F005FB0A6 /* llmessagereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3834D6010B73ABC1002B61C8 /* llmessagereader.cpp */; }; | ||
661 | C1E4A5C30CC0216F005FB0A6 /* patch_idct.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922217074A9B59005E1F34 /* patch_idct.cpp */; }; | ||
662 | C1E4A5C40CC0216F005FB0A6 /* lliosocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99374E460B5C603E008DB4BE /* lliosocket.cpp */; }; | ||
663 | C1E4A5C50CC0216F005FB0A6 /* llcachename.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221BB074A9B59005E1F34 /* llcachename.cpp */; }; | ||
664 | C1E4A5C60CC0216F005FB0A6 /* llblowfishcipher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A02017E0B7A861200D5C589 /* llblowfishcipher.cpp */; }; | ||
665 | C1E4A5C70CC0216F005FB0A6 /* llpacketbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221E1074A9B59005E1F34 /* llpacketbuffer.cpp */; }; | ||
666 | C1E4A5C80CC0216F005FB0A6 /* llmessagetemplateparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9CC280FE0BE79737006D8BDC /* llmessagetemplateparser.cpp */; }; | ||
667 | C1E4A5C90CC0216F005FB0A6 /* llbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD6C9A3809C75B0500AA1849 /* llbuffer.cpp */; }; | ||
668 | C1E4A5CA0CC0216F005FB0A6 /* llcurl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA348DF80B0EAB31002C3015 /* llcurl.cpp */; }; | ||
669 | C1E4A5CB0CC0216F005FB0A6 /* llxorcipher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922205074A9B59005E1F34 /* llxorcipher.cpp */; }; | ||
670 | C1E4A5CC0CC0216F005FB0A6 /* llnamevalue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221DD074A9B59005E1F34 /* llnamevalue.cpp */; }; | ||
671 | C1E4A5CD0CC0216F005FB0A6 /* lliobuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9190430E08327117002396D4 /* lliobuffer.cpp */; }; | ||
672 | C1E4A5CE0CC0216F005FB0A6 /* llpartdata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221E5074A9B59005E1F34 /* llpartdata.cpp */; }; | ||
673 | C1E4A5CF0CC0216F005FB0A6 /* llfiltersd2xmlrpc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9190430C08327117002396D4 /* llfiltersd2xmlrpc.cpp */; }; | ||
674 | C1E4A5D00CC0216F005FB0A6 /* net.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192220D074A9B59005E1F34 /* net.cpp */; }; | ||
675 | C1E4A5D10CC0216F005FB0A6 /* llxfer_mem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221FF074A9B59005E1F34 /* llxfer_mem.cpp */; }; | ||
676 | C1E4A5D20CC0216F005FB0A6 /* llthrottle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221EC074A9B59005E1F34 /* llthrottle.cpp */; }; | ||
677 | C1E4A5D30CC0216F005FB0A6 /* lllogtextmessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A241CB8C07B3E383001A39E3 /* lllogtextmessage.cpp */; }; | ||
678 | C1E4A5D40CC0216F005FB0A6 /* llinstantmessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93AE41CF08F4845400141675 /* llinstantmessage.cpp */; }; | ||
679 | C1E4A5D50CC0216F005FB0A6 /* llmessagebuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38D0FA6B0B4BF898003323BA /* llmessagebuilder.cpp */; }; | ||
680 | C1E4A5D60CC0216F005FB0A6 /* lldatapacker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221C5074A9B59005E1F34 /* lldatapacker.cpp */; }; | ||
681 | C1E4A5D70CC0216F005FB0A6 /* patch_code.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922213074A9B59005E1F34 /* patch_code.cpp */; }; | ||
682 | C1E4A5D80CC0216F005FB0A6 /* llservice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9190431408327117002396D4 /* llservice.cpp */; }; | ||
683 | C1E4A5D90CC0216F005FB0A6 /* llclassifiedflags.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99FBB071087365E90048A5CC /* llclassifiedflags.cpp */; }; | ||
684 | C1E4A5DA0CC0216F005FB0A6 /* patch_dct.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922215074A9B59005E1F34 /* patch_dct.cpp */; }; | ||
685 | C1E4A5DB0CC0216F005FB0A6 /* lltransfertargetvfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221F6074A9B59005E1F34 /* lltransfertargetvfile.cpp */; }; | ||
686 | C1E4A5DC0CC0216F005FB0A6 /* lltemplatemessagereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3834D6030B73ABC1002B61C8 /* lltemplatemessagereader.cpp */; }; | ||
687 | C1E4A5DD0CC0216F005FB0A6 /* llassetstorage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221B9074A9B59005E1F34 /* llassetstorage.cpp */; }; | ||
688 | C1E4A5DE0CC0216F005FB0A6 /* lldispatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221D0074A9B59005E1F34 /* lldispatcher.cpp */; }; | ||
689 | C1E4A5DF0CC0216F005FB0A6 /* llpacketack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9117EAA10BF24A6100845BD2 /* llpacketack.cpp */; }; | ||
690 | C1E4A5E00CC0216F005FB0A6 /* llcircuit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221BE074A9B59005E1F34 /* llcircuit.cpp */; }; | ||
691 | C1E4A5E10CC0216F005FB0A6 /* llhttpsender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DA4B14140B978815003F64DE /* llhttpsender.cpp */; }; | ||
692 | C1E4A5E20CC0216F005FB0A6 /* llpumpio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9190431208327117002396D4 /* llpumpio.cpp */; }; | ||
693 | C1E4A5E30CC0216F005FB0A6 /* lltransfertargetfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221F4074A9B59005E1F34 /* lltransfertargetfile.cpp */; }; | ||
694 | C1E4A5E40CC0216F005FB0A6 /* lluseroperation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221F8074A9B59005E1F34 /* lluseroperation.cpp */; }; | ||
695 | C1E4A5E50CC0216F005FB0A6 /* lliopipe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9190431008327117002396D4 /* lliopipe.cpp */; }; | ||
696 | C1E4A5E60CC0216F005FB0A6 /* llioutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD6C9A4609C75BCD00AA1849 /* llioutil.cpp */; }; | ||
697 | C1E4A5E70CC0216F005FB0A6 /* lltransfermanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221EE074A9B59005E1F34 /* lltransfermanager.cpp */; }; | ||
698 | C1E4A5F70CC0226A005FB0A6 /* llxmltree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192227B074A9B5A005E1F34 /* llxmltree.cpp */; }; | ||
699 | C1E4A5F80CC0226A005FB0A6 /* llxmlnode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EBAAFE160858EBA400B9269A /* llxmlnode.cpp */; }; | ||
700 | C1E4A5F90CC0226A005FB0A6 /* llcontrol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA0E2A5F0A2FDAEE0066250A /* llcontrol.cpp */; }; | ||
701 | C1E4A5FA0CC0226A005FB0A6 /* llxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922279074A9B5A005E1F34 /* llxmlparser.cpp */; }; | ||
702 | C1E4A5FE0CC02365005FB0A6 /* libxmlrpc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FDE8765809BEA39700AF6316 /* libxmlrpc.a */; }; | ||
592 | C1F5D0A50B138AEB00827F1D /* lluserrelations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C1F5D0A30B138AEB00827F1D /* lluserrelations.cpp */; }; | 703 | C1F5D0A50B138AEB00827F1D /* lluserrelations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C1F5D0A30B138AEB00827F1D /* lluserrelations.cpp */; }; |
593 | C64F673F0AFBED80009732B5 /* lllogchat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C64F673D0AFBED80009732B5 /* lllogchat.cpp */; }; | 704 | C64F673F0AFBED80009732B5 /* lllogchat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C64F673D0AFBED80009732B5 /* lllogchat.cpp */; }; |
594 | C64F67420AFBED91009732B5 /* lldirpicker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C64F67400AFBED91009732B5 /* lldirpicker.cpp */; }; | 705 | C64F67420AFBED91009732B5 /* lldirpicker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C64F67400AFBED91009732B5 /* lldirpicker.cpp */; }; |
595 | D23289B50C453A3600304FEF /* llfloaterreleasemsg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D23289B30C453A3600304FEF /* llfloaterreleasemsg.cpp */; }; | 706 | D23289B50C453A3600304FEF /* llfloaterreleasemsg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D23289B30C453A3600304FEF /* llfloaterreleasemsg.cpp */; }; |
707 | D2768CE50CEA38940000BD66 /* llfloaterlagmeter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D2768CE30CEA38940000BD66 /* llfloaterlagmeter.cpp */; }; | ||
596 | D62830DB0B4DC76300F8830F /* llimagej2coj.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D62830D80B4DC76300F8830F /* llimagej2coj.cpp */; }; | 708 | D62830DB0B4DC76300F8830F /* llimagej2coj.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D62830D80B4DC76300F8830F /* llimagej2coj.cpp */; }; |
597 | D645940C0B3B6D9000FAB68F /* libapr-1.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FDE8764E09BEA39600AF6316 /* libapr-1.a */; }; | 709 | D645940C0B3B6D9000FAB68F /* libapr-1.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FDE8764E09BEA39600AF6316 /* libapr-1.a */; }; |
598 | D645940D0B3B6D9A00FAB68F /* libaprutil-1.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FD6C9A5209C773A000AA1849 /* libaprutil-1.a */; }; | 710 | D645940D0B3B6D9A00FAB68F /* libaprutil-1.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FD6C9A5209C773A000AA1849 /* libaprutil-1.a */; }; |
@@ -715,6 +827,10 @@ | |||
715 | FE51387B0CD80BAE00F32EE3 /* llfloaterclassified.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5138730CD80BAE00F32EE3 /* llfloaterclassified.cpp */; }; | 827 | FE51387B0CD80BAE00F32EE3 /* llfloaterclassified.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5138730CD80BAE00F32EE3 /* llfloaterclassified.cpp */; }; |
716 | FE51387C0CD80BAE00F32EE3 /* llfloaterevent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5138750CD80BAE00F32EE3 /* llfloaterevent.cpp */; }; | 828 | FE51387C0CD80BAE00F32EE3 /* llfloaterevent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5138750CD80BAE00F32EE3 /* llfloaterevent.cpp */; }; |
717 | FE51387D0CD80BAE00F32EE3 /* llfloaterparcel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5138770CD80BAE00F32EE3 /* llfloaterparcel.cpp */; }; | 829 | FE51387D0CD80BAE00F32EE3 /* llfloaterparcel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5138770CD80BAE00F32EE3 /* llfloaterparcel.cpp */; }; |
830 | FE679A3D0CDFF5AC00959041 /* llappviewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE679A350CDFF5AC00959041 /* llappviewer.cpp */; }; | ||
831 | FE679A3E0CDFF5AC00959041 /* llappviewermacosx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE679A370CDFF5AC00959041 /* llappviewermacosx.cpp */; }; | ||
832 | FE679A3F0CDFF5AC00959041 /* llvectorperfoptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE679A390CDFF5AC00959041 /* llvectorperfoptions.cpp */; }; | ||
833 | FE679A400CDFF5AC00959041 /* llvieweraudio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE679A3B0CDFF5AC00959041 /* llvieweraudio.cpp */; }; | ||
718 | /* End PBXBuildFile section */ | 834 | /* End PBXBuildFile section */ |
719 | 835 | ||
720 | /* Begin PBXBuildRule section */ | 836 | /* Begin PBXBuildRule section */ |
@@ -874,8 +990,6 @@ | |||
874 | 1A5104580ABF60BF00520F6D /* llviewerassetstorage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llviewerassetstorage.h; sourceTree = "<group>"; }; | 990 | 1A5104580ABF60BF00520F6D /* llviewerassetstorage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llviewerassetstorage.h; sourceTree = "<group>"; }; |
875 | 1A57B92C09F8303A004D8B1A /* lllslconstants.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = lllslconstants.h; sourceTree = "<group>"; }; | 991 | 1A57B92C09F8303A004D8B1A /* lllslconstants.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = lllslconstants.h; sourceTree = "<group>"; }; |
876 | 1A57B92D09F8303A004D8B1A /* llagentconstants.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagentconstants.h; sourceTree = "<group>"; }; | 992 | 1A57B92D09F8303A004D8B1A /* llagentconstants.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagentconstants.h; sourceTree = "<group>"; }; |
877 | 1A57CD2B0C9EFE9900B6EB24 /* llfloaterlagmeter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterlagmeter.cpp; sourceTree = "<group>"; }; | ||
878 | 1A57CD2D0C9EFEA400B6EB24 /* llfloaterlagmeter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterlagmeter.h; sourceTree = "<group>"; }; | ||
879 | 1A5B3B530A70146900A90391 /* llfloaterbump.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterbump.h; sourceTree = "<group>"; }; | 993 | 1A5B3B530A70146900A90391 /* llfloaterbump.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterbump.h; sourceTree = "<group>"; }; |
880 | 1A5B3B540A70147000A90391 /* llfloaterbump.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterbump.cpp; sourceTree = "<group>"; }; | 994 | 1A5B3B540A70147000A90391 /* llfloaterbump.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterbump.cpp; sourceTree = "<group>"; }; |
881 | 1A61A7EF0A5ED446009FE3D2 /* llfloateravatarpicker.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloateravatarpicker.cpp; sourceTree = "<group>"; }; | 995 | 1A61A7EF0A5ED446009FE3D2 /* llfloateravatarpicker.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloateravatarpicker.cpp; sourceTree = "<group>"; }; |
@@ -909,7 +1023,6 @@ | |||
909 | 1A9897E80B98E2F4005C45D7 /* llbase32.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llbase32.cpp; sourceTree = "<group>"; }; | 1023 | 1A9897E80B98E2F4005C45D7 /* llbase32.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llbase32.cpp; sourceTree = "<group>"; }; |
910 | 1A9EC236083EA0100023D510 /* llfloatereditui.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloatereditui.cpp; sourceTree = "<group>"; }; | 1024 | 1A9EC236083EA0100023D510 /* llfloatereditui.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloatereditui.cpp; sourceTree = "<group>"; }; |
911 | 1A9EC23A083EA01F0023D510 /* llfloatereditui.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloatereditui.h; sourceTree = "<group>"; }; | 1025 | 1A9EC23A083EA01F0023D510 /* llfloatereditui.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloatereditui.h; sourceTree = "<group>"; }; |
912 | 1AB0DADC0A52E8A0001CACEB /* message_template.msg */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = message_template.msg; path = ../../scripts/messages/message_template.msg; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.simpleColoring; }; | ||
913 | 1AA2EE9C0CBBE2790017E185 /* llfloaterlandmark.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterlandmark.h; sourceTree = "<group>"; }; | 1026 | 1AA2EE9C0CBBE2790017E185 /* llfloaterlandmark.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterlandmark.h; sourceTree = "<group>"; }; |
914 | 1AA2EE9D0CBBE2790017E185 /* llfloaterlandmark.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterlandmark.cpp; sourceTree = "<group>"; }; | 1027 | 1AA2EE9D0CBBE2790017E185 /* llfloaterlandmark.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterlandmark.cpp; sourceTree = "<group>"; }; |
915 | 1AA2EE9F0CBBE28C0017E185 /* llclassifiedstatsresponder.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llclassifiedstatsresponder.h; sourceTree = "<group>"; }; | 1028 | 1AA2EE9F0CBBE28C0017E185 /* llclassifiedstatsresponder.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llclassifiedstatsresponder.h; sourceTree = "<group>"; }; |
@@ -918,6 +1031,7 @@ | |||
918 | 1AA2EEA30CBBE2BF0017E185 /* llfloaterurldisplay.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterurldisplay.cpp; sourceTree = "<group>"; }; | 1031 | 1AA2EEA30CBBE2BF0017E185 /* llfloaterurldisplay.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterurldisplay.cpp; sourceTree = "<group>"; }; |
919 | 1AA2EEA50CBBE2D40017E185 /* llremoteparcelrequest.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llremoteparcelrequest.h; sourceTree = "<group>"; }; | 1032 | 1AA2EEA50CBBE2D40017E185 /* llremoteparcelrequest.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llremoteparcelrequest.h; sourceTree = "<group>"; }; |
920 | 1AA2EEA60CBBE2D40017E185 /* llremoteparcelrequest.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llremoteparcelrequest.cpp; sourceTree = "<group>"; }; | 1033 | 1AA2EEA60CBBE2D40017E185 /* llremoteparcelrequest.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llremoteparcelrequest.cpp; sourceTree = "<group>"; }; |
1034 | 1AB0DADC0A52E8A0001CACEB /* message_template.msg */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = message_template.msg; path = ../../scripts/messages/message_template.msg; sourceTree = SOURCE_ROOT; }; | ||
921 | 1AD3940C0CAB0003004BA76A /* llurlsimstring.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llurlsimstring.h; sourceTree = "<group>"; }; | 1035 | 1AD3940C0CAB0003004BA76A /* llurlsimstring.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llurlsimstring.h; sourceTree = "<group>"; }; |
922 | 1AD3940D0CAB0003004BA76A /* llurldispatcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llurldispatcher.h; sourceTree = "<group>"; }; | 1036 | 1AD3940D0CAB0003004BA76A /* llurldispatcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llurldispatcher.h; sourceTree = "<group>"; }; |
923 | 1AD3940E0CAB000F004BA76A /* llurlsimstring.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llurlsimstring.cpp; sourceTree = "<group>"; }; | 1037 | 1AD3940E0CAB000F004BA76A /* llurlsimstring.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llurlsimstring.cpp; sourceTree = "<group>"; }; |
@@ -949,7 +1063,6 @@ | |||
949 | 26C5F3E605DB1E3C00994065 /* llfloaterpostcard.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterpostcard.cpp; sourceTree = "<group>"; }; | 1063 | 26C5F3E605DB1E3C00994065 /* llfloaterpostcard.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterpostcard.cpp; sourceTree = "<group>"; }; |
950 | 26E79A3D0520B56600A80050 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; }; | 1064 | 26E79A3D0520B56600A80050 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; }; |
951 | 26E79A630520BC6D00A80050 /* libSystem.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libSystem.dylib; path = /usr/lib/libSystem.B.dylib; sourceTree = "<absolute>"; }; | 1065 | 26E79A630520BC6D00A80050 /* libSystem.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libSystem.dylib; path = /usr/lib/libSystem.B.dylib; sourceTree = "<absolute>"; }; |
952 | 26E79A760520BEC400A80050 /* viewer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = viewer.cpp; sourceTree = SOURCE_ROOT; }; | ||
953 | 26E79A7A0520ED1200A80050 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; }; | 1066 | 26E79A7A0520ED1200A80050 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; }; |
954 | 26F529A1051F61DF00A80050 /* llgenepool.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llgenepool.cpp; sourceTree = SOURCE_ROOT; }; | 1067 | 26F529A1051F61DF00A80050 /* llgenepool.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llgenepool.cpp; sourceTree = SOURCE_ROOT; }; |
955 | 26F529A2051F61DF00A80050 /* llviewercamera.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llviewercamera.cpp; sourceTree = SOURCE_ROOT; }; | 1068 | 26F529A2051F61DF00A80050 /* llviewercamera.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llviewercamera.cpp; sourceTree = SOURCE_ROOT; }; |
@@ -1665,7 +1778,6 @@ | |||
1665 | 996209680B864D0E00392531 /* SLVoiceAgent.app */ = {isa = PBXFileReference; lastKnownFileType = wrapper.application; name = SLVoiceAgent.app; path = "vivox-runtime/universal-darwin/SLVoiceAgent.app"; sourceTree = SOURCE_ROOT; }; | 1778 | 996209680B864D0E00392531 /* SLVoiceAgent.app */ = {isa = PBXFileReference; lastKnownFileType = wrapper.application; name = SLVoiceAgent.app; path = "vivox-runtime/universal-darwin/SLVoiceAgent.app"; sourceTree = SOURCE_ROOT; }; |
1666 | 9967E9090B37533F0087BD1B /* libfmodwrapper.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libfmodwrapper.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; | 1779 | 9967E9090B37533F0087BD1B /* libfmodwrapper.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libfmodwrapper.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; |
1667 | 9967E9520B37564D0087BD1B /* fmodwrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fmodwrapper.cpp; sourceTree = "<group>"; }; | 1780 | 9967E9520B37564D0087BD1B /* fmodwrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fmodwrapper.cpp; sourceTree = "<group>"; }; |
1668 | 997B4BD006015820001B0407 /* viewer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = viewer.h; sourceTree = SOURCE_ROOT; }; | ||
1669 | 997B4BD106015820001B0407 /* VertexCache.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = VertexCache.h; sourceTree = SOURCE_ROOT; }; | 1781 | 997B4BD106015820001B0407 /* VertexCache.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = VertexCache.h; sourceTree = SOURCE_ROOT; }; |
1670 | 997B4BD406015820001B0407 /* randgauss.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = randgauss.h; sourceTree = SOURCE_ROOT; }; | 1782 | 997B4BD406015820001B0407 /* randgauss.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = randgauss.h; sourceTree = SOURCE_ROOT; }; |
1671 | 997B4BD506015820001B0407 /* pipeline.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = pipeline.h; sourceTree = SOURCE_ROOT; }; | 1783 | 997B4BD506015820001B0407 /* pipeline.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = pipeline.h; sourceTree = SOURCE_ROOT; }; |
@@ -1898,12 +2010,10 @@ | |||
1898 | 997B4D1306015823001B0407 /* llcallbacklist.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llcallbacklist.h; sourceTree = SOURCE_ROOT; }; | 2010 | 997B4D1306015823001B0407 /* llcallbacklist.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llcallbacklist.h; sourceTree = SOURCE_ROOT; }; |
1899 | 997B4D1606015823001B0407 /* llbox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llbox.h; sourceTree = SOURCE_ROOT; }; | 2011 | 997B4D1606015823001B0407 /* llbox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llbox.h; sourceTree = SOURCE_ROOT; }; |
1900 | 997B4D1806015823001B0407 /* llbbox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llbbox.h; sourceTree = SOURCE_ROOT; }; | 2012 | 997B4D1806015823001B0407 /* llbbox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llbbox.h; sourceTree = SOURCE_ROOT; }; |
1901 | 997B4D1C06015823001B0407 /* llaudiostatus.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llaudiostatus.h; sourceTree = SOURCE_ROOT; }; | ||
1902 | 997B4D1E06015823001B0407 /* llappearance.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llappearance.h; sourceTree = SOURCE_ROOT; }; | 2013 | 997B4D1E06015823001B0407 /* llappearance.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llappearance.h; sourceTree = SOURCE_ROOT; }; |
1903 | 997B4D2206015823001B0407 /* llagentpilot.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagentpilot.h; sourceTree = SOURCE_ROOT; }; | 2014 | 997B4D2206015823001B0407 /* llagentpilot.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagentpilot.h; sourceTree = SOURCE_ROOT; }; |
1904 | 997B4D2306015823001B0407 /* llagent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagent.h; sourceTree = SOURCE_ROOT; }; | 2015 | 997B4D2306015823001B0407 /* llagent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagent.h; sourceTree = SOURCE_ROOT; }; |
1905 | 997B4D2406015823001B0407 /* head.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = head.h; sourceTree = SOURCE_ROOT; }; | 2016 | 997B4D2406015823001B0407 /* head.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = head.h; sourceTree = SOURCE_ROOT; }; |
1906 | 997B4D2506015823001B0407 /* llasynchostbyname.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llasynchostbyname.h; sourceTree = SOURCE_ROOT; }; | ||
1907 | 9985A08E0AC1FE3600579AFB /* llwindowmacosx-objc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = "llwindowmacosx-objc.h"; sourceTree = "<group>"; }; | 2017 | 9985A08E0AC1FE3600579AFB /* llwindowmacosx-objc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = "llwindowmacosx-objc.h"; sourceTree = "<group>"; }; |
1908 | 9985A08F0AC1FE3600579AFB /* llwindowmacosx-objc.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = "llwindowmacosx-objc.mm"; sourceTree = "<group>"; }; | 2018 | 9985A08F0AC1FE3600579AFB /* llwindowmacosx-objc.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = "llwindowmacosx-objc.mm"; sourceTree = "<group>"; }; |
1909 | 9985A1270AC1FE4E00579AFB /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = ../../../../../../../../System/Library/Frameworks/AppKit.framework; sourceTree = "<group>"; }; | 2019 | 9985A1270AC1FE4E00579AFB /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = ../../../../../../../../System/Library/Frameworks/AppKit.framework; sourceTree = "<group>"; }; |
@@ -2032,6 +2142,10 @@ | |||
2032 | ABD8702D0B3C68630007C63B /* llvoavatar.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llvoavatar.h; sourceTree = "<group>"; }; | 2142 | ABD8702D0B3C68630007C63B /* llvoavatar.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llvoavatar.h; sourceTree = "<group>"; }; |
2033 | C16C084E0B4AE6C7009AD67F /* llfloaterinspect.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterinspect.cpp; sourceTree = "<group>"; }; | 2143 | C16C084E0B4AE6C7009AD67F /* llfloaterinspect.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterinspect.cpp; sourceTree = "<group>"; }; |
2034 | C16C084F0B4AE6C7009AD67F /* llfloaterinspect.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterinspect.h; sourceTree = "<group>"; }; | 2144 | C16C084F0B4AE6C7009AD67F /* llfloaterinspect.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterinspect.h; sourceTree = "<group>"; }; |
2145 | C1B2AF890CD679EB004CD4EF /* llcrashloggermac.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llcrashloggermac.h; sourceTree = "<group>"; }; | ||
2146 | C1E4A5750CC020FC005FB0A6 /* llcrashloggermac.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llcrashloggermac.cpp; sourceTree = "<group>"; }; | ||
2147 | C1E4A5770CC0210F005FB0A6 /* llcrashlogger.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = llcrashlogger.cpp; path = ../llcrashlogger/llcrashlogger.cpp; sourceTree = SOURCE_ROOT; }; | ||
2148 | C1E4A5780CC0210F005FB0A6 /* llcrashlogger.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = llcrashlogger.h; path = ../llcrashlogger/llcrashlogger.h; sourceTree = SOURCE_ROOT; }; | ||
2035 | C1F5D0A30B138AEB00827F1D /* lluserrelations.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = lluserrelations.cpp; sourceTree = "<group>"; }; | 2149 | C1F5D0A30B138AEB00827F1D /* lluserrelations.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = lluserrelations.cpp; sourceTree = "<group>"; }; |
2036 | C1F5D0A40B138AEB00827F1D /* lluserrelations.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = lluserrelations.h; sourceTree = "<group>"; }; | 2150 | C1F5D0A40B138AEB00827F1D /* lluserrelations.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = lluserrelations.h; sourceTree = "<group>"; }; |
2037 | C64F673D0AFBED80009732B5 /* lllogchat.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = lllogchat.cpp; sourceTree = "<group>"; }; | 2151 | C64F673D0AFBED80009732B5 /* lllogchat.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = lllogchat.cpp; sourceTree = "<group>"; }; |
@@ -2041,6 +2155,8 @@ | |||
2041 | CB162DB40C6CCCFE00BF83BB /* llextendedstatus.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llextendedstatus.h; sourceTree = "<group>"; }; | 2155 | CB162DB40C6CCCFE00BF83BB /* llextendedstatus.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llextendedstatus.h; sourceTree = "<group>"; }; |
2042 | D23289B30C453A3600304FEF /* llfloaterreleasemsg.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterreleasemsg.cpp; sourceTree = "<group>"; }; | 2156 | D23289B30C453A3600304FEF /* llfloaterreleasemsg.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterreleasemsg.cpp; sourceTree = "<group>"; }; |
2043 | D23289B40C453A3600304FEF /* llfloaterreleasemsg.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterreleasemsg.h; sourceTree = "<group>"; }; | 2157 | D23289B40C453A3600304FEF /* llfloaterreleasemsg.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterreleasemsg.h; sourceTree = "<group>"; }; |
2158 | D2768CE30CEA38940000BD66 /* llfloaterlagmeter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterlagmeter.cpp; sourceTree = "<group>"; }; | ||
2159 | D2768CE40CEA38940000BD66 /* llfloaterlagmeter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = llfloaterlagmeter.h; sourceTree = "<group>"; }; | ||
2044 | D62830D80B4DC76300F8830F /* llimagej2coj.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llimagej2coj.cpp; sourceTree = "<group>"; }; | 2160 | D62830D80B4DC76300F8830F /* llimagej2coj.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llimagej2coj.cpp; sourceTree = "<group>"; }; |
2045 | D62830D90B4DC76300F8830F /* llimagej2coj.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llimagej2coj.h; sourceTree = "<group>"; }; | 2161 | D62830D90B4DC76300F8830F /* llimagej2coj.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llimagej2coj.h; sourceTree = "<group>"; }; |
2046 | D628315B0B4F3FA100F8830F /* llfont.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfont.cpp; sourceTree = "<group>"; }; | 2162 | D628315B0B4F3FA100F8830F /* llfont.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfont.cpp; sourceTree = "<group>"; }; |
@@ -2234,6 +2350,14 @@ | |||
2234 | FE5138760CD80BAE00F32EE3 /* llfloaterevent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterevent.h; sourceTree = "<group>"; }; | 2350 | FE5138760CD80BAE00F32EE3 /* llfloaterevent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterevent.h; sourceTree = "<group>"; }; |
2235 | FE5138770CD80BAE00F32EE3 /* llfloaterparcel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterparcel.cpp; sourceTree = "<group>"; }; | 2351 | FE5138770CD80BAE00F32EE3 /* llfloaterparcel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterparcel.cpp; sourceTree = "<group>"; }; |
2236 | FE5138780CD80BAE00F32EE3 /* llfloaterparcel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterparcel.h; sourceTree = "<group>"; }; | 2352 | FE5138780CD80BAE00F32EE3 /* llfloaterparcel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterparcel.h; sourceTree = "<group>"; }; |
2353 | FE679A350CDFF5AC00959041 /* llappviewer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llappviewer.cpp; sourceTree = "<group>"; }; | ||
2354 | FE679A360CDFF5AC00959041 /* llappviewer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llappviewer.h; sourceTree = "<group>"; }; | ||
2355 | FE679A370CDFF5AC00959041 /* llappviewermacosx.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llappviewermacosx.cpp; sourceTree = "<group>"; }; | ||
2356 | FE679A380CDFF5AC00959041 /* llappviewermacosx.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llappviewermacosx.h; sourceTree = "<group>"; }; | ||
2357 | FE679A390CDFF5AC00959041 /* llvectorperfoptions.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llvectorperfoptions.cpp; sourceTree = "<group>"; }; | ||
2358 | FE679A3A0CDFF5AC00959041 /* llvectorperfoptions.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llvectorperfoptions.h; sourceTree = "<group>"; }; | ||
2359 | FE679A3B0CDFF5AC00959041 /* llvieweraudio.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llvieweraudio.cpp; sourceTree = "<group>"; }; | ||
2360 | FE679A3C0CDFF5AC00959041 /* llvieweraudio.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llvieweraudio.h; sourceTree = "<group>"; }; | ||
2237 | /* End PBXFileReference section */ | 2361 | /* End PBXFileReference section */ |
2238 | 2362 | ||
2239 | /* Begin PBXFrameworksBuildPhase section */ | 2363 | /* Begin PBXFrameworksBuildPhase section */ |
@@ -2278,6 +2402,7 @@ | |||
2278 | buildActionMask = 2147483647; | 2402 | buildActionMask = 2147483647; |
2279 | files = ( | 2403 | files = ( |
2280 | 61923C89074ACA70005E1F34 /* libllcommon.a in Frameworks */, | 2404 | 61923C89074ACA70005E1F34 /* libllcommon.a in Frameworks */, |
2405 | C1E4A5FE0CC02365005FB0A6 /* libxmlrpc.a in Frameworks */, | ||
2281 | FDE8765A09BEA3BC00AF6316 /* libapr-1.a in Frameworks */, | 2406 | FDE8765A09BEA3BC00AF6316 /* libapr-1.a in Frameworks */, |
2282 | FDAA36AA09B916BD00FBF1CA /* Carbon.framework in Frameworks */, | 2407 | FDAA36AA09B916BD00FBF1CA /* Carbon.framework in Frameworks */, |
2283 | FDAA36B909B919AD00FBF1CA /* libssl.dylib in Frameworks */, | 2408 | FDAA36B909B919AD00FBF1CA /* libssl.dylib in Frameworks */, |
@@ -2419,6 +2544,16 @@ | |||
2419 | 26F529A0051F61CD00A80050 /* newview */ = { | 2544 | 26F529A0051F61CD00A80050 /* newview */ = { |
2420 | isa = PBXGroup; | 2545 | isa = PBXGroup; |
2421 | children = ( | 2546 | children = ( |
2547 | D2768CE30CEA38940000BD66 /* llfloaterlagmeter.cpp */, | ||
2548 | D2768CE40CEA38940000BD66 /* llfloaterlagmeter.h */, | ||
2549 | FE679A350CDFF5AC00959041 /* llappviewer.cpp */, | ||
2550 | FE679A360CDFF5AC00959041 /* llappviewer.h */, | ||
2551 | FE679A370CDFF5AC00959041 /* llappviewermacosx.cpp */, | ||
2552 | FE679A380CDFF5AC00959041 /* llappviewermacosx.h */, | ||
2553 | FE679A390CDFF5AC00959041 /* llvectorperfoptions.cpp */, | ||
2554 | FE679A3A0CDFF5AC00959041 /* llvectorperfoptions.h */, | ||
2555 | FE679A3B0CDFF5AC00959041 /* llvieweraudio.cpp */, | ||
2556 | FE679A3C0CDFF5AC00959041 /* llvieweraudio.h */, | ||
2422 | FE51386F0CD80BAE00F32EE3 /* llclassifiedinfo.h */, | 2557 | FE51386F0CD80BAE00F32EE3 /* llclassifiedinfo.h */, |
2423 | FE5138700CD80BAE00F32EE3 /* lldebugmessagebox.cpp */, | 2558 | FE5138700CD80BAE00F32EE3 /* lldebugmessagebox.cpp */, |
2424 | FE5138710CD80BAE00F32EE3 /* lldebugmessagebox.h */, | 2559 | FE5138710CD80BAE00F32EE3 /* lldebugmessagebox.h */, |
@@ -2439,7 +2574,6 @@ | |||
2439 | 1AD394120CAB001B004BA76A /* llcommandhandler.cpp */, | 2574 | 1AD394120CAB001B004BA76A /* llcommandhandler.cpp */, |
2440 | 1AD3940E0CAB000F004BA76A /* llurlsimstring.cpp */, | 2575 | 1AD3940E0CAB000F004BA76A /* llurlsimstring.cpp */, |
2441 | 1AD3940F0CAB000F004BA76A /* llurldispatcher.cpp */, | 2576 | 1AD3940F0CAB000F004BA76A /* llurldispatcher.cpp */, |
2442 | 1A57CD2B0C9EFE9900B6EB24 /* llfloaterlagmeter.cpp */, | ||
2443 | 79256EA10C57D6A4000AAFA4 /* llfloatervoicewizard.cpp */, | 2577 | 79256EA10C57D6A4000AAFA4 /* llfloatervoicewizard.cpp */, |
2444 | 79256EA20C57D6A4000AAFA4 /* llfloatervoicewizard.h */, | 2578 | 79256EA20C57D6A4000AAFA4 /* llfloatervoicewizard.h */, |
2445 | AA11834E0C1DF9C400FDE5BA /* llpanelaudiovolume.cpp */, | 2579 | AA11834E0C1DF9C400FDE5BA /* llpanelaudiovolume.cpp */, |
@@ -2839,7 +2973,6 @@ | |||
2839 | 26F529BE051F61DF00A80050 /* moviemaker.cpp */, | 2973 | 26F529BE051F61DF00A80050 /* moviemaker.cpp */, |
2840 | 26F529BD051F61DF00A80050 /* noise.cpp */, | 2974 | 26F529BD051F61DF00A80050 /* noise.cpp */, |
2841 | 26F529BA051F61DF00A80050 /* pipeline.cpp */, | 2975 | 26F529BA051F61DF00A80050 /* pipeline.cpp */, |
2842 | 26E79A760520BEC400A80050 /* viewer.cpp */, | ||
2843 | D8CA570D0BAF74FC0093D6D4 /* llvoicevisualizer.h */, | 2976 | D8CA570D0BAF74FC0093D6D4 /* llvoicevisualizer.h */, |
2844 | D8CA570E0BAF74FC0093D6D4 /* llvoicevisualizer.cpp */, | 2977 | D8CA570E0BAF74FC0093D6D4 /* llvoicevisualizer.cpp */, |
2845 | ); | 2978 | ); |
@@ -3479,6 +3612,10 @@ | |||
3479 | 61923C96074AD8B7005E1F34 /* mac_crash_logger */ = { | 3612 | 61923C96074AD8B7005E1F34 /* mac_crash_logger */ = { |
3480 | isa = PBXGroup; | 3613 | isa = PBXGroup; |
3481 | children = ( | 3614 | children = ( |
3615 | C1B2AF890CD679EB004CD4EF /* llcrashloggermac.h */, | ||
3616 | C1E4A5770CC0210F005FB0A6 /* llcrashlogger.cpp */, | ||
3617 | C1E4A5780CC0210F005FB0A6 /* llcrashlogger.h */, | ||
3618 | C1E4A5750CC020FC005FB0A6 /* llcrashloggermac.cpp */, | ||
3482 | 61923C97074AD8B7005E1F34 /* mac_crash_logger.cpp */, | 3619 | 61923C97074AD8B7005E1F34 /* mac_crash_logger.cpp */, |
3483 | ); | 3620 | ); |
3484 | name = mac_crash_logger; | 3621 | name = mac_crash_logger; |
@@ -3636,15 +3773,12 @@ | |||
3636 | 1AD394140CAB0023004BA76A /* llcommandhandler.h */, | 3773 | 1AD394140CAB0023004BA76A /* llcommandhandler.h */, |
3637 | 1AD3940C0CAB0003004BA76A /* llurlsimstring.h */, | 3774 | 1AD3940C0CAB0003004BA76A /* llurlsimstring.h */, |
3638 | 1AD3940D0CAB0003004BA76A /* llurldispatcher.h */, | 3775 | 1AD3940D0CAB0003004BA76A /* llurldispatcher.h */, |
3639 | 1A57CD2D0C9EFEA400B6EB24 /* llfloaterlagmeter.h */, | ||
3640 | 997B4CF006015822001B0407 /* audiosettings.h */, | 3776 | 997B4CF006015822001B0407 /* audiosettings.h */, |
3641 | 997B4D2406015823001B0407 /* head.h */, | 3777 | 997B4D2406015823001B0407 /* head.h */, |
3642 | 997B4D2306015823001B0407 /* llagent.h */, | 3778 | 997B4D2306015823001B0407 /* llagent.h */, |
3643 | 1A758C990A43700400589675 /* llagentdata.h */, | 3779 | 1A758C990A43700400589675 /* llagentdata.h */, |
3644 | 997B4D2206015823001B0407 /* llagentpilot.h */, | 3780 | 997B4D2206015823001B0407 /* llagentpilot.h */, |
3645 | 997B4D1E06015823001B0407 /* llappearance.h */, | 3781 | 997B4D1E06015823001B0407 /* llappearance.h */, |
3646 | 997B4D2506015823001B0407 /* llasynchostbyname.h */, | ||
3647 | 997B4D1C06015823001B0407 /* llaudiostatus.h */, | ||
3648 | 997B4D1806015823001B0407 /* llbbox.h */, | 3782 | 997B4D1806015823001B0407 /* llbbox.h */, |
3649 | 997B4D1606015823001B0407 /* llbox.h */, | 3783 | 997B4D1606015823001B0407 /* llbox.h */, |
3650 | 997B4D1306015823001B0407 /* llcallbacklist.h */, | 3784 | 997B4D1306015823001B0407 /* llcallbacklist.h */, |
@@ -3919,7 +4053,6 @@ | |||
3919 | 997B4BD506015820001B0407 /* pipeline.h */, | 4053 | 997B4BD506015820001B0407 /* pipeline.h */, |
3920 | 997B4BD406015820001B0407 /* randgauss.h */, | 4054 | 997B4BD406015820001B0407 /* randgauss.h */, |
3921 | 997B4BD106015820001B0407 /* VertexCache.h */, | 4055 | 997B4BD106015820001B0407 /* VertexCache.h */, |
3922 | 997B4BD006015820001B0407 /* viewer.h */, | ||
3923 | ); | 4056 | ); |
3924 | name = "newview headers"; | 4057 | name = "newview headers"; |
3925 | sourceTree = "<group>"; | 4058 | sourceTree = "<group>"; |
@@ -4129,6 +4262,7 @@ | |||
4129 | 20286C28FDCF999611CA2CEA /* Project object */ = { | 4262 | 20286C28FDCF999611CA2CEA /* Project object */ = { |
4130 | isa = PBXProject; | 4263 | isa = PBXProject; |
4131 | buildConfigurationList = 999484580883114300EFC621 /* Build configuration list for PBXProject "macview" */; | 4264 | buildConfigurationList = 999484580883114300EFC621 /* Build configuration list for PBXProject "macview" */; |
4265 | compatibilityVersion = "Xcode 2.4"; | ||
4132 | hasScannedForEncodings = 1; | 4266 | hasScannedForEncodings = 1; |
4133 | knownRegions = ( | 4267 | knownRegions = ( |
4134 | English, | 4268 | English, |
@@ -4139,6 +4273,7 @@ | |||
4139 | ); | 4273 | ); |
4140 | mainGroup = 20286C29FDCF999611CA2CEA /* «PROJECTNAME» */; | 4274 | mainGroup = 20286C29FDCF999611CA2CEA /* «PROJECTNAME» */; |
4141 | projectDirPath = ""; | 4275 | projectDirPath = ""; |
4276 | projectRoot = ""; | ||
4142 | targets = ( | 4277 | targets = ( |
4143 | FD53B40509BDF9F600BFE3BC /* third party libs */, | 4278 | FD53B40509BDF9F600BFE3BC /* third party libs */, |
4144 | 99CDED4905E70BAB0000F8AA /* llcommon */, | 4279 | 99CDED4905E70BAB0000F8AA /* llcommon */, |
@@ -4437,7 +4572,6 @@ | |||
4437 | 5503BC4E05446B20003D051F /* llmenucommands.cpp in Sources */, | 4572 | 5503BC4E05446B20003D051F /* llmenucommands.cpp in Sources */, |
4438 | 5503BC4F05446B20003D051F /* llhudeffectpointat.cpp in Sources */, | 4573 | 5503BC4F05446B20003D051F /* llhudeffectpointat.cpp in Sources */, |
4439 | 5503BC5005446B20003D051F /* llhudeffectlookat.cpp in Sources */, | 4574 | 5503BC5005446B20003D051F /* llhudeffectlookat.cpp in Sources */, |
4440 | 5503BCDA05446B20003D051F /* viewer.cpp in Sources */, | ||
4441 | 5503BCDC05446B20003D051F /* llnameeditor.cpp in Sources */, | 4575 | 5503BCDC05446B20003D051F /* llnameeditor.cpp in Sources */, |
4442 | 5503BCDD05446B20003D051F /* llnamebox.cpp in Sources */, | 4576 | 5503BCDD05446B20003D051F /* llnamebox.cpp in Sources */, |
4443 | 5503BCEB05446B20003D051F /* llfeaturemanager.cpp in Sources */, | 4577 | 5503BCEB05446B20003D051F /* llfeaturemanager.cpp in Sources */, |
@@ -4684,7 +4818,6 @@ | |||
4684 | 79256EA30C57D6A5000AAFA4 /* llfloatervoicewizard.cpp in Sources */, | 4818 | 79256EA30C57D6A5000AAFA4 /* llfloatervoicewizard.cpp in Sources */, |
4685 | D23289B50C453A3600304FEF /* llfloaterreleasemsg.cpp in Sources */, | 4819 | D23289B50C453A3600304FEF /* llfloaterreleasemsg.cpp in Sources */, |
4686 | 8849626C0C7B3E8A00A777FB /* llares.cpp in Sources */, | 4820 | 8849626C0C7B3E8A00A777FB /* llares.cpp in Sources */, |
4687 | 1A57CD2C0C9EFE9900B6EB24 /* llfloaterlagmeter.cpp in Sources */, | ||
4688 | 1AD394100CAB000F004BA76A /* llurlsimstring.cpp in Sources */, | 4821 | 1AD394100CAB000F004BA76A /* llurlsimstring.cpp in Sources */, |
4689 | 1AD394110CAB000F004BA76A /* llurldispatcher.cpp in Sources */, | 4822 | 1AD394110CAB000F004BA76A /* llurldispatcher.cpp in Sources */, |
4690 | 1AD394130CAB001B004BA76A /* llcommandhandler.cpp in Sources */, | 4823 | 1AD394130CAB001B004BA76A /* llcommandhandler.cpp in Sources */, |
@@ -4696,6 +4829,11 @@ | |||
4696 | FE51387B0CD80BAE00F32EE3 /* llfloaterclassified.cpp in Sources */, | 4829 | FE51387B0CD80BAE00F32EE3 /* llfloaterclassified.cpp in Sources */, |
4697 | FE51387C0CD80BAE00F32EE3 /* llfloaterevent.cpp in Sources */, | 4830 | FE51387C0CD80BAE00F32EE3 /* llfloaterevent.cpp in Sources */, |
4698 | FE51387D0CD80BAE00F32EE3 /* llfloaterparcel.cpp in Sources */, | 4831 | FE51387D0CD80BAE00F32EE3 /* llfloaterparcel.cpp in Sources */, |
4832 | FE679A3D0CDFF5AC00959041 /* llappviewer.cpp in Sources */, | ||
4833 | FE679A3E0CDFF5AC00959041 /* llappviewermacosx.cpp in Sources */, | ||
4834 | FE679A3F0CDFF5AC00959041 /* llvectorperfoptions.cpp in Sources */, | ||
4835 | FE679A400CDFF5AC00959041 /* llvieweraudio.cpp in Sources */, | ||
4836 | D2768CE50CEA38940000BD66 /* llfloaterlagmeter.cpp in Sources */, | ||
4699 | ); | 4837 | ); |
4700 | runOnlyForDeploymentPostprocessing = 0; | 4838 | runOnlyForDeploymentPostprocessing = 0; |
4701 | }; | 4839 | }; |
@@ -4703,7 +4841,119 @@ | |||
4703 | isa = PBXSourcesBuildPhase; | 4841 | isa = PBXSourcesBuildPhase; |
4704 | buildActionMask = 2147483647; | 4842 | buildActionMask = 2147483647; |
4705 | files = ( | 4843 | files = ( |
4844 | C1E4A5F70CC0226A005FB0A6 /* llxmltree.cpp in Sources */, | ||
4845 | C1E4A5F80CC0226A005FB0A6 /* llxmlnode.cpp in Sources */, | ||
4846 | C1E4A5F90CC0226A005FB0A6 /* llcontrol.cpp in Sources */, | ||
4847 | C1E4A5FA0CC0226A005FB0A6 /* llxmlparser.cpp in Sources */, | ||
4848 | C1E4A57B0CC02160005FB0A6 /* lldate.cpp in Sources */, | ||
4849 | C1E4A57C0CC02160005FB0A6 /* llthread.cpp in Sources */, | ||
4850 | C1E4A57D0CC02160005FB0A6 /* u64.cpp in Sources */, | ||
4851 | C1E4A57E0CC02160005FB0A6 /* llerror.cpp in Sources */, | ||
4852 | C1E4A57F0CC02160005FB0A6 /* llstreamtools.cpp in Sources */, | ||
4853 | C1E4A5800CC02160005FB0A6 /* llapp.cpp in Sources */, | ||
4854 | C1E4A5810CC02160005FB0A6 /* llfasttimer.cpp in Sources */, | ||
4855 | C1E4A5820CC02160005FB0A6 /* llfixedbuffer.cpp in Sources */, | ||
4856 | C1E4A5830CC02160005FB0A6 /* llstat.cpp in Sources */, | ||
4857 | C1E4A5840CC02160005FB0A6 /* llmemory.cpp in Sources */, | ||
4858 | C1E4A5850CC02160005FB0A6 /* llsd.cpp in Sources */, | ||
4859 | C1E4A5860CC02160005FB0A6 /* llcommon.cpp in Sources */, | ||
4860 | C1E4A5870CC02160005FB0A6 /* llares.cpp in Sources */, | ||
4861 | C1E4A5880CC02160005FB0A6 /* llbase32.cpp in Sources */, | ||
4862 | C1E4A5890CC02160005FB0A6 /* llbase64.cpp in Sources */, | ||
4863 | C1E4A58A0CC02160005FB0A6 /* llmortician.cpp in Sources */, | ||
4864 | C1E4A58B0CC02160005FB0A6 /* llprocessor.cpp in Sources */, | ||
4865 | C1E4A58C0CC02160005FB0A6 /* llformat.cpp in Sources */, | ||
4866 | C1E4A58D0CC02160005FB0A6 /* llsecondlifeurls.cpp in Sources */, | ||
4867 | C1E4A58E0CC02160005FB0A6 /* llstringtable.cpp in Sources */, | ||
4868 | C1E4A58F0CC02160005FB0A6 /* llsdutil.cpp in Sources */, | ||
4869 | C1E4A5900CC02160005FB0A6 /* llstring.cpp in Sources */, | ||
4870 | C1E4A5910CC02160005FB0A6 /* lluri.cpp in Sources */, | ||
4871 | C1E4A5930CC02160005FB0A6 /* llapr.cpp in Sources */, | ||
4872 | C1E4A5940CC02160005FB0A6 /* llworkerthread.cpp in Sources */, | ||
4873 | C1E4A5960CC02160005FB0A6 /* llerrorthread.cpp in Sources */, | ||
4874 | C1E4A5970CC02160005FB0A6 /* llsdserialize.cpp in Sources */, | ||
4875 | C1E4A5980CC02160005FB0A6 /* llrun.cpp in Sources */, | ||
4876 | C1E4A59A0CC02160005FB0A6 /* llframetimer.cpp in Sources */, | ||
4877 | C1E4A59B0CC02160005FB0A6 /* llmemorystream.cpp in Sources */, | ||
4878 | C1E4A59C0CC02160005FB0A6 /* metaproperty.cpp in Sources */, | ||
4879 | C1E4A59D0CC02160005FB0A6 /* llfile.cpp in Sources */, | ||
4880 | C1E4A59E0CC02160005FB0A6 /* llcriticaldamp.cpp in Sources */, | ||
4881 | C1E4A59F0CC02160005FB0A6 /* llsdserialize_xml.cpp in Sources */, | ||
4882 | C1E4A5A00CC02160005FB0A6 /* metaclass.cpp in Sources */, | ||
4883 | C1E4A5A10CC02160005FB0A6 /* reflective.cpp in Sources */, | ||
4884 | C1E4A5A20CC02160005FB0A6 /* llsys.cpp in Sources */, | ||
4885 | C1E4A5A30CC02160005FB0A6 /* llassettype.cpp in Sources */, | ||
4886 | C1E4A5A40CC02160005FB0A6 /* lltimer.cpp in Sources */, | ||
4887 | C1E4A5A50CC02160005FB0A6 /* timing.cpp in Sources */, | ||
4888 | C1E4A5A60CC02160005FB0A6 /* llliveappconfig.cpp in Sources */, | ||
4889 | C1E4A5A70CC0216F005FB0A6 /* llnullcipher.cpp in Sources */, | ||
4890 | C1E4A5A80CC0216F005FB0A6 /* llurlrequest.cpp in Sources */, | ||
4891 | C1E4A5AA0CC0216F005FB0A6 /* lltransfersourceasset.cpp in Sources */, | ||
4892 | C1E4A5AB0CC0216F005FB0A6 /* llhost.cpp in Sources */, | ||
4893 | C1E4A5AC0CC0216F005FB0A6 /* llmessageconfig.cpp in Sources */, | ||
4894 | C1E4A5AD0CC0216F005FB0A6 /* partsyspacket.cpp in Sources */, | ||
4895 | C1E4A5AE0CC0216F005FB0A6 /* lltemplatemessagebuilder.cpp in Sources */, | ||
4896 | C1E4A5AF0CC0216F005FB0A6 /* message.cpp in Sources */, | ||
4897 | C1E4A5B00CC0216F005FB0A6 /* llbufferstream.cpp in Sources */, | ||
4898 | C1E4A5B10CC0216F005FB0A6 /* llhttpnode.cpp in Sources */, | ||
4899 | C1E4A5B20CC0216F005FB0A6 /* lltransfersourcefile.cpp in Sources */, | ||
4900 | C1E4A5B30CC0216F005FB0A6 /* llchainio.cpp in Sources */, | ||
4901 | C1E4A5B40CC0216F005FB0A6 /* llhttpclient.cpp in Sources */, | ||
4902 | C1E4A5B50CC0216F005FB0A6 /* llxfer.cpp in Sources */, | ||
4903 | C1E4A5B60CC0216F005FB0A6 /* network.cpp in Sources */, | ||
4904 | C1E4A5B70CC0216F005FB0A6 /* llpacketring.cpp in Sources */, | ||
4905 | C1E4A5B80CC0216F005FB0A6 /* llxfer_vfile.cpp in Sources */, | ||
4906 | C1E4A5B90CC0216F005FB0A6 /* llsdmessagereader.cpp in Sources */, | ||
4907 | C1E4A5BA0CC0216F005FB0A6 /* llxfermanager.cpp in Sources */, | ||
4908 | C1E4A5BB0CC0216F005FB0A6 /* llmessagethrottle.cpp in Sources */, | ||
4909 | C1E4A5BC0CC0216F005FB0A6 /* llsdmessagebuilder.cpp in Sources */, | ||
4910 | C1E4A5BD0CC0216F005FB0A6 /* message_string_table.cpp in Sources */, | ||
4911 | C1E4A5BE0CC0216F005FB0A6 /* message_prehash.cpp in Sources */, | ||
4912 | C1E4A5BF0CC0216F005FB0A6 /* llmessagetemplate.cpp in Sources */, | ||
4913 | C1E4A5C00CC0216F005FB0A6 /* llxfer_file.cpp in Sources */, | ||
4914 | C1E4A5C10CC0216F005FB0A6 /* llmime.cpp in Sources */, | ||
4915 | C1E4A5C20CC0216F005FB0A6 /* llmessagereader.cpp in Sources */, | ||
4916 | C1E4A5C30CC0216F005FB0A6 /* patch_idct.cpp in Sources */, | ||
4917 | C1E4A5C40CC0216F005FB0A6 /* lliosocket.cpp in Sources */, | ||
4918 | C1E4A5C50CC0216F005FB0A6 /* llcachename.cpp in Sources */, | ||
4919 | C1E4A5C60CC0216F005FB0A6 /* llblowfishcipher.cpp in Sources */, | ||
4920 | C1E4A5C70CC0216F005FB0A6 /* llpacketbuffer.cpp in Sources */, | ||
4921 | C1E4A5C80CC0216F005FB0A6 /* llmessagetemplateparser.cpp in Sources */, | ||
4922 | C1E4A5C90CC0216F005FB0A6 /* llbuffer.cpp in Sources */, | ||
4923 | C1E4A5CA0CC0216F005FB0A6 /* llcurl.cpp in Sources */, | ||
4924 | C1E4A5CB0CC0216F005FB0A6 /* llxorcipher.cpp in Sources */, | ||
4925 | C1E4A5CC0CC0216F005FB0A6 /* llnamevalue.cpp in Sources */, | ||
4926 | C1E4A5CD0CC0216F005FB0A6 /* lliobuffer.cpp in Sources */, | ||
4927 | C1E4A5CE0CC0216F005FB0A6 /* llpartdata.cpp in Sources */, | ||
4928 | C1E4A5CF0CC0216F005FB0A6 /* llfiltersd2xmlrpc.cpp in Sources */, | ||
4929 | C1E4A5D00CC0216F005FB0A6 /* net.cpp in Sources */, | ||
4930 | C1E4A5D10CC0216F005FB0A6 /* llxfer_mem.cpp in Sources */, | ||
4931 | C1E4A5D20CC0216F005FB0A6 /* llthrottle.cpp in Sources */, | ||
4932 | C1E4A5D30CC0216F005FB0A6 /* lllogtextmessage.cpp in Sources */, | ||
4933 | C1E4A5920CC02160005FB0A6 /* llevent.cpp in Sources */, | ||
4934 | C1E4A5D40CC0216F005FB0A6 /* llinstantmessage.cpp in Sources */, | ||
4935 | C1E4A5D50CC0216F005FB0A6 /* llmessagebuilder.cpp in Sources */, | ||
4936 | C1E4A5D60CC0216F005FB0A6 /* lldatapacker.cpp in Sources */, | ||
4937 | C1E4A5D70CC0216F005FB0A6 /* patch_code.cpp in Sources */, | ||
4938 | C1E4A5D80CC0216F005FB0A6 /* llservice.cpp in Sources */, | ||
4939 | C1E4A5D90CC0216F005FB0A6 /* llclassifiedflags.cpp in Sources */, | ||
4940 | C1E4A5DA0CC0216F005FB0A6 /* patch_dct.cpp in Sources */, | ||
4941 | C1E4A5DB0CC0216F005FB0A6 /* lltransfertargetvfile.cpp in Sources */, | ||
4942 | C1E4A5DC0CC0216F005FB0A6 /* lltemplatemessagereader.cpp in Sources */, | ||
4943 | C1E4A5DD0CC0216F005FB0A6 /* llassetstorage.cpp in Sources */, | ||
4944 | C1E4A5DE0CC0216F005FB0A6 /* lldispatcher.cpp in Sources */, | ||
4945 | C1E4A5DF0CC0216F005FB0A6 /* llpacketack.cpp in Sources */, | ||
4946 | C1E4A5E00CC0216F005FB0A6 /* llcircuit.cpp in Sources */, | ||
4947 | C1E4A5E10CC0216F005FB0A6 /* llhttpsender.cpp in Sources */, | ||
4948 | C1E4A5E20CC0216F005FB0A6 /* llpumpio.cpp in Sources */, | ||
4949 | C1E4A5E30CC0216F005FB0A6 /* lltransfertargetfile.cpp in Sources */, | ||
4950 | C1E4A5E40CC0216F005FB0A6 /* lluseroperation.cpp in Sources */, | ||
4951 | C1E4A5E50CC0216F005FB0A6 /* lliopipe.cpp in Sources */, | ||
4952 | C1E4A5E60CC0216F005FB0A6 /* llioutil.cpp in Sources */, | ||
4953 | C1E4A5E70CC0216F005FB0A6 /* lltransfermanager.cpp in Sources */, | ||
4706 | 61923C9E074AD920005E1F34 /* mac_crash_logger.cpp in Sources */, | 4954 | 61923C9E074AD920005E1F34 /* mac_crash_logger.cpp in Sources */, |
4955 | C1E4A5760CC020FC005FB0A6 /* llcrashloggermac.cpp in Sources */, | ||
4956 | C1E4A5790CC0210F005FB0A6 /* llcrashlogger.cpp in Sources */, | ||
4707 | ); | 4957 | ); |
4708 | runOnlyForDeploymentPostprocessing = 0; | 4958 | runOnlyForDeploymentPostprocessing = 0; |
4709 | }; | 4959 | }; |
@@ -4994,12 +5244,10 @@ | |||
4994 | isa = XCBuildConfiguration; | 5244 | isa = XCBuildConfiguration; |
4995 | buildSettings = { | 5245 | buildSettings = { |
4996 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; | 5246 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; |
4997 | GCC_PRECOMPILE_PREFIX_HEADER = YES; | ||
4998 | GCC_PREFIX_HEADER = macutil_Prefix.h; | ||
4999 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; | 5247 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; |
5000 | INFOPLIST_FILE = "AutoUpdater-Info.plist"; | 5248 | INFOPLIST_FILE = "AutoUpdater-Info.plist"; |
5001 | LIBRARY_SEARCH_PATHS = "$(inherited)"; | 5249 | LIBRARY_SEARCH_PATHS = "$(inherited)"; |
5002 | OTHER_LDFLAGS = ""; | 5250 | OTHER_LDFLAGS = "-Wl,-search_paths_first"; |
5003 | PRODUCT_NAME = AutoUpdater; | 5251 | PRODUCT_NAME = AutoUpdater; |
5004 | }; | 5252 | }; |
5005 | name = Universal; | 5253 | name = Universal; |
@@ -5011,8 +5259,15 @@ | |||
5011 | GCC_PRECOMPILE_PREFIX_HEADER = YES; | 5259 | GCC_PRECOMPILE_PREFIX_HEADER = YES; |
5012 | GCC_PREFIX_HEADER = macutil_Prefix.h; | 5260 | GCC_PREFIX_HEADER = macutil_Prefix.h; |
5013 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; | 5261 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; |
5262 | HEADER_SEARCH_PATHS = ( | ||
5263 | "../../libraries/$(arch)-darwin/include", | ||
5264 | ../../libraries/include, | ||
5265 | ../llcommon, | ||
5266 | ../llcrashlogger, | ||
5267 | ); | ||
5014 | INFOPLIST_FILE = "crashreporter-Info.plist"; | 5268 | INFOPLIST_FILE = "crashreporter-Info.plist"; |
5015 | LIBRARY_SEARCH_PATHS = "$(inherited)"; | 5269 | LIBRARY_SEARCH_PATHS = "$(inherited)"; |
5270 | OTHER_LDFLAGS = "-Wl,-search_paths_first"; | ||
5016 | PRODUCT_NAME = crashreporter; | 5271 | PRODUCT_NAME = crashreporter; |
5017 | }; | 5272 | }; |
5018 | name = Universal; | 5273 | name = Universal; |
@@ -5022,8 +5277,10 @@ | |||
5022 | buildSettings = { | 5277 | buildSettings = { |
5023 | CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)"; | 5278 | CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)"; |
5024 | DEPLOYMENT_POSTPROCESSING = YES; | 5279 | DEPLOYMENT_POSTPROCESSING = YES; |
5280 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; | ||
5025 | GCC_PRECOMPILE_PREFIX_HEADER = YES; | 5281 | GCC_PRECOMPILE_PREFIX_HEADER = YES; |
5026 | GCC_PREFIX_HEADER = llviewerprecompiledheaders.h; | 5282 | GCC_PREFIX_HEADER = llviewerprecompiledheaders.h; |
5283 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; | ||
5027 | HEADER_SEARCH_PATHS = "$(HEADER_SEARCH_PATHS)"; | 5284 | HEADER_SEARCH_PATHS = "$(HEADER_SEARCH_PATHS)"; |
5028 | INFOPLIST_FILE = "Info-SecondLife.plist"; | 5285 | INFOPLIST_FILE = "Info-SecondLife.plist"; |
5029 | INSTALL_PATH = Applications; | 5286 | INSTALL_PATH = Applications; |
@@ -5032,11 +5289,13 @@ | |||
5032 | "$(SRCROOT)/../../libraries/universal-darwin/lib_release", | 5289 | "$(SRCROOT)/../../libraries/universal-darwin/lib_release", |
5033 | "$(LIBRARY_SEARCH_PATHS_QUOTED_1)", | 5290 | "$(LIBRARY_SEARCH_PATHS_QUOTED_1)", |
5034 | ); | 5291 | ); |
5292 | OTHER_LDFLAGS = "-Wl,-search_paths_first"; | ||
5035 | PRODUCT_NAME = "Second Life"; | 5293 | PRODUCT_NAME = "Second Life"; |
5036 | SEPARATE_STRIP = YES; | 5294 | SEPARATE_STRIP = YES; |
5037 | SHARED_PRECOMPS_DIR = "$(BUILD_DIR)/Caches/com.apple.Xcode.$(UID)/SharedPrecompiledHeaders"; | 5295 | SHARED_PRECOMPS_DIR = "$(BUILD_DIR)/Caches/com.apple.Xcode.$(UID)/SharedPrecompiledHeaders"; |
5038 | STRIP_STYLE = debugging; | 5296 | STRIP_STYLE = debugging; |
5039 | WRAPPER_EXTENSION = app; | 5297 | WRAPPER_EXTENSION = app; |
5298 | ZERO_LINK = NO; | ||
5040 | }; | 5299 | }; |
5041 | name = Universal; | 5300 | name = Universal; |
5042 | }; | 5301 | }; |
@@ -5047,6 +5306,7 @@ | |||
5047 | i386, | 5306 | i386, |
5048 | ppc, | 5307 | ppc, |
5049 | ); | 5308 | ); |
5309 | DEAD_CODE_STRIPPING = YES; | ||
5050 | DEBUG_INFORMATION_FORMAT = dwarf; | 5310 | DEBUG_INFORMATION_FORMAT = dwarf; |
5051 | GCC_ALTIVEC_EXTENSIONS = YES; | 5311 | GCC_ALTIVEC_EXTENSIONS = YES; |
5052 | GCC_OPTIMIZATION_LEVEL = 3; | 5312 | GCC_OPTIMIZATION_LEVEL = 3; |
@@ -5091,6 +5351,7 @@ | |||
5091 | "-Wno-reorder", | 5351 | "-Wno-reorder", |
5092 | ); | 5352 | ); |
5093 | PREBINDING = NO; | 5353 | PREBINDING = NO; |
5354 | PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; | ||
5094 | SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; | 5355 | SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; |
5095 | USER_HEADER_SEARCH_PATHS = ""; | 5356 | USER_HEADER_SEARCH_PATHS = ""; |
5096 | WARNING_CFLAGS = ( | 5357 | WARNING_CFLAGS = ( |
@@ -5118,6 +5379,7 @@ | |||
5118 | INSTALL_PATH = "@executable_path/../Resources/"; | 5379 | INSTALL_PATH = "@executable_path/../Resources/"; |
5119 | KEEP_PRIVATE_EXTERNS = NO; | 5380 | KEEP_PRIVATE_EXTERNS = NO; |
5120 | LIBRARY_SEARCH_PATHS = "$(inherited)"; | 5381 | LIBRARY_SEARCH_PATHS = "$(inherited)"; |
5382 | OTHER_LDFLAGS = "-Wl,-search_paths_first"; | ||
5121 | PREBINDING = NO; | 5383 | PREBINDING = NO; |
5122 | PRELINK_LIBS = ""; | 5384 | PRELINK_LIBS = ""; |
5123 | PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; | 5385 | PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; |
@@ -5141,6 +5403,7 @@ | |||
5141 | INSTALL_PATH = "@executable_path/../Resources/"; | 5403 | INSTALL_PATH = "@executable_path/../Resources/"; |
5142 | KEEP_PRIVATE_EXTERNS = NO; | 5404 | KEEP_PRIVATE_EXTERNS = NO; |
5143 | LIBRARY_SEARCH_PATHS = "$(inherited)"; | 5405 | LIBRARY_SEARCH_PATHS = "$(inherited)"; |
5406 | OTHER_LDFLAGS = "-Wl,-search_paths_first"; | ||
5144 | PREBINDING = NO; | 5407 | PREBINDING = NO; |
5145 | PRELINK_LIBS = ""; | 5408 | PRELINK_LIBS = ""; |
5146 | PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; | 5409 | PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; |
@@ -5162,7 +5425,7 @@ | |||
5162 | INSTALL_PATH = "@executable_path/../Resources/"; | 5425 | INSTALL_PATH = "@executable_path/../Resources/"; |
5163 | KEEP_PRIVATE_EXTERNS = NO; | 5426 | KEEP_PRIVATE_EXTERNS = NO; |
5164 | LIBRARY_SEARCH_PATHS = "$(inherited)"; | 5427 | LIBRARY_SEARCH_PATHS = "$(inherited)"; |
5165 | OTHER_LDFLAGS = ""; | 5428 | OTHER_LDFLAGS = "-Wl,-search_paths_first"; |
5166 | PREBINDING = NO; | 5429 | PREBINDING = NO; |
5167 | PRELINK_LIBS = ""; | 5430 | PRELINK_LIBS = ""; |
5168 | PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; | 5431 | PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; |
@@ -5197,7 +5460,9 @@ | |||
5197 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; | 5460 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; |
5198 | INFOPLIST_FILE = "crashreporter-Info.plist"; | 5461 | INFOPLIST_FILE = "crashreporter-Info.plist"; |
5199 | LIBRARY_SEARCH_PATHS = "$(inherited)"; | 5462 | LIBRARY_SEARCH_PATHS = "$(inherited)"; |
5463 | OTHER_LDFLAGS = "-Wl,-search_paths_first"; | ||
5200 | PRODUCT_NAME = crashreporter; | 5464 | PRODUCT_NAME = crashreporter; |
5465 | ZERO_LINK = NO; | ||
5201 | }; | 5466 | }; |
5202 | name = Development; | 5467 | name = Development; |
5203 | }; | 5468 | }; |
@@ -5210,6 +5475,7 @@ | |||
5210 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; | 5475 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; |
5211 | INFOPLIST_FILE = "crashreporter-Info.plist"; | 5476 | INFOPLIST_FILE = "crashreporter-Info.plist"; |
5212 | LIBRARY_SEARCH_PATHS = "$(inherited)"; | 5477 | LIBRARY_SEARCH_PATHS = "$(inherited)"; |
5478 | OTHER_LDFLAGS = "-Wl,-search_paths_first"; | ||
5213 | PRODUCT_NAME = crashreporter; | 5479 | PRODUCT_NAME = crashreporter; |
5214 | }; | 5480 | }; |
5215 | name = Deployment; | 5481 | name = Deployment; |
@@ -5218,12 +5484,10 @@ | |||
5218 | isa = XCBuildConfiguration; | 5484 | isa = XCBuildConfiguration; |
5219 | buildSettings = { | 5485 | buildSettings = { |
5220 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; | 5486 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; |
5221 | GCC_PRECOMPILE_PREFIX_HEADER = YES; | ||
5222 | GCC_PREFIX_HEADER = macutil_Prefix.h; | ||
5223 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; | 5487 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; |
5224 | INFOPLIST_FILE = "AutoUpdater-Info.plist"; | 5488 | INFOPLIST_FILE = "AutoUpdater-Info.plist"; |
5225 | LIBRARY_SEARCH_PATHS = "$(inherited)"; | 5489 | LIBRARY_SEARCH_PATHS = "$(inherited)"; |
5226 | OTHER_LDFLAGS = ""; | 5490 | OTHER_LDFLAGS = "-Wl,-search_paths_first"; |
5227 | PRODUCT_NAME = AutoUpdater; | 5491 | PRODUCT_NAME = AutoUpdater; |
5228 | }; | 5492 | }; |
5229 | name = Development; | 5493 | name = Development; |
@@ -5232,12 +5496,10 @@ | |||
5232 | isa = XCBuildConfiguration; | 5496 | isa = XCBuildConfiguration; |
5233 | buildSettings = { | 5497 | buildSettings = { |
5234 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; | 5498 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; |
5235 | GCC_PRECOMPILE_PREFIX_HEADER = YES; | ||
5236 | GCC_PREFIX_HEADER = macutil_Prefix.h; | ||
5237 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; | 5499 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; |
5238 | INFOPLIST_FILE = "AutoUpdater-Info.plist"; | 5500 | INFOPLIST_FILE = "AutoUpdater-Info.plist"; |
5239 | LIBRARY_SEARCH_PATHS = "$(inherited)"; | 5501 | LIBRARY_SEARCH_PATHS = "$(inherited)"; |
5240 | OTHER_LDFLAGS = ""; | 5502 | OTHER_LDFLAGS = "-Wl,-search_paths_first"; |
5241 | PRODUCT_NAME = AutoUpdater; | 5503 | PRODUCT_NAME = AutoUpdater; |
5242 | }; | 5504 | }; |
5243 | name = Deployment; | 5505 | name = Deployment; |
@@ -5246,9 +5508,11 @@ | |||
5246 | isa = XCBuildConfiguration; | 5508 | isa = XCBuildConfiguration; |
5247 | buildSettings = { | 5509 | buildSettings = { |
5248 | CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)"; | 5510 | CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)"; |
5511 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; | ||
5249 | GCC_OPTIMIZATION_LEVEL = 0; | 5512 | GCC_OPTIMIZATION_LEVEL = 0; |
5250 | GCC_PRECOMPILE_PREFIX_HEADER = YES; | 5513 | GCC_PRECOMPILE_PREFIX_HEADER = YES; |
5251 | GCC_PREFIX_HEADER = llviewerprecompiledheaders.h; | 5514 | GCC_PREFIX_HEADER = llviewerprecompiledheaders.h; |
5515 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; | ||
5252 | HEADER_SEARCH_PATHS = "$(HEADER_SEARCH_PATHS)"; | 5516 | HEADER_SEARCH_PATHS = "$(HEADER_SEARCH_PATHS)"; |
5253 | INFOPLIST_FILE = "Info-SecondLife.plist"; | 5517 | INFOPLIST_FILE = "Info-SecondLife.plist"; |
5254 | INSTALL_PATH = "$(HOME)/Applications"; | 5518 | INSTALL_PATH = "$(HOME)/Applications"; |
@@ -5271,7 +5535,7 @@ | |||
5271 | "-Winvalid-pch", | 5535 | "-Winvalid-pch", |
5272 | ); | 5536 | ); |
5273 | WRAPPER_EXTENSION = app; | 5537 | WRAPPER_EXTENSION = app; |
5274 | ZERO_LINK = YES; | 5538 | ZERO_LINK = NO; |
5275 | }; | 5539 | }; |
5276 | name = Development; | 5540 | name = Development; |
5277 | }; | 5541 | }; |
@@ -5279,8 +5543,10 @@ | |||
5279 | isa = XCBuildConfiguration; | 5543 | isa = XCBuildConfiguration; |
5280 | buildSettings = { | 5544 | buildSettings = { |
5281 | CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)"; | 5545 | CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)"; |
5546 | GCC_INLINES_ARE_PRIVATE_EXTERN = NO; | ||
5282 | GCC_PRECOMPILE_PREFIX_HEADER = YES; | 5547 | GCC_PRECOMPILE_PREFIX_HEADER = YES; |
5283 | GCC_PREFIX_HEADER = llviewerprecompiledheaders.h; | 5548 | GCC_PREFIX_HEADER = llviewerprecompiledheaders.h; |
5549 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; | ||
5284 | HEADER_SEARCH_PATHS = "$(HEADER_SEARCH_PATHS)"; | 5550 | HEADER_SEARCH_PATHS = "$(HEADER_SEARCH_PATHS)"; |
5285 | INFOPLIST_FILE = "Info-SecondLife.plist"; | 5551 | INFOPLIST_FILE = "Info-SecondLife.plist"; |
5286 | INSTALL_PATH = "$(HOME)/Applications"; | 5552 | INSTALL_PATH = "$(HOME)/Applications"; |
@@ -5305,6 +5571,7 @@ | |||
5305 | 999484590883114300EFC621 /* Development */ = { | 5571 | 999484590883114300EFC621 /* Development */ = { |
5306 | isa = XCBuildConfiguration; | 5572 | isa = XCBuildConfiguration; |
5307 | buildSettings = { | 5573 | buildSettings = { |
5574 | DEAD_CODE_STRIPPING = YES; | ||
5308 | DEBUG_INFORMATION_FORMAT = dwarf; | 5575 | DEBUG_INFORMATION_FORMAT = dwarf; |
5309 | GCC_ALTIVEC_EXTENSIONS = YES; | 5576 | GCC_ALTIVEC_EXTENSIONS = YES; |
5310 | GCC_OPTIMIZATION_LEVEL = 0; | 5577 | GCC_OPTIMIZATION_LEVEL = 0; |
@@ -5341,6 +5608,8 @@ | |||
5341 | "-DLL_DEBUG=1", | 5608 | "-DLL_DEBUG=1", |
5342 | "-D_DEBUG", | 5609 | "-D_DEBUG", |
5343 | "-fconstant-cfstrings", | 5610 | "-fconstant-cfstrings", |
5611 | "-gfull", | ||
5612 | "-mlong-branch", | ||
5344 | ); | 5613 | ); |
5345 | OTHER_CPLUSPLUSFLAGS = ( | 5614 | OTHER_CPLUSPLUSFLAGS = ( |
5346 | "$(OTHER_CFLAGS)", | 5615 | "$(OTHER_CFLAGS)", |
@@ -5348,6 +5617,7 @@ | |||
5348 | "-Wno-reorder", | 5617 | "-Wno-reorder", |
5349 | ); | 5618 | ); |
5350 | PREBINDING = NO; | 5619 | PREBINDING = NO; |
5620 | PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; | ||
5351 | SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; | 5621 | SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; |
5352 | USER_HEADER_SEARCH_PATHS = ""; | 5622 | USER_HEADER_SEARCH_PATHS = ""; |
5353 | WARNING_CFLAGS = ( | 5623 | WARNING_CFLAGS = ( |
@@ -5355,13 +5625,14 @@ | |||
5355 | "-Wno-sign-compare", | 5625 | "-Wno-sign-compare", |
5356 | "-Wno-switch", | 5626 | "-Wno-switch", |
5357 | ); | 5627 | ); |
5358 | ZERO_LINK = YES; | 5628 | ZERO_LINK = NO; |
5359 | }; | 5629 | }; |
5360 | name = Development; | 5630 | name = Development; |
5361 | }; | 5631 | }; |
5362 | 9994845A0883114300EFC621 /* Deployment */ = { | 5632 | 9994845A0883114300EFC621 /* Deployment */ = { |
5363 | isa = XCBuildConfiguration; | 5633 | isa = XCBuildConfiguration; |
5364 | buildSettings = { | 5634 | buildSettings = { |
5635 | DEAD_CODE_STRIPPING = YES; | ||
5365 | DEBUG_INFORMATION_FORMAT = dwarf; | 5636 | DEBUG_INFORMATION_FORMAT = dwarf; |
5366 | GCC_ALTIVEC_EXTENSIONS = YES; | 5637 | GCC_ALTIVEC_EXTENSIONS = YES; |
5367 | GCC_OPTIMIZATION_LEVEL = 3; | 5638 | GCC_OPTIMIZATION_LEVEL = 3; |
@@ -5406,6 +5677,7 @@ | |||
5406 | "-Wno-reorder", | 5677 | "-Wno-reorder", |
5407 | ); | 5678 | ); |
5408 | PREBINDING = NO; | 5679 | PREBINDING = NO; |
5680 | PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES; | ||
5409 | SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; | 5681 | SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; |
5410 | USER_HEADER_SEARCH_PATHS = ""; | 5682 | USER_HEADER_SEARCH_PATHS = ""; |
5411 | WARNING_CFLAGS = ( | 5683 | WARNING_CFLAGS = ( |
diff --git a/linden/indra/newview/macview_Prefix.h b/linden/indra/newview/macview_Prefix.h index c7dd351..4d982f1 100644 --- a/linden/indra/newview/macview_Prefix.h +++ b/linden/indra/newview/macview_Prefix.h | |||
@@ -107,7 +107,6 @@ | |||
107 | #include "llvosky.h" | 107 | #include "llvosky.h" |
108 | #include "llworld.h" | 108 | #include "llworld.h" |
109 | #include "pipeline.h" | 109 | #include "pipeline.h" |
110 | #include "viewer.h" | ||
111 | 110 | ||
112 | /////////////////// From llfloater.cpp | 111 | /////////////////// From llfloater.cpp |
113 | #include "llbutton.h" | 112 | #include "llbutton.h" |
diff --git a/linden/indra/newview/newview.vcproj b/linden/indra/newview/newview.vcproj index 075fdcb..941c6c0 100644 --- a/linden/indra/newview/newview.vcproj +++ b/linden/indra/newview/newview.vcproj | |||
@@ -104,11 +104,14 @@ | |||
104 | Name="VCLinkerTool" | 104 | Name="VCLinkerTool" |
105 | AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib areslib.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib OpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib png12.lib psapi.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib dnsapi.lib EZ_LCD_Wrapper.lib lgLcd.lib" | 105 | AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib areslib.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib OpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib png12.lib psapi.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib dnsapi.lib EZ_LCD_Wrapper.lib lgLcd.lib" |
106 | OutputFile="$(ConfigurationName)/newview.exe" | 106 | OutputFile="$(ConfigurationName)/newview.exe" |
107 | LinkIncremental="2" | 107 | LinkIncremental="1" |
108 | AdditionalLibraryDirectories=""../lib_$(ConfigurationName)/i686-win32";"../../libraries/i686-win32/lib_release"" | 108 | AdditionalLibraryDirectories=""../lib_$(ConfigurationName)/i686-win32";"../../libraries/i686-win32/lib_release"" |
109 | IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib" | 109 | IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib" |
110 | GenerateDebugInformation="TRUE" | 110 | GenerateDebugInformation="TRUE" |
111 | ProgramDatabaseFile="$(TargetName).pdb" | 111 | ProgramDatabaseFile="$(TargetName).pdb" |
112 | GenerateMapFile="TRUE" | ||
113 | MapFileName="$(TargetName).map" | ||
114 | MapLines="TRUE" | ||
112 | SubSystem="2" | 115 | SubSystem="2" |
113 | OptimizeReferences="1" | 116 | OptimizeReferences="1" |
114 | EnableCOMDATFolding="1" | 117 | EnableCOMDATFolding="1" |
@@ -166,11 +169,15 @@ | |||
166 | Name="VCLinkerTool" | 169 | Name="VCLinkerTool" |
167 | AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib areslib.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib OpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib png12.lib psapi.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib dnsapi.lib EZ_LCD_Wrapper.lib lgLcd.lib" | 170 | AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib areslib.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib OpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib png12.lib psapi.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib dnsapi.lib EZ_LCD_Wrapper.lib lgLcd.lib" |
168 | OutputFile="$(ConfigurationName)/SecondLife.exe" | 171 | OutputFile="$(ConfigurationName)/SecondLife.exe" |
169 | LinkIncremental="0" | 172 | LinkIncremental="1" |
170 | AdditionalLibraryDirectories=""../lib_release/i686-win32";"../../libraries/i686-win32/lib_release"" | 173 | AdditionalLibraryDirectories=""../lib_release/i686-win32";"../../libraries/i686-win32/lib_release"" |
171 | IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib" | 174 | IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib" |
172 | GenerateDebugInformation="TRUE" | 175 | GenerateDebugInformation="TRUE" |
173 | ProgramDatabaseFile="$(TargetName).pdb" | 176 | ProgramDatabaseFile="$(TargetName).pdb" |
177 | GenerateMapFile="TRUE" | ||
178 | MapFileName="$(TargetName).map" | ||
179 | MapExports="FALSE" | ||
180 | MapLines="TRUE" | ||
174 | SubSystem="2" | 181 | SubSystem="2" |
175 | OptimizeReferences="2" | 182 | OptimizeReferences="2" |
176 | EnableCOMDATFolding="2" | 183 | EnableCOMDATFolding="2" |
@@ -289,6 +296,12 @@ | |||
289 | RelativePath=".\llanimalcontrols.cpp"> | 296 | RelativePath=".\llanimalcontrols.cpp"> |
290 | </File> | 297 | </File> |
291 | <File | 298 | <File |
299 | RelativePath=".\llappviewer.cpp"> | ||
300 | </File> | ||
301 | <File | ||
302 | RelativePath=".\llappviewerwin32.cpp"> | ||
303 | </File> | ||
304 | <File | ||
292 | RelativePath=".\llassetuploadresponders.cpp"> | 305 | RelativePath=".\llassetuploadresponders.cpp"> |
293 | </File> | 306 | </File> |
294 | <File | 307 | <File |
@@ -1114,6 +1127,9 @@ | |||
1114 | RelativePath=".\lluserauth.cpp"> | 1127 | RelativePath=".\lluserauth.cpp"> |
1115 | </File> | 1128 | </File> |
1116 | <File | 1129 | <File |
1130 | RelativePath=".\llvectorperfoptions.cpp"> | ||
1131 | </File> | ||
1132 | <File | ||
1117 | RelativePath=".\llvelocitybar.cpp"> | 1133 | RelativePath=".\llvelocitybar.cpp"> |
1118 | </File> | 1134 | </File> |
1119 | <File | 1135 | <File |
@@ -1126,6 +1142,9 @@ | |||
1126 | RelativePath=".\llviewerassetstorage.h"> | 1142 | RelativePath=".\llviewerassetstorage.h"> |
1127 | </File> | 1143 | </File> |
1128 | <File | 1144 | <File |
1145 | RelativePath=".\llvieweraudio.cpp"> | ||
1146 | </File> | ||
1147 | <File | ||
1129 | RelativePath=".\llviewercamera.cpp"> | 1148 | RelativePath=".\llviewercamera.cpp"> |
1130 | </File> | 1149 | </File> |
1131 | <File | 1150 | <File |
@@ -1385,9 +1404,6 @@ | |||
1385 | <File | 1404 | <File |
1386 | RelativePath=".\pipeline.cpp"> | 1405 | RelativePath=".\pipeline.cpp"> |
1387 | </File> | 1406 | </File> |
1388 | <File | ||
1389 | RelativePath=".\viewer.cpp"> | ||
1390 | </File> | ||
1391 | </Filter> | 1407 | </Filter> |
1392 | <Filter | 1408 | <Filter |
1393 | Name="Header Files" | 1409 | Name="Header Files" |
@@ -1418,6 +1434,12 @@ | |||
1418 | RelativePath=".\llappearance.h"> | 1434 | RelativePath=".\llappearance.h"> |
1419 | </File> | 1435 | </File> |
1420 | <File | 1436 | <File |
1437 | RelativePath=".\llappviewer.h"> | ||
1438 | </File> | ||
1439 | <File | ||
1440 | RelativePath=".\llappviewerwin32.h"> | ||
1441 | </File> | ||
1442 | <File | ||
1421 | RelativePath=".\llassetuploadresponders.h"> | 1443 | RelativePath=".\llassetuploadresponders.h"> |
1422 | </File> | 1444 | </File> |
1423 | <File | 1445 | <File |
@@ -2264,12 +2286,18 @@ | |||
2264 | RelativePath=".\lluvscreen.h"> | 2286 | RelativePath=".\lluvscreen.h"> |
2265 | </File> | 2287 | </File> |
2266 | <File | 2288 | <File |
2289 | RelativePath=".\llvectorperfoptions.h"> | ||
2290 | </File> | ||
2291 | <File | ||
2267 | RelativePath=".\llvelocitybar.h"> | 2292 | RelativePath=".\llvelocitybar.h"> |
2268 | </File> | 2293 | </File> |
2269 | <File | 2294 | <File |
2270 | RelativePath=".\llviewchildren.h"> | 2295 | RelativePath=".\llviewchildren.h"> |
2271 | </File> | 2296 | </File> |
2272 | <File | 2297 | <File |
2298 | RelativePath=".\llvieweraudio.h"> | ||
2299 | </File> | ||
2300 | <File | ||
2273 | RelativePath=".\llviewerbuild.h"> | 2301 | RelativePath=".\llviewerbuild.h"> |
2274 | </File> | 2302 | </File> |
2275 | <File | 2303 | <File |
@@ -2477,9 +2505,6 @@ | |||
2477 | RelativePath=".\VertexCache.h"> | 2505 | RelativePath=".\VertexCache.h"> |
2478 | </File> | 2506 | </File> |
2479 | <File | 2507 | <File |
2480 | RelativePath=".\viewer.h"> | ||
2481 | </File> | ||
2482 | <File | ||
2483 | RelativePath=".\VorbisFramework.h"> | 2508 | RelativePath=".\VorbisFramework.h"> |
2484 | </File> | 2509 | </File> |
2485 | </Filter> | 2510 | </Filter> |
diff --git a/linden/indra/newview/newview_vc8.vcproj b/linden/indra/newview/newview_vc8.vcproj index 6b669d9..362462f 100644 --- a/linden/indra/newview/newview_vc8.vcproj +++ b/linden/indra/newview/newview_vc8.vcproj | |||
@@ -76,6 +76,8 @@ | |||
76 | IgnoreDefaultLibraryNames="msvcrtd;libcd;libcmt" | 76 | IgnoreDefaultLibraryNames="msvcrtd;libcd;libcmt" |
77 | GenerateDebugInformation="true" | 77 | GenerateDebugInformation="true" |
78 | ProgramDatabaseFile="$(TargetName).pdb" | 78 | ProgramDatabaseFile="$(TargetName).pdb" |
79 | GenerateMapFile="true" | ||
80 | MapFileName="newview.map" | ||
79 | SubSystem="2" | 81 | SubSystem="2" |
80 | OptimizeReferences="1" | 82 | OptimizeReferences="1" |
81 | EnableCOMDATFolding="1" | 83 | EnableCOMDATFolding="1" |
@@ -169,6 +171,8 @@ | |||
169 | IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib" | 171 | IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib" |
170 | GenerateDebugInformation="true" | 172 | GenerateDebugInformation="true" |
171 | ProgramDatabaseFile="$(TargetName).pdb" | 173 | ProgramDatabaseFile="$(TargetName).pdb" |
174 | GenerateMapFile="true" | ||
175 | MapFileName="newview.map" | ||
172 | SubSystem="2" | 176 | SubSystem="2" |
173 | OptimizeReferences="1" | 177 | OptimizeReferences="1" |
174 | EnableCOMDATFolding="1" | 178 | EnableCOMDATFolding="1" |
@@ -330,6 +334,7 @@ | |||
330 | ForceConformanceInForLoopScope="true" | 334 | ForceConformanceInForLoopScope="true" |
331 | UsePrecompiledHeader="2" | 335 | UsePrecompiledHeader="2" |
332 | PrecompiledHeaderThrough="llviewerprecompiledheaders.h" | 336 | PrecompiledHeaderThrough="llviewerprecompiledheaders.h" |
337 | AssemblerOutput="0" | ||
333 | WarningLevel="3" | 338 | WarningLevel="3" |
334 | WarnAsError="true" | 339 | WarnAsError="true" |
335 | Detect64BitPortabilityProblems="false" | 340 | Detect64BitPortabilityProblems="false" |
@@ -353,7 +358,7 @@ | |||
353 | IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib" | 358 | IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib" |
354 | GenerateDebugInformation="true" | 359 | GenerateDebugInformation="true" |
355 | ProgramDatabaseFile="$(TargetName).pdb" | 360 | ProgramDatabaseFile="$(TargetName).pdb" |
356 | GenerateMapFile="false" | 361 | GenerateMapFile="true" |
357 | MapFileName="newview.map" | 362 | MapFileName="newview.map" |
358 | SubSystem="2" | 363 | SubSystem="2" |
359 | OptimizeReferences="1" | 364 | OptimizeReferences="1" |
@@ -417,6 +422,14 @@ | |||
417 | > | 422 | > |
418 | </File> | 423 | </File> |
419 | <File | 424 | <File |
425 | RelativePath=".\llappviewer.cpp" | ||
426 | > | ||
427 | </File> | ||
428 | <File | ||
429 | RelativePath=".\llappviewerwin32.cpp" | ||
430 | > | ||
431 | </File> | ||
432 | <File | ||
420 | RelativePath=".\llassetuploadresponders.cpp" | 433 | RelativePath=".\llassetuploadresponders.cpp" |
421 | > | 434 | > |
422 | </File> | 435 | </File> |
@@ -1505,6 +1518,10 @@ | |||
1505 | > | 1518 | > |
1506 | </File> | 1519 | </File> |
1507 | <File | 1520 | <File |
1521 | RelativePath=".\llvectorperfoptions.cpp" | ||
1522 | > | ||
1523 | </File> | ||
1524 | <File | ||
1508 | RelativePath=".\llvelocitybar.cpp" | 1525 | RelativePath=".\llvelocitybar.cpp" |
1509 | > | 1526 | > |
1510 | </File> | 1527 | </File> |
@@ -1521,6 +1538,10 @@ | |||
1521 | > | 1538 | > |
1522 | </File> | 1539 | </File> |
1523 | <File | 1540 | <File |
1541 | RelativePath=".\llvieweraudio.cpp" | ||
1542 | > | ||
1543 | </File> | ||
1544 | <File | ||
1524 | RelativePath=".\llviewercamera.cpp" | 1545 | RelativePath=".\llviewercamera.cpp" |
1525 | > | 1546 | > |
1526 | </File> | 1547 | </File> |
@@ -1872,10 +1893,6 @@ | |||
1872 | RelativePath=".\pipeline.cpp" | 1893 | RelativePath=".\pipeline.cpp" |
1873 | > | 1894 | > |
1874 | </File> | 1895 | </File> |
1875 | <File | ||
1876 | RelativePath=".\viewer.cpp" | ||
1877 | > | ||
1878 | </File> | ||
1879 | </Filter> | 1896 | </Filter> |
1880 | <Filter | 1897 | <Filter |
1881 | Name="Header Files" | 1898 | Name="Header Files" |
@@ -1911,6 +1928,14 @@ | |||
1911 | > | 1928 | > |
1912 | </File> | 1929 | </File> |
1913 | <File | 1930 | <File |
1931 | RelativePath=".\llappviewer.h" | ||
1932 | > | ||
1933 | </File> | ||
1934 | <File | ||
1935 | RelativePath=".\llappviewerwin32.h" | ||
1936 | > | ||
1937 | </File> | ||
1938 | <File | ||
1914 | RelativePath=".\llassetuploadresponders.h" | 1939 | RelativePath=".\llassetuploadresponders.h" |
1915 | > | 1940 | > |
1916 | </File> | 1941 | </File> |
@@ -3027,6 +3052,10 @@ | |||
3027 | > | 3052 | > |
3028 | </File> | 3053 | </File> |
3029 | <File | 3054 | <File |
3055 | RelativePath=".\llvectorperfoptions.h" | ||
3056 | > | ||
3057 | </File> | ||
3058 | <File | ||
3030 | RelativePath=".\llvelocitybar.h" | 3059 | RelativePath=".\llvelocitybar.h" |
3031 | > | 3060 | > |
3032 | </File> | 3061 | </File> |
@@ -3035,6 +3064,10 @@ | |||
3035 | > | 3064 | > |
3036 | </File> | 3065 | </File> |
3037 | <File | 3066 | <File |
3067 | RelativePath=".\llvieweraudio.h" | ||
3068 | > | ||
3069 | </File> | ||
3070 | <File | ||
3038 | RelativePath=".\llviewerbuild.h" | 3071 | RelativePath=".\llviewerbuild.h" |
3039 | > | 3072 | > |
3040 | </File> | 3073 | </File> |
diff --git a/linden/indra/newview/pipeline.cpp b/linden/indra/newview/pipeline.cpp index 758455d..e9faccb 100644 --- a/linden/indra/newview/pipeline.cpp +++ b/linden/indra/newview/pipeline.cpp | |||
@@ -91,11 +91,11 @@ | |||
91 | #include "llvotree.h" | 91 | #include "llvotree.h" |
92 | #include "llvopartgroup.h" | 92 | #include "llvopartgroup.h" |
93 | #include "llworld.h" | 93 | #include "llworld.h" |
94 | #include "viewer.h" | ||
95 | #include "llcubemap.h" | 94 | #include "llcubemap.h" |
96 | #include "lldebugmessagebox.h" | 95 | #include "lldebugmessagebox.h" |
97 | #include "llglslshader.h" | 96 | #include "llglslshader.h" |
98 | #include "llviewerjoystick.h" | 97 | #include "llviewerjoystick.h" |
98 | #include "llviewerdisplay.h" | ||
99 | 99 | ||
100 | #ifdef _DEBUG | 100 | #ifdef _DEBUG |
101 | // Debug indices is disabled for now for debug performance - djs 4/24/02 | 101 | // Debug indices is disabled for now for debug performance - djs 4/24/02 |
@@ -135,6 +135,8 @@ S32 gTrivialAccepts = 0; | |||
135 | 135 | ||
136 | BOOL gRenderForSelect = FALSE; | 136 | BOOL gRenderForSelect = FALSE; |
137 | 137 | ||
138 | LLPipeline gPipeline; | ||
139 | |||
138 | //---------------------------------------- | 140 | //---------------------------------------- |
139 | 141 | ||
140 | void stamp(F32 x, F32 y, F32 xs, F32 ys) | 142 | void stamp(F32 x, F32 y, F32 xs, F32 ys) |
@@ -383,22 +385,14 @@ void LLPipeline::releaseGLBuffers() | |||
383 | 385 | ||
384 | if (mCubeFrameBuffer) | 386 | if (mCubeFrameBuffer) |
385 | { | 387 | { |
386 | #if !defined(__sparc) | ||
387 | glDeleteFramebuffersEXT(1, &mCubeFrameBuffer); | 388 | glDeleteFramebuffersEXT(1, &mCubeFrameBuffer); |
388 | glDeleteRenderbuffersEXT(1, &mCubeDepth); | 389 | glDeleteRenderbuffersEXT(1, &mCubeDepth); |
389 | #else | ||
390 | #error Can we generalize this without a CPU architecture test? | ||
391 | #endif | ||
392 | mCubeDepth = mCubeFrameBuffer = 0; | 390 | mCubeDepth = mCubeFrameBuffer = 0; |
393 | } | 391 | } |
394 | 392 | ||
395 | if (mFramebuffer[0]) | 393 | if (mFramebuffer[0]) |
396 | { | 394 | { |
397 | #if !defined(__sparc) | ||
398 | glDeleteFramebuffersEXT(2, mFramebuffer); | 395 | glDeleteFramebuffersEXT(2, mFramebuffer); |
399 | #else | ||
400 | #error Can we generalize this without a CPU architecture test? | ||
401 | #endif | ||
402 | mFramebuffer[0] = mFramebuffer[1] = 0; | 396 | mFramebuffer[0] = mFramebuffer[1] = 0; |
403 | } | 397 | } |
404 | } | 398 | } |
@@ -3776,12 +3770,8 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam, | |||
3776 | BOOL reattach = FALSE; | 3770 | BOOL reattach = FALSE; |
3777 | if (mCubeFrameBuffer == 0) | 3771 | if (mCubeFrameBuffer == 0) |
3778 | { | 3772 | { |
3779 | #if !defined(__sparc) | ||
3780 | glGenFramebuffersEXT(1, &mCubeFrameBuffer); | 3773 | glGenFramebuffersEXT(1, &mCubeFrameBuffer); |
3781 | glGenRenderbuffersEXT(1, &mCubeDepth); | 3774 | glGenRenderbuffersEXT(1, &mCubeDepth); |
3782 | #else | ||
3783 | #error Can we generalize this without a CPU architecture test? | ||
3784 | #endif | ||
3785 | reattach = TRUE; | 3775 | reattach = TRUE; |
3786 | } | 3776 | } |
3787 | 3777 | ||
@@ -3852,7 +3842,6 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam, | |||
3852 | 3842 | ||
3853 | if (reattach) | 3843 | if (reattach) |
3854 | { | 3844 | { |
3855 | #if !defined(__sparc) | ||
3856 | glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mCubeDepth); | 3845 | glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mCubeDepth); |
3857 | GLint res_x, res_y; | 3846 | GLint res_x, res_y; |
3858 | glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_WIDTH_EXT, &res_x); | 3847 | glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_WIDTH_EXT, &res_x); |
@@ -3864,22 +3853,15 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam, | |||
3864 | } | 3853 | } |
3865 | 3854 | ||
3866 | glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); | 3855 | glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); |
3867 | #else | ||
3868 | #error Can we generalize this without a CPU architecture test? | ||
3869 | #endif | ||
3870 | } | 3856 | } |
3871 | 3857 | ||
3872 | for (S32 i = 0; i < 6; i++) | 3858 | for (S32 i = 0; i < 6; i++) |
3873 | { | 3859 | { |
3874 | #if !defined(__sparc) | ||
3875 | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mCubeFrameBuffer); | 3860 | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mCubeFrameBuffer); |
3876 | glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, | 3861 | glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, |
3877 | cube_face[i], cube_map->getGLName(), 0); | 3862 | cube_face[i], cube_map->getGLName(), 0); |
3878 | glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, | 3863 | glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, |
3879 | GL_RENDERBUFFER_EXT, mCubeDepth); | 3864 | GL_RENDERBUFFER_EXT, mCubeDepth); |
3880 | #else | ||
3881 | #error Can we generalize this without a CPU architecture test? | ||
3882 | #endif | ||
3883 | glMatrixMode(GL_PROJECTION); | 3865 | glMatrixMode(GL_PROJECTION); |
3884 | glLoadIdentity(); | 3866 | glLoadIdentity(); |
3885 | gluPerspective(90.f, 1.f, 0.1f, 1024.f); | 3867 | gluPerspective(90.f, 1.f, 0.1f, 1024.f); |
@@ -3899,11 +3881,7 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam, | |||
3899 | gPipeline.renderGeom(cube_cam); | 3881 | gPipeline.renderGeom(cube_cam); |
3900 | } | 3882 | } |
3901 | 3883 | ||
3902 | #if !defined(__sparc) | ||
3903 | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); | 3884 | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); |
3904 | #else | ||
3905 | #error Can we generalize this without a CPU architecture test? | ||
3906 | #endif | ||
3907 | 3885 | ||
3908 | cube_cam.setOrigin(origin); | 3886 | cube_cam.setOrigin(origin); |
3909 | gPipeline.resetDrawOrders(); | 3887 | gPipeline.resetDrawOrders(); |
@@ -4112,14 +4090,10 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res, | |||
4112 | LLGLDisable blend(GL_BLEND); | 4090 | LLGLDisable blend(GL_BLEND); |
4113 | LLGLDisable cull(GL_CULL_FACE); | 4091 | LLGLDisable cull(GL_CULL_FACE); |
4114 | 4092 | ||
4115 | #if !defined(__sparc) | ||
4116 | if (mFramebuffer[0] == 0) | 4093 | if (mFramebuffer[0] == 0) |
4117 | { | 4094 | { |
4118 | glGenFramebuffersEXT(2, mFramebuffer); | 4095 | glGenFramebuffersEXT(2, mFramebuffer); |
4119 | } | 4096 | } |
4120 | #else | ||
4121 | #error Can we generalize this without a CPU architecture test? | ||
4122 | #endif | ||
4123 | 4097 | ||
4124 | GLint viewport[4]; | 4098 | GLint viewport[4]; |
4125 | glGetIntegerv(GL_VIEWPORT, viewport); | 4099 | glGetIntegerv(GL_VIEWPORT, viewport); |
@@ -4142,15 +4116,11 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res, | |||
4142 | 4116 | ||
4143 | for (S32 i = 0; i < kernel; i++) | 4117 | for (S32 i = 0; i < kernel; i++) |
4144 | { | 4118 | { |
4145 | #if !defined(__sparc) | ||
4146 | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFramebuffer[i%2]); | 4119 | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFramebuffer[i%2]); |
4147 | glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, | 4120 | glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, |
4148 | GL_COLOR_ATTACHMENT0_EXT, | 4121 | GL_COLOR_ATTACHMENT0_EXT, |
4149 | GL_TEXTURE_2D, | 4122 | GL_TEXTURE_2D, |
4150 | i%2 == 0 ? buffer : dest, 0); | 4123 | i%2 == 0 ? buffer : dest, 0); |
4151 | #else | ||
4152 | #error Can we generalize this without a CPU architecture test? | ||
4153 | #endif | ||
4154 | 4124 | ||
4155 | glBindTexture(GL_TEXTURE_2D, i == 0 ? source : | 4125 | glBindTexture(GL_TEXTURE_2D, i == 0 ? source : |
4156 | i%2==0 ? dest : | 4126 | i%2==0 ? dest : |
@@ -4177,11 +4147,7 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res, | |||
4177 | 4147 | ||
4178 | } | 4148 | } |
4179 | 4149 | ||
4180 | #if !defined(__sparc) | ||
4181 | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); | 4150 | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); |
4182 | #else | ||
4183 | #error Can we generalize this without a CPU architecture test? | ||
4184 | #endif | ||
4185 | gGlowProgram.unbind(); | 4151 | gGlowProgram.unbind(); |
4186 | 4152 | ||
4187 | glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); | 4153 | glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); |
diff --git a/linden/indra/newview/releasenotes.txt b/linden/indra/newview/releasenotes.txt index 72288b8..6c581c5 100644 --- a/linden/indra/newview/releasenotes.txt +++ b/linden/indra/newview/releasenotes.txt | |||
@@ -1,3 +1,32 @@ | |||
1 | Release Notes for Second Life 1.18.6(0) December 5, 2007 | ||
2 | ===================================== | ||
3 | Changes: | ||
4 | * Age Verification: | ||
5 | ** The user interface for parcel and estate access has been clarified and improved. | ||
6 | ** Added the ability to restrict access to parcels and estates to age verified adults. See an upcoming blog post for more details | ||
7 | ** Removed the ability to *ban* access to Residents who have provided payment info or who have used payment info. We continue to support the ability to *allow* access to only those who have provided payment info. | ||
8 | * Login/Authentication | ||
9 | ** We changed the way viewers login to Second Life to support future anti-fraud efforts | ||
10 | ** The changes are largely internal | ||
11 | ** Apart from some minor cosmetic differences, the behavior of the login screen is unchanged | ||
12 | ** For more information, read our public Wiki article found here: http://wiki.secondlife.com/wiki/Viewer_Authentication | ||
13 | * Crash Reporter | ||
14 | ** The crash reporting mechanism has been improved. Following a crash, more useful information will be sent and reports should now take less than 10 seconds. | ||
15 | |||
16 | Fixes: | ||
17 | * VWR-1627: Classified metrics are reset to 0 when the ad is updated | ||
18 | * VWR-1162: Land for sale includes L$1 parcels that are not actually for sale | ||
19 | * VWR-1125: Clicking Title Bar While Mouselook'd Repositions SL | ||
20 | * VWR-2483: the macviewer.xcodeprj file doesn't create stripped binaries on Deployment or Universal | ||
21 | * VWR-2404: lossless texture compression on small textures not lossless | ||
22 | * VWR-2046: Focus is sent to menu/money/notification window | ||
23 | * Land owners can no longer delete objects belonging to others (but can still return objects) | ||
24 | * Positioning fixes for Japanese IME for fields where only ASCII is allowed | ||
25 | * Ctrl-Shift-W now works even if no windows have focus | ||
26 | * Fixed issue where avatar is stuck falling in place after login | ||
27 | * HTML login screen now functional again on Linux | ||
28 | * Floater sizing behavior corrected when viewer window is made very small | ||
29 | |||
1 | Release Notes for Second Life 1.18.5(3) November 29, 2007 | 30 | Release Notes for Second Life 1.18.5(3) November 29, 2007 |
2 | ===================================== | 31 | ===================================== |
3 | New features: | 32 | New features: |
diff --git a/linden/indra/newview/res/newViewRes.rc b/linden/indra/newview/res/newViewRes.rc index a3dfa72..05081a9 100644 --- a/linden/indra/newview/res/newViewRes.rc +++ b/linden/indra/newview/res/newViewRes.rc | |||
@@ -228,8 +228,8 @@ TOOLPIPETTE CURSOR "toolpipette.cur" | |||
228 | // | 228 | // |
229 | 229 | ||
230 | VS_VERSION_INFO VERSIONINFO | 230 | VS_VERSION_INFO VERSIONINFO |
231 | FILEVERSION 1,18,5,3 | 231 | FILEVERSION 1,18,6,0 |
232 | PRODUCTVERSION 1,18,5,3 | 232 | PRODUCTVERSION 1,18,6,0 |
233 | FILEFLAGSMASK 0x3fL | 233 | FILEFLAGSMASK 0x3fL |
234 | #ifdef _DEBUG | 234 | #ifdef _DEBUG |
235 | FILEFLAGS 0x1L | 235 | FILEFLAGS 0x1L |
@@ -246,12 +246,12 @@ BEGIN | |||
246 | BEGIN | 246 | BEGIN |
247 | VALUE "CompanyName", "Linden Lab" | 247 | VALUE "CompanyName", "Linden Lab" |
248 | VALUE "FileDescription", "Second Life" | 248 | VALUE "FileDescription", "Second Life" |
249 | VALUE "FileVersion", "1.18.5.3" | 249 | VALUE "FileVersion", "1.18.6.0" |
250 | VALUE "InternalName", "Second Life" | 250 | VALUE "InternalName", "Second Life" |
251 | VALUE "LegalCopyright", "Copyright © 2001-2007, Linden Research, Inc." | 251 | VALUE "LegalCopyright", "Copyright © 2001-2007, Linden Research, Inc." |
252 | VALUE "OriginalFilename", "SecondLife.exe" | 252 | VALUE "OriginalFilename", "SecondLife.exe" |
253 | VALUE "ProductName", "Second Life" | 253 | VALUE "ProductName", "Second Life" |
254 | VALUE "ProductVersion", "1.18.5.3" | 254 | VALUE "ProductVersion", "1.18.6.0" |
255 | END | 255 | END |
256 | END | 256 | END |
257 | BLOCK "VarFileInfo" | 257 | BLOCK "VarFileInfo" |
diff --git a/linden/indra/newview/skins/xui/de/LCD_text.xml b/linden/indra/newview/skins/xui/de/LCD_text.xml new file mode 100644 index 0000000..a20d9f4 --- /dev/null +++ b/linden/indra/newview/skins/xui/de/LCD_text.xml | |||
@@ -0,0 +1,75 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <panel name="panel_login"> | ||
3 | <text name="DebugInfo"> | ||
4 | Debug-Info | ||
5 | </text> | ||
6 | <text name="FPS"> | ||
7 | FPS | ||
8 | </text> | ||
9 | <text name="SimFPS"> | ||
10 | SimFPS | ||
11 | </text> | ||
12 | <text name="Pin"> | ||
13 | P-Ein | ||
14 | </text> | ||
15 | <text name="Pout"> | ||
16 | P-Aus | ||
17 | </text> | ||
18 | <text name="PLoss"> | ||
19 | P-Verlust | ||
20 | </text> | ||
21 | <text name="Ping"> | ||
22 | Ping | ||
23 | </text> | ||
24 | <text name="AccountDetails"> | ||
25 | Kontodaten | ||
26 | </text> | ||
27 | <text name="LBal"> | ||
28 | L$-Stand | ||
29 | </text> | ||
30 | <text name="Time"> | ||
31 | Zeit | ||
32 | </text> | ||
33 | <text name="LocationDetails1"> | ||
34 | Standortdetails 1 | ||
35 | </text> | ||
36 | <text name="LocationDetails2"> | ||
37 | Standortdetails 2 | ||
38 | </text> | ||
39 | <text name="Region"> | ||
40 | Region | ||
41 | </text> | ||
42 | <text name="Parcel"> | ||
43 | Parzelle | ||
44 | </text> | ||
45 | <text name="Pos"> | ||
46 | Pos | ||
47 | </text> | ||
48 | <text name="Sqm"> | ||
49 | qm | ||
50 | </text> | ||
51 | <text name="Owner"> | ||
52 | Eigentümer | ||
53 | </text> | ||
54 | <text name="Type"> | ||
55 | Typ | ||
56 | </text> | ||
57 | <text name="Yes"> | ||
58 | Ja | ||
59 | </text> | ||
60 | <text name="No"> | ||
61 | Nein | ||
62 | </text> | ||
63 | <text name="Forsale"> | ||
64 | Zum Verkauf | ||
65 | </text> | ||
66 | <text name="Traffic"> | ||
67 | Traffic | ||
68 | </text> | ||
69 | <text name="Last3ChatLines"> | ||
70 | Letzte 3 Chat-Zeilen | ||
71 | </text> | ||
72 | <text name="Last3IMLines"> | ||
73 | Letzte 3 IM-Zeilen | ||
74 | </text> | ||
75 | </panel> | ||
diff --git a/linden/indra/newview/skins/xui/de/floater_landmark_ctrl.xml b/linden/indra/newview/skins/xui/de/floater_landmark_ctrl.xml new file mode 100644 index 0000000..f983bde --- /dev/null +++ b/linden/indra/newview/skins/xui/de/floater_landmark_ctrl.xml | |||
@@ -0,0 +1,10 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <floater name="landmarkpicker" title="Organisieren: Landmarken"> | ||
3 | <check_box label="Ordner anzeigen" name="show_folders_check" /> | ||
4 | <button label="Neu" label_selected="Neu" name="New" /> | ||
5 | <button label="Umbenennen" label_selected="Umbenennen" name="Rename" /> | ||
6 | <button label="Neuer Ordner" label_selected="Neuer Ordner" name="NewFolder" /> | ||
7 | <button label="Bearbeiten" label_selected="Bearbeiten" name="Edit" /> | ||
8 | <button label="Löschen" label_selected="Löschen" name="Delete" /> | ||
9 | <button label="Schließen" label_selected="Schließen" name="Close" /> | ||
10 | </floater> | ||
diff --git a/linden/indra/newview/skins/xui/de/floater_preview_classified.xml b/linden/indra/newview/skins/xui/de/floater_preview_classified.xml new file mode 100644 index 0000000..c820fbf --- /dev/null +++ b/linden/indra/newview/skins/xui/de/floater_preview_classified.xml | |||
@@ -0,0 +1,2 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <floater name="classified_preview" /> | ||
diff --git a/linden/indra/newview/skins/xui/de/floater_preview_event.xml b/linden/indra/newview/skins/xui/de/floater_preview_event.xml new file mode 100644 index 0000000..732e1fe --- /dev/null +++ b/linden/indra/newview/skins/xui/de/floater_preview_event.xml | |||
@@ -0,0 +1,2 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <floater name="event_preview" /> | ||
diff --git a/linden/indra/newview/skins/xui/de/floater_preview_url.xml b/linden/indra/newview/skins/xui/de/floater_preview_url.xml new file mode 100644 index 0000000..fd6486c --- /dev/null +++ b/linden/indra/newview/skins/xui/de/floater_preview_url.xml | |||
@@ -0,0 +1,2 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <floater name="url_preview" /> | ||
diff --git a/linden/indra/newview/skins/xui/de/menu_slurl.xml b/linden/indra/newview/skins/xui/de/menu_slurl.xml new file mode 100644 index 0000000..13b91b5 --- /dev/null +++ b/linden/indra/newview/skins/xui/de/menu_slurl.xml | |||
@@ -0,0 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <menu name="Popup"> | ||
3 | <menu_item_call label="URL-Info" name="about_url" /> | ||
4 | <menu_item_call label="Zu URL teleportieren" name="teleport_to_url" /> | ||
5 | <menu_item_call label="Auf Karte" name="show_on_map" /> | ||
6 | </menu> | ||
diff --git a/linden/indra/newview/skins/xui/de/need_to_long.xml b/linden/indra/newview/skins/xui/de/need_to_long.xml new file mode 100644 index 0000000..f794784 --- /dev/null +++ b/linden/indra/newview/skins/xui/de/need_to_long.xml | |||
@@ -0,0 +1,85 @@ | |||
1 | <?xml version="1.0"?> | ||
2 | <?mso-application progid="Excel.Sheet"?> | ||
3 | <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" | ||
4 | xmlns:o="urn:schemas-microsoft-com:office:office" | ||
5 | xmlns:x="urn:schemas-microsoft-com:office:excel" | ||
6 | xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" | ||
7 | xmlns:html="http://www.w3.org/TR/REC-html40"> | ||
8 | <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> | ||
9 | <LastAuthor>Leyla Farazha</LastAuthor> | ||
10 | <Created>2007-11-21T01:00:51Z</Created> | ||
11 | <LastSaved>2007-11-21T01:00:51Z</LastSaved> | ||
12 | <Version>11.6568</Version> | ||
13 | </DocumentProperties> | ||
14 | <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> | ||
15 | <WindowHeight>10230</WindowHeight> | ||
16 | <WindowWidth>22875</WindowWidth> | ||
17 | <WindowTopX>-4710</WindowTopX> | ||
18 | <WindowTopY>-105</WindowTopY> | ||
19 | <ProtectStructure>False</ProtectStructure> | ||
20 | <ProtectWindows>False</ProtectWindows> | ||
21 | </ExcelWorkbook> | ||
22 | <Styles> | ||
23 | <Style ss:ID="Default" ss:Name="Normal"> | ||
24 | <Alignment ss:Vertical="Bottom"/> | ||
25 | <Borders/> | ||
26 | <Font/> | ||
27 | <Interior/> | ||
28 | <NumberFormat/> | ||
29 | <Protection/> | ||
30 | </Style> | ||
31 | <Style ss:ID="s21"> | ||
32 | <Font ss:Bold="1"/> | ||
33 | </Style> | ||
34 | <Style ss:ID="s22"> | ||
35 | <Font ss:Bold="1"/> | ||
36 | <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/> | ||
37 | </Style> | ||
38 | <Style ss:ID="s23"> | ||
39 | <Alignment ss:Vertical="Bottom" ss:WrapText="1"/> | ||
40 | </Style> | ||
41 | </Styles> | ||
42 | <Worksheet ss:Name="need_to_long2"> | ||
43 | <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="3" x:FullColumns="1" | ||
44 | x:FullRows="1"> | ||
45 | <Column ss:Width="63.75"/> | ||
46 | <Column ss:Width="70.5"/> | ||
47 | <Column ss:Width="88.5"/> | ||
48 | <Column ss:Width="63.75"/> | ||
49 | <Column ss:Width="69.75"/> | ||
50 | <Column ss:Width="90.75"/> | ||
51 | <Column ss:Width="97.5"/> | ||
52 | <Row> | ||
53 | <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell> | ||
54 | </Row> | ||
55 | <Row> | ||
56 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell> | ||
57 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell> | ||
58 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell> | ||
59 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell> | ||
60 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell> | ||
61 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell> | ||
62 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell> | ||
63 | </Row> | ||
64 | <Row ss:Height="409.5"> | ||
65 | <Cell><Data ss:Type="String">floater_about.xml</Data></Cell> | ||
66 | <Cell><Data ss:Type="String">/floater_about/credits_editor</Data></Cell> | ||
67 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa and many others. In Memory of Jesse Malthus, you will be fondly remembered by all who heard your voice. Thank you to the following residents for helping to ensure that this is the best version yet: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard. APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. All rights reserved. See licenses.txt for details. Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) Mr. Watson -- come here -- I want to see you.</Data></Cell> | ||
68 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa and many others. In Memory of Jesse Malthus, you will be fondly remembered by all who heard your voice. Thank you to the following residents for helping to ensure that this is the best version yet: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, Preciousse Moody, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard. APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. All rights reserved. See licenses.txt for details. Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) Mr. Watson -- come here -- I want to see you.</Data></Cell> | ||
69 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life wird Ihnen präsentiert von Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa und vielen anderen. Im Gedenken an Jesse Malthus. Du wirst allen in Erinnerung bleiben, die deine Stimme hören durften. Vielen Dank den folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard. APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler. Alle Rechte vorbehalten. Details siehe licenses.txt. Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) (ITU-T Empf. G.722.1 Anhang C) Mr. Watson - kommen Sie bitte her - ich möchte Sie sehen.</Data></Cell> | ||
70 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life wird Ihnen präsentiert von Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa und vielen anderen. Im Gedenken an Jesse Malthus. Du wirst allen in Erinnerung bleiben, die deine Stimme hören durften. Vielen Dank den folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, Preciousse Moody, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard. APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler. Alle Rechte vorbehalten. Details siehe licenses.txt. Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) (ITU-T Empf. G.722.1 Anhang C) Mr. Watson – kommen Sie bitte her – ich möchte Sie sehen.</Data></Cell> | ||
71 | </Row> | ||
72 | </Table> | ||
73 | <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> | ||
74 | <Selected/> | ||
75 | <Panes> | ||
76 | <Pane> | ||
77 | <Number>3</Number> | ||
78 | <ActiveRow>2</ActiveRow> | ||
79 | </Pane> | ||
80 | </Panes> | ||
81 | <ProtectObjects>False</ProtectObjects> | ||
82 | <ProtectScenarios>False</ProtectScenarios> | ||
83 | </WorksheetOptions> | ||
84 | </Worksheet> | ||
85 | </Workbook> | ||
diff --git a/linden/indra/newview/skins/xui/de/need_to_translate.xml b/linden/indra/newview/skins/xui/de/need_to_translate.xml new file mode 100644 index 0000000..c47be1d --- /dev/null +++ b/linden/indra/newview/skins/xui/de/need_to_translate.xml | |||
@@ -0,0 +1,1056 @@ | |||
1 | <?xml version="1.0"?> | ||
2 | <?mso-application progid="Excel.Sheet"?> | ||
3 | <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" | ||
4 | xmlns:o="urn:schemas-microsoft-com:office:office" | ||
5 | xmlns:x="urn:schemas-microsoft-com:office:excel" | ||
6 | xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" | ||
7 | xmlns:html="http://www.w3.org/TR/REC-html40"> | ||
8 | <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> | ||
9 | <LastAuthor>Leyla Farazha</LastAuthor> | ||
10 | <Created>2007-11-21T00:46:40Z</Created> | ||
11 | <LastSaved>2007-11-21T00:46:40Z</LastSaved> | ||
12 | <Version>11.6568</Version> | ||
13 | </DocumentProperties> | ||
14 | <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> | ||
15 | <WindowHeight>10230</WindowHeight> | ||
16 | <WindowWidth>22875</WindowWidth> | ||
17 | <WindowTopX>120</WindowTopX> | ||
18 | <WindowTopY>90</WindowTopY> | ||
19 | <ProtectStructure>False</ProtectStructure> | ||
20 | <ProtectWindows>False</ProtectWindows> | ||
21 | </ExcelWorkbook> | ||
22 | <Styles> | ||
23 | <Style ss:ID="Default" ss:Name="Normal"> | ||
24 | <Alignment ss:Vertical="Bottom"/> | ||
25 | <Borders/> | ||
26 | <Font/> | ||
27 | <Interior/> | ||
28 | <NumberFormat/> | ||
29 | <Protection/> | ||
30 | </Style> | ||
31 | <Style ss:ID="s21"> | ||
32 | <Font ss:Bold="1"/> | ||
33 | </Style> | ||
34 | <Style ss:ID="s22"> | ||
35 | <Font ss:Bold="1"/> | ||
36 | <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/> | ||
37 | </Style> | ||
38 | </Styles> | ||
39 | <Worksheet ss:Name="need_to_translate2"> | ||
40 | <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="154" x:FullColumns="1" | ||
41 | x:FullRows="1"> | ||
42 | <Column ss:Width="63.75"/> | ||
43 | <Column ss:Width="70.5"/> | ||
44 | <Column ss:Width="88.5"/> | ||
45 | <Column ss:Width="63.75"/> | ||
46 | <Column ss:Width="69.75"/> | ||
47 | <Column ss:Width="90.75"/> | ||
48 | <Column ss:Width="97.5"/> | ||
49 | <Row> | ||
50 | <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell> | ||
51 | </Row> | ||
52 | <Row> | ||
53 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell> | ||
54 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell> | ||
55 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell> | ||
56 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell> | ||
57 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell> | ||
58 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell> | ||
59 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell> | ||
60 | </Row> | ||
61 | <Row> | ||
62 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
63 | <Cell><Data ss:Type="String">//skipnexttime</Data></Cell> | ||
64 | <Cell ss:Index="5"><Data ss:Type="String">Don't show me this again</Data></Cell> | ||
65 | <Cell ss:Index="7"><Data ss:Type="String">Nicht mehr anzeigen</Data></Cell> | ||
66 | </Row> | ||
67 | <Row> | ||
68 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
69 | <Cell><Data ss:Type="String">//alwayschoose</Data></Cell> | ||
70 | <Cell ss:Index="5"><Data ss:Type="String">Always choose this option</Data></Cell> | ||
71 | <Cell ss:Index="7"><Data ss:Type="String">Diese Option immer auswählen</Data></Cell> | ||
72 | </Row> | ||
73 | <Row> | ||
74 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
75 | <Cell><Data ss:Type="String">//TeleportFromLandmark/message</Data></Cell> | ||
76 | <Cell ss:Index="5"><Data ss:Type="String">Are you sure you want to teleport?</Data></Cell> | ||
77 | <Cell ss:Index="7"><Data ss:Type="String">Möchten Sie sich wirklich teleportieren?</Data></Cell> | ||
78 | </Row> | ||
79 | <Row> | ||
80 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
81 | <Cell><Data ss:Type="String">//TeleportFromLandmark/ignore</Data></Cell> | ||
82 | <Cell ss:Index="5"><Data ss:Type="String">When teleporting from a landmark in inventory</Data></Cell> | ||
83 | <Cell ss:Index="7"><Data ss:Type="String">Beim Teleportieren von einer Landmarke im Inventar</Data></Cell> | ||
84 | </Row> | ||
85 | <Row> | ||
86 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
87 | <Cell><Data ss:Type="String">//TeleportFromLandmark/Teleport</Data></Cell> | ||
88 | <Cell ss:Index="5"><Data ss:Type="String">Teleport</Data></Cell> | ||
89 | <Cell ss:Index="7"><Data ss:Type="String">Teleportieren</Data></Cell> | ||
90 | </Row> | ||
91 | <Row> | ||
92 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
93 | <Cell><Data ss:Type="String">//TeleportFromLandmark/Cancel</Data></Cell> | ||
94 | <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell> | ||
95 | <Cell ss:Index="7"><Data ss:Type="String">Abbrechen</Data></Cell> | ||
96 | </Row> | ||
97 | <Row> | ||
98 | <Cell><Data ss:Type="String">floater_active_speakers.xml</Data></Cell> | ||
99 | <Cell><Data ss:Type="String">/active_speakers/active_speakers_panel/speakers_list/speaking_status</Data></Cell> | ||
100 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
101 | </Row> | ||
102 | <Row> | ||
103 | <Cell><Data ss:Type="String">floater_chatterbox.xml</Data></Cell> | ||
104 | <Cell><Data ss:Type="String">/floater_chatterbox</Data></Cell> | ||
105 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
106 | <Cell ss:Index="5"><Data ss:Type="String">Communicate</Data></Cell> | ||
107 | <Cell ss:Index="7"><Data ss:Type="String">Unterhalten</Data></Cell> | ||
108 | </Row> | ||
109 | <Row> | ||
110 | <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell> | ||
111 | <Cell><Data ss:Type="String">/chat floater/ringing</Data></Cell> | ||
112 | <Cell ss:Index="5"><Data ss:Type="String">Connecting to in-world Voice Chat...</Data></Cell> | ||
113 | <Cell ss:Index="7"><Data ss:Type="String">Verbindung mit In-Welt-Voice-Chat...</Data></Cell> | ||
114 | </Row> | ||
115 | <Row> | ||
116 | <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell> | ||
117 | <Cell><Data ss:Type="String">/chat floater/connected</Data></Cell> | ||
118 | <Cell ss:Index="5"><Data ss:Type="String">Connected</Data></Cell> | ||
119 | <Cell ss:Index="7"><Data ss:Type="String">Verbunden</Data></Cell> | ||
120 | </Row> | ||
121 | <Row> | ||
122 | <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell> | ||
123 | <Cell><Data ss:Type="String">/chat floater/hang_up</Data></Cell> | ||
124 | <Cell ss:Index="5"><Data ss:Type="String">Disconnected from in-world Voice Chat</Data></Cell> | ||
125 | <Cell ss:Index="7"><Data ss:Type="String">Verbindung mit In-Welt-Voice-Chat getrennt</Data></Cell> | ||
126 | </Row> | ||
127 | <Row> | ||
128 | <Cell><Data ss:Type="String">floater_device_settings.xml</Data></Cell> | ||
129 | <Cell><Data ss:Type="String">/floater_device_settings</Data></Cell> | ||
130 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
131 | <Cell ss:Index="5"><Data ss:Type="String">Voice Chat Device Settings</Data></Cell> | ||
132 | <Cell ss:Index="7"><Data ss:Type="String">Geräte-Einstellungen für Voice-Chat</Data></Cell> | ||
133 | </Row> | ||
134 | <Row> | ||
135 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
136 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel</Data></Cell> | ||
137 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
138 | <Cell ss:Index="5"><Data ss:Type="String">All</Data></Cell> | ||
139 | <Cell ss:Index="7"><Data ss:Type="String">Alle</Data></Cell> | ||
140 | </Row> | ||
141 | <Row> | ||
142 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
143 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/back_btn</Data></Cell> | ||
144 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
145 | <Cell ss:Index="5"><Data ss:Type="String">Back</Data></Cell> | ||
146 | <Cell ss:Index="7"><Data ss:Type="String">Zurück</Data></Cell> | ||
147 | </Row> | ||
148 | <Row> | ||
149 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
150 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/forward_btn</Data></Cell> | ||
151 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
152 | <Cell ss:Index="5"><Data ss:Type="String">Forward</Data></Cell> | ||
153 | <Cell ss:Index="7"><Data ss:Type="String">Weiter</Data></Cell> | ||
154 | </Row> | ||
155 | <Row> | ||
156 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
157 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_editor</Data></Cell> | ||
158 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
159 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
160 | <Cell ss:Index="7"><Data ss:Type="String">Suchen</Data></Cell> | ||
161 | </Row> | ||
162 | <Row> | ||
163 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
164 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_editor</Data></Cell> | ||
165 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
166 | <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell> | ||
167 | <Cell ss:Index="7"><Data ss:Type="String">Second Life durchsuchen</Data></Cell> | ||
168 | </Row> | ||
169 | <Row> | ||
170 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
171 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_btn</Data></Cell> | ||
172 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
173 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
174 | <Cell ss:Index="7"><Data ss:Type="String">Suchen</Data></Cell> | ||
175 | </Row> | ||
176 | <Row> | ||
177 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
178 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/AnyCategory</Data></Cell> | ||
179 | <Cell ss:Index="5"><Data ss:Type="String">Any Category</Data></Cell> | ||
180 | <Cell ss:Index="7"><Data ss:Type="String">Alle Kategorien</Data></Cell> | ||
181 | </Row> | ||
182 | <Row> | ||
183 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
184 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Classifieds</Data></Cell> | ||
185 | <Cell ss:Index="5"><Data ss:Type="String">Classifieds</Data></Cell> | ||
186 | <Cell ss:Index="7"><Data ss:Type="String">Anzeigen</Data></Cell> | ||
187 | </Row> | ||
188 | <Row> | ||
189 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
190 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Events</Data></Cell> | ||
191 | <Cell ss:Index="5"><Data ss:Type="String">Events</Data></Cell> | ||
192 | <Cell ss:Index="7"><Data ss:Type="String">Events</Data></Cell> | ||
193 | </Row> | ||
194 | <Row> | ||
195 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
196 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Groups</Data></Cell> | ||
197 | <Cell ss:Index="5"><Data ss:Type="String">Groups</Data></Cell> | ||
198 | <Cell ss:Index="7"><Data ss:Type="String">Gruppen</Data></Cell> | ||
199 | </Row> | ||
200 | <Row> | ||
201 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
202 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/People</Data></Cell> | ||
203 | <Cell ss:Index="5"><Data ss:Type="String">People</Data></Cell> | ||
204 | <Cell ss:Index="7"><Data ss:Type="String">Leute</Data></Cell> | ||
205 | </Row> | ||
206 | <Row> | ||
207 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
208 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Places</Data></Cell> | ||
209 | <Cell ss:Index="5"><Data ss:Type="String">Places</Data></Cell> | ||
210 | <Cell ss:Index="7"><Data ss:Type="String">Orte</Data></Cell> | ||
211 | </Row> | ||
212 | <Row> | ||
213 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
214 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Wiki</Data></Cell> | ||
215 | <Cell ss:Index="5"><Data ss:Type="String">Wiki</Data></Cell> | ||
216 | <Cell ss:Index="7"><Data ss:Type="String">Wiki</Data></Cell> | ||
217 | </Row> | ||
218 | <Row> | ||
219 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
220 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/mature_check</Data></Cell> | ||
221 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
222 | <Cell ss:Index="5"><Data ss:Type="String">Include Mature content</Data></Cell> | ||
223 | <Cell ss:Index="7"><Data ss:Type="String">Ab-18-Inhalte einschließen</Data></Cell> | ||
224 | </Row> | ||
225 | <Row> | ||
226 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
227 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/loading_text</Data></Cell> | ||
228 | <Cell ss:Index="5"><Data ss:Type="String">Loading...</Data></Cell> | ||
229 | <Cell ss:Index="7"><Data ss:Type="String">Wird geladen...</Data></Cell> | ||
230 | </Row> | ||
231 | <Row> | ||
232 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
233 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/done_text</Data></Cell> | ||
234 | <Cell ss:Index="5"><Data ss:Type="String">Done</Data></Cell> | ||
235 | <Cell ss:Index="7"><Data ss:Type="String">Fertig</Data></Cell> | ||
236 | </Row> | ||
237 | <Row> | ||
238 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
239 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel</Data></Cell> | ||
240 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
241 | <Cell ss:Index="5"><Data ss:Type="String">All (old)</Data></Cell> | ||
242 | <Cell ss:Index="7"><Data ss:Type="String">Alle (alt)</Data></Cell> | ||
243 | </Row> | ||
244 | <Row> | ||
245 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
246 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/< Prev</Data></Cell> | ||
247 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
248 | <Cell ss:Index="5"><Data ss:Type="String">< Prev</Data></Cell> | ||
249 | <Cell ss:Index="7"><Data ss:Type="String">< Vorherige/s</Data></Cell> | ||
250 | </Row> | ||
251 | <Row> | ||
252 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
253 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/< Prev</Data></Cell> | ||
254 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
255 | <Cell ss:Index="5"><Data ss:Type="String">< Prev</Data></Cell> | ||
256 | <Cell ss:Index="7"><Data ss:Type="String">< Vorherige/s</Data></Cell> | ||
257 | </Row> | ||
258 | <Row> | ||
259 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
260 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Next ></Data></Cell> | ||
261 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
262 | <Cell ss:Index="5"><Data ss:Type="String">Next ></Data></Cell> | ||
263 | <Cell ss:Index="7"><Data ss:Type="String">Weiter ></Data></Cell> | ||
264 | </Row> | ||
265 | <Row> | ||
266 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
267 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Next ></Data></Cell> | ||
268 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
269 | <Cell ss:Index="5"><Data ss:Type="String">Next ></Data></Cell> | ||
270 | <Cell ss:Index="7"><Data ss:Type="String">Weiter ></Data></Cell> | ||
271 | </Row> | ||
272 | <Row> | ||
273 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
274 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/find</Data></Cell> | ||
275 | <Cell ss:Index="5"><Data ss:Type="String">Find:</Data></Cell> | ||
276 | <Cell ss:Index="7"><Data ss:Type="String">Suchen:</Data></Cell> | ||
277 | </Row> | ||
278 | <Row> | ||
279 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
280 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Search</Data></Cell> | ||
281 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
282 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
283 | <Cell ss:Index="7"><Data ss:Type="String">Suchen</Data></Cell> | ||
284 | </Row> | ||
285 | <Row> | ||
286 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
287 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Search</Data></Cell> | ||
288 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
289 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
290 | <Cell ss:Index="7"><Data ss:Type="String">Suchen</Data></Cell> | ||
291 | </Row> | ||
292 | <Row> | ||
293 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
294 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/incmature</Data></Cell> | ||
295 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
296 | <Cell ss:Index="5"><Data ss:Type="String">Include Mature content</Data></Cell> | ||
297 | <Cell ss:Index="7"><Data ss:Type="String">Ab-18-Inhalte einschließen</Data></Cell> | ||
298 | </Row> | ||
299 | <Row> | ||
300 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
301 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/icon</Data></Cell> | ||
302 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
303 | </Row> | ||
304 | <Row> | ||
305 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
306 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/name</Data></Cell> | ||
307 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
308 | <Cell ss:Index="5"><Data ss:Type="String">Name</Data></Cell> | ||
309 | <Cell ss:Index="7"><Data ss:Type="String">Name</Data></Cell> | ||
310 | </Row> | ||
311 | <Row> | ||
312 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
313 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/price</Data></Cell> | ||
314 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
315 | <Cell ss:Index="5"><Data ss:Type="String">Price</Data></Cell> | ||
316 | <Cell ss:Index="7"><Data ss:Type="String">Preis</Data></Cell> | ||
317 | </Row> | ||
318 | <Row> | ||
319 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
320 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/date</Data></Cell> | ||
321 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
322 | <Cell ss:Index="5"><Data ss:Type="String">Time (PT)</Data></Cell> | ||
323 | <Cell ss:Index="7"><Data ss:Type="String">Zeit (PT)</Data></Cell> | ||
324 | </Row> | ||
325 | <Row> | ||
326 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
327 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/time</Data></Cell> | ||
328 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
329 | <Cell ss:Index="5"><Data ss:Type="String">Time</Data></Cell> | ||
330 | <Cell ss:Index="7"><Data ss:Type="String">Zeit</Data></Cell> | ||
331 | </Row> | ||
332 | <Row> | ||
333 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
334 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/dwell</Data></Cell> | ||
335 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
336 | <Cell ss:Index="5"><Data ss:Type="String">Traffic</Data></Cell> | ||
337 | <Cell ss:Index="7"><Data ss:Type="String">Traffic</Data></Cell> | ||
338 | </Row> | ||
339 | <Row> | ||
340 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
341 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/area</Data></Cell> | ||
342 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
343 | <Cell ss:Index="5"><Data ss:Type="String">Area</Data></Cell> | ||
344 | <Cell ss:Index="7"><Data ss:Type="String">Gebiet</Data></Cell> | ||
345 | </Row> | ||
346 | <Row> | ||
347 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
348 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/per_meter</Data></Cell> | ||
349 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
350 | <Cell ss:Index="5"><Data ss:Type="String">L$/sq.m</Data></Cell> | ||
351 | <Cell ss:Index="7"><Data ss:Type="String">L$/qm</Data></Cell> | ||
352 | </Row> | ||
353 | <Row> | ||
354 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
355 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/online</Data></Cell> | ||
356 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
357 | <Cell ss:Index="5"><Data ss:Type="String">Online</Data></Cell> | ||
358 | <Cell ss:Index="7"><Data ss:Type="String">Online</Data></Cell> | ||
359 | </Row> | ||
360 | <Row> | ||
361 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
362 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/members</Data></Cell> | ||
363 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
364 | <Cell ss:Index="5"><Data ss:Type="String">Members</Data></Cell> | ||
365 | <Cell ss:Index="7"><Data ss:Type="String">Mitglieder</Data></Cell> | ||
366 | </Row> | ||
367 | <Row> | ||
368 | <Cell><Data ss:Type="String">floater_im.xml</Data></Cell> | ||
369 | <Cell><Data ss:Type="String">/im_floater/invite_message</Data></Cell> | ||
370 | <Cell ss:Index="5"><Data ss:Type="String">Click the [BUTTON NAME] button to accept/connect to this voice chat.</Data></Cell> | ||
371 | <Cell ss:Index="7"><Data ss:Type="String">Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen.</Data></Cell> | ||
372 | </Row> | ||
373 | <Row> | ||
374 | <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell> | ||
375 | <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell> | ||
376 | <Cell ss:Index="5"><Data ss:Type="String">Calling...</Data></Cell> | ||
377 | <Cell ss:Index="7"><Data ss:Type="String">Anruf...</Data></Cell> | ||
378 | </Row> | ||
379 | <Row> | ||
380 | <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell> | ||
381 | <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell> | ||
382 | <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell> | ||
383 | <Cell ss:Index="7"><Data ss:Type="String">Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen</Data></Cell> | ||
384 | </Row> | ||
385 | <Row> | ||
386 | <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell> | ||
387 | <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell> | ||
388 | <Cell ss:Index="5"><Data ss:Type="String">Call ended</Data></Cell> | ||
389 | <Cell ss:Index="7"><Data ss:Type="String">Anruf beendet</Data></Cell> | ||
390 | </Row> | ||
391 | <Row> | ||
392 | <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell> | ||
393 | <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell> | ||
394 | <Cell ss:Index="5"><Data ss:Type="String">Joining Voice Chat...</Data></Cell> | ||
395 | <Cell ss:Index="7"><Data ss:Type="String">Voice-Chat wird beigetreten...</Data></Cell> | ||
396 | </Row> | ||
397 | <Row> | ||
398 | <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell> | ||
399 | <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell> | ||
400 | <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell> | ||
401 | <Cell ss:Index="7"><Data ss:Type="String">Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen</Data></Cell> | ||
402 | </Row> | ||
403 | <Row> | ||
404 | <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell> | ||
405 | <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell> | ||
406 | <Cell ss:Index="5"><Data ss:Type="String">Left Voice Chat</Data></Cell> | ||
407 | <Cell ss:Index="7"><Data ss:Type="String">Voice-Chat verlassen</Data></Cell> | ||
408 | </Row> | ||
409 | <Row> | ||
410 | <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell> | ||
411 | <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell> | ||
412 | <Cell ss:Index="5"><Data ss:Type="String">Joining Voice Chat...</Data></Cell> | ||
413 | <Cell ss:Index="7"><Data ss:Type="String">Voice-Chat wird beigetreten...</Data></Cell> | ||
414 | </Row> | ||
415 | <Row> | ||
416 | <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell> | ||
417 | <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell> | ||
418 | <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell> | ||
419 | <Cell ss:Index="7"><Data ss:Type="String">Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen</Data></Cell> | ||
420 | </Row> | ||
421 | <Row> | ||
422 | <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell> | ||
423 | <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell> | ||
424 | <Cell ss:Index="5"><Data ss:Type="String">Left Voice Chat</Data></Cell> | ||
425 | <Cell ss:Index="7"><Data ss:Type="String">Voice-Chat verlassen</Data></Cell> | ||
426 | </Row> | ||
427 | <Row> | ||
428 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
429 | <Cell><Data ss:Type="String">/landmarkpicker</Data></Cell> | ||
430 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
431 | <Cell ss:Index="5"><Data ss:Type="String">Organize: Landmarks</Data></Cell> | ||
432 | <Cell ss:Index="7"><Data ss:Type="String">Organisieren: Landmarken</Data></Cell> | ||
433 | </Row> | ||
434 | <Row> | ||
435 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
436 | <Cell><Data ss:Type="String">/landmarkpicker/show_folders_check</Data></Cell> | ||
437 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
438 | <Cell ss:Index="5"><Data ss:Type="String">Show Folders</Data></Cell> | ||
439 | <Cell ss:Index="7"><Data ss:Type="String">Ordner anzeigen</Data></Cell> | ||
440 | </Row> | ||
441 | <Row> | ||
442 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
443 | <Cell><Data ss:Type="String">/landmarkpicker/New</Data></Cell> | ||
444 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
445 | <Cell ss:Index="5"><Data ss:Type="String">New</Data></Cell> | ||
446 | <Cell ss:Index="7"><Data ss:Type="String">Neu</Data></Cell> | ||
447 | </Row> | ||
448 | <Row> | ||
449 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
450 | <Cell><Data ss:Type="String">/landmarkpicker/New</Data></Cell> | ||
451 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
452 | <Cell ss:Index="5"><Data ss:Type="String">New</Data></Cell> | ||
453 | <Cell ss:Index="7"><Data ss:Type="String">Neu</Data></Cell> | ||
454 | </Row> | ||
455 | <Row> | ||
456 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
457 | <Cell><Data ss:Type="String">/landmarkpicker/Rename</Data></Cell> | ||
458 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
459 | <Cell ss:Index="5"><Data ss:Type="String">Rename</Data></Cell> | ||
460 | <Cell ss:Index="7"><Data ss:Type="String">Umbenennen</Data></Cell> | ||
461 | </Row> | ||
462 | <Row> | ||
463 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
464 | <Cell><Data ss:Type="String">/landmarkpicker/Rename</Data></Cell> | ||
465 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
466 | <Cell ss:Index="5"><Data ss:Type="String">Rename</Data></Cell> | ||
467 | <Cell ss:Index="7"><Data ss:Type="String">Umbenennen</Data></Cell> | ||
468 | </Row> | ||
469 | <Row> | ||
470 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
471 | <Cell><Data ss:Type="String">/landmarkpicker/NewFolder</Data></Cell> | ||
472 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
473 | <Cell ss:Index="5"><Data ss:Type="String">New Folder</Data></Cell> | ||
474 | <Cell ss:Index="7"><Data ss:Type="String">Neuer Ordner</Data></Cell> | ||
475 | </Row> | ||
476 | <Row> | ||
477 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
478 | <Cell><Data ss:Type="String">/landmarkpicker/NewFolder</Data></Cell> | ||
479 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
480 | <Cell ss:Index="5"><Data ss:Type="String">New Folder</Data></Cell> | ||
481 | <Cell ss:Index="7"><Data ss:Type="String">Neuer Ordner</Data></Cell> | ||
482 | </Row> | ||
483 | <Row> | ||
484 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
485 | <Cell><Data ss:Type="String">/landmarkpicker/Edit</Data></Cell> | ||
486 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
487 | <Cell ss:Index="5"><Data ss:Type="String">Edit</Data></Cell> | ||
488 | <Cell ss:Index="7"><Data ss:Type="String">Bearbeiten</Data></Cell> | ||
489 | </Row> | ||
490 | <Row> | ||
491 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
492 | <Cell><Data ss:Type="String">/landmarkpicker/Edit</Data></Cell> | ||
493 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
494 | <Cell ss:Index="5"><Data ss:Type="String">Edit</Data></Cell> | ||
495 | <Cell ss:Index="7"><Data ss:Type="String">Bearbeiten</Data></Cell> | ||
496 | </Row> | ||
497 | <Row> | ||
498 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
499 | <Cell><Data ss:Type="String">/landmarkpicker/Delete</Data></Cell> | ||
500 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
501 | <Cell ss:Index="5"><Data ss:Type="String">Delete</Data></Cell> | ||
502 | <Cell ss:Index="7"><Data ss:Type="String">Löschen</Data></Cell> | ||
503 | </Row> | ||
504 | <Row> | ||
505 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
506 | <Cell><Data ss:Type="String">/landmarkpicker/Delete</Data></Cell> | ||
507 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
508 | <Cell ss:Index="5"><Data ss:Type="String">Delete</Data></Cell> | ||
509 | <Cell ss:Index="7"><Data ss:Type="String">Löschen</Data></Cell> | ||
510 | </Row> | ||
511 | <Row> | ||
512 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
513 | <Cell><Data ss:Type="String">/landmarkpicker/Close</Data></Cell> | ||
514 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
515 | <Cell ss:Index="5"><Data ss:Type="String">Close</Data></Cell> | ||
516 | <Cell ss:Index="7"><Data ss:Type="String">Schließen</Data></Cell> | ||
517 | </Row> | ||
518 | <Row> | ||
519 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
520 | <Cell><Data ss:Type="String">/landmarkpicker/Close</Data></Cell> | ||
521 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
522 | <Cell ss:Index="5"><Data ss:Type="String">Close</Data></Cell> | ||
523 | <Cell ss:Index="7"><Data ss:Type="String">Schließen</Data></Cell> | ||
524 | </Row> | ||
525 | <Row> | ||
526 | <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell> | ||
527 | <Cell><Data ss:Type="String">/land holdings floater/area_string</Data></Cell> | ||
528 | <Cell ss:Index="5"><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
529 | <Cell ss:Index="7"><Data ss:Type="String">[AREA] qm</Data></Cell> | ||
530 | </Row> | ||
531 | <Row> | ||
532 | <Cell><Data ss:Type="String">floater_preview_classified.xml</Data></Cell> | ||
533 | <Cell><Data ss:Type="String">/classified_preview</Data></Cell> | ||
534 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
535 | <Cell ss:Index="5"><Data ss:Type="String">Classified Information</Data></Cell> | ||
536 | <Cell ss:Index="7"><Data ss:Type="String">Vertrauliche Informationen</Data></Cell> | ||
537 | </Row> | ||
538 | <Row> | ||
539 | <Cell><Data ss:Type="String">floater_preview_event.xml</Data></Cell> | ||
540 | <Cell><Data ss:Type="String">/event_preview</Data></Cell> | ||
541 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
542 | <Cell ss:Index="5"><Data ss:Type="String">Event Information</Data></Cell> | ||
543 | <Cell ss:Index="7"><Data ss:Type="String">Event-Informationen</Data></Cell> | ||
544 | </Row> | ||
545 | <Row> | ||
546 | <Cell><Data ss:Type="String">floater_preview_url.xml</Data></Cell> | ||
547 | <Cell><Data ss:Type="String">/url_preview</Data></Cell> | ||
548 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
549 | <Cell ss:Index="5"><Data ss:Type="String">Place Information</Data></Cell> | ||
550 | <Cell ss:Index="7"><Data ss:Type="String">Ortsinformationen</Data></Cell> | ||
551 | </Row> | ||
552 | <Row> | ||
553 | <Cell><Data ss:Type="String">floater_select_key.xml</Data></Cell> | ||
554 | <Cell><Data ss:Type="String">/modal container</Data></Cell> | ||
555 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
556 | </Row> | ||
557 | <Row> | ||
558 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
559 | <Cell><Data ss:Type="String">/panel_login/DebugInfo</Data></Cell> | ||
560 | <Cell ss:Index="5"><Data ss:Type="String">Debug Info</Data></Cell> | ||
561 | <Cell ss:Index="7"><Data ss:Type="String">Debug-Info</Data></Cell> | ||
562 | </Row> | ||
563 | <Row> | ||
564 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
565 | <Cell><Data ss:Type="String">/panel_login/FPS</Data></Cell> | ||
566 | <Cell ss:Index="5"><Data ss:Type="String">FPS</Data></Cell> | ||
567 | <Cell ss:Index="7"><Data ss:Type="String">FPS</Data></Cell> | ||
568 | </Row> | ||
569 | <Row> | ||
570 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
571 | <Cell><Data ss:Type="String">/panel_login/SimFPS</Data></Cell> | ||
572 | <Cell ss:Index="5"><Data ss:Type="String">SimFPS</Data></Cell> | ||
573 | <Cell ss:Index="7"><Data ss:Type="String">SimFPS</Data></Cell> | ||
574 | </Row> | ||
575 | <Row> | ||
576 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
577 | <Cell><Data ss:Type="String">/panel_login/Pin</Data></Cell> | ||
578 | <Cell ss:Index="5"><Data ss:Type="String">P-In</Data></Cell> | ||
579 | <Cell ss:Index="7"><Data ss:Type="String">P-Ein</Data></Cell> | ||
580 | </Row> | ||
581 | <Row> | ||
582 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
583 | <Cell><Data ss:Type="String">/panel_login/Pout</Data></Cell> | ||
584 | <Cell ss:Index="5"><Data ss:Type="String">P-Out</Data></Cell> | ||
585 | <Cell ss:Index="7"><Data ss:Type="String">P-Aus</Data></Cell> | ||
586 | </Row> | ||
587 | <Row> | ||
588 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
589 | <Cell><Data ss:Type="String">/panel_login/PLoss</Data></Cell> | ||
590 | <Cell ss:Index="5"><Data ss:Type="String">P-Loss</Data></Cell> | ||
591 | <Cell ss:Index="7"><Data ss:Type="String">P-Verlust</Data></Cell> | ||
592 | </Row> | ||
593 | <Row> | ||
594 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
595 | <Cell><Data ss:Type="String">/panel_login/Ping</Data></Cell> | ||
596 | <Cell ss:Index="5"><Data ss:Type="String">Ping</Data></Cell> | ||
597 | <Cell ss:Index="7"><Data ss:Type="String">Ping</Data></Cell> | ||
598 | </Row> | ||
599 | <Row> | ||
600 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
601 | <Cell><Data ss:Type="String">/panel_login/AccountDetails</Data></Cell> | ||
602 | <Cell ss:Index="5"><Data ss:Type="String">Account Details</Data></Cell> | ||
603 | <Cell ss:Index="7"><Data ss:Type="String">Kontodaten</Data></Cell> | ||
604 | </Row> | ||
605 | <Row> | ||
606 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
607 | <Cell><Data ss:Type="String">/panel_login/LBal</Data></Cell> | ||
608 | <Cell ss:Index="5"><Data ss:Type="String">L$ bal</Data></Cell> | ||
609 | <Cell ss:Index="7"><Data ss:Type="String">L$-Stand</Data></Cell> | ||
610 | </Row> | ||
611 | <Row> | ||
612 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
613 | <Cell><Data ss:Type="String">/panel_login/Time</Data></Cell> | ||
614 | <Cell ss:Index="5"><Data ss:Type="String">Time</Data></Cell> | ||
615 | <Cell ss:Index="7"><Data ss:Type="String">Zeit</Data></Cell> | ||
616 | </Row> | ||
617 | <Row> | ||
618 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
619 | <Cell><Data ss:Type="String">/panel_login/LocationDetails1</Data></Cell> | ||
620 | <Cell ss:Index="5"><Data ss:Type="String">Location Details 1</Data></Cell> | ||
621 | <Cell ss:Index="7"><Data ss:Type="String">Standortdetails 1</Data></Cell> | ||
622 | </Row> | ||
623 | <Row> | ||
624 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
625 | <Cell><Data ss:Type="String">/panel_login/LocationDetails2</Data></Cell> | ||
626 | <Cell ss:Index="5"><Data ss:Type="String">Location Details 2</Data></Cell> | ||
627 | <Cell ss:Index="7"><Data ss:Type="String">Standortdetails 2</Data></Cell> | ||
628 | </Row> | ||
629 | <Row> | ||
630 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
631 | <Cell><Data ss:Type="String">/panel_login/Region</Data></Cell> | ||
632 | <Cell ss:Index="5"><Data ss:Type="String">Region</Data></Cell> | ||
633 | <Cell ss:Index="7"><Data ss:Type="String">Region</Data></Cell> | ||
634 | </Row> | ||
635 | <Row> | ||
636 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
637 | <Cell><Data ss:Type="String">/panel_login/Parcel</Data></Cell> | ||
638 | <Cell ss:Index="5"><Data ss:Type="String">Parcel</Data></Cell> | ||
639 | <Cell ss:Index="7"><Data ss:Type="String">Parzelle</Data></Cell> | ||
640 | </Row> | ||
641 | <Row> | ||
642 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
643 | <Cell><Data ss:Type="String">/panel_login/Pos</Data></Cell> | ||
644 | <Cell ss:Index="5"><Data ss:Type="String">Pos</Data></Cell> | ||
645 | <Cell ss:Index="7"><Data ss:Type="String">Pos</Data></Cell> | ||
646 | </Row> | ||
647 | <Row> | ||
648 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
649 | <Cell><Data ss:Type="String">/panel_login/Sqm</Data></Cell> | ||
650 | <Cell ss:Index="5"><Data ss:Type="String">Sqm</Data></Cell> | ||
651 | <Cell ss:Index="7"><Data ss:Type="String">qm</Data></Cell> | ||
652 | </Row> | ||
653 | <Row> | ||
654 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
655 | <Cell><Data ss:Type="String">/panel_login/Owner</Data></Cell> | ||
656 | <Cell ss:Index="5"><Data ss:Type="String">Owner</Data></Cell> | ||
657 | <Cell ss:Index="7"><Data ss:Type="String">Eigentümer</Data></Cell> | ||
658 | </Row> | ||
659 | <Row> | ||
660 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
661 | <Cell><Data ss:Type="String">/panel_login/Type</Data></Cell> | ||
662 | <Cell ss:Index="5"><Data ss:Type="String">Type</Data></Cell> | ||
663 | <Cell ss:Index="7"><Data ss:Type="String">Typ</Data></Cell> | ||
664 | </Row> | ||
665 | <Row> | ||
666 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
667 | <Cell><Data ss:Type="String">/panel_login/Yes</Data></Cell> | ||
668 | <Cell ss:Index="5"><Data ss:Type="String">Yes</Data></Cell> | ||
669 | <Cell ss:Index="7"><Data ss:Type="String">Ja</Data></Cell> | ||
670 | </Row> | ||
671 | <Row> | ||
672 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
673 | <Cell><Data ss:Type="String">/panel_login/No</Data></Cell> | ||
674 | <Cell ss:Index="5"><Data ss:Type="String">No</Data></Cell> | ||
675 | <Cell ss:Index="7"><Data ss:Type="String">Nein</Data></Cell> | ||
676 | </Row> | ||
677 | <Row> | ||
678 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
679 | <Cell><Data ss:Type="String">/panel_login/Forsale</Data></Cell> | ||
680 | <Cell ss:Index="5"><Data ss:Type="String">ForSale</Data></Cell> | ||
681 | <Cell ss:Index="7"><Data ss:Type="String">Zum Verkauf</Data></Cell> | ||
682 | </Row> | ||
683 | <Row> | ||
684 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
685 | <Cell><Data ss:Type="String">/panel_login/Traffic</Data></Cell> | ||
686 | <Cell ss:Index="5"><Data ss:Type="String">Traffic</Data></Cell> | ||
687 | <Cell ss:Index="7"><Data ss:Type="String">Traffic</Data></Cell> | ||
688 | </Row> | ||
689 | <Row> | ||
690 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
691 | <Cell><Data ss:Type="String">/panel_login/Last3ChatLines</Data></Cell> | ||
692 | <Cell ss:Index="5"><Data ss:Type="String">Last 3 Chat Lines</Data></Cell> | ||
693 | <Cell ss:Index="7"><Data ss:Type="String">Letzte 3 Chat-Zeilen</Data></Cell> | ||
694 | </Row> | ||
695 | <Row> | ||
696 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
697 | <Cell><Data ss:Type="String">/panel_login/Last3IMLines</Data></Cell> | ||
698 | <Cell ss:Index="5"><Data ss:Type="String">Last 3 IM Lines</Data></Cell> | ||
699 | <Cell ss:Index="7"><Data ss:Type="String">Letzte 3 IM-Zeilen</Data></Cell> | ||
700 | </Row> | ||
701 | <Row> | ||
702 | <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell> | ||
703 | <Cell><Data ss:Type="String">/Popup/about_url</Data></Cell> | ||
704 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
705 | <Cell ss:Index="5"><Data ss:Type="String">About URL</Data></Cell> | ||
706 | <Cell ss:Index="7"><Data ss:Type="String">URL-Info</Data></Cell> | ||
707 | </Row> | ||
708 | <Row> | ||
709 | <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell> | ||
710 | <Cell><Data ss:Type="String">/Popup/teleport_to_url</Data></Cell> | ||
711 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
712 | <Cell ss:Index="5"><Data ss:Type="String">Teleport to URL</Data></Cell> | ||
713 | <Cell ss:Index="7"><Data ss:Type="String">Zu URL teleportieren</Data></Cell> | ||
714 | </Row> | ||
715 | <Row> | ||
716 | <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell> | ||
717 | <Cell><Data ss:Type="String">/Popup/show_on_map</Data></Cell> | ||
718 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
719 | <Cell ss:Index="5"><Data ss:Type="String">Show on Map</Data></Cell> | ||
720 | <Cell ss:Index="7"><Data ss:Type="String">Auf Karte</Data></Cell> | ||
721 | </Row> | ||
722 | <Row> | ||
723 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
724 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting</Data></Cell> | ||
725 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
726 | <Cell ss:Index="5"><Data ss:Type="String">Bug Reporting</Data></Cell> | ||
727 | <Cell ss:Index="7"><Data ss:Type="String">Fehlermeldungen</Data></Cell> | ||
728 | </Row> | ||
729 | <Row> | ||
730 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
731 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Public Issue Tracker...</Data></Cell> | ||
732 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
733 | <Cell ss:Index="5"><Data ss:Type="String">Public Issue Tracker...</Data></Cell> | ||
734 | <Cell ss:Index="7"><Data ss:Type="String">Allgemeiner Probleme-Tracker...</Data></Cell> | ||
735 | </Row> | ||
736 | <Row> | ||
737 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
738 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Publc Issue Tracker Help...</Data></Cell> | ||
739 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
740 | <Cell ss:Index="5"><Data ss:Type="String">Public Issue Tracker Help...</Data></Cell> | ||
741 | <Cell ss:Index="7"><Data ss:Type="String">Hilfe zum Allgemeinen Probleme-Tracker...</Data></Cell> | ||
742 | </Row> | ||
743 | <Row> | ||
744 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
745 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/separator7</Data></Cell> | ||
746 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
747 | <Cell ss:Index="5"><Data ss:Type="String">-----------</Data></Cell> | ||
748 | <Cell ss:Index="7"><Data ss:Type="String">-----------</Data></Cell> | ||
749 | </Row> | ||
750 | <Row> | ||
751 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
752 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Bug Reporing 101...</Data></Cell> | ||
753 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
754 | <Cell ss:Index="5"><Data ss:Type="String">Bug Reporting 101...</Data></Cell> | ||
755 | <Cell ss:Index="7"><Data ss:Type="String">Fehlermeldungs-1x1...</Data></Cell> | ||
756 | </Row> | ||
757 | <Row> | ||
758 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
759 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Security Issues...</Data></Cell> | ||
760 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
761 | <Cell ss:Index="5"><Data ss:Type="String">Security Issues...</Data></Cell> | ||
762 | <Cell ss:Index="7"><Data ss:Type="String">Sicherheitsfragen...</Data></Cell> | ||
763 | </Row> | ||
764 | <Row> | ||
765 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
766 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/QA Wiki...</Data></Cell> | ||
767 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
768 | <Cell ss:Index="5"><Data ss:Type="String">QA Wiki...</Data></Cell> | ||
769 | <Cell ss:Index="7"><Data ss:Type="String">QA-Wiki...</Data></Cell> | ||
770 | </Row> | ||
771 | <Row> | ||
772 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
773 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/separator7</Data></Cell> | ||
774 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
775 | <Cell ss:Index="5"><Data ss:Type="String">-----------</Data></Cell> | ||
776 | <Cell ss:Index="7"><Data ss:Type="String">-----------</Data></Cell> | ||
777 | </Row> | ||
778 | <Row> | ||
779 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
780 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Report Bug...</Data></Cell> | ||
781 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
782 | <Cell ss:Index="5"><Data ss:Type="String">Report Bug...</Data></Cell> | ||
783 | <Cell ss:Index="7"><Data ss:Type="String">Fehler melden...</Data></Cell> | ||
784 | </Row> | ||
785 | <Row> | ||
786 | <Cell><Data ss:Type="String">notify.xml</Data></Cell> | ||
787 | <Cell><Data ss:Type="String">//VoiceChannelJoinFailed/message</Data></Cell> | ||
788 | <Cell ss:Index="5"><Data ss:Type="String">Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to spatial voice chat.</Data></Cell> | ||
789 | <Cell ss:Index="7"><Data ss:Type="String">Verbindung zu [VOICE_CHANNEL_NAME] nicht möglich. Bitte versuchen Sie es später. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.</Data></Cell> | ||
790 | </Row> | ||
791 | <Row> | ||
792 | <Cell><Data ss:Type="String">panel_avatar_classified.xml</Data></Cell> | ||
793 | <Cell><Data ss:Type="String">/Classified/update_txt</Data></Cell> | ||
794 | <Cell ss:Index="5"><Data ss:Type="String">Update</Data></Cell> | ||
795 | <Cell ss:Index="7"><Data ss:Type="String">Aktualisieren</Data></Cell> | ||
796 | </Row> | ||
797 | <Row> | ||
798 | <Cell><Data ss:Type="String">panel_avatar_classified.xml</Data></Cell> | ||
799 | <Cell><Data ss:Type="String">/Classified/publish_txt</Data></Cell> | ||
800 | <Cell ss:Index="5"><Data ss:Type="String">Publish...</Data></Cell> | ||
801 | <Cell ss:Index="7"><Data ss:Type="String">Veröffentlichen...</Data></Cell> | ||
802 | </Row> | ||
803 | <Row> | ||
804 | <Cell><Data ss:Type="String">panel_groups.xml</Data></Cell> | ||
805 | <Cell><Data ss:Type="String">/groups/group list/name</Data></Cell> | ||
806 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
807 | </Row> | ||
808 | <Row> | ||
809 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
810 | <Cell><Data ss:Type="String">/general_tab/group_info_unchanged</Data></Cell> | ||
811 | <Cell ss:Index="5"><Data ss:Type="String">General group information has changed.</Data></Cell> | ||
812 | <Cell ss:Index="7"><Data ss:Type="String">Die allgemeine Gruppeninfo wurde geändert.</Data></Cell> | ||
813 | </Row> | ||
814 | <Row> | ||
815 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
816 | <Cell><Data ss:Type="String">/land_money_tab/land_contrib_error</Data></Cell> | ||
817 | <Cell ss:Index="5"><Data ss:Type="String">Unable to set your land contribution.</Data></Cell> | ||
818 | <Cell ss:Index="7"><Data ss:Type="String">Ihr Landbeitrag kann nicht festgelegt werden.</Data></Cell> | ||
819 | </Row> | ||
820 | <Row> | ||
821 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
822 | <Cell><Data ss:Type="String">/Place/server_update_text</Data></Cell> | ||
823 | <Cell ss:Index="5"><Data ss:Type="String">Place information not available without server update.</Data></Cell> | ||
824 | <Cell ss:Index="7"><Data ss:Type="String">Ohne Serverupdate sind keine Ortsinformationen verfügbar.</Data></Cell> | ||
825 | </Row> | ||
826 | <Row> | ||
827 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
828 | <Cell><Data ss:Type="String">/Place/server_error_text</Data></Cell> | ||
829 | <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable at this time, please try again later.</Data></Cell> | ||
830 | <Cell ss:Index="7"><Data ss:Type="String">Zur Zeit gibt es keine Informationen zu diesem Standort. Bitte versuchen Sie es später.</Data></Cell> | ||
831 | </Row> | ||
832 | <Row> | ||
833 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
834 | <Cell><Data ss:Type="String">/Place/server_forbidden_text</Data></Cell> | ||
835 | <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.</Data></Cell> | ||
836 | <Cell ss:Index="7"><Data ss:Type="String">Die Informationen über diesen Standort sind zugriffsbeschränkt. Bitte wenden Sie sich bezüglich Ihrer Berechtigungen an den Eigentümer der Parzelle.</Data></Cell> | ||
837 | </Row> | ||
838 | <Row> | ||
839 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
840 | <Cell><Data ss:Type="String">/Place/traffic_text</Data></Cell> | ||
841 | <Cell ss:Index="5"><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell> | ||
842 | <Cell ss:Index="7"><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell> | ||
843 | </Row> | ||
844 | <Row> | ||
845 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
846 | <Cell><Data ss:Type="String">/Place/area_text</Data></Cell> | ||
847 | <Cell ss:Index="5"><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell> | ||
848 | <Cell ss:Index="7"><Data ss:Type="String">Gebiet: [AREA] qm</Data></Cell> | ||
849 | </Row> | ||
850 | <Row> | ||
851 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
852 | <Cell><Data ss:Type="String">/Place/forsale_text</Data></Cell> | ||
853 | <Cell ss:Index="5"><Data ss:Type="String">For Sale for L$ [PRICE]</Data></Cell> | ||
854 | <Cell ss:Index="7"><Data ss:Type="String">Steht zum Verkauf für [PRICE] L$</Data></Cell> | ||
855 | </Row> | ||
856 | <Row> | ||
857 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
858 | <Cell><Data ss:Type="String">/Place/auction_text</Data></Cell> | ||
859 | <Cell ss:Index="5"><Data ss:Type="String">Auction ID [ID].</Data></Cell> | ||
860 | <Cell ss:Index="7"><Data ss:Type="String">Auktions-ID [ID].</Data></Cell> | ||
861 | </Row> | ||
862 | <Row> | ||
863 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
864 | <Cell><Data ss:Type="String">/Place/server_update_text</Data></Cell> | ||
865 | <Cell ss:Index="5"><Data ss:Type="String">Place information not available without server update.</Data></Cell> | ||
866 | <Cell ss:Index="7"><Data ss:Type="String">Ohne Serverupdate sind keine Ortsinformationen verfügbar.</Data></Cell> | ||
867 | </Row> | ||
868 | <Row> | ||
869 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
870 | <Cell><Data ss:Type="String">/Place/server_error_text</Data></Cell> | ||
871 | <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable at this time, please try again later.</Data></Cell> | ||
872 | <Cell ss:Index="7"><Data ss:Type="String">Zur Zeit gibt es keine Informationen zu diesem Standort. Bitte versuchen Sie es später.</Data></Cell> | ||
873 | </Row> | ||
874 | <Row> | ||
875 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
876 | <Cell><Data ss:Type="String">/Place/server_forbidden_text</Data></Cell> | ||
877 | <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.</Data></Cell> | ||
878 | <Cell ss:Index="7"><Data ss:Type="String">Die Informationen über diesen Standort sind zugriffsbeschränkt. Bitte wenden Sie sich bezüglich Ihrer Berechtigungen an den Eigentümer der Parzelle.</Data></Cell> | ||
879 | </Row> | ||
880 | <Row> | ||
881 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
882 | <Cell><Data ss:Type="String">/LCD Options</Data></Cell> | ||
883 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
884 | <Cell ss:Index="5"><Data ss:Type="String">Logitech LCD</Data></Cell> | ||
885 | <Cell ss:Index="7"><Data ss:Type="String">Logitech-LCD</Data></Cell> | ||
886 | </Row> | ||
887 | <Row> | ||
888 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
889 | <Cell><Data ss:Type="String">/LCD Options/LCD Destination:</Data></Cell> | ||
890 | <Cell ss:Index="5"><Data ss:Type="String">LCD Destination:</Data></Cell> | ||
891 | <Cell ss:Index="7"><Data ss:Type="String">LCD-Ziel:</Data></Cell> | ||
892 | </Row> | ||
893 | <Row> | ||
894 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
895 | <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationG15</Data></Cell> | ||
896 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
897 | <Cell ss:Index="5"><Data ss:Type="String">Display forms selected appear on Logitech G15 Keyboard LCD</Data></Cell> | ||
898 | <Cell ss:Index="7"><Data ss:Type="String">Zeigt die Auswahl auf dem LCD der Logitech G15-Tastatur an</Data></Cell> | ||
899 | </Row> | ||
900 | <Row> | ||
901 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
902 | <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationG15</Data></Cell> | ||
903 | <Cell ss:Index="5"><Data ss:Type="String">Logitech G15 Gaming Keyboard</Data></Cell> | ||
904 | <Cell ss:Index="7"><Data ss:Type="String">Logitech G15 Gaming-Tastatur</Data></Cell> | ||
905 | </Row> | ||
906 | <Row> | ||
907 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
908 | <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationZ10</Data></Cell> | ||
909 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
910 | <Cell ss:Index="5"><Data ss:Type="String">Display forms selected appear on Logitech Z10 Speaker LCD</Data></Cell> | ||
911 | <Cell ss:Index="7"><Data ss:Type="String">Zeigt die Auswahl auf dem LCD der Logitech Z10-Lautsprecher an</Data></Cell> | ||
912 | </Row> | ||
913 | <Row> | ||
914 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
915 | <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationZ10</Data></Cell> | ||
916 | <Cell ss:Index="5"><Data ss:Type="String">Logitech Z10 Speakers</Data></Cell> | ||
917 | <Cell ss:Index="7"><Data ss:Type="String">Logitech Z10-Lautsprecher</Data></Cell> | ||
918 | </Row> | ||
919 | <Row> | ||
920 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
921 | <Cell><Data ss:Type="String">/LCD Options/LCD Display Options</Data></Cell> | ||
922 | <Cell ss:Index="5"><Data ss:Type="String">LCD Display Options:</Data></Cell> | ||
923 | <Cell ss:Index="7"><Data ss:Type="String">LCD-Anzeigeoptionen:</Data></Cell> | ||
924 | </Row> | ||
925 | <Row> | ||
926 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
927 | <Cell><Data ss:Type="String">/LCD Options/DisplayChat</Data></Cell> | ||
928 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
929 | <Cell ss:Index="5"><Data ss:Type="String">Display Chat</Data></Cell> | ||
930 | <Cell ss:Index="7"><Data ss:Type="String">Chat anzeigen</Data></Cell> | ||
931 | </Row> | ||
932 | <Row> | ||
933 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
934 | <Cell><Data ss:Type="String">/LCD Options/DisplayChat</Data></Cell> | ||
935 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
936 | <Cell ss:Index="5"><Data ss:Type="String">Display Last Chat line in LCD Window</Data></Cell> | ||
937 | <Cell ss:Index="7"><Data ss:Type="String">Letzte Chat-Zeile auf dem LCD anzeigen</Data></Cell> | ||
938 | </Row> | ||
939 | <Row> | ||
940 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
941 | <Cell><Data ss:Type="String">/LCD Options/DisplayIM</Data></Cell> | ||
942 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
943 | <Cell ss:Index="5"><Data ss:Type="String">Display IM's</Data></Cell> | ||
944 | <Cell ss:Index="7"><Data ss:Type="String">IMs anzeigen</Data></Cell> | ||
945 | </Row> | ||
946 | <Row> | ||
947 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
948 | <Cell><Data ss:Type="String">/LCD Options/DisplayIM</Data></Cell> | ||
949 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
950 | <Cell ss:Index="5"><Data ss:Type="String">Display Last IM in LCD Window</Data></Cell> | ||
951 | <Cell ss:Index="7"><Data ss:Type="String">Letzte IM auf dem LCD anzeigen</Data></Cell> | ||
952 | </Row> | ||
953 | <Row> | ||
954 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
955 | <Cell><Data ss:Type="String">/LCD Options/DisplayRegion</Data></Cell> | ||
956 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
957 | <Cell ss:Index="5"><Data ss:Type="String">Show Location Information</Data></Cell> | ||
958 | <Cell ss:Index="7"><Data ss:Type="String">Standortinformationen anzeigen</Data></Cell> | ||
959 | </Row> | ||
960 | <Row> | ||
961 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
962 | <Cell><Data ss:Type="String">/LCD Options/DisplayRegion</Data></Cell> | ||
963 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
964 | <Cell ss:Index="5"><Data ss:Type="String">Display current location information in LCD Window</Data></Cell> | ||
965 | <Cell ss:Index="7"><Data ss:Type="String">Informationen zum aktuellen Standort auf dem LCD anzeigen</Data></Cell> | ||
966 | </Row> | ||
967 | <Row> | ||
968 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
969 | <Cell><Data ss:Type="String">/LCD Options/DisplayLinden</Data></Cell> | ||
970 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
971 | <Cell ss:Index="5"><Data ss:Type="String">Show Account Information</Data></Cell> | ||
972 | <Cell ss:Index="7"><Data ss:Type="String">Kontodaten anzeigen</Data></Cell> | ||
973 | </Row> | ||
974 | <Row> | ||
975 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
976 | <Cell><Data ss:Type="String">/LCD Options/DisplayLinden</Data></Cell> | ||
977 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
978 | <Cell ss:Index="5"><Data ss:Type="String">Display current account information in LCD Window</Data></Cell> | ||
979 | <Cell ss:Index="7"><Data ss:Type="String">Aktuelle Informationen zum Konto auf dem LCD anzeigen</Data></Cell> | ||
980 | </Row> | ||
981 | <Row> | ||
982 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
983 | <Cell><Data ss:Type="String">/LCD Options/DisplayDebug</Data></Cell> | ||
984 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
985 | <Cell ss:Index="5"><Data ss:Type="String">Display Network Comms Info</Data></Cell> | ||
986 | <Cell ss:Index="7"><Data ss:Type="String">Netzwerkinformationen anzeigen</Data></Cell> | ||
987 | </Row> | ||
988 | <Row> | ||
989 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
990 | <Cell><Data ss:Type="String">/LCD Options/DisplayDebug</Data></Cell> | ||
991 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
992 | <Cell ss:Index="5"><Data ss:Type="String">Display debug information in LCD Window</Data></Cell> | ||
993 | <Cell ss:Index="7"><Data ss:Type="String">Debug-Informationen auf dem LCD anzeigen</Data></Cell> | ||
994 | </Row> | ||
995 | <Row> | ||
996 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
997 | <Cell><Data ss:Type="String">/LCD Options/DisplayDebugConsole</Data></Cell> | ||
998 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
999 | <Cell ss:Index="5"><Data ss:Type="String">Display Debug Info from Console</Data></Cell> | ||
1000 | <Cell ss:Index="7"><Data ss:Type="String">Debug-Info von Konsole anzeigen</Data></Cell> | ||
1001 | </Row> | ||
1002 | <Row> | ||
1003 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
1004 | <Cell><Data ss:Type="String">/LCD Options/DisplayDebugConsole</Data></Cell> | ||
1005 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
1006 | <Cell ss:Index="5"><Data ss:Type="String">Display console debug information in LCD Window</Data></Cell> | ||
1007 | <Cell ss:Index="7"><Data ss:Type="String">Debug-Informationen von der Konsole auf dem LCD anzeigen</Data></Cell> | ||
1008 | </Row> | ||
1009 | <Row> | ||
1010 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1011 | <Cell><Data ss:Type="String">/status/search_editor</Data></Cell> | ||
1012 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
1013 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
1014 | <Cell ss:Index="7"><Data ss:Type="String">Suchen</Data></Cell> | ||
1015 | </Row> | ||
1016 | <Row> | ||
1017 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1018 | <Cell><Data ss:Type="String">/status/search_editor</Data></Cell> | ||
1019 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
1020 | <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell> | ||
1021 | <Cell ss:Index="7"><Data ss:Type="String">Second Life durchsuchen</Data></Cell> | ||
1022 | </Row> | ||
1023 | <Row> | ||
1024 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1025 | <Cell><Data ss:Type="String">/status/search_btn</Data></Cell> | ||
1026 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
1027 | </Row> | ||
1028 | <Row> | ||
1029 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1030 | <Cell><Data ss:Type="String">/status/search_btn</Data></Cell> | ||
1031 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
1032 | </Row> | ||
1033 | <Row> | ||
1034 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1035 | <Cell><Data ss:Type="String">/status/search_btn</Data></Cell> | ||
1036 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
1037 | <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell> | ||
1038 | <Cell ss:Index="7"><Data ss:Type="String">Second Life durchsuchen</Data></Cell> | ||
1039 | </Row> | ||
1040 | </Table> | ||
1041 | <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> | ||
1042 | <Selected/> | ||
1043 | <TopRowVisible>123</TopRowVisible> | ||
1044 | <Panes> | ||
1045 | <Pane> | ||
1046 | <Number>3</Number> | ||
1047 | <ActiveRow>2</ActiveRow> | ||
1048 | <ActiveCol>4</ActiveCol> | ||
1049 | <RangeSelection>R3C5:R154C5</RangeSelection> | ||
1050 | </Pane> | ||
1051 | </Panes> | ||
1052 | <ProtectObjects>False</ProtectObjects> | ||
1053 | <ProtectScenarios>False</ProtectScenarios> | ||
1054 | </WorksheetOptions> | ||
1055 | </Worksheet> | ||
1056 | </Workbook> | ||
diff --git a/linden/indra/newview/skins/xui/de/need_to_update.xml b/linden/indra/newview/skins/xui/de/need_to_update.xml new file mode 100644 index 0000000..38def15 --- /dev/null +++ b/linden/indra/newview/skins/xui/de/need_to_update.xml | |||
@@ -0,0 +1,420 @@ | |||
1 | <?xml version="1.0"?> | ||
2 | <?mso-application progid="Excel.Sheet"?> | ||
3 | <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" | ||
4 | xmlns:o="urn:schemas-microsoft-com:office:office" | ||
5 | xmlns:x="urn:schemas-microsoft-com:office:excel" | ||
6 | xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" | ||
7 | xmlns:html="http://www.w3.org/TR/REC-html40"> | ||
8 | <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> | ||
9 | <LastAuthor>Leyla Farazha</LastAuthor> | ||
10 | <Created>2007-11-21T00:47:10Z</Created> | ||
11 | <LastSaved>2007-11-21T00:47:10Z</LastSaved> | ||
12 | <Version>11.6568</Version> | ||
13 | </DocumentProperties> | ||
14 | <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> | ||
15 | <WindowHeight>9975</WindowHeight> | ||
16 | <WindowWidth>22635</WindowWidth> | ||
17 | <WindowTopX>360</WindowTopX> | ||
18 | <WindowTopY>345</WindowTopY> | ||
19 | <ProtectStructure>False</ProtectStructure> | ||
20 | <ProtectWindows>False</ProtectWindows> | ||
21 | </ExcelWorkbook> | ||
22 | <Styles> | ||
23 | <Style ss:ID="Default" ss:Name="Normal"> | ||
24 | <Alignment ss:Vertical="Bottom"/> | ||
25 | <Borders/> | ||
26 | <Font/> | ||
27 | <Interior/> | ||
28 | <NumberFormat/> | ||
29 | <Protection/> | ||
30 | </Style> | ||
31 | <Style ss:ID="s21"> | ||
32 | <Font ss:Bold="1"/> | ||
33 | </Style> | ||
34 | <Style ss:ID="s22"> | ||
35 | <Font ss:Bold="1"/> | ||
36 | <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/> | ||
37 | </Style> | ||
38 | <Style ss:ID="s23"> | ||
39 | <Alignment ss:Vertical="Bottom" ss:WrapText="1"/> | ||
40 | </Style> | ||
41 | </Styles> | ||
42 | <Worksheet ss:Name="need_to_update2"> | ||
43 | <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="43" x:FullColumns="1" | ||
44 | x:FullRows="1"> | ||
45 | <Column ss:Width="63.75"/> | ||
46 | <Column ss:Width="70.5"/> | ||
47 | <Column ss:Width="88.5"/> | ||
48 | <Column ss:Width="63.75"/> | ||
49 | <Column ss:Width="69.75"/> | ||
50 | <Column ss:Width="90.75"/> | ||
51 | <Column ss:Width="97.5"/> | ||
52 | <Row> | ||
53 | <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell> | ||
54 | </Row> | ||
55 | <Row> | ||
56 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell> | ||
57 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell> | ||
58 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell> | ||
59 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell> | ||
60 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell> | ||
61 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell> | ||
62 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell> | ||
63 | </Row> | ||
64 | <Row ss:Height="153"> | ||
65 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
66 | <Cell><Data ss:Type="String">//ClickPublishHelpAvatar/message</Data></Cell> | ||
67 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Selecting the "Publish in Search" will show: - my profile in search results - a link to my profile in public group pages</Data></Cell> | ||
68 | <Cell ss:StyleID="s23"><Data ss:Type="String">Selecting "Show in Search" will show: - my profile in search results - a link to my profile in public group pages</Data></Cell> | ||
69 | <Cell><Data ss:Type="String">In Suche veröffentlichen</Data></Cell> | ||
70 | <Cell ss:StyleID="s23"><Data ss:Type="String">"In Suche anzeigen" zeigt Folgendes an: - Ihr Profil in den Suchergebnissen - einen Link auf Ihr Profil in den öffentlichen Gruppenseiten</Data></Cell> | ||
71 | </Row> | ||
72 | <Row> | ||
73 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
74 | <Cell><Data ss:Type="String">//ErrorEncodingSnapshot/message</Data></Cell> | ||
75 | <Cell ss:Index="4"><Data ss:Type="String">Error encoding snapshot.</Data></Cell> | ||
76 | <Cell><Data ss:Type="String">Error encoding snapshot!</Data></Cell> | ||
77 | <Cell><Data ss:Type="String">Fehler beim Erstellen des Fotos!</Data></Cell> | ||
78 | <Cell><Data ss:Type="String">Fehler beim Erstellen des Fotos!</Data></Cell> | ||
79 | </Row> | ||
80 | <Row ss:Height="409.5"> | ||
81 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
82 | <Cell><Data ss:Type="String">//AddClassified/message</Data></Cell> | ||
83 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the Search directory and on www.secondlife.com for one week. Fill out your ad, then click 'Publish...' to add it to the directory. You'll be asked for a price to pay when clicking Publish. Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords.</Data></Cell> | ||
84 | <Cell ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the Find directory for one week. Fill out your ad, then click 'Publish...' to add it to the directory. You'll be asked for a price to pay when clicking Publish. Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords.</Data></Cell> | ||
85 | <Cell ss:StyleID="s23"><Data ss:Type="String">Anzeigen erscheinen eine Woche lang im Abschnitt 'Anzeigen' des Suchverzeichnisses. Füllen Sie Ihre Anzeige aus und klicken Sie auf 'Veröffentlichen...', um sie zum Verzeichnis hinzuzufügen. Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf 'Veröffentlichen' klicken. Wenn Sie mehr bezahlen, erscheint Ihre Anzeige weiter oben in der Liste, ebenso wenn ein Benutzer nach Ihren Suchbegriffen sucht.</Data></Cell> | ||
86 | <Cell ss:StyleID="s23"><Data ss:Type="String">Anzeigen erscheinen eine Woche lang auf der Registerkarte 'Anzeigen' im Suchverzeichnis. Füllen Sie Ihre Anzeige aus und klicken Sie auf 'Veröffentlichen...', um sie zum Verzeichnis hinzuzufügen. Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf 'Veröffentlichen' klicken. Wenn Sie mehr bezahlen oder ein Benutzer nach Ihren Suchbegriffen sucht, erscheint Ihre Anzeige weiter oben in der Liste.</Data></Cell> | ||
87 | </Row> | ||
88 | <Row ss:Height="178.5"> | ||
89 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
90 | <Cell><Data ss:Type="String">//HelpEstateExternallyVisible/message</Data></Cell> | ||
91 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">This checkbox sets whether Residents who are on other estates can enter this estate without being on an access list. Default: on</Data></Cell> | ||
92 | <Cell ss:StyleID="s23"><Data ss:Type="String">This checkbox sets whether Residents who are on other estates can enter this estate without being on an access list. Default: on</Data></Cell> | ||
93 | <Cell ss:StyleID="s23"><Data ss:Type="String">Aktivieren Sie diese Option, um Einwohnern den Zugang zu diesem Grundstück zu erlauben, ohne auf der Zugangsliste zu stehen. Standard: ein</Data></Cell> | ||
94 | <Cell ss:StyleID="s23"><Data ss:Type="String">Aktivieren Sie diese Option, um Einwohnern den Zugang zu diesem Grundstück zu erlauben, ohne auf der Zugangsliste zu stehen. Standard: ein</Data></Cell> | ||
95 | </Row> | ||
96 | <Row ss:Height="204"> | ||
97 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
98 | <Cell><Data ss:Type="String">//HelpEstateAllowResident/message</Data></Cell> | ||
99 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to Residents listed here and any groups below. This setting is only available when Visible from Mainland is unchecked.</Data></Cell> | ||
100 | <Cell ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to Residents listed here and any groups below. This setting is only available when Visible from Mainland is unchecked.</Data></Cell> | ||
101 | <Cell ss:StyleID="s23"><Data ss:Type="String">Der Zugang zu diesem Grundstück wird auf die hier aufgeführten Einwohner und Gruppen beschränkt. Diese Einstellung ist nur verfügbar, wenn 'Vom Festland aus sichtbar' deaktiviert ist.</Data></Cell> | ||
102 | <Cell ss:StyleID="s23"><Data ss:Type="String">Der Zugang zu diesem Grundstück wird auf die hier aufgeführten Einwohner und Gruppen beschränkt. Diese Einstellung ist nur verfügbar, wenn 'Vom Festland aus sichtbar' deaktiviert ist.</Data></Cell> | ||
103 | </Row> | ||
104 | <Row ss:Height="204"> | ||
105 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
106 | <Cell><Data ss:Type="String">//HelpEstateAllowGroup/message</Data></Cell> | ||
107 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to groups listed here and any Residents above. This setting is only available when Visible from Mainland is unchecked.</Data></Cell> | ||
108 | <Cell ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to groups listed here and any Residents above. This setting is only available when Visible from Mainland is unchecked.</Data></Cell> | ||
109 | <Cell ss:StyleID="s23"><Data ss:Type="String">Der Zugang zu diesem Grundstück wird auf die hier aufgeführten Einwohner und Gruppen beschränkt. Diese Einstellung ist nur verfügbar, wenn 'Vom Festland aus sichtbar' deaktiviert ist.</Data></Cell> | ||
110 | <Cell ss:StyleID="s23"><Data ss:Type="String">Der Zugang zu diesem Grundstück wird auf die hier aufgeführten Einwohner und Gruppen beschränkt. Diese Einstellung ist nur verfügbar, wenn 'Vom Festland aus sichtbar' deaktiviert ist.</Data></Cell> | ||
111 | </Row> | ||
112 | <Row ss:Height="204"> | ||
113 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
114 | <Cell><Data ss:Type="String">//HelpEstateVoiceChat/message</Data></Cell> | ||
115 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Parcels in this estate are allowed to have their own voice channels in which residents may hear and talk with others nearby. Default: off</Data></Cell> | ||
116 | <Cell ss:StyleID="s23"><Data ss:Type="String">Parcels in this estate are allowed to have their own voice channels in which residents may hear and talk with others nearby. Default: off</Data></Cell> | ||
117 | <Cell ss:StyleID="s23"><Data ss:Type="String">Die Parzellen auf diesem Grundstück können über eigene Voice- Channel verfügen, die es Einwohnern ermöglichen, sich mit anderen Personen in der Nähe zu unterhalten. Standard: aus</Data></Cell> | ||
118 | <Cell ss:StyleID="s23"><Data ss:Type="String">Die Parzellen auf diesem Grundstück können über eigene Voice- Channel verfügen, die es Einwohnern ermöglichen, sich mit anderen Personen in der Nähe zu unterhalten. Standard: aus</Data></Cell> | ||
119 | </Row> | ||
120 | <Row ss:Height="331.5"> | ||
121 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
122 | <Cell><Data ss:Type="String">//BadURL/message</Data></Cell> | ||
123 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life doesn't know how to handle the link: [SLURL] Most links are similar to this: secondlife://app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about Please check the spelling and try again.</Data></Cell> | ||
124 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life doesn't know how to handle the link: [SLURL] Most links are similar to this: secondlife:///app/agent/0e346d8b-4433-4d66-a6b0- fd37083abc4c/about Please check the spelling and try again.</Data></Cell> | ||
125 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life kann den folgenden Link nicht verarbeiten: [SLURL] Die meisten Links ähneln dem Folgenden: secondlife://app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about Bitte überprüfen Sie die Schreibweise und versuchen Sie es erneut.</Data></Cell> | ||
126 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life kann den folgenden Link nicht verarbeiten: [SLURL] Die meisten Links ähneln dem Folgenden: secondlife:///app/agent/0e346d8b-4433-4d66-a6b0- fd37083abc4c/about Überprüfen Sie die Schreibweise und versuchen Sie es erneut.</Data></Cell> | ||
127 | </Row> | ||
128 | <Row> | ||
129 | <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell> | ||
130 | <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/ShowDirectoryCheck</Data></Cell> | ||
131 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
132 | <Cell><Data ss:Type="String">Show in Search > Places (L$30/week) under</Data></Cell> | ||
133 | <Cell><Data ss:Type="String">Show Place in Search (L$30/week) under</Data></Cell> | ||
134 | <Cell><Data ss:Type="String">In Suchen > Orte (30 L$/Woche) zeigen unter</Data></Cell> | ||
135 | <Cell><Data ss:Type="String">Ort in Suche anzeigen (30 L$/Woche) unter</Data></Cell> | ||
136 | </Row> | ||
137 | <Row ss:Height="25.5"> | ||
138 | <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell> | ||
139 | <Cell><Data ss:Type="String">/floaterland/landtab/land_media_panel/Media texture:</Data></Cell> | ||
140 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Media texture:</Data></Cell> | ||
141 | <Cell ss:StyleID="s23"><Data ss:Type="String">Sound Settings:</Data></Cell> | ||
142 | <Cell ss:StyleID="s23"><Data ss:Type="String">Sound- Einstellungen:</Data></Cell> | ||
143 | <Cell ss:StyleID="s23"><Data ss:Type="String">Sound- Einstellungen:</Data></Cell> | ||
144 | </Row> | ||
145 | <Row> | ||
146 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
147 | <Cell><Data ss:Type="String">/directory</Data></Cell> | ||
148 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
149 | <Cell><Data ss:Type="String">Search</Data></Cell> | ||
150 | <Cell><Data ss:Type="String">Search Second Life</Data></Cell> | ||
151 | <Cell><Data ss:Type="String">Suchen</Data></Cell> | ||
152 | <Cell><Data ss:Type="String">Second Life durchsuchen</Data></Cell> | ||
153 | </Row> | ||
154 | <Row> | ||
155 | <Cell><Data ss:Type="String">floater_html_help.xml</Data></Cell> | ||
156 | <Cell><Data ss:Type="String">/htmlhelp/status_text</Data></Cell> | ||
157 | <Cell ss:Index="4"><Data ss:Type="String">Done</Data></Cell> | ||
158 | <Cell><Data ss:Type="String">Ready</Data></Cell> | ||
159 | <Cell><Data ss:Type="String">Fertig</Data></Cell> | ||
160 | <Cell><Data ss:Type="String">Bereit</Data></Cell> | ||
161 | </Row> | ||
162 | <Row> | ||
163 | <Cell><Data ss:Type="String">floater_lagmeter.xml</Data></Cell> | ||
164 | <Cell><Data ss:Type="String">/floater_lagmeter/network_ping_warning_ms</Data></Cell> | ||
165 | <Cell ss:Index="4"><Data ss:Type="Number">250</Data></Cell> | ||
166 | <Cell><Data ss:Type="Number">300</Data></Cell> | ||
167 | <Cell><Data ss:Type="Number">250</Data></Cell> | ||
168 | <Cell><Data ss:Type="Number">300</Data></Cell> | ||
169 | </Row> | ||
170 | <Row> | ||
171 | <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell> | ||
172 | <Cell><Data ss:Type="String">/land holdings floater/allowed_text</Data></Cell> | ||
173 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
174 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
175 | <Cell><Data ss:Type="String">0 Quadratmeter</Data></Cell> | ||
176 | <Cell><Data ss:Type="String">[AREA] qm</Data></Cell> | ||
177 | </Row> | ||
178 | <Row> | ||
179 | <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell> | ||
180 | <Cell><Data ss:Type="String">/land holdings floater/current_text</Data></Cell> | ||
181 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
182 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
183 | <Cell><Data ss:Type="String">0 Quadratmeter</Data></Cell> | ||
184 | <Cell><Data ss:Type="String">[AREA] qm</Data></Cell> | ||
185 | </Row> | ||
186 | <Row> | ||
187 | <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell> | ||
188 | <Cell><Data ss:Type="String">/land holdings floater/available_text</Data></Cell> | ||
189 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
190 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
191 | <Cell><Data ss:Type="String">0 Quadratmeter</Data></Cell> | ||
192 | <Cell><Data ss:Type="String">[AREA] qm</Data></Cell> | ||
193 | </Row> | ||
194 | <Row> | ||
195 | <Cell><Data ss:Type="String">floater_tools.xml</Data></Cell> | ||
196 | <Cell><Data ss:Type="String">/toolbox floater/Object Info Tabs/General/search_check</Data></Cell> | ||
197 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
198 | <Cell><Data ss:Type="String">Show in Search</Data></Cell> | ||
199 | <Cell><Data ss:Type="String">Show in search</Data></Cell> | ||
200 | <Cell><Data ss:Type="String">In Suche anzeigen</Data></Cell> | ||
201 | <Cell><Data ss:Type="String">In Suche anzeigen</Data></Cell> | ||
202 | </Row> | ||
203 | <Row> | ||
204 | <Cell><Data ss:Type="String">menu_inventory.xml</Data></Cell> | ||
205 | <Cell><Data ss:Type="String">/Popup/Teleport To Landmark</Data></Cell> | ||
206 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
207 | <Cell><Data ss:Type="String">Teleport To Landmark</Data></Cell> | ||
208 | <Cell><Data ss:Type="String">About Landmark</Data></Cell> | ||
209 | <Cell><Data ss:Type="String">Zu Landmarke teleportieren</Data></Cell> | ||
210 | <Cell><Data ss:Type="String">Landmarken-Info</Data></Cell> | ||
211 | </Row> | ||
212 | <Row> | ||
213 | <Cell><Data ss:Type="String">panel_audio_device.xml</Data></Cell> | ||
214 | <Cell><Data ss:Type="String">/device_settings/Input device (microphone):</Data></Cell> | ||
215 | <Cell ss:Index="4"><Data ss:Type="String">Audio Devices</Data></Cell> | ||
216 | <Cell><Data ss:Type="String">Input device (microphone):</Data></Cell> | ||
217 | <Cell><Data ss:Type="String">Eingangslautstärke</Data></Cell> | ||
218 | <Cell><Data ss:Type="String">Eingabegerät (Mikro):</Data></Cell> | ||
219 | </Row> | ||
220 | <Row> | ||
221 | <Cell><Data ss:Type="String">panel_audio_device.xml</Data></Cell> | ||
222 | <Cell><Data ss:Type="String">/device_settings/Input device (microphone):</Data></Cell> | ||
223 | <Cell ss:Index="4"><Data ss:Type="String">Audio Devices</Data></Cell> | ||
224 | <Cell><Data ss:Type="String">Input Level</Data></Cell> | ||
225 | <Cell><Data ss:Type="String">Eingangslautstärke</Data></Cell> | ||
226 | <Cell><Data ss:Type="String">Eingangslautstärke</Data></Cell> | ||
227 | </Row> | ||
228 | <Row> | ||
229 | <Cell><Data ss:Type="String">panel_avatar.xml</Data></Cell> | ||
230 | <Cell><Data ss:Type="String">/Panel Avatar/tab/2nd Life/allow_publish</Data></Cell> | ||
231 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
232 | <Cell><Data ss:Type="String">Show In Search</Data></Cell> | ||
233 | <Cell><Data ss:Type="String">Show in search</Data></Cell> | ||
234 | <Cell><Data ss:Type="String">In Suche anzeigen</Data></Cell> | ||
235 | <Cell><Data ss:Type="String">In Suche anzeigen</Data></Cell> | ||
236 | </Row> | ||
237 | <Row> | ||
238 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
239 | <Cell><Data ss:Type="String">/general_tab/preferences_container/show_in_group_list</Data></Cell> | ||
240 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
241 | <Cell><Data ss:Type="String">Show In Search</Data></Cell> | ||
242 | <Cell><Data ss:Type="String">Show in search</Data></Cell> | ||
243 | <Cell><Data ss:Type="String">In Suche anzeigen</Data></Cell> | ||
244 | <Cell><Data ss:Type="String">In Suche anzeigen</Data></Cell> | ||
245 | </Row> | ||
246 | <Row> | ||
247 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
248 | <Cell><Data ss:Type="String">/general_tab/preferences_container/mature</Data></Cell> | ||
249 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
250 | <Cell><Data ss:Type="String">Mature Group</Data></Cell> | ||
251 | <Cell><Data ss:Type="String">Mature group</Data></Cell> | ||
252 | <Cell><Data ss:Type="String">Ab-18-Gruppe</Data></Cell> | ||
253 | <Cell><Data ss:Type="String">Ab-18-Gruppe</Data></Cell> | ||
254 | </Row> | ||
255 | <Row> | ||
256 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
257 | <Cell><Data ss:Type="String">/general_tab/preferences_container/open_enrollement</Data></Cell> | ||
258 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
259 | <Cell><Data ss:Type="String">Open Enrollment</Data></Cell> | ||
260 | <Cell><Data ss:Type="String">Open enrollment</Data></Cell> | ||
261 | <Cell><Data ss:Type="String">Registrierung offen</Data></Cell> | ||
262 | <Cell><Data ss:Type="String">Registrierung offen</Data></Cell> | ||
263 | </Row> | ||
264 | <Row> | ||
265 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
266 | <Cell><Data ss:Type="String">/general_tab/preferences_container/check_enrollment_fee</Data></Cell> | ||
267 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
268 | <Cell><Data ss:Type="String">Enrollment Fee: L$</Data></Cell> | ||
269 | <Cell><Data ss:Type="String">Enrollment fee: L$</Data></Cell> | ||
270 | <Cell><Data ss:Type="String">Beitrittsgebühr: L$</Data></Cell> | ||
271 | <Cell><Data ss:Type="String">Beitrittsgebühr: L$</Data></Cell> | ||
272 | </Row> | ||
273 | <Row> | ||
274 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
275 | <Cell><Data ss:Type="String">/general_tab/preferences_container/receive_notices</Data></Cell> | ||
276 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
277 | <Cell><Data ss:Type="String">Receive Group Notices</Data></Cell> | ||
278 | <Cell><Data ss:Type="String">Receive group notices</Data></Cell> | ||
279 | <Cell><Data ss:Type="String">Gruppenmitteilungen erhalten</Data></Cell> | ||
280 | <Cell><Data ss:Type="String">Gruppenmitteilungen erhalten</Data></Cell> | ||
281 | </Row> | ||
282 | <Row> | ||
283 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
284 | <Cell><Data ss:Type="String">/general_tab/preferences_container/list_groups_in_profile</Data></Cell> | ||
285 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
286 | <Cell><Data ss:Type="String">List Group in Profile</Data></Cell> | ||
287 | <Cell><Data ss:Type="String">List group in my profile</Data></Cell> | ||
288 | <Cell><Data ss:Type="String">Gruppe in Profil anzeigen</Data></Cell> | ||
289 | <Cell><Data ss:Type="String">Gruppe in meinem Profil anzeigen</Data></Cell> | ||
290 | </Row> | ||
291 | <Row> | ||
292 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
293 | <Cell><Data ss:Type="String">/land_money_tab/total_contributed_land_value</Data></Cell> | ||
294 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
295 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
296 | <Cell><Data ss:Type="String">0 Quadratmeter</Data></Cell> | ||
297 | <Cell><Data ss:Type="String">[AREA] qm</Data></Cell> | ||
298 | </Row> | ||
299 | <Row> | ||
300 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
301 | <Cell><Data ss:Type="String">/land_money_tab/total_land_in_use_value</Data></Cell> | ||
302 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
303 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
304 | <Cell><Data ss:Type="String">0 Quadratmeter</Data></Cell> | ||
305 | <Cell><Data ss:Type="String">[AREA] qm</Data></Cell> | ||
306 | </Row> | ||
307 | <Row> | ||
308 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
309 | <Cell><Data ss:Type="String">/land_money_tab/land_available_value</Data></Cell> | ||
310 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
311 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
312 | <Cell><Data ss:Type="String">0 Quadratmeter</Data></Cell> | ||
313 | <Cell><Data ss:Type="String">[AREA] qm</Data></Cell> | ||
314 | </Row> | ||
315 | <Row> | ||
316 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
317 | <Cell><Data ss:Type="String">/land_money_tab/your_contribution_max_value</Data></Cell> | ||
318 | <Cell ss:Index="4"><Data ss:Type="String">([AMOUNT] max)</Data></Cell> | ||
319 | <Cell><Data ss:Type="String">sq. meters ([AMOUNT] max)</Data></Cell> | ||
320 | <Cell><Data ss:Type="String">(max. [AMOUNT])</Data></Cell> | ||
321 | <Cell><Data ss:Type="String">Quadratmeter (max. [AMOUNT])</Data></Cell> | ||
322 | </Row> | ||
323 | <Row> | ||
324 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
325 | <Cell><Data ss:Type="String">/Place/traffic_text</Data></Cell> | ||
326 | <Cell ss:Index="4"><Data ss:Type="String">Traffic: [TRAFFIC].</Data></Cell> | ||
327 | <Cell><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell> | ||
328 | <Cell><Data ss:Type="String">Traffic: [TRAFFIC].</Data></Cell> | ||
329 | <Cell><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell> | ||
330 | </Row> | ||
331 | <Row> | ||
332 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
333 | <Cell><Data ss:Type="String">/Place/area_text</Data></Cell> | ||
334 | <Cell ss:Index="4"><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell> | ||
335 | <Cell><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell> | ||
336 | <Cell><Data ss:Type="String">Gebiet: [AREA] qm</Data></Cell> | ||
337 | <Cell><Data ss:Type="String">Gebiet: [AREA] qm</Data></Cell> | ||
338 | </Row> | ||
339 | <Row> | ||
340 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
341 | <Cell><Data ss:Type="String">/Place/forsale_text</Data></Cell> | ||
342 | <Cell ss:Index="4"><Data ss:Type="String">For Sale for L$ [PRICE].</Data></Cell> | ||
343 | <Cell><Data ss:Type="String">For Sale for L$ [PRICE]</Data></Cell> | ||
344 | <Cell><Data ss:Type="String">Steht zum Verkauf für [PRICE] L$.</Data></Cell> | ||
345 | <Cell><Data ss:Type="String">Steht zum Verkauf für [PRICE] L$</Data></Cell> | ||
346 | </Row> | ||
347 | <Row> | ||
348 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
349 | <Cell><Data ss:Type="String">/Place/auction_text</Data></Cell> | ||
350 | <Cell ss:Index="4"><Data ss:Type="String">Auction ID [ID].</Data></Cell> | ||
351 | <Cell><Data ss:Type="String">Auction ID [ID].</Data></Cell> | ||
352 | <Cell><Data ss:Type="String">Auktions-ID [ID].</Data></Cell> | ||
353 | <Cell><Data ss:Type="String">Auktions-ID [ID].</Data></Cell> | ||
354 | </Row> | ||
355 | <Row> | ||
356 | <Cell><Data ss:Type="String">panel_preferences_audio.xml</Data></Cell> | ||
357 | <Cell><Data ss:Type="String">/Media panel/doppler_effect_text</Data></Cell> | ||
358 | <Cell ss:Index="4"><Data ss:Type="String">Streaming Preferences:</Data></Cell> | ||
359 | <Cell><Data ss:Type="String">Audio Preferences:</Data></Cell> | ||
360 | <Cell><Data ss:Type="String">Audio-Einstellungen:</Data></Cell> | ||
361 | <Cell><Data ss:Type="String">Audio-Einstellungen:</Data></Cell> | ||
362 | </Row> | ||
363 | <Row> | ||
364 | <Cell><Data ss:Type="String">panel_preferences_im.xml</Data></Cell> | ||
365 | <Cell><Data ss:Type="String">/im/text_box3</Data></Cell> | ||
366 | <Cell ss:Index="4"><Data ss:Type="String">Busy Mode Response:</Data></Cell> | ||
367 | <Cell><Data ss:Type="String">Logging Options:</Data></Cell> | ||
368 | <Cell><Data ss:Type="String">Protokolloptionen:</Data></Cell> | ||
369 | <Cell><Data ss:Type="String">Protokolloptionen:</Data></Cell> | ||
370 | </Row> | ||
371 | <Row> | ||
372 | <Cell><Data ss:Type="String">panel_preferences_voice.xml</Data></Cell> | ||
373 | <Cell><Data ss:Type="String">/chat/ear_location/0</Data></Cell> | ||
374 | <Cell ss:Index="4"><Data ss:Type="String">Hear Voice Chat from camera position.</Data></Cell> | ||
375 | <Cell><Data ss:Type="String">Hear Voice Chat from camera position.</Data></Cell> | ||
376 | <Cell><Data ss:Type="String">Voice-Chat von Kameraposition aus hören.</Data></Cell> | ||
377 | <Cell><Data ss:Type="String">Voice-Chat von Kameraposition aus hören.</Data></Cell> | ||
378 | </Row> | ||
379 | <Row> | ||
380 | <Cell><Data ss:Type="String">panel_preferences_voice.xml</Data></Cell> | ||
381 | <Cell><Data ss:Type="String">/chat/ear_location/1</Data></Cell> | ||
382 | <Cell ss:Index="4"><Data ss:Type="String">Hear Voice Chat from avatar position.</Data></Cell> | ||
383 | <Cell><Data ss:Type="String">Hear Voice Chat from avatar position.</Data></Cell> | ||
384 | <Cell><Data ss:Type="String">Voice-Chat von Avatarposition aus hören.</Data></Cell> | ||
385 | <Cell><Data ss:Type="String">Voice-Chat von Avatarposition aus hören.</Data></Cell> | ||
386 | </Row> | ||
387 | <Row> | ||
388 | <Cell><Data ss:Type="String">panel_region_general.xml</Data></Cell> | ||
389 | <Cell><Data ss:Type="String">/General/block_parcel_search_check</Data></Cell> | ||
390 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
391 | <Cell><Data ss:Type="String">Block Parcel Search</Data></Cell> | ||
392 | <Cell><Data ss:Type="String">Block Land Show in Search</Data></Cell> | ||
393 | <Cell><Data ss:Type="String">Parzellensuche unterbinden</Data></Cell> | ||
394 | <Cell><Data ss:Type="String">Landanzeige in Suche blockieren</Data></Cell> | ||
395 | </Row> | ||
396 | <Row> | ||
397 | <Cell><Data ss:Type="String">panel_voice_options.xml</Data></Cell> | ||
398 | <Cell><Data ss:Type="String">/content_panel/push_to_talk_check</Data></Cell> | ||
399 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
400 | <Cell><Data ss:Type="String">Only allow Friends to initiate Voice Calls with me</Data></Cell> | ||
401 | <Cell><Data ss:Type="String">Start Viewer in Push-to-Talk mode</Data></Cell> | ||
402 | <Cell><Data ss:Type="String">Viewer im &apos;Zum-Sprechen-drücken&apos;-Modus starten</Data></Cell> | ||
403 | <Cell><Data ss:Type="String">Viewer im 'Zum-Sprechen-drücken'-Modus starten</Data></Cell> | ||
404 | </Row> | ||
405 | </Table> | ||
406 | <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> | ||
407 | <Selected/> | ||
408 | <Panes> | ||
409 | <Pane> | ||
410 | <Number>3</Number> | ||
411 | <ActiveRow>2</ActiveRow> | ||
412 | <ActiveCol>4</ActiveCol> | ||
413 | <RangeSelection>R3C5:R43C5</RangeSelection> | ||
414 | </Pane> | ||
415 | </Panes> | ||
416 | <ProtectObjects>False</ProtectObjects> | ||
417 | <ProtectScenarios>False</ProtectScenarios> | ||
418 | </WorksheetOptions> | ||
419 | </Worksheet> | ||
420 | </Workbook> | ||
diff --git a/linden/indra/newview/skins/xui/de/panel_login.xml b/linden/indra/newview/skins/xui/de/panel_login.xml index afda3d5..34779a6 100644 --- a/linden/indra/newview/skins/xui/de/panel_login.xml +++ b/linden/indra/newview/skins/xui/de/panel_login.xml | |||
@@ -1,44 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | 1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> |
2 | <panel name="panel_login"> | 2 | <panel name="panel_login"> |
3 | <text name="real_url"> | 3 | <text name="real_url"> |
4 | http://secondlife.com/app/login/ | 4 | https://secondlife.com/app/login/de/?show_login_form=True |
5 | </text> | ||
6 | <text name="first_name_text"> | ||
7 | Vorname: | ||
8 | </text> | ||
9 | <text name="last_name_text"> | ||
10 | Nachname: | ||
11 | </text> | ||
12 | <text name="password_text"> | ||
13 | Kennwort: | ||
14 | </text> | ||
15 | <text name="start_location_text"> | ||
16 | Startposition: | ||
17 | </text> | ||
18 | <combo_box name="start_location_combo"> | ||
19 | <combo_item name="MyHome"> | ||
20 | Mein Heimatort | ||
21 | </combo_item> | ||
22 | <combo_item name="MyLastLocation"> | ||
23 | Mein letzter Standort | ||
24 | </combo_item> | ||
25 | <combo_item name="Typeregionname"> | ||
26 | <Region eingeben> | ||
27 | </combo_item> | ||
28 | </combo_box> | ||
29 | <check_box label="Kennwort merken" name="remember_check" /> | ||
30 | <text name="full_screen_text"> | ||
31 | Die Anzeige schaltet bei Anmeldung auf Vollbild um. | ||
32 | </text> | ||
33 | <button label="Neues Konto..." label_selected="Neues Konto..." name="new_account_btn" /> | ||
34 | <button label="Einstellungen..." label_selected="Einstellungen..." | ||
35 | name="preferences_btn" /> | ||
36 | <button label="Verbinden" label_selected="Verbinden" name="connect_btn" /> | ||
37 | <button label="Beenden" label_selected="Beenden" name="quit_btn" /> | ||
38 | <text name="version_text"> | ||
39 | 1.23.4 (5) | ||
40 | </text> | ||
41 | <text name="channel_text"> | ||
42 | [Viewer Channel Name] | ||
43 | </text> | 5 | </text> |
44 | </panel> | 6 | </panel> |
diff --git a/linden/indra/newview/skins/xui/de/panel_preferences_LCD.xml b/linden/indra/newview/skins/xui/de/panel_preferences_LCD.xml new file mode 100644 index 0000000..6438fe6 --- /dev/null +++ b/linden/indra/newview/skins/xui/de/panel_preferences_LCD.xml | |||
@@ -0,0 +1,30 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <panel label="Logitech-LCD" name="LCD Options"> | ||
3 | <text name="LCD Destination:"> | ||
4 | LCD-Ziel: | ||
5 | </text> | ||
6 | <radio_group name="LCDDestination"> | ||
7 | <radio_item name="DestinationG15" | ||
8 | tool_tip="Zeigt die Auswahl auf dem LCD der Logitech G15-Tastatur an"> | ||
9 | Logitech G15 Gaming-Tastatur | ||
10 | </radio_item> | ||
11 | <radio_item name="DestinationZ10" | ||
12 | tool_tip="Zeigt die Auswahl auf dem LCD der Logitech Z10-Lautsprecher an"> | ||
13 | Logitech Z10-Lautsprecher | ||
14 | </radio_item> | ||
15 | </radio_group> | ||
16 | <text name="LCD Display Options"> | ||
17 | LCD-Anzeigeoptionen: | ||
18 | </text> | ||
19 | <check_box label="Chat anzeigen" name="DisplayChat" | ||
20 | tool_tip="Letzte Chat-Zeile auf dem LCD anzeigen" /> | ||
21 | <check_box label="IMs anzeigen" name="DisplayIM" tool_tip="Letzte IM auf dem LCD anzeigen" /> | ||
22 | <check_box label="Standortinformationen anzeigen" name="DisplayRegion" | ||
23 | tool_tip="Informationen zum aktuellen Standort auf dem LCD anzeigen" /> | ||
24 | <check_box label="Kontodaten anzeigen" name="DisplayLinden" | ||
25 | tool_tip="Aktuelle Informationen zum Konto auf dem LCD anzeigen" /> | ||
26 | <check_box label="Netzwerkinformationen anzeigen" name="DisplayDebug" | ||
27 | tool_tip="Debug-Informationen auf dem LCD anzeigen" /> | ||
28 | <check_box label="Debug-Info von Konsole anzeigen" name="DisplayDebugConsole" | ||
29 | tool_tip="Debug-Informationen von der Konsole auf dem LCD anzeigen" /> | ||
30 | </panel> | ||
diff --git a/linden/indra/newview/skins/xui/en-us/alerts.xml b/linden/indra/newview/skins/xui/en-us/alerts.xml index 192fcdb..fdb84b9 100644 --- a/linden/indra/newview/skins/xui/en-us/alerts.xml +++ b/linden/indra/newview/skins/xui/en-us/alerts.xml | |||
@@ -51,6 +51,7 @@ | |||
51 | <message name="message"> | 51 | <message name="message"> |
52 | Unable to connect to [SECOND_LIFE]. | 52 | Unable to connect to [SECOND_LIFE]. |
53 | The system may be down. | 53 | The system may be down. |
54 | |||
54 | Please try again in a few minutes, or click Help | 55 | Please try again in a few minutes, or click Help |
55 | for advice and a link to the system status web page. | 56 | for advice and a link to the system status web page. |
56 | </message> | 57 | </message> |
@@ -115,7 +116,6 @@ Enter a brief description of the group's purpose. | |||
115 | <alert modal="true" name="CharacterSnapshotSaved"> | 116 | <alert modal="true" name="CharacterSnapshotSaved"> |
116 | <message name="message"> | 117 | <message name="message"> |
117 | A snapshot of your character has been saved. | 118 | A snapshot of your character has been saved. |
118 | |||
119 | Visit the Webpage Studio exhibit to see it. | 119 | Visit the Webpage Studio exhibit to see it. |
120 | </message> | 120 | </message> |
121 | </alert> | 121 | </alert> |
@@ -201,7 +201,6 @@ Do you want to grant modify rights for [FIRST_NAME] [LAST_NAME]? | |||
201 | <alert modal="true" name="CreateGroupCanAfford"> | 201 | <alert modal="true" name="CreateGroupCanAfford"> |
202 | <message name="message"> | 202 | <message name="message"> |
203 | Creating a group costs L$[COST]. | 203 | Creating a group costs L$[COST]. |
204 | |||
205 | To maintain the group for more than three days, | 204 | To maintain the group for more than three days, |
206 | you must reach a total of two or more members. | 205 | you must reach a total of two or more members. |
207 | 206 | ||
@@ -307,8 +306,8 @@ Add this Ability to '[ROLE_NAME]'? | |||
307 | Selecting the "Publish on the Web" option allows us to publish | 306 | Selecting the "Publish on the Web" option allows us to publish |
308 | the group name, insignia, charter, titles, and founder on the | 307 | the group name, insignia, charter, titles, and founder on the |
309 | [SECOND_LIFE] website. You are responsible for indicating if any | 308 | [SECOND_LIFE] website. You are responsible for indicating if any |
310 | of the above content is considered Mature according to the | 309 | of the above content is considered inappropriate for a minor |
311 | Community Standards. | 310 | according to the Community Standards. |
312 | </message> | 311 | </message> |
313 | </alert> | 312 | </alert> |
314 | <alert modal="true" name="ClickPublishHelpLand"> | 313 | <alert modal="true" name="ClickPublishHelpLand"> |
@@ -331,8 +330,8 @@ region that forbids this. | |||
331 | Selecting the "Publish on the Web" option allows us to publish | 330 | Selecting the "Publish on the Web" option allows us to publish |
332 | the photographer's [SECOND_LIFE] name, subject line, location, message and | 331 | the photographer's [SECOND_LIFE] name, subject line, location, message and |
333 | snapshot on the [SECOND_LIFE] website. You are responsible for indicating if any | 332 | snapshot on the [SECOND_LIFE] website. You are responsible for indicating if any |
334 | of the above content for each snapshot is considered Mature according to the | 333 | of the above content for each snapshot is considered inappropriate for a minor |
335 | Community Standards. | 334 | according to the Community Standards. |
336 | </message> | 335 | </message> |
337 | </alert> | 336 | </alert> |
338 | <alert modal="true" name="ClickPublishHelpAvatar"> | 337 | <alert modal="true" name="ClickPublishHelpAvatar"> |
@@ -474,7 +473,6 @@ Please select an individual to sell to if selling for L$0. | |||
474 | <message name="message"> | 473 | <message name="message"> |
475 | The selected [LAND_SIZE] m2 land is being set for sale. | 474 | The selected [LAND_SIZE] m2 land is being set for sale. |
476 | Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME]. | 475 | Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME]. |
477 | |||
478 | </message> | 476 | </message> |
479 | <option name="Continue"> | 477 | <option name="Continue"> |
480 | OK | 478 | OK |
@@ -692,7 +690,6 @@ The outfit folder contains no clothing, body parts, or attachments. | |||
692 | <alert modal="true" name="MustHaveAccountToLogIn"> | 690 | <alert modal="true" name="MustHaveAccountToLogIn"> |
693 | <message name="message"> | 691 | <message name="message"> |
694 | You must have an account to connect to [SECOND_LIFE]. | 692 | You must have an account to connect to [SECOND_LIFE]. |
695 | |||
696 | Go to www.secondlife.com to create an account? | 693 | Go to www.secondlife.com to create an account? |
697 | </message> | 694 | </message> |
698 | <option name="OK"> | 695 | <option name="OK"> |
@@ -706,10 +703,8 @@ Go to www.secondlife.com to create an account? | |||
706 | <message name="message"> | 703 | <message name="message"> |
707 | Classified ads appear in the 'Classified' section of the | 704 | Classified ads appear in the 'Classified' section of the |
708 | Search directory and on www.secondlife.com for one week. | 705 | Search directory and on www.secondlife.com for one week. |
709 | |||
710 | Fill out your ad, then click 'Publish...' to add it to the | 706 | Fill out your ad, then click 'Publish...' to add it to the |
711 | directory. | 707 | directory. |
712 | |||
713 | You'll be asked for a price to pay when clicking Publish. | 708 | You'll be asked for a price to pay when clicking Publish. |
714 | Paying more makes your ad appear higher in the list, and | 709 | Paying more makes your ad appear higher in the list, and |
715 | also appear higher when people search for keywords. | 710 | also appear higher when people search for keywords. |
@@ -766,8 +761,8 @@ There is no reimbursement for fees paid. | |||
766 | Some of the display changes that you have made | 761 | Some of the display changes that you have made |
767 | require [SECOND_LIFE] to shut down immediately, | 762 | require [SECOND_LIFE] to shut down immediately, |
768 | which will cause you to lose any work in progress. | 763 | which will cause you to lose any work in progress. |
769 | 764 | ||
770 | Apply those changes and quit | 765 | Apply those changes and quit? |
771 | </message> | 766 | </message> |
772 | <option name="ApplyandQuit"> | 767 | <option name="ApplyandQuit"> |
773 | Apply and Quit | 768 | Apply and Quit |
@@ -1007,7 +1002,6 @@ Could not request domain name: [HOST] | |||
1007 | Unable to find the server domain name. | 1002 | Unable to find the server domain name. |
1008 | This could be the result of a lost network connection | 1003 | This could be the result of a lost network connection |
1009 | or a server problem. | 1004 | or a server problem. |
1010 | |||
1011 | Please try again in a few minutes, or click Help | 1005 | Please try again in a few minutes, or click Help |
1012 | for advice and a link to the system status web page. | 1006 | for advice and a link to the system status web page. |
1013 | </message> | 1007 | </message> |
@@ -1028,6 +1022,7 @@ Unable to connect to [SERVER] | |||
1028 | <message name="message"> | 1022 | <message name="message"> |
1029 | Unable to connect to [SECOND_LIFE]. | 1023 | Unable to connect to [SECOND_LIFE]. |
1030 | DNS could not resolve the host name. | 1024 | DNS could not resolve the host name. |
1025 | |||
1031 | Please verify that you can connect to the www.secondlife.com | 1026 | Please verify that you can connect to the www.secondlife.com |
1032 | web site. If you can, but continue to receive this error, | 1027 | web site. If you can, but continue to receive this error, |
1033 | please go to www.secondlife.com/support and report this problem. | 1028 | please go to www.secondlife.com/support and report this problem. |
@@ -1037,8 +1032,8 @@ please go to www.secondlife.com/support and report this problem. | |||
1037 | <message name="message"> | 1032 | <message name="message"> |
1038 | Unable to establish a secure connection to the login server. | 1033 | Unable to establish a secure connection to the login server. |
1039 | Often this means that your computer's clock is set incorrectly. | 1034 | Often this means that your computer's clock is set incorrectly. |
1035 | |||
1040 | Please ensure the time and date are set correctly. | 1036 | Please ensure the time and date are set correctly. |
1041 | |||
1042 | If you continue to receive this error, please go | 1037 | If you continue to receive this error, please go |
1043 | to www.secondlife.com/support | 1038 | to www.secondlife.com/support |
1044 | and report the problem. | 1039 | and report the problem. |
@@ -1048,6 +1043,7 @@ and report the problem. | |||
1048 | <message name="message"> | 1043 | <message name="message"> |
1049 | Unable to connect to [SECOND_LIFE]. | 1044 | Unable to connect to [SECOND_LIFE]. |
1050 | The login server couldn't verify itself via SSL. | 1045 | The login server couldn't verify itself via SSL. |
1046 | |||
1051 | If you continue to receive this error, please go | 1047 | If you continue to receive this error, please go |
1052 | to www.secondlife.com/support | 1048 | to www.secondlife.com/support |
1053 | and report the problem. | 1049 | and report the problem. |
@@ -1057,6 +1053,7 @@ and report the problem. | |||
1057 | <message name="message"> | 1053 | <message name="message"> |
1058 | Unable to connect to [SECOND_LIFE]. | 1054 | Unable to connect to [SECOND_LIFE]. |
1059 | Despite our best efforts, something unexpected has gone wrong. | 1055 | Despite our best efforts, something unexpected has gone wrong. |
1056 | |||
1060 | Please go to www.secondlife.com/support | 1057 | Please go to www.secondlife.com/support |
1061 | and report the problem. If possible, include your SecondLife.log | 1058 | and report the problem. If possible, include your SecondLife.log |
1062 | file from: C:\Documents and Settings\(name)\Application Data\SecondLife\logs | 1059 | file from: C:\Documents and Settings\(name)\Application Data\SecondLife\logs |
@@ -1067,6 +1064,7 @@ Thank you. | |||
1067 | <message name="message"> | 1064 | <message name="message"> |
1068 | Unable to connect to [SECOND_LIFE]. | 1065 | Unable to connect to [SECOND_LIFE]. |
1069 | Despite our best efforts, something unexpected has gone wrong. | 1066 | Despite our best efforts, something unexpected has gone wrong. |
1067 | |||
1070 | Please go to www.secondlife.com/support | 1068 | Please go to www.secondlife.com/support |
1071 | and report the problem. If possible, include your SecondLife.log | 1069 | and report the problem. If possible, include your SecondLife.log |
1072 | file from: ~/Library/Application Support/SecondLife/logs | 1070 | file from: ~/Library/Application Support/SecondLife/logs |
@@ -1076,15 +1074,16 @@ Thank you. | |||
1076 | <alert modal="true" name="CannotResolveLoginToken"> | 1074 | <alert modal="true" name="CannotResolveLoginToken"> |
1077 | <message name="message"> | 1075 | <message name="message"> |
1078 | There was a problem resolving your login | 1076 | There was a problem resolving your login |
1079 | authentication token. Please try logging in | 1077 | authentication token. Please try logging in again. |
1080 | again. If you continue to receive this error, | 1078 | |
1079 | If you continue to receive this error, | ||
1081 | please go to www.secondlife.com/support. | 1080 | please go to www.secondlife.com/support. |
1082 | </message> | 1081 | </message> |
1083 | </alert> | 1082 | </alert> |
1084 | <alert modal="true" name="CannotConnectNoMessage"> | 1083 | <alert modal="true" name="CannotConnectNoMessage"> |
1085 | <message name="message"> | 1084 | <message name="message"> |
1086 | Unknown problem trying to connect. | 1085 | Unknown problem trying to connect. |
1087 | 1086 | ||
1088 | Please try again in a few minutes, or click Help | 1087 | Please try again in a few minutes, or click Help |
1089 | for advice and a link to the system status web page. | 1088 | for advice and a link to the system status web page. |
1090 | </message> | 1089 | </message> |
@@ -1117,10 +1116,9 @@ for advice and a link to the system status web page. | |||
1117 | <alert modal="true" name="FirstRunDialog"> | 1116 | <alert modal="true" name="FirstRunDialog"> |
1118 | <message name="message"> | 1117 | <message name="message"> |
1119 | [SECOND_LIFE] installation is complete. | 1118 | [SECOND_LIFE] installation is complete. |
1120 | 1119 | ||
1121 | If this is your first time using [SECOND_LIFE], you will need to create | 1120 | If this is your first time using [SECOND_LIFE], you will need to create |
1122 | an account before you can log on. | 1121 | an account before you can log on. |
1123 | |||
1124 | Return to www.secondlife.com to create a new account? | 1122 | Return to www.secondlife.com to create a new account? |
1125 | </message> | 1123 | </message> |
1126 | <option name="NewAccount..."> | 1124 | <option name="NewAccount..."> |
@@ -1141,6 +1139,7 @@ will see you correctly. | |||
1141 | <message name="message"> | 1139 | <message name="message"> |
1142 | Unable to connect to server. | 1140 | Unable to connect to server. |
1143 | Could not resolve domain name: [DOMAIN] | 1141 | Could not resolve domain name: [DOMAIN] |
1142 | |||
1144 | Please check your network connection. | 1143 | Please check your network connection. |
1145 | </message> | 1144 | </message> |
1146 | </alert> | 1145 | </alert> |
@@ -1162,9 +1161,8 @@ for advice and a link to the system status web page. | |||
1162 | <alert modal="true" name="WelcomeToSecondLife"> | 1161 | <alert modal="true" name="WelcomeToSecondLife"> |
1163 | <message name="message"> | 1162 | <message name="message"> |
1164 | Welcome to [SECOND_LIFE]! | 1163 | Welcome to [SECOND_LIFE]! |
1165 | 1164 | ||
1166 | Use arrow keys to walk. | 1165 | Use arrow keys to walk. |
1167 | |||
1168 | Please choose the male or female avatar. | 1166 | Please choose the male or female avatar. |
1169 | You can change your mind later. | 1167 | You can change your mind later. |
1170 | </message> | 1168 | </message> |
@@ -1177,10 +1175,9 @@ You can change your mind later. | |||
1177 | </alert> | 1175 | </alert> |
1178 | <alert modal="true" name="WelcomeToSecondLifeSimple"> | 1176 | <alert modal="true" name="WelcomeToSecondLifeSimple"> |
1179 | <message name="message"> | 1177 | <message name="message"> |
1180 | Welcome to [SECOND_LIFE]! | 1178 | Welcome to [SECOND_LIFE]! |
1181 | 1179 | ||
1182 | Use arrow keys to walk. | 1180 | Use arrow keys to walk. |
1183 | |||
1184 | Please choose the male or female avatar. | 1181 | Please choose the male or female avatar. |
1185 | </message> | 1182 | </message> |
1186 | <option name="Male"> | 1183 | <option name="Male"> |
@@ -1316,8 +1313,7 @@ Are you sure you want to take these itmes? | |||
1316 | <alert modal="true" name="PromptGoToCurrencyPage"> | 1313 | <alert modal="true" name="PromptGoToCurrencyPage"> |
1317 | <message name="message"> | 1314 | <message name="message"> |
1318 | [EXTRA] | 1315 | [EXTRA] |
1319 | 1316 | ||
1320 | |||
1321 | Go to [URL] for information on purchasing currency? | 1317 | Go to [URL] for information on purchasing currency? |
1322 | </message> | 1318 | </message> |
1323 | <option name="GotoPage"> | 1319 | <option name="GotoPage"> |
@@ -1342,20 +1338,24 @@ select more than one object. | |||
1342 | <alert modal="true" name="CannotLinkModify"> | 1338 | <alert modal="true" name="CannotLinkModify"> |
1343 | <message name="message"> | 1339 | <message name="message"> |
1344 | Unable to link because you don't have modify permission | 1340 | Unable to link because you don't have modify permission |
1345 | on all the objects. Make sure none are locked, and that | 1341 | on all the objects. |
1346 | you own all of them. | 1342 | |
1343 | Please make sure none are locked, and that you own all of them. | ||
1347 | </message> | 1344 | </message> |
1348 | </alert> | 1345 | </alert> |
1349 | <alert modal="true" name="CannotLinkDifferentOwners"> | 1346 | <alert modal="true" name="CannotLinkDifferentOwners"> |
1350 | <message name="message"> | 1347 | <message name="message"> |
1351 | Unable to link because not all of the objects have the | 1348 | Unable to link because not all of the objects have the |
1352 | same owner. Make sure you own all of the selected objects. | 1349 | same owner. |
1350 | |||
1351 | Please make sure you own all of the selected objects. | ||
1353 | </message> | 1352 | </message> |
1354 | </alert> | 1353 | </alert> |
1355 | <alert modal="true" name="NoFileExtension"> | 1354 | <alert modal="true" name="NoFileExtension"> |
1356 | <message name="message"> | 1355 | <message name="message"> |
1357 | No file extension for the file: '[FILE]' | 1356 | No file extension for the file: '[FILE]' |
1358 | Please make sure the file has a correct file extension | 1357 | |
1358 | Please make sure the file has a correct file extension. | ||
1359 | </message> | 1359 | </message> |
1360 | </alert> | 1360 | </alert> |
1361 | <alert modal="true" name="InvalidFileExtension"> | 1361 | <alert modal="true" name="InvalidFileExtension"> |
@@ -1488,6 +1488,7 @@ Select an object with a script. | |||
1488 | <alert modal="true" name="CannotRecompileSelectObjectsNoPermission"> | 1488 | <alert modal="true" name="CannotRecompileSelectObjectsNoPermission"> |
1489 | <message name="message"> | 1489 | <message name="message"> |
1490 | Not able to perform 'recompilation'. | 1490 | Not able to perform 'recompilation'. |
1491 | |||
1491 | Select objects with scripts that you | 1492 | Select objects with scripts that you |
1492 | have permission to modify. | 1493 | have permission to modify. |
1493 | </message> | 1494 | </message> |
@@ -1495,12 +1496,14 @@ have permission to modify. | |||
1495 | <alert modal="true" name="CannotResetSelectObjectsNoScripts"> | 1496 | <alert modal="true" name="CannotResetSelectObjectsNoScripts"> |
1496 | <message name="message"> | 1497 | <message name="message"> |
1497 | Not able to perform 'reset'. | 1498 | Not able to perform 'reset'. |
1499 | |||
1498 | Select objects with scripts. | 1500 | Select objects with scripts. |
1499 | </message> | 1501 | </message> |
1500 | </alert> | 1502 | </alert> |
1501 | <alert modal="true" name="CannotResetSelectObjectsNoPermission"> | 1503 | <alert modal="true" name="CannotResetSelectObjectsNoPermission"> |
1502 | <message name="message"> | 1504 | <message name="message"> |
1503 | Not able to perform 'reset'. | 1505 | Not able to perform 'reset'. |
1506 | |||
1504 | Select objects with scripts that you | 1507 | Select objects with scripts that you |
1505 | have permission to modify. | 1508 | have permission to modify. |
1506 | </message> | 1509 | </message> |
@@ -1508,12 +1511,14 @@ have permission to modify. | |||
1508 | <alert modal="true" name="CannotSetRunningSelectObjectsNoScripts"> | 1511 | <alert modal="true" name="CannotSetRunningSelectObjectsNoScripts"> |
1509 | <message name="message"> | 1512 | <message name="message"> |
1510 | Not able to set any scripts to 'running'. | 1513 | Not able to set any scripts to 'running'. |
1514 | |||
1511 | Select objects with scripts. | 1515 | Select objects with scripts. |
1512 | </message> | 1516 | </message> |
1513 | </alert> | 1517 | </alert> |
1514 | <alert modal="true" name="CannotSetRunningSelectObjectsNoPermission"> | 1518 | <alert modal="true" name="CannotSetRunningSelectObjectsNoPermission"> |
1515 | <message name="message"> | 1519 | <message name="message"> |
1516 | Not able to set any scripts to 'running'. | 1520 | Not able to set any scripts to 'running'. |
1521 | |||
1517 | Select objects with scripts that you | 1522 | Select objects with scripts that you |
1518 | have permission to modify. | 1523 | have permission to modify. |
1519 | </message> | 1524 | </message> |
@@ -1521,12 +1526,14 @@ have permission to modify. | |||
1521 | <alert modal="true" name="CannotSetRunningNotSelectObjectsNoScripts"> | 1526 | <alert modal="true" name="CannotSetRunningNotSelectObjectsNoScripts"> |
1522 | <message name="message"> | 1527 | <message name="message"> |
1523 | Unable to set any scripts to 'not running'. | 1528 | Unable to set any scripts to 'not running'. |
1529 | |||
1524 | Select objects with scripts. | 1530 | Select objects with scripts. |
1525 | </message> | 1531 | </message> |
1526 | </alert> | 1532 | </alert> |
1527 | <alert modal="true" name="CannotSetRunningNotSelectObjectsNoPermission"> | 1533 | <alert modal="true" name="CannotSetRunningNotSelectObjectsNoPermission"> |
1528 | <message name="message"> | 1534 | <message name="message"> |
1529 | Unable to set any scripts to 'not running'. | 1535 | Unable to set any scripts to 'not running'. |
1536 | |||
1530 | Select objects with scripts that you | 1537 | Select objects with scripts that you |
1531 | have permission to modify. | 1538 | have permission to modify. |
1532 | </message> | 1539 | </message> |
@@ -1661,6 +1668,7 @@ No parcel selected. | |||
1661 | <alert modal="true" name="CannotBuyLandMultipleRegions"> | 1668 | <alert modal="true" name="CannotBuyLandMultipleRegions"> |
1662 | <message name="message"> | 1669 | <message name="message"> |
1663 | Unable to buy land because selection spans multiple regions. | 1670 | Unable to buy land because selection spans multiple regions. |
1671 | |||
1664 | Please select a smaller area and try again. | 1672 | Please select a smaller area and try again. |
1665 | </message> | 1673 | </message> |
1666 | </alert> | 1674 | </alert> |
@@ -1668,6 +1676,7 @@ Please select a smaller area and try again. | |||
1668 | <message name="message"> | 1676 | <message name="message"> |
1669 | Unable to buy land: | 1677 | Unable to buy land: |
1670 | Multiple parcels selected. | 1678 | Multiple parcels selected. |
1679 | |||
1671 | Try selecting a single parcel. | 1680 | Try selecting a single parcel. |
1672 | </message> | 1681 | </message> |
1673 | </alert> | 1682 | </alert> |
@@ -1675,6 +1684,7 @@ Try selecting a single parcel. | |||
1675 | <message name="message"> | 1684 | <message name="message"> |
1676 | Unable to deed land: | 1685 | Unable to deed land: |
1677 | Multiple parcels selected. | 1686 | Multiple parcels selected. |
1687 | |||
1678 | Try selecting a single parcel. | 1688 | Try selecting a single parcel. |
1679 | </message> | 1689 | </message> |
1680 | </alert> | 1690 | </alert> |
@@ -1686,10 +1696,9 @@ Try selecting a single parcel. | |||
1686 | <alert modal="true" name="ParcelCanPlayMusic"> | 1696 | <alert modal="true" name="ParcelCanPlayMusic"> |
1687 | <message name="message"> | 1697 | <message name="message"> |
1688 | This location can play streaming music. | 1698 | This location can play streaming music. |
1689 | |||
1690 | Music requires a 768 kbps or faster | 1699 | Music requires a 768 kbps or faster |
1691 | Internet connection. | 1700 | Internet connection. |
1692 | 1701 | ||
1693 | Play music when available? | 1702 | Play music when available? |
1694 | </message> | 1703 | </message> |
1695 | <option name="PlayMusic"> | 1704 | <option name="PlayMusic"> |
@@ -1702,12 +1711,10 @@ Play music when available? | |||
1702 | <alert modal="true" name="ParcelCanPlayMedia"> | 1711 | <alert modal="true" name="ParcelCanPlayMedia"> |
1703 | <message name="message"> | 1712 | <message name="message"> |
1704 | This location can play streaming video. | 1713 | This location can play streaming video. |
1705 | |||
1706 | Streaming video requires a 768 kbps or | 1714 | Streaming video requires a 768 kbps or |
1707 | faster Internet connection. | 1715 | faster Internet connection. |
1708 | 1716 | ||
1709 | Play streaming video when available? | 1717 | Play streaming video when available? |
1710 | |||
1711 | (You can change this option later under | 1718 | (You can change this option later under |
1712 | Preferences > Audio & Video.) | 1719 | Preferences > Audio & Video.) |
1713 | </message> | 1720 | </message> |
@@ -1722,6 +1729,7 @@ Preferences > Audio & Video.) | |||
1722 | <message name="message"> | 1729 | <message name="message"> |
1723 | Unable to buy land: | 1730 | Unable to buy land: |
1724 | Waiting for server to report cost. | 1731 | Waiting for server to report cost. |
1732 | |||
1725 | Please try again. | 1733 | Please try again. |
1726 | </message> | 1734 | </message> |
1727 | </alert> | 1735 | </alert> |
@@ -1729,6 +1737,7 @@ Please try again. | |||
1729 | <message name="message"> | 1737 | <message name="message"> |
1730 | Unable to deed land: | 1738 | Unable to deed land: |
1731 | Waiting for server to report ownership. | 1739 | Waiting for server to report ownership. |
1740 | |||
1732 | Please try again. | 1741 | Please try again. |
1733 | </message> | 1742 | </message> |
1734 | </alert> | 1743 | </alert> |
@@ -1749,6 +1758,7 @@ by another Resident. | |||
1749 | <message name="message"> | 1758 | <message name="message"> |
1750 | Unable to buy land: | 1759 | Unable to buy land: |
1751 | Cannot find the region this land is in. | 1760 | Cannot find the region this land is in. |
1761 | |||
1752 | Please use Tools -> Report Bug to report this. | 1762 | Please use Tools -> Report Bug to report this. |
1753 | </message> | 1763 | </message> |
1754 | </alert> | 1764 | </alert> |
@@ -1768,6 +1778,7 @@ The region [REGION] does not allow transfer of land. | |||
1768 | <message name="message"> | 1778 | <message name="message"> |
1769 | Unable to buy land for the group: | 1779 | Unable to buy land for the group: |
1770 | You are not an officer in your current group. | 1780 | You are not an officer in your current group. |
1781 | |||
1771 | Please activate another group using Edit -> Groups... | 1782 | Please activate another group using Edit -> Groups... |
1772 | </message> | 1783 | </message> |
1773 | </alert> | 1784 | </alert> |
@@ -1787,6 +1798,7 @@ No parcel selected. | |||
1787 | <message name="message"> | 1798 | <message name="message"> |
1788 | Unable to abandon land: | 1799 | Unable to abandon land: |
1789 | Waiting for server to update parcel information. | 1800 | Waiting for server to update parcel information. |
1801 | |||
1790 | Try again in a few seconds. | 1802 | Try again in a few seconds. |
1791 | </message> | 1803 | </message> |
1792 | </alert> | 1804 | </alert> |
@@ -1794,6 +1806,7 @@ Try again in a few seconds. | |||
1794 | <message name="message"> | 1806 | <message name="message"> |
1795 | Unable to abandon land: | 1807 | Unable to abandon land: |
1796 | You do not own all the parcels selected. | 1808 | You do not own all the parcels selected. |
1809 | |||
1797 | Please select a single parcel. | 1810 | Please select a single parcel. |
1798 | </message> | 1811 | </message> |
1799 | </alert> | 1812 | </alert> |
@@ -1808,6 +1821,7 @@ Parcels you own appear in green. | |||
1808 | <message name="message"> | 1821 | <message name="message"> |
1809 | Unable to abandon land: | 1822 | Unable to abandon land: |
1810 | Cannot find the region this land is in. | 1823 | Cannot find the region this land is in. |
1824 | |||
1811 | Please use Tools -> Report Bug to report this. | 1825 | Please use Tools -> Report Bug to report this. |
1812 | </message> | 1826 | </message> |
1813 | </alert> | 1827 | </alert> |
@@ -1821,6 +1835,7 @@ The region [REGION] does not allow transfer of land. | |||
1821 | <message name="message"> | 1835 | <message name="message"> |
1822 | Unable to abandon land: | 1836 | Unable to abandon land: |
1823 | You must select an entire parcel to release it. | 1837 | You must select an entire parcel to release it. |
1838 | |||
1824 | Select an entire parcel, or divide your parcel first. | 1839 | Select an entire parcel, or divide your parcel first. |
1825 | </message> | 1840 | </message> |
1826 | </alert> | 1841 | </alert> |
@@ -1829,7 +1844,7 @@ Select an entire parcel, or divide your parcel first. | |||
1829 | You are about to release [AREA] m2 of land. | 1844 | You are about to release [AREA] m2 of land. |
1830 | Releasing this parcel will remove it from your land | 1845 | Releasing this parcel will remove it from your land |
1831 | holdings, but will not grant any L$. | 1846 | holdings, but will not grant any L$. |
1832 | 1847 | ||
1833 | Release this land? | 1848 | Release this land? |
1834 | </message> | 1849 | </message> |
1835 | <option name="Release"> | 1850 | <option name="Release"> |
@@ -1842,12 +1857,14 @@ Release this land? | |||
1842 | <alert modal="true" name="CannotDivideLandNothingSelected"> | 1857 | <alert modal="true" name="CannotDivideLandNothingSelected"> |
1843 | <message name="message"> | 1858 | <message name="message"> |
1844 | Unable to divide land: | 1859 | Unable to divide land: |
1860 | |||
1845 | No parcels selected. | 1861 | No parcels selected. |
1846 | </message> | 1862 | </message> |
1847 | </alert> | 1863 | </alert> |
1848 | <alert modal="true" name="CannotDivideLandPartialSelection"> | 1864 | <alert modal="true" name="CannotDivideLandPartialSelection"> |
1849 | <message name="message"> | 1865 | <message name="message"> |
1850 | Unable to divide land: | 1866 | Unable to divide land: |
1867 | |||
1851 | You have an entire parcel selected. | 1868 | You have an entire parcel selected. |
1852 | Try selecting a part of the parcel. | 1869 | Try selecting a part of the parcel. |
1853 | </message> | 1870 | </message> |
@@ -1871,6 +1888,7 @@ Divide land? | |||
1871 | <message name="message"> | 1888 | <message name="message"> |
1872 | Unable to divide land: | 1889 | Unable to divide land: |
1873 | Cannot find the region this land is in. | 1890 | Cannot find the region this land is in. |
1891 | |||
1874 | Please use Tools -> Report Bug to report this. | 1892 | Please use Tools -> Report Bug to report this. |
1875 | </message> | 1893 | </message> |
1876 | </alert> | 1894 | </alert> |
@@ -1878,6 +1896,7 @@ Please use Tools -> Report Bug to report this. | |||
1878 | <message name="message"> | 1896 | <message name="message"> |
1879 | Unable to join land: | 1897 | Unable to join land: |
1880 | Cannot find the region this land is in. | 1898 | Cannot find the region this land is in. |
1899 | |||
1881 | Please use Tools -> Report Bug to report this. | 1900 | Please use Tools -> Report Bug to report this. |
1882 | </message> | 1901 | </message> |
1883 | </alert> | 1902 | </alert> |
@@ -1891,6 +1910,7 @@ No parcels selected. | |||
1891 | <message name="message"> | 1910 | <message name="message"> |
1892 | Unable to join land: | 1911 | Unable to join land: |
1893 | You only have one parcel selected. | 1912 | You only have one parcel selected. |
1913 | |||
1894 | Select land across both parcels. | 1914 | Select land across both parcels. |
1895 | </message> | 1915 | </message> |
1896 | </alert> | 1916 | </alert> |
@@ -1898,6 +1918,7 @@ Select land across both parcels. | |||
1898 | <message name="message"> | 1918 | <message name="message"> |
1899 | Unable to join land: | 1919 | Unable to join land: |
1900 | You must select more than one parcel. | 1920 | You must select more than one parcel. |
1921 | |||
1901 | Select land across both parcels. | 1922 | Select land across both parcels. |
1902 | </message> | 1923 | </message> |
1903 | </alert> | 1924 | </alert> |
@@ -1905,9 +1926,8 @@ Select land across both parcels. | |||
1905 | <message name="message"> | 1926 | <message name="message"> |
1906 | Joining this land will create one large parcel | 1927 | Joining this land will create one large parcel |
1907 | out of all parcels intersecting the selected rectangle. | 1928 | out of all parcels intersecting the selected rectangle. |
1908 | |||
1909 | You will need to reset the name and options of the | 1929 | You will need to reset the name and options of the |
1910 | new parcel. | 1930 | new parcel. |
1911 | 1931 | ||
1912 | Join land? | 1932 | Join land? |
1913 | </message> | 1933 | </message> |
@@ -1978,7 +1998,9 @@ save the wearable again. | |||
1978 | Unable to save [NAME] to central asset store. | 1998 | Unable to save [NAME] to central asset store. |
1979 | This is usually a temporary failure. Please | 1999 | This is usually a temporary failure. Please |
1980 | customize and save the wearable again in a | 2000 | customize and save the wearable again in a |
1981 | few minutes. If this problem persists, please | 2001 | few minutes. |
2002 | |||
2003 | If this problem persists, please | ||
1982 | click on the 'Tools | Report Bug' pull down menu | 2004 | click on the 'Tools | Report Bug' pull down menu |
1983 | and provide details about your network setup. | 2005 | and provide details about your network setup. |
1984 | </message> | 2006 | </message> |
@@ -1987,8 +2009,9 @@ and provide details about your network setup. | |||
1987 | <message name="message"> | 2009 | <message name="message"> |
1988 | [MESSAGE] | 2010 | [MESSAGE] |
1989 | 2011 | ||
1990 | We are unable to recover from this problem. Please | 2012 | We are unable to recover from this problem. |
1991 | uninstall and reinstall before trying again. If this | 2013 | |
2014 | Please uninstall and reinstall before trying again. If this | ||
1992 | problem persists, check the Tech Support FAQ at: | 2015 | problem persists, check the Tech Support FAQ at: |
1993 | www.secondlife.com/support. | 2016 | www.secondlife.com/support. |
1994 | </message> | 2017 | </message> |
@@ -1999,9 +2022,8 @@ www.secondlife.com/support. | |||
1999 | <alert modal="true" name="YouHaveBeenLoggedOut"> | 2022 | <alert modal="true" name="YouHaveBeenLoggedOut"> |
2000 | <message name="message"> | 2023 | <message name="message"> |
2001 | You have been logged out of [SECOND_LIFE]: | 2024 | You have been logged out of [SECOND_LIFE]: |
2002 | |||
2003 | [MESSAGE] | 2025 | [MESSAGE] |
2004 | 2026 | ||
2005 | Click Continue to look at existing IM and chat. | 2027 | Click Continue to look at existing IM and chat. |
2006 | You will not be able to perform any other operations. | 2028 | You will not be able to perform any other operations. |
2007 | Click Quit to exit [SECOND_LIFE] immediately. | 2029 | Click Quit to exit [SECOND_LIFE] immediately. |
@@ -2024,7 +2046,7 @@ You do not have permission to buy land for your active group. | |||
2024 | Friends can give permissions to | 2046 | Friends can give permissions to |
2025 | track each other on the map and | 2047 | track each other on the map and |
2026 | receive online status updates. | 2048 | receive online status updates. |
2027 | 2049 | ||
2028 | Offer friendship to [NAME]? | 2050 | Offer friendship to [NAME]? |
2029 | </message> | 2051 | </message> |
2030 | <option name="Offer"> | 2052 | <option name="Offer"> |
@@ -2059,9 +2081,7 @@ Offer friendship to [NAME]? | |||
2059 | <alert modal="true" name="GodDeleteAllScriptedPublicObjectsByUser"> | 2081 | <alert modal="true" name="GodDeleteAllScriptedPublicObjectsByUser"> |
2060 | <message name="message"> | 2082 | <message name="message"> |
2061 | Are you sure you want to delete all scripted objects owned by | 2083 | Are you sure you want to delete all scripted objects owned by |
2062 | |||
2063 | ** [AVATAR_NAME] ** | 2084 | ** [AVATAR_NAME] ** |
2064 | |||
2065 | on all others land in this sim? | 2085 | on all others land in this sim? |
2066 | </message> | 2086 | </message> |
2067 | <option name="DELETE!!"> | 2087 | <option name="DELETE!!"> |
@@ -2074,9 +2094,7 @@ on all others land in this sim? | |||
2074 | <alert modal="true" name="GodDeleteAllScriptedObjectsByUser"> | 2094 | <alert modal="true" name="GodDeleteAllScriptedObjectsByUser"> |
2075 | <message name="message"> | 2095 | <message name="message"> |
2076 | Are you sure you want to DELETE ALL scripted objects owned by | 2096 | Are you sure you want to DELETE ALL scripted objects owned by |
2077 | |||
2078 | ** [AVATAR_NAME] ** | 2097 | ** [AVATAR_NAME] ** |
2079 | |||
2080 | on ALL LAND in this sim? | 2098 | on ALL LAND in this sim? |
2081 | </message> | 2099 | </message> |
2082 | <option name="!!DELETEALL!!"> | 2100 | <option name="!!DELETEALL!!"> |
@@ -2090,9 +2108,7 @@ on ALL LAND in this sim? | |||
2090 | <message name="message"> | 2108 | <message name="message"> |
2091 | Are you sure you want to DELETE ALL objects (scripted or not) | 2109 | Are you sure you want to DELETE ALL objects (scripted or not) |
2092 | owned by | 2110 | owned by |
2093 | |||
2094 | ** [AVATAR_NAME] ** | 2111 | ** [AVATAR_NAME] ** |
2095 | |||
2096 | on ALL LAND in this sim? | 2112 | on ALL LAND in this sim? |
2097 | </message> | 2113 | </message> |
2098 | <option name="!!DELETEALL!!"> | 2114 | <option name="!!DELETEALL!!"> |
@@ -2266,6 +2282,7 @@ If you continue, next owner permissions will be | |||
2266 | applied and possibly restrict your | 2282 | applied and possibly restrict your |
2267 | ability to modify or copy them. | 2283 | ability to modify or copy them. |
2268 | However, you can take the current selection. | 2284 | However, you can take the current selection. |
2285 | |||
2269 | Are you sure you want to take these items? | 2286 | Are you sure you want to take these items? |
2270 | </message> | 2287 | </message> |
2271 | <option name="Yes"> | 2288 | <option name="Yes"> |
@@ -2278,6 +2295,7 @@ Are you sure you want to take these items? | |||
2278 | <alert modal="true" name="CantBuyLandAcrossMultipleRegions"> | 2295 | <alert modal="true" name="CantBuyLandAcrossMultipleRegions"> |
2279 | <message name="message"> | 2296 | <message name="message"> |
2280 | Unable to buy land because selection spans multiple regions. | 2297 | Unable to buy land because selection spans multiple regions. |
2298 | |||
2281 | Please select a smaller area and try again. | 2299 | Please select a smaller area and try again. |
2282 | </message> | 2300 | </message> |
2283 | </alert> | 2301 | </alert> |
@@ -2285,11 +2303,10 @@ Please select a smaller area and try again. | |||
2285 | <message name="message"> | 2303 | <message name="message"> |
2286 | By deeding this parcel, the group will be required | 2304 | By deeding this parcel, the group will be required |
2287 | to have and maintain sufficient land use credits. | 2305 | to have and maintain sufficient land use credits. |
2288 | |||
2289 | The purchase price of the land is not refunded to | 2306 | The purchase price of the land is not refunded to |
2290 | the owner. If a deeded parcel is sold, the sale | 2307 | the owner. If a deeded parcel is sold, the sale |
2291 | price will be divided evenly among group members. | 2308 | price will be divided evenly among group members. |
2292 | 2309 | ||
2293 | Deed this [AREA] m2 of land to the group | 2310 | Deed this [AREA] m2 of land to the group |
2294 | '[GROUP_NAME]'? | 2311 | '[GROUP_NAME]'? |
2295 | </message> | 2312 | </message> |
@@ -2304,10 +2321,8 @@ Deed this [AREA] m2 of land to the group | |||
2304 | <message name="message"> | 2321 | <message name="message"> |
2305 | By deeding this parcel, the group will be required | 2322 | By deeding this parcel, the group will be required |
2306 | to have and maintain sufficient land use credits. | 2323 | to have and maintain sufficient land use credits. |
2307 | |||
2308 | The deed will include a simultaneous land | 2324 | The deed will include a simultaneous land |
2309 | contribution to the group from '[FIRST_NAME] [LAST_NAME]'. | 2325 | contribution to the group from '[FIRST_NAME] [LAST_NAME]'. |
2310 | |||
2311 | The purchase price of the land is not refunded to | 2326 | The purchase price of the land is not refunded to |
2312 | the owner. If a deeded parcel is sold, the sale | 2327 | the owner. If a deeded parcel is sold, the sale |
2313 | price will be divided evenly among group members. | 2328 | price will be divided evenly among group members. |
@@ -2345,7 +2360,7 @@ Could not request domain name: [HOST_NAME] | |||
2345 | Unable to find the server domain name. | 2360 | Unable to find the server domain name. |
2346 | This could be the result of a lost network connection | 2361 | This could be the result of a lost network connection |
2347 | or a server problem. | 2362 | or a server problem. |
2348 | 2363 | ||
2349 | Please try again in a few minutes, or click Help | 2364 | Please try again in a few minutes, or click Help |
2350 | for advice and a link to the system status web page. | 2365 | for advice and a link to the system status web page. |
2351 | </message> | 2366 | </message> |
@@ -2366,6 +2381,7 @@ Unable to connect to [IP_ADDRESS] | |||
2366 | <message name="message"> | 2381 | <message name="message"> |
2367 | Unable to connect to [SECOND_LIFE] | 2382 | Unable to connect to [SECOND_LIFE] |
2368 | The system may be down. | 2383 | The system may be down. |
2384 | |||
2369 | Please try again in a few minutes, or click Help | 2385 | Please try again in a few minutes, or click Help |
2370 | for advice and a link to the system status web page. | 2386 | for advice and a link to the system status web page. |
2371 | </message> | 2387 | </message> |
@@ -2383,8 +2399,7 @@ for advice and a link to the system status web page. | |||
2383 | </alert> | 2399 | </alert> |
2384 | <alert modal="true" name="AvatarMoved"> | 2400 | <alert modal="true" name="AvatarMoved"> |
2385 | <message name="message"> | 2401 | <message name="message"> |
2386 | Your [TYPE] location is not currently available. | 2402 | Your [TYPE] location is not currently available. [HELP] |
2387 | [HELP] | ||
2388 | You have been moved into a nearby region. | 2403 | You have been moved into a nearby region. |
2389 | </message> | 2404 | </message> |
2390 | </alert> | 2405 | </alert> |
@@ -2398,10 +2413,9 @@ will see you correctly. | |||
2398 | <alert modal="true" name="FirstRun"> | 2413 | <alert modal="true" name="FirstRun"> |
2399 | <message name="message"> | 2414 | <message name="message"> |
2400 | [SECOND_LIFE] installation is complete. | 2415 | [SECOND_LIFE] installation is complete. |
2401 | 2416 | ||
2402 | If this is your first time using [SECOND_LIFE], you will need to create | 2417 | If this is your first time using [SECOND_LIFE], you will need to create |
2403 | an account before you can log on. | 2418 | an account before you can log on. |
2404 | |||
2405 | Return to www.secondlife.com to create a new account? | 2419 | Return to www.secondlife.com to create a new account? |
2406 | </message> | 2420 | </message> |
2407 | <option name="NewAccount..."> | 2421 | <option name="NewAccount..."> |
@@ -2415,6 +2429,7 @@ Return to www.secondlife.com to create a new account? | |||
2415 | <message name="message"> | 2429 | <message name="message"> |
2416 | Unable to connect to server. | 2430 | Unable to connect to server. |
2417 | Could not resolve domain name: [HOST_NAME] | 2431 | Could not resolve domain name: [HOST_NAME] |
2432 | |||
2418 | Please check your network connection. | 2433 | Please check your network connection. |
2419 | </message> | 2434 | </message> |
2420 | </alert> | 2435 | </alert> |
@@ -2422,7 +2437,7 @@ Please check your network connection. | |||
2422 | <message name="message"> | 2437 | <message name="message"> |
2423 | Unable to connect. Login packet never received by | 2438 | Unable to connect. Login packet never received by |
2424 | login server. | 2439 | login server. |
2425 | 2440 | ||
2426 | Please try again in a few minutes, or click Help | 2441 | Please try again in a few minutes, or click Help |
2427 | for advice and a link to the system status web page. | 2442 | for advice and a link to the system status web page. |
2428 | </message> | 2443 | </message> |
@@ -2436,9 +2451,8 @@ for advice and a link to the system status web page. | |||
2436 | <alert modal="true" name="WelcomeNoClothes"> | 2451 | <alert modal="true" name="WelcomeNoClothes"> |
2437 | <message name="message"> | 2452 | <message name="message"> |
2438 | Your character will appear in a moment. | 2453 | Your character will appear in a moment. |
2439 | 2454 | ||
2440 | Use arrow keys to walk. | 2455 | Use arrow keys to walk. |
2441 | |||
2442 | Press the F1 key at any time for help or | 2456 | Press the F1 key at any time for help or |
2443 | to learn more about [SECOND_LIFE]. | 2457 | to learn more about [SECOND_LIFE]. |
2444 | </message> | 2458 | </message> |
@@ -2446,12 +2460,10 @@ to learn more about [SECOND_LIFE]. | |||
2446 | <alert modal="true" name="WelcomeChooseSex" nodefault="true"> | 2460 | <alert modal="true" name="WelcomeChooseSex" nodefault="true"> |
2447 | <message name="message"> | 2461 | <message name="message"> |
2448 | Your character will appear in a moment. | 2462 | Your character will appear in a moment. |
2449 | 2463 | ||
2450 | Use arrow keys to walk. | 2464 | Use arrow keys to walk. |
2451 | |||
2452 | Press the F1 key at any time for help or | 2465 | Press the F1 key at any time for help or |
2453 | to learn more about [SECOND_LIFE]. | 2466 | to learn more about [SECOND_LIFE]. |
2454 | |||
2455 | Please choose the male or female avatar. | 2467 | Please choose the male or female avatar. |
2456 | You can change your mind later. | 2468 | You can change your mind later. |
2457 | </message> | 2469 | </message> |
@@ -2480,9 +2492,7 @@ You can change your mind later. | |||
2480 | <alert modal="true" name="FlushMapVisibilityCaches"> | 2492 | <alert modal="true" name="FlushMapVisibilityCaches"> |
2481 | <message name="message"> | 2493 | <message name="message"> |
2482 | This will flush the map caches on this region. | 2494 | This will flush the map caches on this region. |
2483 | |||
2484 | This is really only useful for debugging. | 2495 | This is really only useful for debugging. |
2485 | |||
2486 | (In production, wait 5 minutes, then everyone's map will | 2496 | (In production, wait 5 minutes, then everyone's map will |
2487 | update after they relog.) | 2497 | update after they relog.) |
2488 | </message> | 2498 | </message> |
@@ -2545,9 +2555,8 @@ on ALL LAND in this region? | |||
2545 | <alert modal="true" name="InvalidTerrainBitDepth"> | 2555 | <alert modal="true" name="InvalidTerrainBitDepth"> |
2546 | <message name="message"> | 2556 | <message name="message"> |
2547 | Couldn't set region textures: | 2557 | Couldn't set region textures: |
2548 | |||
2549 | Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH]. | 2558 | Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH]. |
2550 | 2559 | ||
2551 | Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image | 2560 | Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image |
2552 | then click "Apply" again. | 2561 | then click "Apply" again. |
2553 | </message> | 2562 | </message> |
@@ -2555,9 +2564,8 @@ then click "Apply" again. | |||
2555 | <alert modal="true" name="InvalidTerrainSize"> | 2564 | <alert modal="true" name="InvalidTerrainSize"> |
2556 | <message name="message"> | 2565 | <message name="message"> |
2557 | Couldn't set region textures: | 2566 | Couldn't set region textures: |
2558 | |||
2559 | Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]. | 2567 | Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]. |
2560 | 2568 | ||
2561 | Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image | 2569 | Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image |
2562 | then click "Apply" again. | 2570 | then click "Apply" again. |
2563 | </message> | 2571 | </message> |
@@ -2639,7 +2647,6 @@ Please set the object for sale and try again. | |||
2639 | <message name="message"> | 2647 | <message name="message"> |
2640 | A new version of [SECOND_LIFE] is available. | 2648 | A new version of [SECOND_LIFE] is available. |
2641 | [MESSAGE] | 2649 | [MESSAGE] |
2642 | |||
2643 | You must download this update to use [SECOND_LIFE]. | 2650 | You must download this update to use [SECOND_LIFE]. |
2644 | </message> | 2651 | </message> |
2645 | <option name="Download"> | 2652 | <option name="Download"> |
@@ -2653,7 +2660,6 @@ You must download this update to use [SECOND_LIFE]. | |||
2653 | <message name="message"> | 2660 | <message name="message"> |
2654 | An updated version of [SECOND_LIFE] is available. | 2661 | An updated version of [SECOND_LIFE] is available. |
2655 | [MESSAGE] | 2662 | [MESSAGE] |
2656 | |||
2657 | This update is not required, but we suggest you install it to improve performance and stability. | 2663 | This update is not required, but we suggest you install it to improve performance and stability. |
2658 | </message> | 2664 | </message> |
2659 | <option name="Download"> | 2665 | <option name="Download"> |
@@ -2667,7 +2673,6 @@ This update is not required, but we suggest you install it to improve performanc | |||
2667 | <message name="message"> | 2673 | <message name="message"> |
2668 | An updated version of [SECOND_LIFE] is available. | 2674 | An updated version of [SECOND_LIFE] is available. |
2669 | [MESSAGE] | 2675 | [MESSAGE] |
2670 | |||
2671 | This update is not required, but we suggest you install it to improve performance and stability. | 2676 | This update is not required, but we suggest you install it to improve performance and stability. |
2672 | </message> | 2677 | </message> |
2673 | <option name="Download"> | 2678 | <option name="Download"> |
@@ -2681,9 +2686,8 @@ This update is not required, but we suggest you install it to improve performanc | |||
2681 | <message name="message"> | 2686 | <message name="message"> |
2682 | A new version of [SECOND_LIFE] is available. | 2687 | A new version of [SECOND_LIFE] is available. |
2683 | [MESSAGE] | 2688 | [MESSAGE] |
2684 | |||
2685 | You must download this update to use [SECOND_LIFE]. | 2689 | You must download this update to use [SECOND_LIFE]. |
2686 | 2690 | ||
2687 | Download to your Applications folder? | 2691 | Download to your Applications folder? |
2688 | </message> | 2692 | </message> |
2689 | <option name="Download"> | 2693 | <option name="Download"> |
@@ -2697,7 +2701,6 @@ Download to your Applications folder? | |||
2697 | <message name="message"> | 2701 | <message name="message"> |
2698 | An updated version of [SECOND_LIFE] is available. | 2702 | An updated version of [SECOND_LIFE] is available. |
2699 | [MESSAGE] | 2703 | [MESSAGE] |
2700 | |||
2701 | This update is not required, but we suggest you install it to improve performance and stability. | 2704 | This update is not required, but we suggest you install it to improve performance and stability. |
2702 | 2705 | ||
2703 | Download to your Applications folder? | 2706 | Download to your Applications folder? |
@@ -2713,7 +2716,6 @@ Download to your Applications folder? | |||
2713 | <message name="message"> | 2716 | <message name="message"> |
2714 | An updated version of [SECOND_LIFE] is available. | 2717 | An updated version of [SECOND_LIFE] is available. |
2715 | [MESSAGE] | 2718 | [MESSAGE] |
2716 | |||
2717 | This update is not required, but we suggest you install it to improve performance and stability. | 2719 | This update is not required, but we suggest you install it to improve performance and stability. |
2718 | 2720 | ||
2719 | Download to your Applications folder? | 2721 | Download to your Applications folder? |
@@ -2744,10 +2746,8 @@ Download to your Applications folder? | |||
2744 | <message name="message"> | 2746 | <message name="message"> |
2745 | Classified ads appear in the 'Classified' section of the | 2747 | Classified ads appear in the 'Classified' section of the |
2746 | Find directory for one week. | 2748 | Find directory for one week. |
2747 | |||
2748 | Fill out your ad, then click 'Publish...' to add it to the | 2749 | Fill out your ad, then click 'Publish...' to add it to the |
2749 | directory. | 2750 | directory. |
2750 | |||
2751 | You'll be asked for a price to pay when clicking Publish. | 2751 | You'll be asked for a price to pay when clicking Publish. |
2752 | Paying more makes your ad appear higher in the list, and | 2752 | Paying more makes your ad appear higher in the list, and |
2753 | also appear higher when people search for keywords. | 2753 | also appear higher when people search for keywords. |
@@ -2935,7 +2935,7 @@ also appear higher when people search for keywords. | |||
2935 | Are you sure you want to return the selected | 2935 | Are you sure you want to return the selected |
2936 | objects to their owners? Transferable deeded | 2936 | objects to their owners? Transferable deeded |
2937 | objects will be returned to their previous owners. | 2937 | objects will be returned to their previous owners. |
2938 | 2938 | ||
2939 | *WARNING* No-transfer deeded objects will be deleted! | 2939 | *WARNING* No-transfer deeded objects will be deleted! |
2940 | </message> | 2940 | </message> |
2941 | <ignore name="ignore"> | 2941 | <ignore name="ignore"> |
@@ -3264,7 +3264,7 @@ sent to everyone currently in your estate. | |||
3264 | <message name="message"> | 3264 | <message name="message"> |
3265 | You are about to change a Linden owned estate (mainland, | 3265 | You are about to change a Linden owned estate (mainland, |
3266 | teen grid, orientation, etc.). | 3266 | teen grid, orientation, etc.). |
3267 | 3267 | ||
3268 | This is EXTREMELY DANGEROUS because it can fundamentally | 3268 | This is EXTREMELY DANGEROUS because it can fundamentally |
3269 | affect the user experience. On the mainland, it will change | 3269 | affect the user experience. On the mainland, it will change |
3270 | thousands of regions and make the spaceserver hiccup. | 3270 | thousands of regions and make the spaceserver hiccup. |
@@ -3282,11 +3282,10 @@ Proceed? | |||
3282 | <message name="message"> | 3282 | <message name="message"> |
3283 | You are about to change the access list for a Linden owned | 3283 | You are about to change the access list for a Linden owned |
3284 | estate (mainland, teen grid, orientation, etc.). | 3284 | estate (mainland, teen grid, orientation, etc.). |
3285 | 3285 | ||
3286 | This is DANGEROUS and should only be done to invoke the | 3286 | This is DANGEROUS and should only be done to invoke the |
3287 | hack allowing objects/L$ to be transfered in/out of | 3287 | hack allowing objects/L$ to be transfered in/out of |
3288 | a grid. | 3288 | a grid. |
3289 | |||
3290 | It will change thousands of regions and make the | 3289 | It will change thousands of regions and make the |
3291 | spaceserver hiccup. | 3290 | spaceserver hiccup. |
3292 | </message> | 3291 | </message> |
@@ -3485,7 +3484,7 @@ spaceserver hiccup. | |||
3485 | <alert name="PublishClassified"> | 3484 | <alert name="PublishClassified"> |
3486 | <message name="message"> | 3485 | <message name="message"> |
3487 | Remember: Classified ad fees are non-refundable. | 3486 | Remember: Classified ad fees are non-refundable. |
3488 | 3487 | ||
3489 | Publish this classified now for L$[AMOUNT]? | 3488 | Publish this classified now for L$[AMOUNT]? |
3490 | </message> | 3489 | </message> |
3491 | <option name="Publish"> | 3490 | <option name="Publish"> |
@@ -3523,7 +3522,7 @@ sent to everyone in this region. | |||
3523 | <message name="message"> | 3522 | <message name="message"> |
3524 | If this box is checked, land owners will not be able to terraform | 3523 | If this box is checked, land owners will not be able to terraform |
3525 | their land regardless of the per-parcel 'Edit Terrain' setting. | 3524 | their land regardless of the per-parcel 'Edit Terrain' setting. |
3526 | 3525 | ||
3527 | Default: off | 3526 | Default: off |
3528 | </message> | 3527 | </message> |
3529 | </alert> | 3528 | </alert> |
@@ -3614,7 +3613,6 @@ Default: Off | |||
3614 | </alert> | 3613 | </alert> |
3615 | <alert modal="true" name="HelpParcelSearch" title="Do Not Show In Search"> | 3614 | <alert modal="true" name="HelpParcelSearch" title="Do Not Show In Search"> |
3616 | <message name="message"> | 3615 | <message name="message"> |
3617 | |||
3618 | Checking this box will show: | 3616 | Checking this box will show: |
3619 | - this parcel in search results | 3617 | - this parcel in search results |
3620 | - this parcel's public objects | 3618 | - this parcel's public objects |
@@ -3623,7 +3621,6 @@ Checking this box will show: | |||
3623 | <alert modal="true" name="RegionMaturityChange" title="Changed Region Maturity"> | 3621 | <alert modal="true" name="RegionMaturityChange" title="Changed Region Maturity"> |
3624 | <message name="message"> | 3622 | <message name="message"> |
3625 | The maturity rating for this region has been updated. | 3623 | The maturity rating for this region has been updated. |
3626 | |||
3627 | It may take some time for the change to be | 3624 | It may take some time for the change to be |
3628 | reflected on the map. | 3625 | reflected on the map. |
3629 | </message> | 3626 | </message> |
@@ -4043,7 +4040,6 @@ They will be copied to your inventory. | |||
4043 | <alert modal="true" name="ConfirmPurchase" nodefault="true"> | 4040 | <alert modal="true" name="ConfirmPurchase" nodefault="true"> |
4044 | <message name="message"> | 4041 | <message name="message"> |
4045 | This transaction will: | 4042 | This transaction will: |
4046 | |||
4047 | [ACTION] | 4043 | [ACTION] |
4048 | 4044 | ||
4049 | Are you sure you want to proceed with this purchase? | 4045 | Are you sure you want to proceed with this purchase? |
@@ -4058,7 +4054,6 @@ Are you sure you want to proceed with this purchase? | |||
4058 | <alert modal="true" name="ConfirmPurchasePassword" nodefault="true"> | 4054 | <alert modal="true" name="ConfirmPurchasePassword" nodefault="true"> |
4059 | <message name="message"> | 4055 | <message name="message"> |
4060 | This transaction will: | 4056 | This transaction will: |
4061 | |||
4062 | [ACTION] | 4057 | [ACTION] |
4063 | 4058 | ||
4064 | Are you sure you want to proceed with this purchase? | 4059 | Are you sure you want to proceed with this purchase? |
@@ -4104,7 +4099,6 @@ Move the inventory item(s)? | |||
4104 | <message name="message"> | 4099 | <message name="message"> |
4105 | You have selected 'no copy' inventory items. These items | 4100 | You have selected 'no copy' inventory items. These items |
4106 | will be moved to your inventory, not copied. | 4101 | will be moved to your inventory, not copied. |
4107 | |||
4108 | Because this object is scripted, moving these items | 4102 | Because this object is scripted, moving these items |
4109 | to your inventory may cause the script to malfunction. | 4103 | to your inventory may cause the script to malfunction. |
4110 | 4104 | ||
@@ -4232,42 +4226,36 @@ Note: Incomplete reports will not be investigated | |||
4232 | <alert modal="true" name="HelpReportAbuseSelectCategory"> | 4226 | <alert modal="true" name="HelpReportAbuseSelectCategory"> |
4233 | <message name="message"> | 4227 | <message name="message"> |
4234 | Please select a category for this abuse report. | 4228 | Please select a category for this abuse report. |
4235 | |||
4236 | Selecting a category helps us file and process abuse reports. | 4229 | Selecting a category helps us file and process abuse reports. |
4237 | </message> | 4230 | </message> |
4238 | </alert> | 4231 | </alert> |
4239 | <alert modal="true" name="HelpReportBugSelectCategory"> | 4232 | <alert modal="true" name="HelpReportBugSelectCategory"> |
4240 | <message name="message"> | 4233 | <message name="message"> |
4241 | Please select a category for this bug. | 4234 | Please select a category for this bug. |
4242 | |||
4243 | Selecting a category helps us file and process bug reports. | 4235 | Selecting a category helps us file and process bug reports. |
4244 | </message> | 4236 | </message> |
4245 | </alert> | 4237 | </alert> |
4246 | <alert modal="true" name="HelpReportAbuseAbuserNameEmpty"> | 4238 | <alert modal="true" name="HelpReportAbuseAbuserNameEmpty"> |
4247 | <message name="message"> | 4239 | <message name="message"> |
4248 | Please enter the name of the abuser. | 4240 | Please enter the name of the abuser. |
4249 | |||
4250 | Entering an accurate value helps us file and process abuse reports. | 4241 | Entering an accurate value helps us file and process abuse reports. |
4251 | </message> | 4242 | </message> |
4252 | </alert> | 4243 | </alert> |
4253 | <alert modal="true" name="HelpReportAbuseAbuserLocationEmpty"> | 4244 | <alert modal="true" name="HelpReportAbuseAbuserLocationEmpty"> |
4254 | <message name="message"> | 4245 | <message name="message"> |
4255 | Please enter the location where the abuse took place. | 4246 | Please enter the location where the abuse took place. |
4256 | |||
4257 | Entering an accurate value helps us file and process abuse reports. | 4247 | Entering an accurate value helps us file and process abuse reports. |
4258 | </message> | 4248 | </message> |
4259 | </alert> | 4249 | </alert> |
4260 | <alert modal="true" name="HelpReportAbuseSummaryEmpty"> | 4250 | <alert modal="true" name="HelpReportAbuseSummaryEmpty"> |
4261 | <message name="message"> | 4251 | <message name="message"> |
4262 | Please enter a summary of the abuse that took place. | 4252 | Please enter a summary of the abuse that took place. |
4263 | |||
4264 | Entering an accurate summary helps us file and process abuse reports. | 4253 | Entering an accurate summary helps us file and process abuse reports. |
4265 | </message> | 4254 | </message> |
4266 | </alert> | 4255 | </alert> |
4267 | <alert modal="true" name="HelpReportBugSummaryEmpty"> | 4256 | <alert modal="true" name="HelpReportBugSummaryEmpty"> |
4268 | <message name="message"> | 4257 | <message name="message"> |
4269 | Please enter a summary of the bug. | 4258 | Please enter a summary of the bug. |
4270 | |||
4271 | Entering an accurate summary helps us file and process bug reports. | 4259 | Entering an accurate summary helps us file and process bug reports. |
4272 | </message> | 4260 | </message> |
4273 | </alert> | 4261 | </alert> |
@@ -4276,7 +4264,6 @@ Entering an accurate summary helps us file and process bug reports. | |||
4276 | Please enter a detailed description of the abuse that took place. | 4264 | Please enter a detailed description of the abuse that took place. |
4277 | Be as specific as you can, including names and the details of the | 4265 | Be as specific as you can, including names and the details of the |
4278 | incident you are reporting. | 4266 | incident you are reporting. |
4279 | |||
4280 | Entering an accurate description helps us file and process abuse reports. | 4267 | Entering an accurate description helps us file and process abuse reports. |
4281 | </message> | 4268 | </message> |
4282 | </alert> | 4269 | </alert> |
@@ -4285,7 +4272,6 @@ Entering an accurate description helps us file and process abuse reports. | |||
4285 | Please enter a detailed description of the bug. | 4272 | Please enter a detailed description of the bug. |
4286 | Be as specific as you can, including steps to reproduce the bug | 4273 | Be as specific as you can, including steps to reproduce the bug |
4287 | if possible. | 4274 | if possible. |
4288 | |||
4289 | Entering an accurate description helps us file and process bug reports. | 4275 | Entering an accurate description helps us file and process bug reports. |
4290 | </message> | 4276 | </message> |
4291 | </alert> | 4277 | </alert> |
@@ -4295,7 +4281,7 @@ Entering an accurate description helps us file and process bug reports. | |||
4295 | 4281 | ||
4296 | Reports about copyright infringement can only be submitted | 4282 | Reports about copyright infringement can only be submitted |
4297 | as described at http://secondlife.com/corporate/dmca.php. | 4283 | as described at http://secondlife.com/corporate/dmca.php. |
4298 | 4284 | ||
4299 | Reports concerning copyright infringement will automatically | 4285 | Reports concerning copyright infringement will automatically |
4300 | be discarded if they are submitted through the 'Abuse Report' | 4286 | be discarded if they are submitted through the 'Abuse Report' |
4301 | feature. If your report does not relate to copyright infringement, | 4287 | feature. If your report does not relate to copyright infringement, |
@@ -4403,9 +4389,8 @@ the contents of your Lost And Found folder? | |||
4403 | <alert modal="true" name="CopySLURL"> | 4389 | <alert modal="true" name="CopySLURL"> |
4404 | <message name="message"> | 4390 | <message name="message"> |
4405 | The following SLURL has been copied to your clipboard: | 4391 | The following SLURL has been copied to your clipboard: |
4406 | |||
4407 | [SLURL] | 4392 | [SLURL] |
4408 | 4393 | ||
4409 | Put it in a web page to give others easy access to this location or | 4394 | Put it in a web page to give others easy access to this location or |
4410 | try it out yourself by pasting it into the address bar of your web browser. | 4395 | try it out yourself by pasting it into the address bar of your web browser. |
4411 | </message> | 4396 | </message> |
@@ -4481,9 +4466,7 @@ the contents of your Lost And Found folder? | |||
4481 | <alert modal="true" name="BadURL"> | 4466 | <alert modal="true" name="BadURL"> |
4482 | <message name="message"> | 4467 | <message name="message"> |
4483 | Second Life doesn't know how to handle the link: | 4468 | Second Life doesn't know how to handle the link: |
4484 | 4469 | [SLURL] | |
4485 | [SLURL] | ||
4486 | |||
4487 | Most links are similar to this: | 4470 | Most links are similar to this: |
4488 | 4471 | ||
4489 | secondlife:///app/agent/0e346d8b-4433-4d66-a6b0- | 4472 | secondlife:///app/agent/0e346d8b-4433-4d66-a6b0- |
@@ -4492,4 +4475,40 @@ fd37083abc4c/about | |||
4492 | Please check the spelling and try again. | 4475 | Please check the spelling and try again. |
4493 | </message> | 4476 | </message> |
4494 | </alert> | 4477 | </alert> |
4478 | <alert modal="true" name="NotAgeVerified"> | ||
4479 | <message name="message"> | ||
4480 | You need to be age-verified in order to access this parcel. | ||
4481 | Would you like to visit the Second Life website to verify your age? | ||
4482 | |||
4483 | [_URL] | ||
4484 | </message> | ||
4485 | <ignore name="ignore"> | ||
4486 | Warn about lack of age verification | ||
4487 | </ignore> | ||
4488 | <option name="Yes"> | ||
4489 | Yes | ||
4490 | </option> | ||
4491 | <option name="No"> | ||
4492 | No | ||
4493 | </option> | ||
4494 | <url option="0">https://secondlife.com/account/verification.php</url> | ||
4495 | </alert> | ||
4496 | <alert modal="true" name="Cannot enter parcel: no payment info on file"> | ||
4497 | <message name="message"> | ||
4498 | This parcel requires that you have payment information on file before you can access it. | ||
4499 | Would you like to visit the Second Life website to set this up? | ||
4500 | |||
4501 | [_URL] | ||
4502 | </message> | ||
4503 | <ignore name="ignore"> | ||
4504 | Warn about lack of payment info | ||
4505 | </ignore> | ||
4506 | <option name="Yes"> | ||
4507 | Yes | ||
4508 | </option> | ||
4509 | <option name="No"> | ||
4510 | No | ||
4511 | </option> | ||
4512 | <url option="0">https://secondlife.com/account/</url> | ||
4513 | </alert> | ||
4495 | </alerts> | 4514 | </alerts> |
diff --git a/linden/indra/newview/skins/xui/en-us/floater_about_land.xml b/linden/indra/newview/skins/xui/en-us/floater_about_land.xml index eb5448f..37a4e8e 100644 --- a/linden/indra/newview/skins/xui/en-us/floater_about_land.xml +++ b/linden/indra/newview/skins/xui/en-us/floater_about_land.xml | |||
@@ -1,6 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | 1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> |
2 | <floater bottom="-554" can_close="true" can_drag_on_left="false" can_minimize="true" | 2 | <floater bottom="-554" can_close="true" can_drag_on_left="false" can_minimize="true" |
3 | can_resize="true" can_tear_off="true" enabled="true" height="385" | 3 | can_resize="true" can_tear_off="false" enabled="true" height="385" |
4 | hidden="false" left="367" min_height="385" min_width="460" | 4 | hidden="false" left="367" min_height="385" min_width="460" |
5 | mouse_opaque="true" name="floaterland" rect_control="FloaterLandRect5" | 5 | mouse_opaque="true" name="floaterland" rect_control="FloaterLandRect5" |
6 | title="About Land" width="460"> | 6 | title="About Land" width="460"> |
@@ -755,49 +755,111 @@ Settings: | |||
755 | <panel border="false" bottom="-349" enabled="true" follows="left|top|right|bottom" | 755 | <panel border="false" bottom="-349" enabled="true" follows="left|top|right|bottom" |
756 | height="333" hidden="false" label="Access" left="1" mouse_opaque="true" | 756 | height="333" hidden="false" label="Access" left="1" mouse_opaque="true" |
757 | name="land_access_panel" width="458"> | 757 | name="land_access_panel" width="458"> |
758 | <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | 758 | <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" |
759 | bottom="-20" drop_shadow_visible="true" enabled="true" follows="left|top" | 759 | bottom="-24" drop_shadow_visible="true" enabled="true" follows="left|top" |
760 | font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false" | 760 | font="SansSerif" h_pad="0" halign="left" height="20" hidden="false" |
761 | left="4" mouse_opaque="true" name="Limit access to this parcel to:" | 761 | left="8" mouse_opaque="true" name="Limit access to this parcel to:" |
762 | v_pad="0" width="278"> | 762 | v_pad="0" width="278"> |
763 | Limit access to this parcel to: | 763 | Access To This Parcel |
764 | </text> | 764 | </text> |
765 | <check_box bottom="-40" enabled="true" follows="left|top" font="SansSerifSmall" | 765 | |
766 | height="16" hidden="false" initial_value="false" label="Group: [GROUP]" | 766 | <check_box bottom="-45" enabled="true" follows="top|left" font="SansSerifSmall" |
767 | left="4" mouse_opaque="true" name="GroupCheck" radio_style="false" | 767 | height="16" hidden="false" initial_value="false" label="Allow Public Access" |
768 | left="8" mouse_opaque="true" name="public_access" radio_style="false" | ||
768 | width="278" /> | 769 | width="278" /> |
769 | <check_box bottom="-60" enabled="true" follows="left|top" font="SansSerifSmall" | 770 | <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" |
771 | bottom_delta="-20" drop_shadow_visible="true" enabled="true" follows="top|left" | ||
772 | font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false" | ||
773 | left_delta="20" mouse_opaque="true" name="Only Allow" | ||
774 | v_pad="0" width="278"> | ||
775 | Restrict Access To: | ||
776 | </text> | ||
777 | <check_box bottom_delta="-20" enabled="true" follows="top|left" font="SansSerifSmall" | ||
778 | height="16" hidden="false" initial_value="false" label="Residents who have given payment info to Linden Lab" | ||
779 | left_delta="0" mouse_opaque="true" name="limit_payment" radio_style="false" width="278" | ||
780 | tool_tip="Ban unidentified residents." /> | ||
781 | <check_box bottom_delta="-20" enabled="true" follows="top|left" font="SansSerifSmall" | ||
782 | height="16" hidden="false" initial_value="false" label="Age-verified adults" | ||
783 | left_delta="0" mouse_opaque="true" name="limit_age_verified" radio_style="false" width="278" | ||
784 | tool_tip="Ban residents who have not verified their age. See support.secondlife.com for more information." /> | ||
785 | <string name="estate_override">One ore more of these options is set at the estate level</string> | ||
786 | |||
787 | <check_box bottom_delta="-20" enabled="true" follows="left|top" font="SansSerifSmall" | ||
788 | height="16" hidden="false" initial_value="false" label="Allow Group Access: [GROUP]" | ||
789 | left="8" mouse_opaque="true" name="GroupCheck" radio_style="false" width="278" | ||
790 | tool_tip="Set group in the General tab." /> | ||
791 | |||
792 | <check_box bottom_delta="-20" enabled="false" follows="left|top" font="SansSerifSmall" | ||
770 | height="16" hidden="false" initial_value="false" | 793 | height="16" hidden="false" initial_value="false" |
771 | label="Avatars: ([LISTED] listed, [MAX] max)" left="4" mouse_opaque="true" | 794 | label="Sell passes to:" left="8" |
772 | name="AccessCheck" radio_style="false" width="278" /> | 795 | mouse_opaque="true" name="PassCheck" radio_style="false" width="120" |
773 | <name_list allow_calling_card_drop="false" background_visible="true" bottom="-234" | 796 | tool_tip="Allows temporary access to this parcel"/> |
774 | column_padding="0" draw_border="true" draw_heading="true" heading_font="SansSerifSmall" heading_height="14" | 797 | <combo_box allow_text_entry="false" bottom_delta="0" enabled="true" follows="left|top" |
775 | enabled="true" follows="left|top|right|bottom" height="170" | 798 | height="16" hidden="false" left_delta="120" max_chars="20" mouse_opaque="true" |
776 | hidden="false" left="28" mouse_opaque="true" multi_select="false" | 799 | name="pass_combo" width="100"> |
777 | name="AccessList" width="400"> | 800 | <combo_item name="Anyone" value="anyone"> |
778 | <column label="Allowed Residents" name="name" relwidth="1.0" /> | 801 | Anyone |
802 | </combo_item> | ||
803 | <combo_item name="Group" value="group"> | ||
804 | Group | ||
805 | </combo_item> | ||
806 | </combo_box> | ||
807 | <spinner bottom_delta="-20" enabled="false" follows="left|top" height="16" hidden="false" | ||
808 | increment="1" initial_val="10" label="Price in L$:" label_width="120" | ||
809 | left="28" max_val="500" min_val="1" mouse_opaque="true" name="PriceSpin" | ||
810 | width="180" /> | ||
811 | <spinner bottom_delta="-20" enabled="false" follows="left|top" height="16" hidden="false" | ||
812 | increment="0.25" initial_val="1" label="Hours of access:" label_width="120" | ||
813 | left_delta="0" max_val="24" min_val="0.01" mouse_opaque="true" name="HoursSpin" | ||
814 | width="180" /> | ||
815 | |||
816 | |||
817 | <text bottom="-220" enabled="true" follows="left|right|top" font="SansSerifSmall" | ||
818 | height="16" hidden="false" initial_value="false" | ||
819 | label="Always Allow" left="20" mouse_opaque="true" | ||
820 | name="AccessCheck" radio_style="false" width="195"> | ||
821 | Allowed Residents | ||
822 | </text> | ||
823 | <name_list allow_calling_card_drop="false" background_visible="true" bottom="-320" | ||
824 | column_padding="0" draw_border="true" draw_heading="false" heading_font="SansSerifSmall" heading_height="14" | ||
825 | enabled="true" follows="left|top" height="100" | ||
826 | hidden="false" left="20" mouse_opaque="true" multi_select="true" | ||
827 | name="AccessList" width="195" | ||
828 | tool_tip="([LISTED] listed, [MAX] max)"> | ||
779 | </name_list> | 829 | </name_list> |
780 | <button bottom="-264" enabled="true" follows="left|bottom" font="SansSerifSmall" | 830 | <button bottom_delta="-20" enabled="true" follows="left|top" font="SansSerifSmall" |
781 | halign="center" height="16" hidden="false" label="Add..." | 831 | halign="center" height="16" hidden="false" label="Add..." |
782 | label_selected="Add..." left="28" mouse_opaque="true" name="Add..." | 832 | label_selected="Add..." left_delta="5" mouse_opaque="true" name="add_allowed" |
783 | scale_image="true" width="88" /> | 833 | scale_image="true" width="80" /> |
784 | <button bottom="-264" enabled="false" follows="left|bottom" font="SansSerifSmall" | 834 | <button bottom_delta="0" enabled="true" follows="left|top" font="SansSerifSmall" |
785 | halign="center" height="16" hidden="false" label="Remove" | 835 | halign="center" height="16" hidden="false" label="Remove" |
786 | label_selected="Remove" left="124" mouse_opaque="true" name="Remove" | 836 | label_selected="Remove" left_delta="100" mouse_opaque="true" name="remove_allowed" |
787 | scale_image="true" width="88" /> | 837 | scale_image="true" width="80" /> |
788 | <check_box bottom="-284" enabled="false" follows="left|bottom" font="SansSerifSmall" | 838 | |
839 | <text bottom="-220" enabled="true" follows="left|right|top" font="SansSerifSmall" | ||
789 | height="16" hidden="false" initial_value="false" | 840 | height="16" hidden="false" initial_value="false" |
790 | label="Sell passes allowing temporary access:" left="28" | 841 | label="Ban" left="240" mouse_opaque="true" |
791 | mouse_opaque="true" name="PassCheck" radio_style="false" width="254" /> | 842 | name="AccessCheck" radio_style="false" width="195"> |
792 | <spinner bottom="-304" enabled="false" follows="left|bottom" height="16" hidden="false" | 843 | Banned Residents |
793 | increment="1" initial_val="10" label="Price in L$:" label_width="128" | 844 | </text> |
794 | left="76" max_val="500" min_val="1" mouse_opaque="true" name="PriceSpin" | 845 | <name_list allow_calling_card_drop="false" background_visible="true" bottom="-320" |
795 | width="206" /> | 846 | column_padding="0" draw_border="true" draw_heading="false" heading_font="SansSerifSmall" heading_height="14" |
796 | <spinner bottom="-324" enabled="false" follows="left|bottom" height="16" hidden="false" | 847 | enabled="true" follows="left|right|top|bottom" height="100" |
797 | increment="0.25" initial_val="1" label="Hours of access:" label_width="128" | 848 | hidden="false" left_delta="0" mouse_opaque="true" multi_select="true" |
798 | left="76" max_val="24" min_val="0.01" mouse_opaque="true" name="HoursSpin" | 849 | name="BannedList" width="195" |
799 | width="206" /> | 850 | tool_tip="([LISTED] listed, [MAX] max)"> |
851 | </name_list> | ||
852 | <button bottom_delta="-20" enabled="true" follows="right|bottom" font="SansSerifSmall" | ||
853 | halign="center" height="16" hidden="false" label="Add..." | ||
854 | label_selected="Add..." left_delta="5" mouse_opaque="true" name="add_banned" | ||
855 | scale_image="true" width="80" /> | ||
856 | <button bottom_delta="0" enabled="false" follows="right|bottom" font="SansSerifSmall" | ||
857 | halign="center" height="16" hidden="false" label="Remove" | ||
858 | label_selected="Remove" left_delta="100" mouse_opaque="true" name="remove_banned" | ||
859 | scale_image="true" width="80" /> | ||
860 | |||
800 | </panel> | 861 | </panel> |
862 | <!-- | ||
801 | <panel border="false" bottom="-349" enabled="true" follows="left|top|right|bottom" | 863 | <panel border="false" bottom="-349" enabled="true" follows="left|top|right|bottom" |
802 | height="333" hidden="false" label="Ban" left="1" mouse_opaque="true" | 864 | height="333" hidden="false" label="Ban" left="1" mouse_opaque="true" |
803 | name="land_ban_panel" width="458"> | 865 | name="land_ban_panel" width="458"> |
@@ -840,5 +902,6 @@ Settings: | |||
840 | label="Deny Payment Info Used" left="28" mouse_opaque="true" | 902 | label="Deny Payment Info Used" left="28" mouse_opaque="true" |
841 | name="DenyTransactedCheck" radio_style="false" width="254" /> | 903 | name="DenyTransactedCheck" radio_style="false" width="254" /> |
842 | </panel> | 904 | </panel> |
905 | --> | ||
843 | </tab_container> | 906 | </tab_container> |
844 | </floater> | 907 | </floater> |
diff --git a/linden/indra/newview/skins/xui/en-us/floater_directory.xml b/linden/indra/newview/skins/xui/en-us/floater_directory.xml index a012625..0d2063d 100644 --- a/linden/indra/newview/skins/xui/en-us/floater_directory.xml +++ b/linden/indra/newview/skins/xui/en-us/floater_directory.xml | |||
@@ -1,6 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | 1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> |
2 | <floater can_close="true" can_drag_on_left="false" can_minimize="true" | 2 | <floater can_close="true" can_drag_on_left="false" can_minimize="true" |
3 | can_resize="false" height="570" min_height="570" min_width="780" | 3 | can_resize="true" height="570" min_height="570" min_width="780" |
4 | name="directory" rect_control="FloaterFindRect2" | 4 | name="directory" rect_control="FloaterFindRect2" |
5 | title="Search Second Life" width="780"> | 5 | title="Search Second Life" width="780"> |
6 | <tab_container bottom="-570" follows="left|top|right|bottom" height="550" left="0" | 6 | <tab_container bottom="-570" follows="left|top|right|bottom" height="550" left="0" |
@@ -324,7 +324,7 @@ | |||
324 | name="incpictures" width="200" /> | 324 | name="incpictures" width="200" /> |
325 | <check_box bottom_delta="-16" control_name="ShowMatureSims" follows="left|top" | 325 | <check_box bottom_delta="-16" control_name="ShowMatureSims" follows="left|top" |
326 | font="SansSerifSmall" height="16" initial_value="false" | 326 | font="SansSerifSmall" height="16" initial_value="false" |
327 | label="Include parcels with Mature Content" left="24" mouse_opaque="true" | 327 | label="Include parcels with Restricted Content" left="24" mouse_opaque="true" |
328 | name="incmature" width="204" /> | 328 | name="incmature" width="204" /> |
329 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | 329 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" |
330 | bottom="-38" drop_shadow_visible="true" follows="right|top" | 330 | bottom="-38" drop_shadow_visible="true" follows="right|top" |
diff --git a/linden/indra/newview/skins/xui/en-us/floater_texture_ctrl.xml b/linden/indra/newview/skins/xui/en-us/floater_texture_ctrl.xml index de2c40b..f9b0f28 100644 --- a/linden/indra/newview/skins/xui/en-us/floater_texture_ctrl.xml +++ b/linden/indra/newview/skins/xui/en-us/floater_texture_ctrl.xml | |||
@@ -3,6 +3,7 @@ | |||
3 | can_resize="true" can_tear_off="true" enabled="true" height="290" | 3 | can_resize="true" can_tear_off="true" enabled="true" height="290" |
4 | hidden="false" left="478" min_height="290" min_width="410" | 4 | hidden="false" left="478" min_height="290" min_width="410" |
5 | mouse_opaque="true" name="texture picker" title="Pick: Texture" width="410"> | 5 | mouse_opaque="true" name="texture picker" title="Pick: Texture" width="410"> |
6 | <string name="choose_picture">"Click to choose a picture"</string> | ||
6 | <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | 7 | <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" |
7 | bottom="-110" drop_shadow_visible="true" enabled="true" follows="left|top" | 8 | bottom="-110" drop_shadow_visible="true" enabled="true" follows="left|top" |
8 | font="SansSerifSmall" h_pad="0" halign="center" height="14" hidden="false" | 9 | font="SansSerifSmall" h_pad="0" halign="center" height="14" hidden="false" |
diff --git a/linden/indra/newview/skins/xui/en-us/menu_login.xml b/linden/indra/newview/skins/xui/en-us/menu_login.xml new file mode 100644 index 0000000..6533f90 --- /dev/null +++ b/linden/indra/newview/skins/xui/en-us/menu_login.xml | |||
@@ -0,0 +1,37 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <menu_bar bottom="-18" drop_shadow="false" enabled="true" | ||
3 | follows="left|top|right" height="18" hidden="false" left="0" | ||
4 | mouse_opaque="true" name="Login Menu" opaque="true" tear_off="false" | ||
5 | width="802"> | ||
6 | <menu bottom="273" drop_shadow="true" enabled="true" height="263" | ||
7 | hidden="false" label="File" left="0" mouse_opaque="false" name="File" | ||
8 | opaque="true" tear_off="true" create_jump_keys="true" width="243"> | ||
9 | <menu_item_call bottom="-29" enabled="true" height="19" hidden="false" label="Quit" left="0" | ||
10 | mouse_opaque="true" name="Quit" shortcut="control|Q" width="243"> | ||
11 | <on_click function="File.Quit" userdata="" /> | ||
12 | </menu_item_call> | ||
13 | </menu> | ||
14 | <menu bottom="97" drop_shadow="true" enabled="true" height="439" | ||
15 | hidden="false" label="Edit" left="38" mouse_opaque="false" name="Edit" | ||
16 | opaque="true" tear_off="true" create_jump_keys="true" width="153"> | ||
17 | <menu_item_call bottom="-29" enabled="true" height="19" hidden="false" label="Preferences..." | ||
18 | left="0" mouse_opaque="true" name="Preferences..." shortcut="control|P" | ||
19 | width="153"> | ||
20 | <on_click function="ShowFloater" userdata="preferences" /> | ||
21 | </menu_item_call> | ||
22 | </menu> | ||
23 | <menu bottom="219" drop_shadow="true" enabled="true" height="317" | ||
24 | hidden="false" label="Help" left="80" mouse_opaque="false" name="Help" | ||
25 | opaque="true" tear_off="true" create_jump_keys="true" width="166"> | ||
26 | <menu_item_call bottom="-29" enabled="true" height="19" hidden="false" label="Second Life Help" | ||
27 | left="0" mouse_opaque="true" name="Second Life Help" shortcut="F1" | ||
28 | width="166"> | ||
29 | <on_click function="ShowFloater" userdata="help f1" /> | ||
30 | </menu_item_call> | ||
31 | <menu_item_call bottom="-48" enabled="true" height="19" hidden="false" | ||
32 | label="About Second Life..." left="0" mouse_opaque="true" | ||
33 | name="About Second Life..." width="166"> | ||
34 | <on_click function="ShowFloater" userdata="about" /> | ||
35 | </menu_item_call> | ||
36 | </menu> | ||
37 | </menu_bar> | ||
diff --git a/linden/indra/newview/skins/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/xui/en-us/menu_viewer.xml index 3b289d4..8643c7e 100644 --- a/linden/indra/newview/skins/xui/en-us/menu_viewer.xml +++ b/linden/indra/newview/skins/xui/en-us/menu_viewer.xml | |||
@@ -43,7 +43,7 @@ | |||
43 | left="0" mouse_opaque="true" name="Close All Windows" shortcut="control|shift|W" | 43 | left="0" mouse_opaque="true" name="Close All Windows" shortcut="control|shift|W" |
44 | width="243"> | 44 | width="243"> |
45 | <on_click function="File.CloseAllWindows" userdata="" /> | 45 | <on_click function="File.CloseAllWindows" userdata="" /> |
46 | <on_enable function="File.EnableCloseWindow" userdata="" /> | 46 | <on_enable function="File.EnableCloseAllWindows" userdata="" /> |
47 | </menu_item_call> | 47 | </menu_item_call> |
48 | <menu_item_separator bottom="-121" enabled="true" height="8" hidden="false" label="-----------" | 48 | <menu_item_separator bottom="-121" enabled="true" height="8" hidden="false" label="-----------" |
49 | left="0" mouse_opaque="true" name="separator2" width="243" /> | 49 | left="0" mouse_opaque="true" name="separator2" width="243" /> |
diff --git a/linden/indra/newview/skins/xui/en-us/notify.xml b/linden/indra/newview/skins/xui/en-us/notify.xml index ad9e049..cbd2789 100644 --- a/linden/indra/newview/skins/xui/en-us/notify.xml +++ b/linden/indra/newview/skins/xui/en-us/notify.xml | |||
@@ -970,4 +970,24 @@ Click Accept to join the call or Decline to decline the invitation. Click Mute t | |||
970 | We are creating a voice channel for you. This may take up to one minute. | 970 | We are creating a voice channel for you. This may take up to one minute. |
971 | </message> | 971 | </message> |
972 | </notify> | 972 | </notify> |
973 | <notify name="VoiceLoginRetry" tip="true" unique="true" duration="10"> | ||
974 | <message name="message"> | ||
975 | We are creating a voice channel for you. This may take up to one minute. | ||
976 | </message> | ||
977 | </notify> | ||
978 | <notify name="Cannot enter parcel: not a group member" tip="true"> | ||
979 | <message name="message"> | ||
980 | Cannot enter parcel, you are not a member of the appropriate group. | ||
981 | </message> | ||
982 | </notify> | ||
983 | <notify name="Cannot enter parcel: banned" tip="true"> | ||
984 | <message name="message"> | ||
985 | Cannot enter parcel, you have been banned. | ||
986 | </message> | ||
987 | </notify> | ||
988 | <notify name="Cannot enter parcel: not on access list" tip="true"> | ||
989 | <message name="message"> | ||
990 | Cannot enter parcel, you are not on the access list. | ||
991 | </message> | ||
992 | </notify> | ||
973 | </notifications> | 993 | </notifications> |
diff --git a/linden/indra/newview/skins/xui/en-us/panel_avatar.xml b/linden/indra/newview/skins/xui/en-us/panel_avatar.xml index fa64706..c5c42b4 100644 --- a/linden/indra/newview/skins/xui/en-us/panel_avatar.xml +++ b/linden/indra/newview/skins/xui/en-us/panel_avatar.xml | |||
@@ -28,6 +28,12 @@ | |||
28 | <text hidden="true" name="NoPaymentInfoOnFile"> | 28 | <text hidden="true" name="NoPaymentInfoOnFile"> |
29 | No Payment Info On File | 29 | No Payment Info On File |
30 | </text> | 30 | </text> |
31 | <text hidden="true" name="AgeVerified"> | ||
32 | , Age-verified | ||
33 | </text> | ||
34 | <text hidden="true" name="NotAgeVerified"> | ||
35 | , Not Age-verified | ||
36 | </text> | ||
31 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | 37 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" |
32 | bottom="-24" drop_shadow_visible="true" follows="left|top" | 38 | bottom="-24" drop_shadow_visible="true" follows="left|top" |
33 | font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4" | 39 | font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4" |
diff --git a/linden/indra/newview/skins/xui/en-us/panel_login.xml b/linden/indra/newview/skins/xui/en-us/panel_login.xml index 6652a63..062eba1 100644 --- a/linden/indra/newview/skins/xui/en-us/panel_login.xml +++ b/linden/indra/newview/skins/xui/en-us/panel_login.xml | |||
@@ -6,95 +6,9 @@ | |||
6 | start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody bgcolor=%22#000000%22 text=%22ffffff%22%3E%3Ch1%3E%3Ctt%3Eloading...%3C/tt%3E%3C/h1%3E %3C/body%3E %3C/html%3E" | 6 | start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody bgcolor=%22#000000%22 text=%22ffffff%22%3E%3Ch1%3E%3Ctt%3Eloading...%3C/tt%3E%3C/h1%3E %3C/body%3E %3C/html%3E" |
7 | top="-1" /> | 7 | top="-1" /> |
8 | <text hidden="true" name="real_url"> | 8 | <text hidden="true" name="real_url"> |
9 | http://secondlife.com/app/login/ | 9 | https://secondlife.com/app/login/en/?show_login_form=True |
10 | </text> | 10 | </text> |
11 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | 11 | <text hidden="true" name="forgot_password_url"> |
12 | bottom="54" drop_shadow_visible="true" follows="left|bottom" | 12 | http://secondlife.com/account/request.php |
13 | font="SansSerif" h_pad="0" halign="left" height="16" hidden="false" | ||
14 | left="32" mouse_opaque="true" name="first_name_text" v_pad="0" width="120"> | ||
15 | First Name: | ||
16 | </text> | ||
17 | <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24" | ||
18 | follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true" | ||
19 | height="20" hidden="false" left="32" max_length="31" mouse_opaque="true" | ||
20 | name="first_name_edit" select_all_on_focus_received="true" width="120" /> | ||
21 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | ||
22 | bottom="54" drop_shadow_visible="true" follows="left|bottom" | ||
23 | font="SansSerif" h_pad="0" halign="left" height="16" hidden="false" | ||
24 | left="164" mouse_opaque="true" name="last_name_text" v_pad="0" width="120"> | ||
25 | Last Name: | ||
26 | </text> | ||
27 | <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24" | ||
28 | follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true" | ||
29 | height="20" hidden="false" left="164" max_length="31" mouse_opaque="true" | ||
30 | name="last_name_edit" select_all_on_focus_received="true" width="120" /> | ||
31 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | ||
32 | bottom="54" drop_shadow_visible="true" follows="left|bottom" | ||
33 | font="SansSerif" h_pad="0" halign="left" height="16" hidden="false" | ||
34 | left="296" mouse_opaque="true" name="password_text" v_pad="0" width="120"> | ||
35 | Password: | ||
36 | </text> | ||
37 | <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24" | ||
38 | follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true" | ||
39 | height="20" hidden="false" left="296" max_length="16" mouse_opaque="true" | ||
40 | name="password_edit" select_all_on_focus_received="true" width="120" /> | ||
41 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | ||
42 | bottom="10" drop_shadow_visible="true" follows="left|bottom" | ||
43 | font="SansSerif" h_pad="0" halign="left" height="16" hidden="false" | ||
44 | left="32" mouse_opaque="true" name="start_location_text" v_pad="0" | ||
45 | width="85"> | ||
46 | Start Location: | ||
47 | </text> | ||
48 | <combo_box allow_text_entry="true" bottom="8" follows="left|bottom" height="18" | ||
49 | hidden="false" left_delta="97" max_chars="128" mouse_opaque="true" | ||
50 | name="start_location_combo" width="140"> | ||
51 | <combo_item name="MyHome" value="My Home"> | ||
52 | My Home | ||
53 | </combo_item> | ||
54 | <combo_item name="MyLastLocation" value="My Last Location"> | ||
55 | My Last Location | ||
56 | </combo_item> | ||
57 | <combo_item name="Typeregionname" value="<Type region name>"> | ||
58 | <Type region name> | ||
59 | </combo_item> | ||
60 | </combo_box> | ||
61 | <check_box bottom="10" follows="left|bottom" font="SansSerifSmall" height="16" | ||
62 | hidden="false" initial_value="false" label="Remember password" | ||
63 | left_delta="167" mouse_opaque="true" name="remember_check" width="138" /> | ||
64 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | ||
65 | bottom="74" drop_shadow_visible="true" follows="left|bottom" | ||
66 | font="SansSerifSmall" h_pad="0" halign="left" height="20" hidden="false" | ||
67 | left="32" mouse_opaque="true" name="full_screen_text" v_pad="0" width="300"> | ||
68 | Viewer will display full screen when logged in. | ||
69 | </text> | ||
70 | <button bottom="46" follows="left|bottom" font="SansSerif" halign="center" height="24" | ||
71 | hidden="false" label="New Account..." label_selected="New Account..." | ||
72 | left="440" mouse_opaque="true" name="new_account_btn" scale_image="TRUE" | ||
73 | width="120" /> | ||
74 | <button bottom="46" follows="left|bottom" font="SansSerif" halign="center" height="24" | ||
75 | hidden="false" label="Preferences..." label_selected="Preferences..." | ||
76 | left="572" mouse_opaque="true" name="preferences_btn" scale_image="TRUE" | ||
77 | width="120" /> | ||
78 | <combo_box allow_text_entry="true" bottom="48" follows="left|bottom" height="18" | ||
79 | hidden="false" left_delta="128" max_chars="20" mouse_opaque="true" | ||
80 | name="server_combo" width="120" /> | ||
81 | <button bottom_delta="-28" follows="left|bottom" font="SansSerif" halign="center" | ||
82 | height="24" hidden="false" label="Connect" label_selected="Connect" | ||
83 | left="440" mouse_opaque="true" name="connect_btn" scale_image="TRUE" | ||
84 | width="120" /> | ||
85 | <button bottom_delta="0" follows="left|bottom" font="SansSerif" halign="center" | ||
86 | height="24" hidden="false" label="Quit" label_selected="Quit" left="572" | ||
87 | mouse_opaque="true" name="quit_btn" scale_image="TRUE" width="120" /> | ||
88 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | ||
89 | bottom="2" drop_shadow_visible="true" follows="right|bottom" | ||
90 | font="SansSerifSmall" h_pad="0" halign="right" height="12" hidden="false" | ||
91 | left="698" mouse_opaque="true" name="version_text" v_pad="0" width="100"> | ||
92 | 1.23.4 (5) | ||
93 | </text> | ||
94 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | ||
95 | bottom="14" drop_shadow_visible="true" follows="right|bottom" | ||
96 | font="SansSerifSmall" h_pad="0" halign="right" height="12" hidden="false" | ||
97 | left="698" mouse_opaque="true" name="channel_text" v_pad="0" width="300"> | ||
98 | [Viewer Channel Name] | ||
99 | </text> | 13 | </text> |
100 | </panel> | 14 | </panel> |
diff --git a/linden/indra/newview/skins/xui/en-us/panel_region_estate.xml b/linden/indra/newview/skins/xui/en-us/panel_region_estate.xml index 13d5f81..4a75032 100644 --- a/linden/indra/newview/skins/xui/en-us/panel_region_estate.xml +++ b/linden/indra/newview/skins/xui/en-us/panel_region_estate.xml | |||
@@ -24,9 +24,9 @@ regions in the estate. | |||
24 | (unknown) | 24 | (unknown) |
25 | </text> | 25 | </text> |
26 | 26 | ||
27 | <view_border bevel_style="in" border="true" border_thickness="1" bottom_delta="-280" follows="top|left" | 27 | <view_border bevel_style="in" border="true" border_thickness="1" bottom_delta="-265" follows="top|left" |
28 | height="275" left="6" width="250" /> | 28 | height="260" left="6" width="250" /> |
29 | <check_box bottom_delta="252" follows="left|top" height="20" label="Use Global Time" | 29 | <check_box bottom_delta="235" follows="left|top" height="20" label="Use Global Time" |
30 | left="12" name="use_global_time_check" width="200" /> | 30 | left="12" name="use_global_time_check" width="200" /> |
31 | <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?" | 31 | <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?" |
32 | right="250" name="use_global_time_help" width="18" /> | 32 | right="250" name="use_global_time_help" width="18" /> |
@@ -39,61 +39,42 @@ regions in the estate. | |||
39 | <slider bottom_delta="-25" follows="left|top" height="20" increment="0.001" | 39 | <slider bottom_delta="-25" follows="left|top" height="20" increment="0.001" |
40 | label="Phase" left="12" max_val="30" min_val="6" name="sun_hour_slider" | 40 | label="Phase" left="12" max_val="30" min_val="6" name="sun_hour_slider" |
41 | show_text="false" width="200" /> | 41 | show_text="false" width="200" /> |
42 | <check_box bottom_delta="-26" follows="left|top" height="20" label="Public Access" | 42 | <check_box bottom_delta="-26" follows="left|top" height="20" label="Allow Public Access" |
43 | left="12" name="externally_visible_check" width="200" /> | 43 | left="12" name="externally_visible_check" width="200" /> |
44 | <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?" | 44 | <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?" |
45 | right="250" name="externally_visible_help" width="18" /> | 45 | right="250" name="externally_visible_help" width="18" /> |
46 | <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" | ||
47 | bottom_delta="-20" drop_shadow_visible="true" enabled="true" follows="top|left" | ||
48 | font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false" | ||
49 | left="32" mouse_opaque="true" name="Only Allow" | ||
50 | v_pad="0" width="278"> | ||
51 | Restrict Access To: | ||
52 | </text> | ||
53 | <check_box bottom_delta="-20" enabled="true" follows="top|left" font="SansSerifSmall" | ||
54 | height="16" hidden="false" initial_value="false" label="Residents with payment info on file" | ||
55 | left_delta="0" mouse_opaque="true" name="limit_payment" radio_style="false" width="278" | ||
56 | tool_tip="Ban unidentified residents."/> | ||
57 | <check_box bottom_delta="-20" enabled="true" follows="top|left" font="SansSerifSmall" | ||
58 | height="16" hidden="false" initial_value="false" label="Age-verified adults" | ||
59 | left_delta="0" mouse_opaque="true" name="limit_age_verified" radio_style="false" width="278" | ||
60 | tool_tip="Ban residents who have not verified their age. See support.secondlife.com for more information."/> | ||
61 | |||
46 | <check_box bottom_delta="-20" follows="left|top" height="20" label="Allow Voice Chat" | 62 | <check_box bottom_delta="-20" follows="left|top" height="20" label="Allow Voice Chat" |
47 | left="12" name="voice_chat_check" width="200" /> | 63 | left="12" name="voice_chat_check" width="200" /> |
48 | <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?" | 64 | <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?" |
49 | right="250" name="voice_chat_help" width="18" /> | 65 | right="250" name="voice_chat_help" width="18" /> |
50 | 66 | ||
51 | <!-- | ||
52 | <check_box name="mainland_visible_check" | ||
53 | label="Mainland Visible From Here" | ||
54 | left="15" | ||
55 | bottom_delta="-20" | ||
56 | width="80" | ||
57 | height="20" | ||
58 | follows="left|top" | ||
59 | /> | ||
60 | <button name="mainland_visible_help" | ||
61 | label="?" | ||
62 | left="185" | ||
63 | bottom_delta="0" | ||
64 | width="18" | ||
65 | height="18" | ||
66 | follows="left|top" | ||
67 | font="SansSerifSmall" | ||
68 | /> | ||
69 | --> | ||
70 | <check_box bottom_delta="-20" follows="left|top" height="20" label="Allow Direct Teleport" left="12" name="allow_direct_teleport" width="80" /> | 67 | <check_box bottom_delta="-20" follows="left|top" height="20" label="Allow Direct Teleport" left="12" name="allow_direct_teleport" width="80" /> |
71 | <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?" | 68 | <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?" |
72 | right="250" name="allow_direct_teleport_help" width="18" /> | 69 | right="250" name="allow_direct_teleport_help" width="18" /> |
73 | <text bottom_delta="-28" follows="left|top" font="SansSerifSmall" height="20" | 70 | <button bottom_delta="-30" enabled="false" follows="left|top" height="20" label="Apply" |
74 | left="12" name="region_text_lbl" width="210"> | ||
75 | Deny Access on Payment Status: | ||
76 | </text> | ||
77 | <check_box bottom_delta="-16" follows="left|top" height="20" | ||
78 | label="Deny No Payment Info On File" left="12" name="deny_anonymous" | ||
79 | width="80" /> | ||
80 | <check_box bottom_delta="-18" follows="left|top" height="20" | ||
81 | label="Deny Payment Info On File" left="12" name="deny_identified" | ||
82 | width="80" /> | ||
83 | <check_box bottom_delta="-18" follows="left|top" height="20" | ||
84 | label="Deny Payment Info Used" left="12" name="deny_transacted" width="80" /> | ||
85 | <text bottom_delta="-23" follows="left|top" height="20" | ||
86 | left="15" name="abuse_email_text" width="100" visible="false"> | ||
87 | [Abuse E-mail Beta] | ||
88 | </text> | ||
89 | <button bottom_delta="-8" enabled="false" follows="left|top" height="20" label="Apply" | ||
90 | right="250" name="apply_btn" width="90" /> | 71 | right="250" name="apply_btn" width="90" /> |
91 | 72 | ||
92 | 73 | ||
93 | <button bottom="-468" enabled="true" follows="left|top" height="20" | 74 | <button bottom="-468" enabled="true" follows="left|top" height="20" |
94 | label="Kick User from Estate..." left="8" | 75 | label="Kick User from Estate..." left="8" |
95 | name="kick_user_from_estate_btn" width="250" /> | 76 | name="kick_user_from_estate_btn" width="250" /> |
96 | <button bottom_delta="23" follows="left|top" height="20" | 77 | <button bottom_delta="23" follows="left|top" height="20" |
97 | label="Send Message To Estate..." left="8" name="message_estate_btn" | 78 | label="Send Message To Estate..." left="8" name="message_estate_btn" |
98 | width="250" /> | 79 | width="250" /> |
99 | 80 | ||
diff --git a/linden/indra/newview/skins/xui/en-us/teleport_strings.xml b/linden/indra/newview/skins/xui/en-us/teleport_strings.xml index 80b5cc4..feac150 100644 --- a/linden/indra/newview/skins/xui/en-us/teleport_strings.xml +++ b/linden/indra/newview/skins/xui/en-us/teleport_strings.xml | |||
@@ -3,53 +3,53 @@ | |||
3 | <message_set name="errors"> | 3 | <message_set name="errors"> |
4 | <message name="invalid_tport"> | 4 | <message name="invalid_tport"> |
5 | Problem encountered processing your teleport request. You may | 5 | Problem encountered processing your teleport request. You may |
6 | need to log back in before you can teleport. If you continue | 6 | need to log back in before you can teleport. If you continue |
7 | to get this message, please check the Tech Support FAQ at: | 7 | to get this message, please check the Tech Support FAQ at: |
8 | www.secondlife.com/support | 8 | www.secondlife.com/support |
9 | </message> | 9 | </message> |
10 | <message name="invalid_region_handoff"> | 10 | <message name="invalid_region_handoff"> |
11 | Problem encountered processing your region crossing. You may | 11 | Problem encountered processing your region crossing. You may |
12 | need to log back in before you can cross regions. If you continue | 12 | need to log back in before you can cross regions. If you continue |
13 | to get this message, please check the Tech Support FAQ at: | 13 | to get this message, please check the Tech Support FAQ at: |
14 | www.secondlife.com/support. | 14 | www.secondlife.com/support. |
15 | </message> | 15 | </message> |
16 | <message name="blocked_tport"> | 16 | <message name="blocked_tport"> |
17 | Sorry, teleport is currently blocked. Try again in a moment. | 17 | Sorry, teleport is currently blocked. Try again in a moment. |
18 | If you still cannot teleport, please log out and log back in to | 18 | If you still cannot teleport, please log out and log back in to |
19 | resolve the problem. | 19 | resolve the problem. |
20 | </message> | 20 | </message> |
21 | <message name="nolandmark_tport"> | 21 | <message name="nolandmark_tport"> |
22 | Sorry, but system was unable to locate landmark destination. | 22 | Sorry, but system was unable to locate landmark destination. |
23 | </message> | 23 | </message> |
24 | <message name="timeout_tport"> | 24 | <message name="timeout_tport"> |
25 | Sorry, but system was unable to complete the teleport connection. | 25 | Sorry, but system was unable to complete the teleport connection. |
26 | Try again in a moment. | 26 | Try again in a moment. |
27 | </message> | 27 | </message> |
28 | <message name="noaccess_tport"> | 28 | <message name="noaccess_tport"> |
29 | Sorry, you do not have access to that teleport destination. | 29 | Sorry, you do not have access to that teleport destination. |
30 | </message> | 30 | </message> |
31 | <message name="missing_attach_tport"> | 31 | <message name="missing_attach_tport"> |
32 | Your attachments have not arrived yet. Try waiting for a few | 32 | Your attachments have not arrived yet. Try waiting for a few |
33 | more seconds or log out and back in again before attempting | 33 | more seconds or log out and back in again before attempting |
34 | to teleport. | 34 | to teleport. |
35 | </message> | 35 | </message> |
36 | <message name="too_many_uploads_tport"> | 36 | <message name="too_many_uploads_tport"> |
37 | The asset queue in this region is currently clogged so your teleport | 37 | The asset queue in this region is currently clogged so your teleport |
38 | request will not be able to succeed in a timely manner. Please try again | 38 | request will not be able to succeed in a timely manner. Please try again |
39 | in a few minutes or go to a less busy area. | 39 | in a few minutes or go to a less busy area. |
40 | </message> | 40 | </message> |
41 | <message name="expired_tport"> | 41 | <message name="expired_tport"> |
42 | Sorry, but the system was unable to complete your teleport request | 42 | Sorry, but the system was unable to complete your teleport request |
43 | in a timely fashion. Please try again in a few minutes. | 43 | in a timely fashion. Please try again in a few minutes. |
44 | </message> | 44 | </message> |
45 | <message name="expired_region_handoff"> | 45 | <message name="expired_region_handoff"> |
46 | Sorry, but the system was unable to complete your region crossing | 46 | Sorry, but the system was unable to complete your region crossing |
47 | in a timely fashion. Please try again in a few minutes. | 47 | in a timely fashion. Please try again in a few minutes. |
48 | </message> | 48 | </message> |
49 | <message name="no_host"> | 49 | <message name="no_host"> |
50 | Unable to find teleport destination. The destination may be | 50 | Unable to find teleport destination. The destination may be |
51 | temporarily unavailable or no longer exists. Please try again | 51 | temporarily unavailable or no longer exists. Please try again |
52 | in a few minutes. | 52 | in a few minutes. |
53 | </message> | 53 | </message> |
54 | <message name="no_inventory_host"> | 54 | <message name="no_inventory_host"> |
55 | The inventory system is currently unavailable. | 55 | The inventory system is currently unavailable. |
diff --git a/linden/indra/newview/skins/xui/es/panel_login.xml b/linden/indra/newview/skins/xui/es/panel_login.xml index d2e60bd..d1d949b 100644 --- a/linden/indra/newview/skins/xui/es/panel_login.xml +++ b/linden/indra/newview/skins/xui/es/panel_login.xml | |||
@@ -1,40 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | 1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> |
2 | <panel name="panel_login"> | 2 | <panel name="panel_login"> |
3 | <text name="real_url"> | 3 | <text name="real_url"> |
4 | http://secondlife.com/app/login/ | 4 | https://secondlife.com/app/login/es/?show_login_form=True |
5 | </text> | ||
6 | <text name="first_name_text"> | ||
7 | Nombre de pila: | ||
8 | </text> | ||
9 | <text name="last_name_text"> | ||
10 | Apellido: | ||
11 | </text> | ||
12 | <text name="password_text"> | ||
13 | Contraseña: | ||
14 | </text> | ||
15 | <text name="start_location_text"> | ||
16 | Local de inicio: | ||
17 | </text> | ||
18 | <combo_box name="start_location_combo"> | ||
19 | <combo_item name="MyHome"> | ||
20 | Mi casa | ||
21 | </combo_item> | ||
22 | <combo_item name="MyLastLocation"> | ||
23 | Mi última posición | ||
24 | </combo_item> | ||
25 | <combo_item name="<Typeregionname>"> | ||
26 | <Teclee un nombre de región> | ||
27 | </combo_item> | ||
28 | </combo_box> | ||
29 | <check_box label="Recordar contraseña" name="remember_check" /> | ||
30 | <text name="full_screen_text"> | ||
31 | Exhibirá en pantalla completa cuando la sesión sea iniciada. | ||
32 | </text> | ||
33 | <button label="Nueva Cuenta..." label_selected="Nueva Cuenta..." name="new_account_btn" /> | ||
34 | <button label="Preferencias..." label_selected="Preferencias..." name="preferences_btn" /> | ||
35 | <button label="Conectar" label_selected="Conectar" name="connect_btn" /> | ||
36 | <button label="Salir" label_selected="Salir" name="quit_btn" /> | ||
37 | <text name="version_text"> | ||
38 | 1.23.4 (5) | ||
39 | </text> | 5 | </text> |
40 | </panel> | 6 | </panel> |
diff --git a/linden/indra/newview/skins/xui/fr/panel_login.xml b/linden/indra/newview/skins/xui/fr/panel_login.xml index c8d237b..40d9268 100644 --- a/linden/indra/newview/skins/xui/fr/panel_login.xml +++ b/linden/indra/newview/skins/xui/fr/panel_login.xml | |||
@@ -1,42 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | 1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> |
2 | <panel name="panel_login"> | 2 | <panel name="panel_login"> |
3 | <text name="real_url"> | 3 | <text name="real_url"> |
4 | http://secondlife.com/app/login/ | 4 | https://secondlife.com/app/login/fr/?show_login_form=True |
5 | </text> | ||
6 | <text name="first_name_text"> | ||
7 | Prénom : | ||
8 | </text> | ||
9 | <text name="last_name_text"> | ||
10 | Nom : | ||
11 | </text> | ||
12 | <text name="password_text"> | ||
13 | Mot de passe : | ||
14 | </text> | ||
15 | <text name="start_location_text"> | ||
16 | Lieu d'arrivée : | ||
17 | </text> | ||
18 | <combo_box name="start_location_combo"> | ||
19 | <combo_item name="MyHome"> | ||
20 | Mon domicile | ||
21 | </combo_item> | ||
22 | <combo_item name="MyLastLocation"> | ||
23 | Dernier lieu visité | ||
24 | </combo_item> | ||
25 | <combo_item name="<Typeregionname>"> | ||
26 | <Choisir région> | ||
27 | </combo_item> | ||
28 | </combo_box> | ||
29 | <check_box label="Mémoriser" name="remember_check" /> | ||
30 | <text name="full_screen_text"> | ||
31 | Le plein écran sera activé après identification. | ||
32 | </text> | ||
33 | <button label="Nouveau Compte..." label_selected="Nouveau Compte..." | ||
34 | name="new_account_btn" /> | ||
35 | <button label="Se connecter" label_selected="Se connecter" name="connect_btn" /> | ||
36 | <button label="Préférences..." label_selected="Préférences..." | ||
37 | name="preferences_btn" /> | ||
38 | <button label="Quitter" label_selected="Quitter" name="quit_btn" /> | ||
39 | <text name="version_text"> | ||
40 | 1.23.4 (5) | ||
41 | </text> | 5 | </text> |
42 | </panel> | 6 | </panel> |
diff --git a/linden/indra/newview/skins/xui/ja/LCD_text.xml b/linden/indra/newview/skins/xui/ja/LCD_text.xml new file mode 100644 index 0000000..534f303 --- /dev/null +++ b/linden/indra/newview/skins/xui/ja/LCD_text.xml | |||
@@ -0,0 +1,75 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <panel name="panel_login"> | ||
3 | <text name="DebugInfo"> | ||
4 | デãƒãƒƒã‚°æƒ…å ± | ||
5 | </text> | ||
6 | <text name="FPS"> | ||
7 | FPS | ||
8 | </text> | ||
9 | <text name="SimFPS"> | ||
10 | シムFPS | ||
11 | </text> | ||
12 | <text name="Pin"> | ||
13 | å—ä¿¡ | ||
14 | </text> | ||
15 | <text name="Pout"> | ||
16 | é€ä¿¡ | ||
17 | </text> | ||
18 | <text name="PLoss"> | ||
19 | パケットãƒã‚¹ | ||
20 | </text> | ||
21 | <text name="Ping"> | ||
22 | Ping | ||
23 | </text> | ||
24 | <text name="AccountDetails"> | ||
25 | アカウントã®è©³ç´° | ||
26 | </text> | ||
27 | <text name="LBal"> | ||
28 | L$残高 | ||
29 | </text> | ||
30 | <text name="Time"> | ||
31 | 時間 | ||
32 | </text> | ||
33 | <text name="LocationDetails1"> | ||
34 | 所在地ã®è©³ç´° 1 | ||
35 | </text> | ||
36 | <text name="LocationDetails2"> | ||
37 | 所在地ã®è©³ç´° 2 | ||
38 | </text> | ||
39 | <text name="Region"> | ||
40 | 地域 | ||
41 | </text> | ||
42 | <text name="Parcel"> | ||
43 | 区画 | ||
44 | </text> | ||
45 | <text name="Pos"> | ||
46 | ï¾Žï¾Ÿï½¼ï¾žï½¼ï½®ï¾ | ||
47 | </text> | ||
48 | <text name="Sqm"> | ||
49 | 平方ã | ||
50 | </text> | ||
51 | <text name="Owner"> | ||
52 | 所有者 | ||
53 | </text> | ||
54 | <text name="Type"> | ||
55 | タイプ | ||
56 | </text> | ||
57 | <text name="Yes"> | ||
58 | ã¯ã„ | ||
59 | </text> | ||
60 | <text name="No"> | ||
61 | ã„ã„㈠| ||
62 | </text> | ||
63 | <text name="Forsale"> | ||
64 | å£²å‡ºä¸ | ||
65 | </text> | ||
66 | <text name="Traffic"> | ||
67 | äº¤é€šé‡ | ||
68 | </text> | ||
69 | <text name="Last3ChatLines"> | ||
70 | ç›´è¿‘ã®ãƒãƒ£ãƒƒãƒˆå…ˆ3ä»¶ | ||
71 | </text> | ||
72 | <text name="Last3IMLines"> | ||
73 | ç›´è¿‘ã®IMå…ˆ3ä»¶ | ||
74 | </text> | ||
75 | </panel> | ||
diff --git a/linden/indra/newview/skins/xui/ja/floater_landmark_ctrl.xml b/linden/indra/newview/skins/xui/ja/floater_landmark_ctrl.xml new file mode 100644 index 0000000..46107e7 --- /dev/null +++ b/linden/indra/newview/skins/xui/ja/floater_landmark_ctrl.xml | |||
@@ -0,0 +1,12 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <floater name="landmarkpicker" title="æ•´ç†ï¼šãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯"> | ||
3 | <check_box label="フォルダーを表示" name="show_folders_check" /> | ||
4 | <button label="æ–°è¦" label_selected="æ–°è¦" name="New" /> | ||
5 | <button label="åå‰ã‚’ã¤ã‘ãªãŠã™" label_selected="åå‰ã‚’ã¤ã‘ãªãŠã™" | ||
6 | name="Rename" /> | ||
7 | <button label="æ–°ã—ã„フォルダー" label_selected="æ–°ã—ã„フォルダー" | ||
8 | name="NewFolder" /> | ||
9 | <button label="編集" label_selected="編集" name="Edit" /> | ||
10 | <button label="削除" label_selected="削除" name="Delete" /> | ||
11 | <button label="é–‰ã˜ã‚‹" label_selected="é–‰ã˜ã‚‹" name="Close" /> | ||
12 | </floater> | ||
diff --git a/linden/indra/newview/skins/xui/ja/floater_preview_classified.xml b/linden/indra/newview/skins/xui/ja/floater_preview_classified.xml new file mode 100644 index 0000000..c820fbf --- /dev/null +++ b/linden/indra/newview/skins/xui/ja/floater_preview_classified.xml | |||
@@ -0,0 +1,2 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <floater name="classified_preview" /> | ||
diff --git a/linden/indra/newview/skins/xui/ja/floater_preview_event.xml b/linden/indra/newview/skins/xui/ja/floater_preview_event.xml new file mode 100644 index 0000000..732e1fe --- /dev/null +++ b/linden/indra/newview/skins/xui/ja/floater_preview_event.xml | |||
@@ -0,0 +1,2 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <floater name="event_preview" /> | ||
diff --git a/linden/indra/newview/skins/xui/ja/floater_preview_url.xml b/linden/indra/newview/skins/xui/ja/floater_preview_url.xml new file mode 100644 index 0000000..fd6486c --- /dev/null +++ b/linden/indra/newview/skins/xui/ja/floater_preview_url.xml | |||
@@ -0,0 +1,2 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <floater name="url_preview" /> | ||
diff --git a/linden/indra/newview/skins/xui/ja/menu_slurl.xml b/linden/indra/newview/skins/xui/ja/menu_slurl.xml new file mode 100644 index 0000000..5007773 --- /dev/null +++ b/linden/indra/newview/skins/xui/ja/menu_slurl.xml | |||
@@ -0,0 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <menu name="Popup"> | ||
3 | <menu_item_call label="URLã«ã¤ã„ã¦" name="about_url" /> | ||
4 | <menu_item_call label="URLã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url" /> | ||
5 | <menu_item_call label="地図上ã«è¡¨ç¤º" name="show_on_map" /> | ||
6 | </menu> | ||
diff --git a/linden/indra/newview/skins/xui/ja/need_to_long.xml b/linden/indra/newview/skins/xui/ja/need_to_long.xml new file mode 100644 index 0000000..8cb33a9 --- /dev/null +++ b/linden/indra/newview/skins/xui/ja/need_to_long.xml | |||
@@ -0,0 +1,85 @@ | |||
1 | <?xml version="1.0"?> | ||
2 | <?mso-application progid="Excel.Sheet"?> | ||
3 | <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" | ||
4 | xmlns:o="urn:schemas-microsoft-com:office:office" | ||
5 | xmlns:x="urn:schemas-microsoft-com:office:excel" | ||
6 | xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" | ||
7 | xmlns:html="http://www.w3.org/TR/REC-html40"> | ||
8 | <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> | ||
9 | <LastAuthor>Leyla Farazha</LastAuthor> | ||
10 | <Created>2007-11-21T00:59:53Z</Created> | ||
11 | <LastSaved>2007-11-21T00:59:53Z</LastSaved> | ||
12 | <Version>11.6568</Version> | ||
13 | </DocumentProperties> | ||
14 | <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> | ||
15 | <WindowHeight>10230</WindowHeight> | ||
16 | <WindowWidth>22875</WindowWidth> | ||
17 | <WindowTopX>-1020</WindowTopX> | ||
18 | <WindowTopY>2280</WindowTopY> | ||
19 | <ProtectStructure>False</ProtectStructure> | ||
20 | <ProtectWindows>False</ProtectWindows> | ||
21 | </ExcelWorkbook> | ||
22 | <Styles> | ||
23 | <Style ss:ID="Default" ss:Name="Normal"> | ||
24 | <Alignment ss:Vertical="Bottom"/> | ||
25 | <Borders/> | ||
26 | <Font/> | ||
27 | <Interior/> | ||
28 | <NumberFormat/> | ||
29 | <Protection/> | ||
30 | </Style> | ||
31 | <Style ss:ID="s21"> | ||
32 | <Font ss:Bold="1"/> | ||
33 | </Style> | ||
34 | <Style ss:ID="s22"> | ||
35 | <Font ss:Bold="1"/> | ||
36 | <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/> | ||
37 | </Style> | ||
38 | <Style ss:ID="s23"> | ||
39 | <Alignment ss:Vertical="Bottom" ss:WrapText="1"/> | ||
40 | </Style> | ||
41 | </Styles> | ||
42 | <Worksheet ss:Name="need_to_long2"> | ||
43 | <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="3" x:FullColumns="1" | ||
44 | x:FullRows="1"> | ||
45 | <Column ss:Width="63.75"/> | ||
46 | <Column ss:Width="70.5"/> | ||
47 | <Column ss:Width="88.5"/> | ||
48 | <Column ss:Width="63.75"/> | ||
49 | <Column ss:Width="69.75"/> | ||
50 | <Column ss:Width="90.75"/> | ||
51 | <Column ss:Width="97.5"/> | ||
52 | <Row> | ||
53 | <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell> | ||
54 | </Row> | ||
55 | <Row> | ||
56 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell> | ||
57 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell> | ||
58 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell> | ||
59 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell> | ||
60 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell> | ||
61 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell> | ||
62 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell> | ||
63 | </Row> | ||
64 | <Row ss:Height="409.5"> | ||
65 | <Cell><Data ss:Type="String">floater_about.xml</Data></Cell> | ||
66 | <Cell><Data ss:Type="String">/floater_about/credits_editor</Data></Cell> | ||
67 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa and many others. In Memory of Jesse Malthus, you will be fondly remembered by all who heard your voice. Thank you to the following residents for helping to ensure that this is the best version yet: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard. APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. All rights reserved. See licenses.txt for details. Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) Mr. Watson -- come here -- I want to see you.</Data></Cell> | ||
68 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa and many others. In Memory of Jesse Malthus, you will be fondly remembered by all who heard your voice. Thank you to the following residents for helping to ensure that this is the best version yet: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, Preciousse Moody, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard. APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. All rights reserved. See licenses.txt for details. Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) Mr. Watson -- come here -- I want to see you.</Data></Cell> | ||
69 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life ã¯ã€Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa ã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•れã¾ã—ãŸã€‚ ã¾ãŸã€Jesse Malthus を記念ã—ã¦ä¸€è¨€ã€‚ã‚ãªãŸã®å£°ã¨ä¸€ç·’ã«ä»•事をã—ãŸå…¨ã¦ã®äººãŒã€ã‚ãªãŸã®ç´ 晴らã—ã•を忘れるã“ã¨ã¯ãªã„ã§ã—ょã†ã€‚ ã“れãŒã€ç¾åœ¨ã®æœ€é«˜ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã‚ã‚‹ã“ã¨ã‚’ä¿è¨¼ã™ã‚‹ãŸã‚ã«ã€æ”¯æ´ã—ã¦ãã‚ŒãŸæ¬¡ã®å±…ä½è€…ã®æ–¹ã€…ã«åŽšãæ„Ÿè¬ã„ãŸã—ã¾ã™ã€‚Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard. APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. All rights reserved.詳細㯠licenses.txt ã‚’ã”覧ãã ã•ã„。 Voice chat Audio coding:Polycom(R) Siren14(TM) (ITU-T Rec.G.722.1 Annex C) ワトソンã•ã‚“ -- ãœã²æ¥ã¦ãã ã•ㄠ– 会ã„ãŸã„よ。</Data></Cell> | ||
70 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life ã¯ã€Philipã€Andrewã€Tessaã€Coryã€Frankã€Jamesã€Dougã€Hunterã€Richardã€Johnã€Ericã€Aviã€AaronBã€AaronYã€Ianã€Peterã€Markã€Robinã€Stephenã€Tracyã€Ryanã€Albertoã€Haneyã€Tanyaã€JimJã€Danã€Benã€Stephanieã€Timã€Evanã€Catherineã€Colinã€Chrisã€Reubenã€Charityã€Jeskaã€Jamesã€JonHenryã€Kellyã€Callumã€Charã€Danielã€DavidFã€Donã€Jeffã€Laurenã€Leeã€Michaelã€Ramziã€Vektorã€Steveã€TomYã€Tessã€Konaã€Brentã€Clarissaã€PeterPã€Jesseã€Annetteã€Cynã€Blueã€Ginsuã€Jonathanã€Karenã€Adamã€Novaã€Deanaã€Lizzieã€Patsyã€DavidKã€Isaacã€Pathfinderã€Monroeã€Jillã€Bennyã€Altruimaã€Rheyaã€Jenniferã€Jackã€DavePã€Bradã€Mickã€Babbageã€Elisabethã€Brianã€Bethã€Dataã€Ethanã€Wendyã€Nicoleã€Skyã€Jeffreyã€Zeroã€Coffeeã€Teslaã€Kennyã€Makikoã€Nigelã€Teepleã€Lucyã€Miaã€Deeã€Guyã€Harryã€Lianaã€Brankaã€Jimboã€Auraã€Vasudaã€SarahDã€bethanyeã€Torleyã€Runitaiã€MikeSã€PaulMã€Miloã€Hermiaã€JoeMã€Melanieã€Rejeanã€DSmithã€SMillerã€Susanã€Joseã€DongYunã€Justinã€Andreyã€Syrahã€Donovanã€Henrikã€Noraã€Lexieã€ACã€Donnaã€ChrisCã€Alexã€Leylaã€Kyleã€Mathewã€Devinã€Joshuaã€DanCã€Jessicaã€Harmonyã€Claudiaã€Tramelã€Glennã€Betsyã€Fritzã€Junã€Adamã€Cassandraã€Kenã€RyanWã€Spikeã€Tofuã€Varasã€Andyã€Lukeã€RobLaã€Chiyoã€JohnZã€Dustinã€Georgeã€Delã€PeterPã€Migyeongã€Matthewã€RMullaneã€CChampionã€JTurbinã€JamesCã€Violaã€Lightfootã€Jacquiã€Sturmã€Adrianã€Buttercupã€Alfredã€Sunilã€Alfredã€Noelã€Irfanã€Jillã€Yoolã€Janeã€Yukiã€Yozã€Matthewã€Arthurã€Jenniferã€Karlã€Brianã€Benã€Janineã€Christopherã€Madhaviã€Everettã€Anthonyã€Joonã€Jakeã€seanã€Adreanneã€Stephanyã€KellyJoã€Jeremyã€Pramodã€Joshuaã€Seanã€Christopherã€Amyã€Cerenã€Katherineã€jonã€Sudheendraã€Jamesã€Stephanã€Kariã€Karticã€Toddã€Thomasã€Jokiã€Rebeccaã€Belindaã€Bertã€Rogerã€Bridieã€Kristiã€Brianã€Mariaã€Johnã€Aricã€Nathanelã€Melindaã€Darrellã€Jenniferã€Sandyã€Gregã€Robã€Bradã€Chrisã€Ericã€Palmerã€Asiã€Katjaã€Lisaã€Mindaã€Jenã€Aaronã€Bryanã€Markã€Jonathanã€Jamieã€Laurelã€Williamã€Matthewã€Steveã€Davidã€Remyã€Jamesã€Timã€Leeã€Brianã€Ashleiã€Samã€Mikeã€Ethanã€Austinã€Wandaã€Paulã€Brianã€Rachelã€Valentynã€Emma Williamsã€Autumã€Stevenã€Laleyã€Charlesã€Jessicaã€Sueã€Gillianã€CGã€Kipã€Kristenã€Shamiranã€Blakeã€Brettã€Ericaã€Kentã€Joelã€Plexusã€Twilightã€Joppa ã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•れã¾ã—ãŸã€‚ åœ¨ã‚Šã—æ—¥ã® Jesse Malthus ã‚’å²ã‚“ã§ä¸€è¨€ã€‚ã‚ãªãŸã¨å‡ºä¼šã£ãŸå…¨ã¦ã®äººãŒã€ã‚ãªãŸã®ç´ 晴らã—ã•を忘れるã“ã¨ã¯ãªã„ã§ã—ょã†ã€‚ ç¾åœ¨ã®æœ€é«˜ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã‚ã‚‹ã“ã¨ã‚’ä¿è¨¼ã™ã‚‹ãŸã‚ã«ã€æ”¯æ´ã—ã¦ãれãŸä½äººã®ã¿ãªã•ã‚“ã«åŽšãæ„Ÿè¬ã„ãŸã—ã¾ã™ã€‚Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard. APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. All rights reserved.詳細㯠licenses.txt ã‚’ã”覧ãã ã•ã„。 Voice chat Audio coding:Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) ワトソンå›ã€ã¡ã‚‡ã£ã¨æ¥ã¦ãれãŸã¾ãˆã€‚</Data></Cell> | ||
71 | </Row> | ||
72 | </Table> | ||
73 | <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> | ||
74 | <Selected/> | ||
75 | <Panes> | ||
76 | <Pane> | ||
77 | <Number>3</Number> | ||
78 | <ActiveRow>2</ActiveRow> | ||
79 | </Pane> | ||
80 | </Panes> | ||
81 | <ProtectObjects>False</ProtectObjects> | ||
82 | <ProtectScenarios>False</ProtectScenarios> | ||
83 | </WorksheetOptions> | ||
84 | </Worksheet> | ||
85 | </Workbook> | ||
diff --git a/linden/indra/newview/skins/xui/ja/need_to_translate.xml b/linden/indra/newview/skins/xui/ja/need_to_translate.xml new file mode 100644 index 0000000..75eceb5 --- /dev/null +++ b/linden/indra/newview/skins/xui/ja/need_to_translate.xml | |||
@@ -0,0 +1,1059 @@ | |||
1 | <?xml version="1.0"?> | ||
2 | <?mso-application progid="Excel.Sheet"?> | ||
3 | <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" | ||
4 | xmlns:o="urn:schemas-microsoft-com:office:office" | ||
5 | xmlns:x="urn:schemas-microsoft-com:office:excel" | ||
6 | xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" | ||
7 | xmlns:html="http://www.w3.org/TR/REC-html40"> | ||
8 | <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> | ||
9 | <LastAuthor>Leyla Farazha</LastAuthor> | ||
10 | <Created>2007-11-21T00:54:56Z</Created> | ||
11 | <LastSaved>2007-11-21T00:54:56Z</LastSaved> | ||
12 | <Version>11.6568</Version> | ||
13 | </DocumentProperties> | ||
14 | <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> | ||
15 | <WindowHeight>10230</WindowHeight> | ||
16 | <WindowWidth>22875</WindowWidth> | ||
17 | <WindowTopX>-1380</WindowTopX> | ||
18 | <WindowTopY>330</WindowTopY> | ||
19 | <ProtectStructure>False</ProtectStructure> | ||
20 | <ProtectWindows>False</ProtectWindows> | ||
21 | </ExcelWorkbook> | ||
22 | <Styles> | ||
23 | <Style ss:ID="Default" ss:Name="Normal"> | ||
24 | <Alignment ss:Vertical="Bottom"/> | ||
25 | <Borders/> | ||
26 | <Font/> | ||
27 | <Interior/> | ||
28 | <NumberFormat/> | ||
29 | <Protection/> | ||
30 | </Style> | ||
31 | <Style ss:ID="s21"> | ||
32 | <Font ss:Bold="1"/> | ||
33 | </Style> | ||
34 | <Style ss:ID="s22"> | ||
35 | <Font ss:Bold="1"/> | ||
36 | <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/> | ||
37 | </Style> | ||
38 | </Styles> | ||
39 | <Worksheet ss:Name="need_to_translate2"> | ||
40 | <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="155" x:FullColumns="1" | ||
41 | x:FullRows="1"> | ||
42 | <Column ss:Width="63.75"/> | ||
43 | <Column ss:Width="70.5"/> | ||
44 | <Column ss:Width="88.5"/> | ||
45 | <Column ss:Width="63.75"/> | ||
46 | <Column ss:Width="69.75"/> | ||
47 | <Column ss:Width="90.75"/> | ||
48 | <Column ss:Width="97.5"/> | ||
49 | <Row> | ||
50 | <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell> | ||
51 | </Row> | ||
52 | <Row> | ||
53 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell> | ||
54 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell> | ||
55 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell> | ||
56 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell> | ||
57 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell> | ||
58 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell> | ||
59 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell> | ||
60 | </Row> | ||
61 | <Row> | ||
62 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
63 | <Cell><Data ss:Type="String">//skipnexttime</Data></Cell> | ||
64 | <Cell ss:Index="5"><Data ss:Type="String">Don't show me this again</Data></Cell> | ||
65 | <Cell ss:Index="7"><Data ss:Type="String">今後ã¯è¡¨ç¤ºã—ãªã„</Data></Cell> | ||
66 | </Row> | ||
67 | <Row> | ||
68 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
69 | <Cell><Data ss:Type="String">//alwayschoose</Data></Cell> | ||
70 | <Cell ss:Index="5"><Data ss:Type="String">Always choose this option</Data></Cell> | ||
71 | <Cell ss:Index="7"><Data ss:Type="String">常ã«ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠž</Data></Cell> | ||
72 | </Row> | ||
73 | <Row> | ||
74 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
75 | <Cell><Data ss:Type="String">//TeleportFromLandmark/message</Data></Cell> | ||
76 | <Cell ss:Index="5"><Data ss:Type="String">Are you sure you want to teleport?</Data></Cell> | ||
77 | <Cell ss:Index="7"><Data ss:Type="String">本当ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹?</Data></Cell> | ||
78 | </Row> | ||
79 | <Row> | ||
80 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
81 | <Cell><Data ss:Type="String">//TeleportFromLandmark/ignore</Data></Cell> | ||
82 | <Cell ss:Index="5"><Data ss:Type="String">When teleporting from a landmark in inventory</Data></Cell> | ||
83 | <Cell ss:Index="7"><Data ss:Type="String">æŒã¡ç‰©ã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹æ™‚</Data></Cell> | ||
84 | </Row> | ||
85 | <Row> | ||
86 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
87 | <Cell><Data ss:Type="String">//TeleportFromLandmark/Teleport</Data></Cell> | ||
88 | <Cell ss:Index="5"><Data ss:Type="String">Teleport</Data></Cell> | ||
89 | <Cell ss:Index="7"><Data ss:Type="String">テレãƒãƒ¼ãƒˆ</Data></Cell> | ||
90 | </Row> | ||
91 | <Row> | ||
92 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
93 | <Cell><Data ss:Type="String">//TeleportFromLandmark/Cancel</Data></Cell> | ||
94 | <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell> | ||
95 | <Cell ss:Index="7"><Data ss:Type="String">ã‚ャンセル</Data></Cell> | ||
96 | </Row> | ||
97 | <Row> | ||
98 | <Cell><Data ss:Type="String">floater_active_speakers.xml</Data></Cell> | ||
99 | <Cell><Data ss:Type="String">/active_speakers/active_speakers_panel/speakers_list/speaking_status</Data></Cell> | ||
100 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
101 | </Row> | ||
102 | <Row> | ||
103 | <Cell><Data ss:Type="String">floater_chatterbox.xml</Data></Cell> | ||
104 | <Cell><Data ss:Type="String">/floater_chatterbox</Data></Cell> | ||
105 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
106 | <Cell ss:Index="5"><Data ss:Type="String">Communicate</Data></Cell> | ||
107 | <Cell ss:Index="7"><Data ss:Type="String">コミュニケーション</Data></Cell> | ||
108 | </Row> | ||
109 | <Row> | ||
110 | <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell> | ||
111 | <Cell><Data ss:Type="String">/chat floater/ringing</Data></Cell> | ||
112 | <Cell ss:Index="5"><Data ss:Type="String">Connecting to in-world Voice Chat...</Data></Cell> | ||
113 | <Cell ss:Index="7"><Data ss:Type="String">インワールドボイスãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸ï¼Žï¼Žï¼Ž</Data></Cell> | ||
114 | </Row> | ||
115 | <Row> | ||
116 | <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell> | ||
117 | <Cell><Data ss:Type="String">/chat floater/connected</Data></Cell> | ||
118 | <Cell ss:Index="5"><Data ss:Type="String">Connected</Data></Cell> | ||
119 | <Cell ss:Index="7"><Data ss:Type="String">接続ã—ã¾ã—ãŸ</Data></Cell> | ||
120 | </Row> | ||
121 | <Row> | ||
122 | <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell> | ||
123 | <Cell><Data ss:Type="String">/chat floater/hang_up</Data></Cell> | ||
124 | <Cell ss:Index="5"><Data ss:Type="String">Disconnected from in-world Voice Chat</Data></Cell> | ||
125 | <Cell ss:Index="7"><Data ss:Type="String">インワールドボイスãƒãƒ£ãƒƒãƒˆã®é€šè©±ãŒåˆ‡æ–ã•れã¾ã—ãŸ</Data></Cell> | ||
126 | </Row> | ||
127 | <Row> | ||
128 | <Cell><Data ss:Type="String">floater_device_settings.xml</Data></Cell> | ||
129 | <Cell><Data ss:Type="String">/floater_device_settings</Data></Cell> | ||
130 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
131 | <Cell ss:Index="5"><Data ss:Type="String">Voice Chat Device Settings</Data></Cell> | ||
132 | <Cell ss:Index="7"><Data ss:Type="String">ボイスãƒãƒ£ãƒƒãƒˆæ©Ÿå™¨ã®è¨å®š</Data></Cell> | ||
133 | </Row> | ||
134 | <Row> | ||
135 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
136 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel</Data></Cell> | ||
137 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
138 | <Cell ss:Index="5"><Data ss:Type="String">All</Data></Cell> | ||
139 | <Cell ss:Index="7"><Data ss:Type="String">å…¨ã¦</Data></Cell> | ||
140 | </Row> | ||
141 | <Row> | ||
142 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
143 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/back_btn</Data></Cell> | ||
144 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
145 | <Cell ss:Index="5"><Data ss:Type="String">Back</Data></Cell> | ||
146 | <Cell ss:Index="7"><Data ss:Type="String">戻る</Data></Cell> | ||
147 | </Row> | ||
148 | <Row> | ||
149 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
150 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/forward_btn</Data></Cell> | ||
151 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
152 | <Cell ss:Index="5"><Data ss:Type="String">Forward</Data></Cell> | ||
153 | <Cell ss:Index="7"><Data ss:Type="String">進む</Data></Cell> | ||
154 | </Row> | ||
155 | <Row> | ||
156 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
157 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_editor</Data></Cell> | ||
158 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
159 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
160 | <Cell ss:Index="7"><Data ss:Type="String">検索</Data></Cell> | ||
161 | </Row> | ||
162 | <Row> | ||
163 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
164 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_editor</Data></Cell> | ||
165 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
166 | <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell> | ||
167 | <Cell ss:Index="7"><Data ss:Type="String">Second Lifeを検索</Data></Cell> | ||
168 | </Row> | ||
169 | <Row> | ||
170 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
171 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_btn</Data></Cell> | ||
172 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
173 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
174 | <Cell ss:Index="7"><Data ss:Type="String">検索</Data></Cell> | ||
175 | </Row> | ||
176 | <Row> | ||
177 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
178 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/AnyCategory</Data></Cell> | ||
179 | <Cell ss:Index="5"><Data ss:Type="String">Any Category</Data></Cell> | ||
180 | <Cell ss:Index="7"><Data ss:Type="String">全カテゴリー</Data></Cell> | ||
181 | </Row> | ||
182 | <Row> | ||
183 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
184 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Classifieds</Data></Cell> | ||
185 | <Cell ss:Index="5"><Data ss:Type="String">Classifieds</Data></Cell> | ||
186 | <Cell ss:Index="7"><Data ss:Type="String">クラシファイド広告</Data></Cell> | ||
187 | </Row> | ||
188 | <Row> | ||
189 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
190 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Events</Data></Cell> | ||
191 | <Cell ss:Index="5"><Data ss:Type="String">Events</Data></Cell> | ||
192 | <Cell ss:Index="7"><Data ss:Type="String">イベント</Data></Cell> | ||
193 | </Row> | ||
194 | <Row> | ||
195 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
196 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Groups</Data></Cell> | ||
197 | <Cell ss:Index="5"><Data ss:Type="String">Groups</Data></Cell> | ||
198 | <Cell ss:Index="7"><Data ss:Type="String">グループ</Data></Cell> | ||
199 | </Row> | ||
200 | <Row> | ||
201 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
202 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/People</Data></Cell> | ||
203 | <Cell ss:Index="5"><Data ss:Type="String">People</Data></Cell> | ||
204 | <Cell ss:Index="7"><Data ss:Type="String">人々</Data></Cell> | ||
205 | </Row> | ||
206 | <Row> | ||
207 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
208 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Places</Data></Cell> | ||
209 | <Cell ss:Index="5"><Data ss:Type="String">Places</Data></Cell> | ||
210 | <Cell ss:Index="7"><Data ss:Type="String">å ´æ‰€</Data></Cell> | ||
211 | </Row> | ||
212 | <Row> | ||
213 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
214 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Wiki</Data></Cell> | ||
215 | <Cell ss:Index="5"><Data ss:Type="String">Wiki</Data></Cell> | ||
216 | <Cell ss:Index="7"><Data ss:Type="String">Wiki</Data></Cell> | ||
217 | </Row> | ||
218 | <Row> | ||
219 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
220 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/mature_check</Data></Cell> | ||
221 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
222 | <Cell ss:Index="5"><Data ss:Type="String">Include Mature content</Data></Cell> | ||
223 | <Cell ss:Index="7"><Data ss:Type="String">æˆäººå‘ã‘コンテンツをå«ã‚€</Data></Cell> | ||
224 | </Row> | ||
225 | <Row> | ||
226 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
227 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/loading_text</Data></Cell> | ||
228 | <Cell ss:Index="5"><Data ss:Type="String">Loading...</Data></Cell> | ||
229 | <Cell ss:Index="7"><Data ss:Type="String">ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ä¸...</Data></Cell> | ||
230 | </Row> | ||
231 | <Row> | ||
232 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
233 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/done_text</Data></Cell> | ||
234 | <Cell ss:Index="5"><Data ss:Type="String">Done</Data></Cell> | ||
235 | <Cell ss:Index="7"><Data ss:Type="String">完了</Data></Cell> | ||
236 | </Row> | ||
237 | <Row> | ||
238 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
239 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel</Data></Cell> | ||
240 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
241 | <Cell ss:Index="5"><Data ss:Type="String">All (old)</Data></Cell> | ||
242 | <Cell ss:Index="7"><Data ss:Type="String">å…¨(æ—§)</Data></Cell> | ||
243 | </Row> | ||
244 | <Row> | ||
245 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
246 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/< Prev</Data></Cell> | ||
247 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
248 | <Cell ss:Index="5"><Data ss:Type="String">< Prev</Data></Cell> | ||
249 | <Cell ss:Index="7"><Data ss:Type="String"><戻る</Data></Cell> | ||
250 | </Row> | ||
251 | <Row> | ||
252 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
253 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/< Prev</Data></Cell> | ||
254 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
255 | <Cell ss:Index="5"><Data ss:Type="String">< Prev</Data></Cell> | ||
256 | <Cell ss:Index="7"><Data ss:Type="String"><戻る</Data></Cell> | ||
257 | </Row> | ||
258 | <Row> | ||
259 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
260 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Next ></Data></Cell> | ||
261 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
262 | <Cell ss:Index="5"><Data ss:Type="String">Next ></Data></Cell> | ||
263 | <Cell ss:Index="7"><Data ss:Type="String">次ã¸ï¼ž</Data></Cell> | ||
264 | </Row> | ||
265 | <Row> | ||
266 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
267 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Next ></Data></Cell> | ||
268 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
269 | <Cell ss:Index="5"><Data ss:Type="String">Next ></Data></Cell> | ||
270 | <Cell ss:Index="7"><Data ss:Type="String">次ã¸ï¼ž</Data></Cell> | ||
271 | </Row> | ||
272 | <Row> | ||
273 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
274 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/find</Data></Cell> | ||
275 | <Cell ss:Index="5"><Data ss:Type="String">Find:</Data></Cell> | ||
276 | <Cell ss:Index="7"><Data ss:Type="String">検索</Data></Cell> | ||
277 | </Row> | ||
278 | <Row> | ||
279 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
280 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Search</Data></Cell> | ||
281 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
282 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
283 | <Cell ss:Index="7"><Data ss:Type="String">検索</Data></Cell> | ||
284 | </Row> | ||
285 | <Row> | ||
286 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
287 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Search</Data></Cell> | ||
288 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
289 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
290 | <Cell ss:Index="7"><Data ss:Type="String">検索</Data></Cell> | ||
291 | </Row> | ||
292 | <Row> | ||
293 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
294 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/incmature</Data></Cell> | ||
295 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
296 | <Cell ss:Index="5"><Data ss:Type="String">Include Mature content</Data></Cell> | ||
297 | <Cell ss:Index="7"><Data ss:Type="String">æˆäººå‘ã‘コンテンツをå«ã‚€</Data></Cell> | ||
298 | </Row> | ||
299 | <Row> | ||
300 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
301 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/icon</Data></Cell> | ||
302 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
303 | </Row> | ||
304 | <Row> | ||
305 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
306 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/name</Data></Cell> | ||
307 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
308 | <Cell ss:Index="5"><Data ss:Type="String">Name</Data></Cell> | ||
309 | <Cell ss:Index="7"><Data ss:Type="String">åå‰</Data></Cell> | ||
310 | </Row> | ||
311 | <Row> | ||
312 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
313 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/price</Data></Cell> | ||
314 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
315 | <Cell ss:Index="5"><Data ss:Type="String">Price</Data></Cell> | ||
316 | <Cell ss:Index="7"><Data ss:Type="String">ä¾¡æ ¼</Data></Cell> | ||
317 | </Row> | ||
318 | <Row> | ||
319 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
320 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/date</Data></Cell> | ||
321 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
322 | <Cell ss:Index="5"><Data ss:Type="String">Time (PT)</Data></Cell> | ||
323 | <Cell ss:Index="7"><Data ss:Type="String">時間(太平洋時間)</Data></Cell> | ||
324 | </Row> | ||
325 | <Row> | ||
326 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
327 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/time</Data></Cell> | ||
328 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
329 | <Cell ss:Index="5"><Data ss:Type="String">Time</Data></Cell> | ||
330 | <Cell ss:Index="7"><Data ss:Type="String">時間</Data></Cell> | ||
331 | </Row> | ||
332 | <Row> | ||
333 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
334 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/dwell</Data></Cell> | ||
335 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
336 | <Cell ss:Index="5"><Data ss:Type="String">Traffic</Data></Cell> | ||
337 | <Cell ss:Index="7"><Data ss:Type="String">交通é‡</Data></Cell> | ||
338 | </Row> | ||
339 | <Row> | ||
340 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
341 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/area</Data></Cell> | ||
342 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
343 | <Cell ss:Index="5"><Data ss:Type="String">Area</Data></Cell> | ||
344 | <Cell ss:Index="7"><Data ss:Type="String">é¢ç©</Data></Cell> | ||
345 | </Row> | ||
346 | <Row> | ||
347 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
348 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/per_meter</Data></Cell> | ||
349 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
350 | <Cell ss:Index="5"><Data ss:Type="String">L$/sq.m</Data></Cell> | ||
351 | <Cell ss:Index="7"><Data ss:Type="String">L$ï¼å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«</Data></Cell> | ||
352 | </Row> | ||
353 | <Row> | ||
354 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
355 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/online</Data></Cell> | ||
356 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
357 | <Cell ss:Index="5"><Data ss:Type="String">Online</Data></Cell> | ||
358 | <Cell ss:Index="7"><Data ss:Type="String">オンライン</Data></Cell> | ||
359 | </Row> | ||
360 | <Row> | ||
361 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
362 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/members</Data></Cell> | ||
363 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
364 | <Cell ss:Index="5"><Data ss:Type="String">Members</Data></Cell> | ||
365 | <Cell ss:Index="7"><Data ss:Type="String">メンãƒãƒ¼</Data></Cell> | ||
366 | </Row> | ||
367 | <Row> | ||
368 | <Cell><Data ss:Type="String">floater_groups.xml</Data></Cell> | ||
369 | <Cell><Data ss:Type="String">/groups/group list/name</Data></Cell> | ||
370 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
371 | </Row> | ||
372 | <Row> | ||
373 | <Cell><Data ss:Type="String">floater_im.xml</Data></Cell> | ||
374 | <Cell><Data ss:Type="String">/im_floater/invite_message</Data></Cell> | ||
375 | <Cell ss:Index="5"><Data ss:Type="String">Click the [BUTTON NAME] button to accept/connect to this voice chat.</Data></Cell> | ||
376 | <Cell ss:Index="7"><Data ss:Type="String">ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç”/接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME]をクリックã—ã¦ãã ã•ã„。</Data></Cell> | ||
377 | </Row> | ||
378 | <Row> | ||
379 | <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell> | ||
380 | <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell> | ||
381 | <Cell ss:Index="5"><Data ss:Type="String">Calling...</Data></Cell> | ||
382 | <Cell ss:Index="7"><Data ss:Type="String">ã‹ã‘ã¦ã„ã¾ã™Âc</Data></Cell> | ||
383 | </Row> | ||
384 | <Row> | ||
385 | <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell> | ||
386 | <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell> | ||
387 | <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell> | ||
388 | <Cell ss:Index="7"><Data ss:Type="String">接続ã—ã¾ã—ãŸã€é€šè©±ã‚’終了ã™ã‚‹å ´åˆã¯ã€Œé€šè©±ã®çµ‚了ã€ã‚’クリックã—ã¦ãã ã•ã„。</Data></Cell> | ||
389 | </Row> | ||
390 | <Row> | ||
391 | <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell> | ||
392 | <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell> | ||
393 | <Cell ss:Index="5"><Data ss:Type="String">Call ended</Data></Cell> | ||
394 | <Cell ss:Index="7"><Data ss:Type="String">通話ãŒçµ‚了ã—ã¾ã—ãŸ</Data></Cell> | ||
395 | </Row> | ||
396 | <Row> | ||
397 | <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell> | ||
398 | <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell> | ||
399 | <Cell ss:Index="5"><Data ss:Type="String">Joining Voice Chat...</Data></Cell> | ||
400 | <Cell ss:Index="7"><Data ss:Type="String">ボイスãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã™ã‚‹ï¼Žï¼Žï¼Ž</Data></Cell> | ||
401 | </Row> | ||
402 | <Row> | ||
403 | <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell> | ||
404 | <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell> | ||
405 | <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell> | ||
406 | <Cell ss:Index="7"><Data ss:Type="String">接続ã—ã¾ã—ãŸã€é€šè©±ã‚’終了ã™ã‚‹å ´åˆã¯ã€Œé€šè©±ã®çµ‚了ã€ã‚’クリックã—ã¦ãã ã•ã„。</Data></Cell> | ||
407 | </Row> | ||
408 | <Row> | ||
409 | <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell> | ||
410 | <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell> | ||
411 | <Cell ss:Index="5"><Data ss:Type="String">Left Voice Chat</Data></Cell> | ||
412 | <Cell ss:Index="7"><Data ss:Type="String">ボイスãƒãƒ£ãƒƒãƒˆã‹ã‚‰é€€å¸ã—ã¾ã—ãŸ</Data></Cell> | ||
413 | </Row> | ||
414 | <Row> | ||
415 | <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell> | ||
416 | <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell> | ||
417 | <Cell ss:Index="5"><Data ss:Type="String">Joining Voice Chat...</Data></Cell> | ||
418 | <Cell ss:Index="7"><Data ss:Type="String">ボイスãƒãƒ£ãƒƒãƒˆã«å‚åŠ ã—ã¾ã™ï¼Žï¼Žï¼Ž</Data></Cell> | ||
419 | </Row> | ||
420 | <Row> | ||
421 | <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell> | ||
422 | <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell> | ||
423 | <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell> | ||
424 | <Cell ss:Index="7"><Data ss:Type="String">接続ã—ã¾ã—ãŸã€é€šè©±ã‚’終了ã™ã‚‹å ´åˆã¯ã€Œé€šè©±ã®çµ‚了ã€ã‚’クリックã—ã¦ãã ã•ã„。</Data></Cell> | ||
425 | </Row> | ||
426 | <Row> | ||
427 | <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell> | ||
428 | <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell> | ||
429 | <Cell ss:Index="5"><Data ss:Type="String">Left Voice Chat</Data></Cell> | ||
430 | <Cell ss:Index="7"><Data ss:Type="String">ボイスãƒãƒ£ãƒƒãƒˆã‹ã‚‰é€€å¸ã—ã¾ã—ãŸ</Data></Cell> | ||
431 | </Row> | ||
432 | <Row> | ||
433 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
434 | <Cell><Data ss:Type="String">/landmarkpicker</Data></Cell> | ||
435 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
436 | <Cell ss:Index="5"><Data ss:Type="String">Organize: Landmarks</Data></Cell> | ||
437 | <Cell ss:Index="7"><Data ss:Type="String">æ•´ç†ï¼šãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯</Data></Cell> | ||
438 | </Row> | ||
439 | <Row> | ||
440 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
441 | <Cell><Data ss:Type="String">/landmarkpicker/show_folders_check</Data></Cell> | ||
442 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
443 | <Cell ss:Index="5"><Data ss:Type="String">Show Folders</Data></Cell> | ||
444 | <Cell ss:Index="7"><Data ss:Type="String">フォルダーを表示</Data></Cell> | ||
445 | </Row> | ||
446 | <Row> | ||
447 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
448 | <Cell><Data ss:Type="String">/landmarkpicker/New</Data></Cell> | ||
449 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
450 | <Cell ss:Index="5"><Data ss:Type="String">New</Data></Cell> | ||
451 | <Cell ss:Index="7"><Data ss:Type="String">æ–°è¦</Data></Cell> | ||
452 | </Row> | ||
453 | <Row> | ||
454 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
455 | <Cell><Data ss:Type="String">/landmarkpicker/New</Data></Cell> | ||
456 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
457 | <Cell ss:Index="5"><Data ss:Type="String">New</Data></Cell> | ||
458 | <Cell ss:Index="7"><Data ss:Type="String">æ–°è¦</Data></Cell> | ||
459 | </Row> | ||
460 | <Row> | ||
461 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
462 | <Cell><Data ss:Type="String">/landmarkpicker/Rename</Data></Cell> | ||
463 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
464 | <Cell ss:Index="5"><Data ss:Type="String">Rename</Data></Cell> | ||
465 | <Cell ss:Index="7"><Data ss:Type="String">åå‰ã‚’ã¤ã‘ãªãŠã™</Data></Cell> | ||
466 | </Row> | ||
467 | <Row> | ||
468 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
469 | <Cell><Data ss:Type="String">/landmarkpicker/Rename</Data></Cell> | ||
470 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
471 | <Cell ss:Index="5"><Data ss:Type="String">Rename</Data></Cell> | ||
472 | <Cell ss:Index="7"><Data ss:Type="String">åå‰ã‚’ã¤ã‘ãªãŠã™</Data></Cell> | ||
473 | </Row> | ||
474 | <Row> | ||
475 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
476 | <Cell><Data ss:Type="String">/landmarkpicker/NewFolder</Data></Cell> | ||
477 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
478 | <Cell ss:Index="5"><Data ss:Type="String">New Folder</Data></Cell> | ||
479 | <Cell ss:Index="7"><Data ss:Type="String">æ–°ã—ã„フォルダー</Data></Cell> | ||
480 | </Row> | ||
481 | <Row> | ||
482 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
483 | <Cell><Data ss:Type="String">/landmarkpicker/NewFolder</Data></Cell> | ||
484 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
485 | <Cell ss:Index="5"><Data ss:Type="String">New Folder</Data></Cell> | ||
486 | <Cell ss:Index="7"><Data ss:Type="String">æ–°ã—ã„フォルダー</Data></Cell> | ||
487 | </Row> | ||
488 | <Row> | ||
489 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
490 | <Cell><Data ss:Type="String">/landmarkpicker/Edit</Data></Cell> | ||
491 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
492 | <Cell ss:Index="5"><Data ss:Type="String">Edit</Data></Cell> | ||
493 | <Cell ss:Index="7"><Data ss:Type="String">編集</Data></Cell> | ||
494 | </Row> | ||
495 | <Row> | ||
496 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
497 | <Cell><Data ss:Type="String">/landmarkpicker/Edit</Data></Cell> | ||
498 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
499 | <Cell ss:Index="5"><Data ss:Type="String">Edit</Data></Cell> | ||
500 | <Cell ss:Index="7"><Data ss:Type="String">編集</Data></Cell> | ||
501 | </Row> | ||
502 | <Row> | ||
503 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
504 | <Cell><Data ss:Type="String">/landmarkpicker/Delete</Data></Cell> | ||
505 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
506 | <Cell ss:Index="5"><Data ss:Type="String">Delete</Data></Cell> | ||
507 | <Cell ss:Index="7"><Data ss:Type="String">削除</Data></Cell> | ||
508 | </Row> | ||
509 | <Row> | ||
510 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
511 | <Cell><Data ss:Type="String">/landmarkpicker/Delete</Data></Cell> | ||
512 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
513 | <Cell ss:Index="5"><Data ss:Type="String">Delete</Data></Cell> | ||
514 | <Cell ss:Index="7"><Data ss:Type="String">削除</Data></Cell> | ||
515 | </Row> | ||
516 | <Row> | ||
517 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
518 | <Cell><Data ss:Type="String">/landmarkpicker/Close</Data></Cell> | ||
519 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
520 | <Cell ss:Index="5"><Data ss:Type="String">Close</Data></Cell> | ||
521 | <Cell ss:Index="7"><Data ss:Type="String">é–‰ã˜ã‚‹</Data></Cell> | ||
522 | </Row> | ||
523 | <Row> | ||
524 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
525 | <Cell><Data ss:Type="String">/landmarkpicker/Close</Data></Cell> | ||
526 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
527 | <Cell ss:Index="5"><Data ss:Type="String">Close</Data></Cell> | ||
528 | <Cell ss:Index="7"><Data ss:Type="String">é–‰ã˜ã‚‹</Data></Cell> | ||
529 | </Row> | ||
530 | <Row> | ||
531 | <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell> | ||
532 | <Cell><Data ss:Type="String">/land holdings floater/area_string</Data></Cell> | ||
533 | <Cell ss:Index="5"><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
534 | <Cell ss:Index="7"><Data ss:Type="String">[AREA]平方メートル</Data></Cell> | ||
535 | </Row> | ||
536 | <Row> | ||
537 | <Cell><Data ss:Type="String">floater_preview_classified.xml</Data></Cell> | ||
538 | <Cell><Data ss:Type="String">/classified_preview</Data></Cell> | ||
539 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
540 | <Cell ss:Index="5"><Data ss:Type="String">Classified Information</Data></Cell> | ||
541 | <Cell ss:Index="7"><Data ss:Type="String">ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šæƒ…å ±</Data></Cell> | ||
542 | </Row> | ||
543 | <Row> | ||
544 | <Cell><Data ss:Type="String">floater_preview_event.xml</Data></Cell> | ||
545 | <Cell><Data ss:Type="String">/event_preview</Data></Cell> | ||
546 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
547 | <Cell ss:Index="5"><Data ss:Type="String">Event Information</Data></Cell> | ||
548 | <Cell ss:Index="7"><Data ss:Type="String">ã‚¤ãƒ™ãƒ³ãƒˆæƒ…å ±</Data></Cell> | ||
549 | </Row> | ||
550 | <Row> | ||
551 | <Cell><Data ss:Type="String">floater_preview_url.xml</Data></Cell> | ||
552 | <Cell><Data ss:Type="String">/url_preview</Data></Cell> | ||
553 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
554 | <Cell ss:Index="5"><Data ss:Type="String">Place Information</Data></Cell> | ||
555 | <Cell ss:Index="7"><Data ss:Type="String">å ´æ‰€ã®æƒ…å ±</Data></Cell> | ||
556 | </Row> | ||
557 | <Row> | ||
558 | <Cell><Data ss:Type="String">floater_select_key.xml</Data></Cell> | ||
559 | <Cell><Data ss:Type="String">/modal container</Data></Cell> | ||
560 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
561 | </Row> | ||
562 | <Row> | ||
563 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
564 | <Cell><Data ss:Type="String">/panel_login/DebugInfo</Data></Cell> | ||
565 | <Cell ss:Index="5"><Data ss:Type="String">Debug Info</Data></Cell> | ||
566 | <Cell ss:Index="7"><Data ss:Type="String">デãƒãƒƒã‚°æƒ…å ±</Data></Cell> | ||
567 | </Row> | ||
568 | <Row> | ||
569 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
570 | <Cell><Data ss:Type="String">/panel_login/FPS</Data></Cell> | ||
571 | <Cell ss:Index="5"><Data ss:Type="String">FPS</Data></Cell> | ||
572 | <Cell ss:Index="7"><Data ss:Type="String">FPS</Data></Cell> | ||
573 | </Row> | ||
574 | <Row> | ||
575 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
576 | <Cell><Data ss:Type="String">/panel_login/SimFPS</Data></Cell> | ||
577 | <Cell ss:Index="5"><Data ss:Type="String">SimFPS</Data></Cell> | ||
578 | <Cell ss:Index="7"><Data ss:Type="String">シムFPS</Data></Cell> | ||
579 | </Row> | ||
580 | <Row> | ||
581 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
582 | <Cell><Data ss:Type="String">/panel_login/Pin</Data></Cell> | ||
583 | <Cell ss:Index="5"><Data ss:Type="String">P-In</Data></Cell> | ||
584 | <Cell ss:Index="7"><Data ss:Type="String">å—ä¿¡</Data></Cell> | ||
585 | </Row> | ||
586 | <Row> | ||
587 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
588 | <Cell><Data ss:Type="String">/panel_login/Pout</Data></Cell> | ||
589 | <Cell ss:Index="5"><Data ss:Type="String">P-Out</Data></Cell> | ||
590 | <Cell ss:Index="7"><Data ss:Type="String">é€ä¿¡</Data></Cell> | ||
591 | </Row> | ||
592 | <Row> | ||
593 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
594 | <Cell><Data ss:Type="String">/panel_login/PLoss</Data></Cell> | ||
595 | <Cell ss:Index="5"><Data ss:Type="String">P-Loss</Data></Cell> | ||
596 | <Cell ss:Index="7"><Data ss:Type="String">パケットãƒã‚¹</Data></Cell> | ||
597 | </Row> | ||
598 | <Row> | ||
599 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
600 | <Cell><Data ss:Type="String">/panel_login/Ping</Data></Cell> | ||
601 | <Cell ss:Index="5"><Data ss:Type="String">Ping</Data></Cell> | ||
602 | <Cell ss:Index="7"><Data ss:Type="String">Ping</Data></Cell> | ||
603 | </Row> | ||
604 | <Row> | ||
605 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
606 | <Cell><Data ss:Type="String">/panel_login/AccountDetails</Data></Cell> | ||
607 | <Cell ss:Index="5"><Data ss:Type="String">Account Details</Data></Cell> | ||
608 | <Cell ss:Index="7"><Data ss:Type="String">アカウントã®è©³ç´°</Data></Cell> | ||
609 | </Row> | ||
610 | <Row> | ||
611 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
612 | <Cell><Data ss:Type="String">/panel_login/LBal</Data></Cell> | ||
613 | <Cell ss:Index="5"><Data ss:Type="String">L$ bal</Data></Cell> | ||
614 | <Cell ss:Index="7"><Data ss:Type="String">L$残高</Data></Cell> | ||
615 | </Row> | ||
616 | <Row> | ||
617 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
618 | <Cell><Data ss:Type="String">/panel_login/Time</Data></Cell> | ||
619 | <Cell ss:Index="5"><Data ss:Type="String">Time</Data></Cell> | ||
620 | <Cell ss:Index="7"><Data ss:Type="String">時間</Data></Cell> | ||
621 | </Row> | ||
622 | <Row> | ||
623 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
624 | <Cell><Data ss:Type="String">/panel_login/LocationDetails1</Data></Cell> | ||
625 | <Cell ss:Index="5"><Data ss:Type="String">Location Details 1</Data></Cell> | ||
626 | <Cell ss:Index="7"><Data ss:Type="String">所在地ã®è©³ç´° 1</Data></Cell> | ||
627 | </Row> | ||
628 | <Row> | ||
629 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
630 | <Cell><Data ss:Type="String">/panel_login/LocationDetails2</Data></Cell> | ||
631 | <Cell ss:Index="5"><Data ss:Type="String">Location Details 2</Data></Cell> | ||
632 | <Cell ss:Index="7"><Data ss:Type="String">所在地ã®è©³ç´° 2</Data></Cell> | ||
633 | </Row> | ||
634 | <Row> | ||
635 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
636 | <Cell><Data ss:Type="String">/panel_login/Region</Data></Cell> | ||
637 | <Cell ss:Index="5"><Data ss:Type="String">Region</Data></Cell> | ||
638 | <Cell ss:Index="7"><Data ss:Type="String">地域</Data></Cell> | ||
639 | </Row> | ||
640 | <Row> | ||
641 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
642 | <Cell><Data ss:Type="String">/panel_login/Parcel</Data></Cell> | ||
643 | <Cell ss:Index="5"><Data ss:Type="String">Parcel</Data></Cell> | ||
644 | <Cell ss:Index="7"><Data ss:Type="String">区画</Data></Cell> | ||
645 | </Row> | ||
646 | <Row> | ||
647 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
648 | <Cell><Data ss:Type="String">/panel_login/Pos</Data></Cell> | ||
649 | <Cell ss:Index="5"><Data ss:Type="String">Pos</Data></Cell> | ||
650 | <Cell ss:Index="7"><Data ss:Type="String">ポジショï¾</Data></Cell> | ||
651 | </Row> | ||
652 | <Row> | ||
653 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
654 | <Cell><Data ss:Type="String">/panel_login/Sqm</Data></Cell> | ||
655 | <Cell ss:Index="5"><Data ss:Type="String">Sqm</Data></Cell> | ||
656 | <Cell ss:Index="7"><Data ss:Type="String">平方ã</Data></Cell> | ||
657 | </Row> | ||
658 | <Row> | ||
659 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
660 | <Cell><Data ss:Type="String">/panel_login/Owner</Data></Cell> | ||
661 | <Cell ss:Index="5"><Data ss:Type="String">Owner</Data></Cell> | ||
662 | <Cell ss:Index="7"><Data ss:Type="String">所有者</Data></Cell> | ||
663 | </Row> | ||
664 | <Row> | ||
665 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
666 | <Cell><Data ss:Type="String">/panel_login/Type</Data></Cell> | ||
667 | <Cell ss:Index="5"><Data ss:Type="String">Type</Data></Cell> | ||
668 | <Cell ss:Index="7"><Data ss:Type="String">タイプ</Data></Cell> | ||
669 | </Row> | ||
670 | <Row> | ||
671 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
672 | <Cell><Data ss:Type="String">/panel_login/Yes</Data></Cell> | ||
673 | <Cell ss:Index="5"><Data ss:Type="String">Yes</Data></Cell> | ||
674 | <Cell ss:Index="7"><Data ss:Type="String">ã¯ã„</Data></Cell> | ||
675 | </Row> | ||
676 | <Row> | ||
677 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
678 | <Cell><Data ss:Type="String">/panel_login/No</Data></Cell> | ||
679 | <Cell ss:Index="5"><Data ss:Type="String">No</Data></Cell> | ||
680 | <Cell ss:Index="7"><Data ss:Type="String">ã„ã„ãˆ</Data></Cell> | ||
681 | </Row> | ||
682 | <Row> | ||
683 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
684 | <Cell><Data ss:Type="String">/panel_login/Forsale</Data></Cell> | ||
685 | <Cell ss:Index="5"><Data ss:Type="String">ForSale</Data></Cell> | ||
686 | <Cell ss:Index="7"><Data ss:Type="String">売出ä¸</Data></Cell> | ||
687 | </Row> | ||
688 | <Row> | ||
689 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
690 | <Cell><Data ss:Type="String">/panel_login/Traffic</Data></Cell> | ||
691 | <Cell ss:Index="5"><Data ss:Type="String">Traffic</Data></Cell> | ||
692 | <Cell ss:Index="7"><Data ss:Type="String">交通é‡</Data></Cell> | ||
693 | </Row> | ||
694 | <Row> | ||
695 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
696 | <Cell><Data ss:Type="String">/panel_login/Last3ChatLines</Data></Cell> | ||
697 | <Cell ss:Index="5"><Data ss:Type="String">Last 3 Chat Lines</Data></Cell> | ||
698 | <Cell ss:Index="7"><Data ss:Type="String">ç›´è¿‘ã®ãƒãƒ£ãƒƒãƒˆå…ˆ3ä»¶</Data></Cell> | ||
699 | </Row> | ||
700 | <Row> | ||
701 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
702 | <Cell><Data ss:Type="String">/panel_login/Last3IMLines</Data></Cell> | ||
703 | <Cell ss:Index="5"><Data ss:Type="String">Last 3 IM Lines</Data></Cell> | ||
704 | <Cell ss:Index="7"><Data ss:Type="String">ç›´è¿‘ã®IMå…ˆ3ä»¶</Data></Cell> | ||
705 | </Row> | ||
706 | <Row> | ||
707 | <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell> | ||
708 | <Cell><Data ss:Type="String">/Popup/about_url</Data></Cell> | ||
709 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
710 | <Cell ss:Index="5"><Data ss:Type="String">About URL</Data></Cell> | ||
711 | <Cell ss:Index="7"><Data ss:Type="String">URLã«ã¤ã„ã¦</Data></Cell> | ||
712 | </Row> | ||
713 | <Row> | ||
714 | <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell> | ||
715 | <Cell><Data ss:Type="String">/Popup/teleport_to_url</Data></Cell> | ||
716 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
717 | <Cell ss:Index="5"><Data ss:Type="String">Teleport to URL</Data></Cell> | ||
718 | <Cell ss:Index="7"><Data ss:Type="String">URLã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹</Data></Cell> | ||
719 | </Row> | ||
720 | <Row> | ||
721 | <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell> | ||
722 | <Cell><Data ss:Type="String">/Popup/show_on_map</Data></Cell> | ||
723 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
724 | <Cell ss:Index="5"><Data ss:Type="String">Show on Map</Data></Cell> | ||
725 | <Cell ss:Index="7"><Data ss:Type="String">地図上ã«è¡¨ç¤º</Data></Cell> | ||
726 | </Row> | ||
727 | <Row> | ||
728 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
729 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting</Data></Cell> | ||
730 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
731 | <Cell ss:Index="5"><Data ss:Type="String">Bug Reporting</Data></Cell> | ||
732 | <Cell ss:Index="7"><Data ss:Type="String">ãƒã‚°ã®å ±å‘Š</Data></Cell> | ||
733 | </Row> | ||
734 | <Row> | ||
735 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
736 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Public Issue Tracker...</Data></Cell> | ||
737 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
738 | <Cell ss:Index="5"><Data ss:Type="String">Public Issue Tracker...</Data></Cell> | ||
739 | <Cell ss:Index="7"><Data ss:Type="String">パブリックå•題トラッカー...</Data></Cell> | ||
740 | </Row> | ||
741 | <Row> | ||
742 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
743 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Publc Issue Tracker Help...</Data></Cell> | ||
744 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
745 | <Cell ss:Index="5"><Data ss:Type="String">Public Issue Tracker Help...</Data></Cell> | ||
746 | <Cell ss:Index="7"><Data ss:Type="String">パブリックå•題トラッカー ヘルプ...</Data></Cell> | ||
747 | </Row> | ||
748 | <Row> | ||
749 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
750 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/separator7</Data></Cell> | ||
751 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
752 | <Cell ss:Index="5"><Data ss:Type="String">-----------</Data></Cell> | ||
753 | <Cell ss:Index="7"><Data ss:Type="String">-----------</Data></Cell> | ||
754 | </Row> | ||
755 | <Row> | ||
756 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
757 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Bug Reporing 101...</Data></Cell> | ||
758 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
759 | <Cell ss:Index="5"><Data ss:Type="String">Bug Reporting 101...</Data></Cell> | ||
760 | <Cell ss:Index="7"><Data ss:Type="String">ãƒã‚°ã®å ±å‘Š 101...</Data></Cell> | ||
761 | </Row> | ||
762 | <Row> | ||
763 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
764 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Security Issues...</Data></Cell> | ||
765 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
766 | <Cell ss:Index="5"><Data ss:Type="String">Security Issues...</Data></Cell> | ||
767 | <Cell ss:Index="7"><Data ss:Type="String">ã‚»ã‚ュリティå•題...</Data></Cell> | ||
768 | </Row> | ||
769 | <Row> | ||
770 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
771 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/QA Wiki...</Data></Cell> | ||
772 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
773 | <Cell ss:Index="5"><Data ss:Type="String">QA Wiki...</Data></Cell> | ||
774 | <Cell ss:Index="7"><Data ss:Type="String">QA Wiki...</Data></Cell> | ||
775 | </Row> | ||
776 | <Row> | ||
777 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
778 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/separator7</Data></Cell> | ||
779 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
780 | <Cell ss:Index="5"><Data ss:Type="String">-----------</Data></Cell> | ||
781 | <Cell ss:Index="7"><Data ss:Type="String">-----------</Data></Cell> | ||
782 | </Row> | ||
783 | <Row> | ||
784 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
785 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Report Bug...</Data></Cell> | ||
786 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
787 | <Cell ss:Index="5"><Data ss:Type="String">Report Bug...</Data></Cell> | ||
788 | <Cell ss:Index="7"><Data ss:Type="String">ãƒã‚°ã®å ±å‘Š...</Data></Cell> | ||
789 | </Row> | ||
790 | <Row> | ||
791 | <Cell><Data ss:Type="String">notify.xml</Data></Cell> | ||
792 | <Cell><Data ss:Type="String">//VoiceChannelJoinFailed/message</Data></Cell> | ||
793 | <Cell ss:Index="5"><Data ss:Type="String">Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to spatial voice chat.</Data></Cell> | ||
794 | <Cell ss:Index="7"><Data ss:Type="String">[VOICE_CHANNEL_NAME]ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚時間をãŠã„ã¦ã€å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚</Data></Cell> | ||
795 | </Row> | ||
796 | <Row> | ||
797 | <Cell><Data ss:Type="String">panel_avatar_classified.xml</Data></Cell> | ||
798 | <Cell><Data ss:Type="String">/Classified/update_txt</Data></Cell> | ||
799 | <Cell ss:Index="5"><Data ss:Type="String">Update</Data></Cell> | ||
800 | <Cell ss:Index="7"><Data ss:Type="String">アップデート</Data></Cell> | ||
801 | </Row> | ||
802 | <Row> | ||
803 | <Cell><Data ss:Type="String">panel_avatar_classified.xml</Data></Cell> | ||
804 | <Cell><Data ss:Type="String">/Classified/publish_txt</Data></Cell> | ||
805 | <Cell ss:Index="5"><Data ss:Type="String">Publish...</Data></Cell> | ||
806 | <Cell ss:Index="7"><Data ss:Type="String">公開...</Data></Cell> | ||
807 | </Row> | ||
808 | <Row> | ||
809 | <Cell><Data ss:Type="String">panel_groups.xml</Data></Cell> | ||
810 | <Cell><Data ss:Type="String">/groups/group list/name</Data></Cell> | ||
811 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
812 | </Row> | ||
813 | <Row> | ||
814 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
815 | <Cell><Data ss:Type="String">/general_tab/group_info_unchanged</Data></Cell> | ||
816 | <Cell ss:Index="5"><Data ss:Type="String">General group information has changed.</Data></Cell> | ||
817 | <Cell ss:Index="7"><Data ss:Type="String">グループè¨å®šãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚</Data></Cell> | ||
818 | </Row> | ||
819 | <Row> | ||
820 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
821 | <Cell><Data ss:Type="String">/land_money_tab/land_contrib_error</Data></Cell> | ||
822 | <Cell ss:Index="5"><Data ss:Type="String">Unable to set your land contribution.</Data></Cell> | ||
823 | <Cell ss:Index="7"><Data ss:Type="String">土地ã®å‡ºè³‡è¨å®šã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚</Data></Cell> | ||
824 | </Row> | ||
825 | <Row> | ||
826 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
827 | <Cell><Data ss:Type="String">/Place/server_update_text</Data></Cell> | ||
828 | <Cell ss:Index="5"><Data ss:Type="String">Place information not available without server update.</Data></Cell> | ||
829 | <Cell ss:Index="7"><Data ss:Type="String">åœŸåœ°æƒ…å ±ã®ã”利用ã«ã¯ã€ã‚µãƒ¼ãƒãƒ¼ã®ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ã§ã™ã€‚</Data></Cell> | ||
830 | </Row> | ||
831 | <Row> | ||
832 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
833 | <Cell><Data ss:Type="String">/Place/server_error_text</Data></Cell> | ||
834 | <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable at this time, please try again later.</Data></Cell> | ||
835 | <Cell ss:Index="7"><Data ss:Type="String">ç¾åœ¨ã®æ‰€åœ¨åœ°ã«ã¤ã„ã¦ã®æƒ…å ±ã¯ç¾åœ¨ã”利用ã§ãã¾ã›ã‚“。時間をãŠã„ã¦ã€å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。</Data></Cell> | ||
836 | </Row> | ||
837 | <Row> | ||
838 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
839 | <Cell><Data ss:Type="String">/Place/server_forbidden_text</Data></Cell> | ||
840 | <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.</Data></Cell> | ||
841 | <Cell ss:Index="7"><Data ss:Type="String">ç¾åœ¨ã®æ‰€åœ¨åœ°ã«ã¤ã„ã¦ã®æƒ…å ±ã¯ã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã®ãŸã‚利用ã§ãã¾ã›ã‚“。区画所有者ã®è¨±å¯ãŒã‚ã‚‹ã‹ã©ã†ã‹ã”確èªãã ã•ã„。</Data></Cell> | ||
842 | </Row> | ||
843 | <Row> | ||
844 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
845 | <Cell><Data ss:Type="String">/Place/traffic_text</Data></Cell> | ||
846 | <Cell ss:Index="5"><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell> | ||
847 | <Cell ss:Index="7"><Data ss:Type="String">交通é‡ï¼š [TRAFFIC]</Data></Cell> | ||
848 | </Row> | ||
849 | <Row> | ||
850 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
851 | <Cell><Data ss:Type="String">/Place/area_text</Data></Cell> | ||
852 | <Cell ss:Index="5"><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell> | ||
853 | <Cell ss:Index="7"><Data ss:Type="String">é¢ç©ï¼šï¼»AREA]平方メートル</Data></Cell> | ||
854 | </Row> | ||
855 | <Row> | ||
856 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
857 | <Cell><Data ss:Type="String">/Place/forsale_text</Data></Cell> | ||
858 | <Cell ss:Index="5"><Data ss:Type="String">For Sale for L$ [PRICE]</Data></Cell> | ||
859 | <Cell ss:Index="7"><Data ss:Type="String">L$[PRICE]ã§å£²ã‚Šå‡ºã—ä¸</Data></Cell> | ||
860 | </Row> | ||
861 | <Row> | ||
862 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
863 | <Cell><Data ss:Type="String">/Place/auction_text</Data></Cell> | ||
864 | <Cell ss:Index="5"><Data ss:Type="String">Auction ID [ID].</Data></Cell> | ||
865 | <Cell ss:Index="7"><Data ss:Type="String">オークションID [ID]。</Data></Cell> | ||
866 | </Row> | ||
867 | <Row> | ||
868 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
869 | <Cell><Data ss:Type="String">/Place/server_update_text</Data></Cell> | ||
870 | <Cell ss:Index="5"><Data ss:Type="String">Place information not available without server update.</Data></Cell> | ||
871 | <Cell ss:Index="7"><Data ss:Type="String">åœŸåœ°æƒ…å ±ã®ã”利用ã«ã¯ã€ã‚µãƒ¼ãƒãƒ¼ã®ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ã§ã™ã€‚</Data></Cell> | ||
872 | </Row> | ||
873 | <Row> | ||
874 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
875 | <Cell><Data ss:Type="String">/Place/server_error_text</Data></Cell> | ||
876 | <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable at this time, please try again later.</Data></Cell> | ||
877 | <Cell ss:Index="7"><Data ss:Type="String">ç¾åœ¨ã®æ‰€åœ¨åœ°ã«ã¤ã„ã¦ã®æƒ…å ±ãŒç¾åœ¨ã”利用ã§ãã¾ã›ã‚“。時間をãŠã„ã¦ã€å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。</Data></Cell> | ||
878 | </Row> | ||
879 | <Row> | ||
880 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
881 | <Cell><Data ss:Type="String">/Place/server_forbidden_text</Data></Cell> | ||
882 | <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.</Data></Cell> | ||
883 | <Cell ss:Index="7"><Data ss:Type="String">ç¾åœ¨ã®æ‰€åœ¨åœ°ã«ã¤ã„ã¦ã®æƒ…å ±ã¯ã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã®ãŸã‚ã”利用ã§ãã¾ã›ã‚“。区画所有者ã®è¨±å¯ãŒã‚ã‚‹ã‹ã©ã†ã‹ã”確èªãã ã•ã„。</Data></Cell> | ||
884 | </Row> | ||
885 | <Row> | ||
886 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
887 | <Cell><Data ss:Type="String">/LCD Options</Data></Cell> | ||
888 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
889 | <Cell ss:Index="5"><Data ss:Type="String">Logitech LCD</Data></Cell> | ||
890 | <Cell ss:Index="7"><Data ss:Type="String">ãƒã‚¸ã‚¯ãƒ¼ãƒ«LCD</Data></Cell> | ||
891 | </Row> | ||
892 | <Row> | ||
893 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
894 | <Cell><Data ss:Type="String">/LCD Options/LCD Destination:</Data></Cell> | ||
895 | <Cell ss:Index="5"><Data ss:Type="String">LCD Destination:</Data></Cell> | ||
896 | <Cell ss:Index="7"><Data ss:Type="String">LCD出力先:</Data></Cell> | ||
897 | </Row> | ||
898 | <Row> | ||
899 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
900 | <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationG15</Data></Cell> | ||
901 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
902 | <Cell ss:Index="5"><Data ss:Type="String">Display forms selected appear on Logitech G15 Keyboard LCD</Data></Cell> | ||
903 | <Cell ss:Index="7"><Data ss:Type="String">é¸æŠžã—ãŸãƒ•ォームをãƒã‚¸ã‚¯ãƒ¼ãƒ«G15 Keyboardã®LCDç”»é¢è¡¨ç¤ºç”¨ã«è¡¨ç¤º</Data></Cell> | ||
904 | </Row> | ||
905 | <Row> | ||
906 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
907 | <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationG15</Data></Cell> | ||
908 | <Cell ss:Index="5"><Data ss:Type="String">Logitech G15 Gaming Keyboard</Data></Cell> | ||
909 | <Cell ss:Index="7"><Data ss:Type="String">ãƒã‚¸ã‚¯ãƒ¼ãƒ« G15 Gaming Keyboard</Data></Cell> | ||
910 | </Row> | ||
911 | <Row> | ||
912 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
913 | <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationZ10</Data></Cell> | ||
914 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
915 | <Cell ss:Index="5"><Data ss:Type="String">Display forms selected appear on Logitech Z10 Speaker LCD</Data></Cell> | ||
916 | <Cell ss:Index="7"><Data ss:Type="String">é¸æŠžã—ãŸãƒ•ォームをãƒã‚¸ã‚¯ãƒ¼ãƒ«G15 Keyboardã®LCDç”»é¢è¡¨ç¤ºç”¨ã«è¡¨ç¤º</Data></Cell> | ||
917 | </Row> | ||
918 | <Row> | ||
919 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
920 | <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationZ10</Data></Cell> | ||
921 | <Cell ss:Index="5"><Data ss:Type="String">Logitech Z10 Speakers</Data></Cell> | ||
922 | <Cell ss:Index="7"><Data ss:Type="String">ãƒã‚¸ã‚¯ãƒ¼ãƒ«Z10スピーカー</Data></Cell> | ||
923 | </Row> | ||
924 | <Row> | ||
925 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
926 | <Cell><Data ss:Type="String">/LCD Options/LCD Display Options</Data></Cell> | ||
927 | <Cell ss:Index="5"><Data ss:Type="String">LCD Display Options:</Data></Cell> | ||
928 | <Cell ss:Index="7"><Data ss:Type="String">LCD表示オプション</Data></Cell> | ||
929 | </Row> | ||
930 | <Row> | ||
931 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
932 | <Cell><Data ss:Type="String">/LCD Options/DisplayChat</Data></Cell> | ||
933 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
934 | <Cell ss:Index="5"><Data ss:Type="String">Display Chat</Data></Cell> | ||
935 | <Cell ss:Index="7"><Data ss:Type="String">ãƒãƒ£ãƒƒãƒˆã‚’表示</Data></Cell> | ||
936 | </Row> | ||
937 | <Row> | ||
938 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
939 | <Cell><Data ss:Type="String">/LCD Options/DisplayChat</Data></Cell> | ||
940 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
941 | <Cell ss:Index="5"><Data ss:Type="String">Display Last Chat line in LCD Window</Data></Cell> | ||
942 | <Cell ss:Index="7"><Data ss:Type="String">LCDウィンドウã«ç›´è¿‘ã®ãƒãƒ£ãƒƒãƒˆã‚’表示</Data></Cell> | ||
943 | </Row> | ||
944 | <Row> | ||
945 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
946 | <Cell><Data ss:Type="String">/LCD Options/DisplayIM</Data></Cell> | ||
947 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
948 | <Cell ss:Index="5"><Data ss:Type="String">Display IM's</Data></Cell> | ||
949 | <Cell ss:Index="7"><Data ss:Type="String">IMを表示</Data></Cell> | ||
950 | </Row> | ||
951 | <Row> | ||
952 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
953 | <Cell><Data ss:Type="String">/LCD Options/DisplayIM</Data></Cell> | ||
954 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
955 | <Cell ss:Index="5"><Data ss:Type="String">Display Last IM in LCD Window</Data></Cell> | ||
956 | <Cell ss:Index="7"><Data ss:Type="String">LCDウィンドウã«ç›´è¿‘ã®IMを表示</Data></Cell> | ||
957 | </Row> | ||
958 | <Row> | ||
959 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
960 | <Cell><Data ss:Type="String">/LCD Options/DisplayRegion</Data></Cell> | ||
961 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
962 | <Cell ss:Index="5"><Data ss:Type="String">Show Location Information</Data></Cell> | ||
963 | <Cell ss:Index="7"><Data ss:Type="String">åœŸåœ°æƒ…å ±ã‚’è¡¨ç¤º</Data></Cell> | ||
964 | </Row> | ||
965 | <Row> | ||
966 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
967 | <Cell><Data ss:Type="String">/LCD Options/DisplayRegion</Data></Cell> | ||
968 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
969 | <Cell ss:Index="5"><Data ss:Type="String">Display current location information in LCD Window</Data></Cell> | ||
970 | <Cell ss:Index="7"><Data ss:Type="String">LCDウィンドウã«ç¾åœ¨ã®æ‰€åœ¨åœ°ã®æƒ…å ±ã‚’è¡¨ç¤º</Data></Cell> | ||
971 | </Row> | ||
972 | <Row> | ||
973 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
974 | <Cell><Data ss:Type="String">/LCD Options/DisplayLinden</Data></Cell> | ||
975 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
976 | <Cell ss:Index="5"><Data ss:Type="String">Show Account Information</Data></Cell> | ||
977 | <Cell ss:Index="7"><Data ss:Type="String">ã‚¢ã‚«ã‚¦ãƒ³ãƒˆæƒ…å ±ã‚’è¡¨ç¤º</Data></Cell> | ||
978 | </Row> | ||
979 | <Row> | ||
980 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
981 | <Cell><Data ss:Type="String">/LCD Options/DisplayLinden</Data></Cell> | ||
982 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
983 | <Cell ss:Index="5"><Data ss:Type="String">Display current account information in LCD Window</Data></Cell> | ||
984 | <Cell ss:Index="7"><Data ss:Type="String">LCDウィンドウã«ç¾åœ¨ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆæƒ…å ±ã‚’è¡¨ç¤º</Data></Cell> | ||
985 | </Row> | ||
986 | <Row> | ||
987 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
988 | <Cell><Data ss:Type="String">/LCD Options/DisplayDebug</Data></Cell> | ||
989 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
990 | <Cell ss:Index="5"><Data ss:Type="String">Display Network Comms Info</Data></Cell> | ||
991 | <Cell ss:Index="7"><Data ss:Type="String">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³æƒ…å ±ã‚’è¡¨ç¤º</Data></Cell> | ||
992 | </Row> | ||
993 | <Row> | ||
994 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
995 | <Cell><Data ss:Type="String">/LCD Options/DisplayDebug</Data></Cell> | ||
996 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
997 | <Cell ss:Index="5"><Data ss:Type="String">Display debug information in LCD Window</Data></Cell> | ||
998 | <Cell ss:Index="7"><Data ss:Type="String">LCDウィンドウã«ãƒ‡ãƒãƒƒã‚°æƒ…å ±ã‚’è¡¨ç¤º</Data></Cell> | ||
999 | </Row> | ||
1000 | <Row> | ||
1001 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
1002 | <Cell><Data ss:Type="String">/LCD Options/DisplayDebugConsole</Data></Cell> | ||
1003 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
1004 | <Cell ss:Index="5"><Data ss:Type="String">Display Debug Info from Console</Data></Cell> | ||
1005 | <Cell ss:Index="7"><Data ss:Type="String">コンソールã‹ã‚‰ã®ãƒ‡ãƒãƒƒã‚°æƒ…å ±ã‚’è¡¨ç¤º</Data></Cell> | ||
1006 | </Row> | ||
1007 | <Row> | ||
1008 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
1009 | <Cell><Data ss:Type="String">/LCD Options/DisplayDebugConsole</Data></Cell> | ||
1010 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
1011 | <Cell ss:Index="5"><Data ss:Type="String">Display console debug information in LCD Window</Data></Cell> | ||
1012 | <Cell ss:Index="7"><Data ss:Type="String">LCDウィンドウã«ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã®ãƒ‡ãƒãƒƒã‚°æƒ…å ±ã‚’è¡¨ç¤º</Data></Cell> | ||
1013 | </Row> | ||
1014 | <Row> | ||
1015 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1016 | <Cell><Data ss:Type="String">/status/search_editor</Data></Cell> | ||
1017 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
1018 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
1019 | <Cell ss:Index="7"><Data ss:Type="String">検索</Data></Cell> | ||
1020 | </Row> | ||
1021 | <Row> | ||
1022 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1023 | <Cell><Data ss:Type="String">/status/search_editor</Data></Cell> | ||
1024 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
1025 | <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell> | ||
1026 | <Cell ss:Index="7"><Data ss:Type="String">Second Lifeを検索</Data></Cell> | ||
1027 | </Row> | ||
1028 | <Row> | ||
1029 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1030 | <Cell><Data ss:Type="String">/status/search_btn</Data></Cell> | ||
1031 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
1032 | </Row> | ||
1033 | <Row> | ||
1034 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1035 | <Cell><Data ss:Type="String">/status/search_btn</Data></Cell> | ||
1036 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
1037 | </Row> | ||
1038 | <Row> | ||
1039 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1040 | <Cell><Data ss:Type="String">/status/search_btn</Data></Cell> | ||
1041 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
1042 | <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell> | ||
1043 | <Cell ss:Index="7"><Data ss:Type="String">Second Lifeを検索</Data></Cell> | ||
1044 | </Row> | ||
1045 | </Table> | ||
1046 | <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> | ||
1047 | <Selected/> | ||
1048 | <Panes> | ||
1049 | <Pane> | ||
1050 | <Number>3</Number> | ||
1051 | <ActiveRow>8</ActiveRow> | ||
1052 | <ActiveCol>6</ActiveCol> | ||
1053 | </Pane> | ||
1054 | </Panes> | ||
1055 | <ProtectObjects>False</ProtectObjects> | ||
1056 | <ProtectScenarios>False</ProtectScenarios> | ||
1057 | </WorksheetOptions> | ||
1058 | </Worksheet> | ||
1059 | </Workbook> | ||
diff --git a/linden/indra/newview/skins/xui/ja/need_to_update.xml b/linden/indra/newview/skins/xui/ja/need_to_update.xml new file mode 100644 index 0000000..93e784f --- /dev/null +++ b/linden/indra/newview/skins/xui/ja/need_to_update.xml | |||
@@ -0,0 +1,419 @@ | |||
1 | <?xml version="1.0"?> | ||
2 | <?mso-application progid="Excel.Sheet"?> | ||
3 | <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" | ||
4 | xmlns:o="urn:schemas-microsoft-com:office:office" | ||
5 | xmlns:x="urn:schemas-microsoft-com:office:excel" | ||
6 | xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" | ||
7 | xmlns:html="http://www.w3.org/TR/REC-html40"> | ||
8 | <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> | ||
9 | <LastAuthor>Leyla Farazha</LastAuthor> | ||
10 | <Created>2007-11-21T00:50:48Z</Created> | ||
11 | <LastSaved>2007-11-21T00:50:48Z</LastSaved> | ||
12 | <Version>11.6568</Version> | ||
13 | </DocumentProperties> | ||
14 | <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> | ||
15 | <WindowHeight>10230</WindowHeight> | ||
16 | <WindowWidth>22875</WindowWidth> | ||
17 | <WindowTopX>-3720</WindowTopX> | ||
18 | <WindowTopY>2220</WindowTopY> | ||
19 | <ProtectStructure>False</ProtectStructure> | ||
20 | <ProtectWindows>False</ProtectWindows> | ||
21 | </ExcelWorkbook> | ||
22 | <Styles> | ||
23 | <Style ss:ID="Default" ss:Name="Normal"> | ||
24 | <Alignment ss:Vertical="Bottom"/> | ||
25 | <Borders/> | ||
26 | <Font/> | ||
27 | <Interior/> | ||
28 | <NumberFormat/> | ||
29 | <Protection/> | ||
30 | </Style> | ||
31 | <Style ss:ID="s21"> | ||
32 | <Font ss:Bold="1"/> | ||
33 | </Style> | ||
34 | <Style ss:ID="s22"> | ||
35 | <Font ss:Bold="1"/> | ||
36 | <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/> | ||
37 | </Style> | ||
38 | <Style ss:ID="s23"> | ||
39 | <Alignment ss:Vertical="Bottom" ss:WrapText="1"/> | ||
40 | </Style> | ||
41 | </Styles> | ||
42 | <Worksheet ss:Name="need_to_update2"> | ||
43 | <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="43" x:FullColumns="1" | ||
44 | x:FullRows="1"> | ||
45 | <Column ss:Width="63.75"/> | ||
46 | <Column ss:Width="70.5"/> | ||
47 | <Column ss:Width="88.5"/> | ||
48 | <Column ss:Width="63.75"/> | ||
49 | <Column ss:Width="69.75"/> | ||
50 | <Column ss:Width="90.75"/> | ||
51 | <Column ss:Width="97.5"/> | ||
52 | <Row> | ||
53 | <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell> | ||
54 | </Row> | ||
55 | <Row> | ||
56 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell> | ||
57 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell> | ||
58 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell> | ||
59 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell> | ||
60 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell> | ||
61 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell> | ||
62 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell> | ||
63 | </Row> | ||
64 | <Row ss:Height="153"> | ||
65 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
66 | <Cell><Data ss:Type="String">//ClickPublishHelpAvatar/message</Data></Cell> | ||
67 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Selecting the "Publish in Search" will show: - my profile in search results - a link to my profile in public group pages</Data></Cell> | ||
68 | <Cell ss:StyleID="s23"><Data ss:Type="String">Selecting "Show in Search" will show: - my profile in search results - a link to my profile in public group pages</Data></Cell> | ||
69 | <Cell ss:StyleID="s23"><Data ss:Type="String">「検索ã§å…¬é–‹ã€ã‚’é¸æŠžã™ã‚‹ã¨è¡¨ç¤º: - æ¤œç´¢çµæžœã«ãŠã‘る自分ã®ãƒ—ãƒãƒ•ィール - パブリックグループページã«ãŠã‘る自分ã®ãƒ—ãƒãƒ•ィールã¸ã®ãƒªãƒ³ã‚¯</Data></Cell> | ||
70 | <Cell ss:StyleID="s23"><Data ss:Type="String">「検索ã«è¡¨ç¤ºã€ã‚’é¸æŠžã™ã‚‹ã¨è¡¨ç¤º: - æ¤œç´¢çµæžœã«ãŠã‘る自分ã®ãƒ—ãƒãƒ•ィール - パブリックグループページã«ãŠã‘る自分ã®ãƒ—ãƒãƒ•ィールã¸ã®ãƒªãƒ³ã‚¯</Data></Cell> | ||
71 | </Row> | ||
72 | <Row> | ||
73 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
74 | <Cell><Data ss:Type="String">//ErrorEncodingSnapshot/message</Data></Cell> | ||
75 | <Cell ss:Index="4"><Data ss:Type="String">Error encoding snapshot.</Data></Cell> | ||
76 | <Cell><Data ss:Type="String">Error encoding snapshot!</Data></Cell> | ||
77 | <Cell><Data ss:Type="String">スナップショットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰åŒ–ã§ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¾ã—ãŸï¼</Data></Cell> | ||
78 | <Cell><Data ss:Type="String">スナップショットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰åŒ–ã§ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¾ã—ãŸï¼</Data></Cell> | ||
79 | </Row> | ||
80 | <Row ss:Height="409.5"> | ||
81 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
82 | <Cell><Data ss:Type="String">//AddClassified/message</Data></Cell> | ||
83 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the Search directory and on www.secondlife.com for one week. Fill out your ad, then click 'Publish...' to add it to the directory. You'll be asked for a price to pay when clicking Publish. Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords.</Data></Cell> | ||
84 | <Cell ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the Find directory for one week. Fill out your ad, then click 'Publish...' to add it to the directory. You'll be asked for a price to pay when clicking Publish. Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords.</Data></Cell> | ||
85 | <Cell ss:StyleID="s23"><Data ss:Type="String">クラシファイド広告ã¯ã€æ¤œç´¢ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ã‚¯ãƒ©ã‚·ãƒ•ァイドセクションã«1週間掲示ã•れã¾ã™ã€‚ 広告を記入後ã€ã€Žç™ºè¡Œã€ã‚’クリックã—ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¿½åŠ ã—ã¾ã™ã€‚ 発行ã™ã‚‹éš›ã«ã€æ”¯æ‰•ã„金é¡ã‚’å°‹ãられã¾ã™ã€‚ 支払ã„金é¡ã‚’多ãã™ã‚Œã°ã€ã‚ãªãŸã®åºƒå‘Šã¯ä¸Šä½ã«ãƒªã‚¹ãƒˆã•れã¾ã™ã€‚ã¾ãŸã€ã‚ーワード検索ã®çµæžœã§ã‚‚上ä½ã«ãƒªã‚¹ãƒˆã•れるよã†ã«ãªã‚Šã¾ã™ã€‚</Data></Cell> | ||
86 | <Cell ss:StyleID="s23"><Data ss:Type="String">検索ディレクトリã®ã€Œã‚¯ãƒ©ã‚·ãƒ•ァイドã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ã€ クラシファイド広告ãŒ1週間掲載ã•れã¾ã™ã€‚ 広告を記入後ã€ã€Œç™ºè¡Œã€ã‚’クリックã—ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã« è¿½åŠ ã—ã¾ã™ã€‚ 「発行ã€ã‚’クリックã™ã‚‹ã¨ã€æ”¯æ‰•金é¡ã‚’å°‹ãられã¾ã™ã€‚ å¤šãæ‰•ã†ã»ã©ã‚¯ãƒ©ã‚·ãƒ•ァイドリストã¨ã‚ーワード検索 ã®ä¸Šä½ã«è¡¨ç¤ºã•れã¾ã™ã€‚</Data></Cell> | ||
87 | </Row> | ||
88 | <Row ss:Height="178.5"> | ||
89 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
90 | <Cell><Data ss:Type="String">//HelpEstateExternallyVisible/message</Data></Cell> | ||
91 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">This checkbox sets whether Residents who are on other estates can enter this estate without being on an access list. Default: on</Data></Cell> | ||
92 | <Cell ss:StyleID="s23"><Data ss:Type="String">This checkbox sets whether Residents who are on other estates can enter this estate without being on an access list. Default: on</Data></Cell> | ||
93 | <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã¯ã€ä»–ã®ä¸å‹•産ã«ã„ã‚‹ä½äººãŒã€ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã«ç™»éŒ²ã•れã¦ã„ãªãã¦ã‚‚ã€ã“ã®ä¸å‹•産ã«ç«‹ã¡å…¥ã‚‹ã“ã¨ãŒã§ãã‚‹ã‹ã©ã†ã‹ã‚’ è¨å®šã—ã¾ã™ã€‚ デフォルト:オン</Data></Cell> | ||
94 | <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã¯ã€ä»–ã®ä¸å‹•産ã«ã„ã‚‹ä½äººãŒã€ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã«ç™»éŒ²ã•れã¦ã„ãªãã¦ã‚‚ã€ã“ã®ä¸å‹•産ã«ç«‹ã¡å…¥ã‚‹ã“ã¨ãŒã§ãã‚‹ã‹ã©ã†ã‹ã‚’ è¨å®šã—ã¾ã™ã€‚ デフォルト:オン</Data></Cell> | ||
95 | </Row> | ||
96 | <Row ss:Height="204"> | ||
97 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
98 | <Cell><Data ss:Type="String">//HelpEstateAllowResident/message</Data></Cell> | ||
99 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to Residents listed here and any groups below. This setting is only available when Visible from Mainland is unchecked.</Data></Cell> | ||
100 | <Cell ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to Residents listed here and any groups below. This setting is only available when Visible from Mainland is unchecked.</Data></Cell> | ||
101 | <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ã“ã“ã«ç™»éŒ²ã•れã¦ã„ã‚‹ä½äººã¨ 下記ã§ç‰¹åˆ¥ã«ç™»éŒ²ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿ã«è¨±å¯ã•れã¾ã™ã€‚ã“ã®è¨å®šã¯ã€ 「メインランドã‹ã‚‰ã“ã“ãŒè¦‹ãˆã‚‹ã€ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ãªã„å ´åˆã®ã¿ã€ 利用ã§ãã¾ã™ã€‚</Data></Cell> | ||
102 | <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ã“ã“ã«ç™»éŒ²ã•れã¦ã„ã‚‹ä½äººã¨ 下記ã§ç‰¹åˆ¥ã«ç™»éŒ²ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿ã«è¨±å¯ã•れã¾ã™ã€‚ã“ã®è¨å®šã¯ã€ 「メインランドã‹ã‚‰ã“ã“ãŒè¦‹ãˆã‚‹ã€ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ãªã„å ´åˆã®ã¿ã€ 利用ã§ãã¾ã™ã€‚</Data></Cell> | ||
103 | </Row> | ||
104 | <Row ss:Height="204"> | ||
105 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
106 | <Cell><Data ss:Type="String">//HelpEstateAllowGroup/message</Data></Cell> | ||
107 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to groups listed here and any Residents above. This setting is only available when Visible from Mainland is unchecked.</Data></Cell> | ||
108 | <Cell ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to groups listed here and any Residents above. This setting is only available when Visible from Mainland is unchecked.</Data></Cell> | ||
109 | <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ã“ã“ã«ç™»éŒ²ã•れã¦ã„るグループ㨠下記ã§ç‰¹åˆ¥ã«ç™»éŒ²ã•れãŸä½äººã®ã¿ã«è¨±å¯ã•れã¾ã™ã€‚ã“ã®è¨å®šã¯ã€ 「メインランドã‹ã‚‰ã“ã“ãŒè¦‹ãˆã‚‹ã€ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ãªã„å ´åˆã®ã¿ã€ 利用ã§ãã¾ã™ã€‚</Data></Cell> | ||
110 | <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ã“ã“ã«ç™»éŒ²ã•れã¦ã„るグループ㨠下記ã§ç‰¹åˆ¥ã«ç™»éŒ²ã•れãŸä½äººã®ã¿ã«è¨±å¯ã•れã¾ã™ã€‚ã“ã®è¨å®šã¯ã€ 「メインランドã‹ã‚‰ã“ã“ãŒè¦‹ãˆã‚‹ã€ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ãªã„å ´åˆã®ã¿ã€ 利用ã§ãã¾ã™ã€‚</Data></Cell> | ||
111 | </Row> | ||
112 | <Row ss:Height="191.25"> | ||
113 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
114 | <Cell><Data ss:Type="String">//HelpEstateVoiceChat/message</Data></Cell> | ||
115 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Parcels in this estate are allowed to have their own voice channels in which residents may hear and talk with others nearby. Default: off</Data></Cell> | ||
116 | <Cell ss:StyleID="s23"><Data ss:Type="String">Parcels in this estate are allowed to have their own voice channels in which residents may hear and talk with others nearby. Default: off</Data></Cell> | ||
117 | <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ä¸å‹•産ã®åŒºç”»ã¯ã€ä½äººãŒè¿‘所ã®äººã¨å¯¾è©±ã§ãã‚‹ 独自ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’æŒã¤ã“ã¨ãŒ ã§ãã¾ã™ã€‚ デフォルト:オフ</Data></Cell> | ||
118 | <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ä¸å‹•産ã®åŒºç”»ã¯ã€ä½äººãŒè¿‘所ã®äººã¨å¯¾è©±ã§ãã‚‹ 独自ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’æŒã¤ã“ã¨ãŒ ã§ãã¾ã™ã€‚ デフォルト:オフ</Data></Cell> | ||
119 | </Row> | ||
120 | <Row ss:Height="331.5"> | ||
121 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
122 | <Cell><Data ss:Type="String">//BadURL/message</Data></Cell> | ||
123 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life doesn't know how to handle the link: [SLURL] Most links are similar to this: secondlife://app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about Please check the spelling and try again.</Data></Cell> | ||
124 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life doesn't know how to handle the link: [SLURL] Most links are similar to this: secondlife:///app/agent/0e346d8b-4433-4d66-a6b0- fd37083abc4c/about Please check the spelling and try again.</Data></Cell> | ||
125 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life ãŒãƒªãƒ³ã‚¯ã‚’処ç†ã§ãã¾ã›ã‚“。 [SLURL] ã»ã¨ã‚“ã©ã®ãƒªãƒ³ã‚¯ã¯ã€æ¬¡ã®ã‚ˆã†ãªå½¢å¼ã§ã™ã€‚ secondlife://app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about ã¤ã¥ã‚Šã‚’ãƒã‚§ãƒƒã‚¯ã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。</Data></Cell> | ||
126 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life ãŒãƒªãƒ³ã‚¯ã‚’処ç†ã§ãã¾ã›ã‚“。 [SLURL] ã»ã¨ã‚“ã©ã®ãƒªãƒ³ã‚¯ã¯ã€æ¬¡ã®ã‚ˆã†ãªå½¢å¼ã§ã™ã€‚ secondlife:///app/agent/0e346d8b-4433-4d66-a6b0- fd37083abc4c/about ã¤ã¥ã‚Šã‚’ãƒã‚§ãƒƒã‚¯ã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。</Data></Cell> | ||
127 | </Row> | ||
128 | <Row> | ||
129 | <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell> | ||
130 | <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/ShowDirectoryCheck</Data></Cell> | ||
131 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
132 | <Cell><Data ss:Type="String">Show in Search > Places (L$30/week) under</Data></Cell> | ||
133 | <Cell><Data ss:Type="String">Show Place in Search (L$30/week) under</Data></Cell> | ||
134 | <Cell><Data ss:Type="String">「検索ã€ï¼žã€Œå ´æ‰€ã€ã«è¡¨ç¤ºï¼ˆL$30/週)</Data></Cell> | ||
135 | <Cell><Data ss:Type="String">検索ã«è¡¨ç¤ºï¼žï¼ˆé€±L$30)以下ã®å ´æ‰€</Data></Cell> | ||
136 | </Row> | ||
137 | <Row ss:Height="25.5"> | ||
138 | <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell> | ||
139 | <Cell><Data ss:Type="String">/floaterland/landtab/land_media_panel/Media texture:</Data></Cell> | ||
140 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Media texture:</Data></Cell> | ||
141 | <Cell ss:StyleID="s23"><Data ss:Type="String">Sound Settings:</Data></Cell> | ||
142 | <Cell><Data ss:Type="String">サウンドã®è¨å®š:</Data></Cell> | ||
143 | <Cell ss:StyleID="s23"><Data ss:Type="String">サウンド è¨å®š:</Data></Cell> | ||
144 | </Row> | ||
145 | <Row> | ||
146 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
147 | <Cell><Data ss:Type="String">/directory</Data></Cell> | ||
148 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
149 | <Cell><Data ss:Type="String">Search</Data></Cell> | ||
150 | <Cell><Data ss:Type="String">Search Second Life</Data></Cell> | ||
151 | <Cell><Data ss:Type="String">検索</Data></Cell> | ||
152 | <Cell><Data ss:Type="String">Second Lifeを検索</Data></Cell> | ||
153 | </Row> | ||
154 | <Row> | ||
155 | <Cell><Data ss:Type="String">floater_html_help.xml</Data></Cell> | ||
156 | <Cell><Data ss:Type="String">/htmlhelp/status_text</Data></Cell> | ||
157 | <Cell ss:Index="4"><Data ss:Type="String">Done</Data></Cell> | ||
158 | <Cell><Data ss:Type="String">Ready</Data></Cell> | ||
159 | <Cell><Data ss:Type="String">完了</Data></Cell> | ||
160 | <Cell><Data ss:Type="String">準備完了</Data></Cell> | ||
161 | </Row> | ||
162 | <Row> | ||
163 | <Cell><Data ss:Type="String">floater_lagmeter.xml</Data></Cell> | ||
164 | <Cell><Data ss:Type="String">/floater_lagmeter/network_ping_warning_ms</Data></Cell> | ||
165 | <Cell ss:Index="4"><Data ss:Type="Number">250</Data></Cell> | ||
166 | <Cell><Data ss:Type="Number">300</Data></Cell> | ||
167 | <Cell><Data ss:Type="Number">250</Data></Cell> | ||
168 | <Cell><Data ss:Type="Number">300</Data></Cell> | ||
169 | </Row> | ||
170 | <Row> | ||
171 | <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell> | ||
172 | <Cell><Data ss:Type="String">/land holdings floater/allowed_text</Data></Cell> | ||
173 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
174 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
175 | <Cell><Data ss:Type="String">0平方メートル</Data></Cell> | ||
176 | <Cell><Data ss:Type="String">[AREA]平方メートル</Data></Cell> | ||
177 | </Row> | ||
178 | <Row> | ||
179 | <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell> | ||
180 | <Cell><Data ss:Type="String">/land holdings floater/current_text</Data></Cell> | ||
181 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
182 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
183 | <Cell><Data ss:Type="String">0平方メートル</Data></Cell> | ||
184 | <Cell><Data ss:Type="String">[AREA]平方メートル</Data></Cell> | ||
185 | </Row> | ||
186 | <Row> | ||
187 | <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell> | ||
188 | <Cell><Data ss:Type="String">/land holdings floater/available_text</Data></Cell> | ||
189 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
190 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
191 | <Cell><Data ss:Type="String">0平方メートル</Data></Cell> | ||
192 | <Cell><Data ss:Type="String">[AREA]平方メートル</Data></Cell> | ||
193 | </Row> | ||
194 | <Row> | ||
195 | <Cell><Data ss:Type="String">floater_tools.xml</Data></Cell> | ||
196 | <Cell><Data ss:Type="String">/toolbox floater/Object Info Tabs/General/search_check</Data></Cell> | ||
197 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
198 | <Cell><Data ss:Type="String">Show in Search</Data></Cell> | ||
199 | <Cell><Data ss:Type="String">Show in search</Data></Cell> | ||
200 | <Cell><Data ss:Type="String">検索ã§è¡¨ç¤º</Data></Cell> | ||
201 | <Cell><Data ss:Type="String">検索ã«è¡¨ç¤º</Data></Cell> | ||
202 | </Row> | ||
203 | <Row> | ||
204 | <Cell><Data ss:Type="String">menu_inventory.xml</Data></Cell> | ||
205 | <Cell><Data ss:Type="String">/Popup/Teleport To Landmark</Data></Cell> | ||
206 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
207 | <Cell><Data ss:Type="String">Teleport To Landmark</Data></Cell> | ||
208 | <Cell><Data ss:Type="String">About Landmark</Data></Cell> | ||
209 | <Cell><Data ss:Type="String">ランドマークã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ</Data></Cell> | ||
210 | <Cell><Data ss:Type="String">ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯æƒ…å ±</Data></Cell> | ||
211 | </Row> | ||
212 | <Row> | ||
213 | <Cell><Data ss:Type="String">panel_audio_device.xml</Data></Cell> | ||
214 | <Cell><Data ss:Type="String">/device_settings/Input device (microphone):</Data></Cell> | ||
215 | <Cell ss:Index="4"><Data ss:Type="String">Audio Devices</Data></Cell> | ||
216 | <Cell><Data ss:Type="String">Input device (microphone):</Data></Cell> | ||
217 | <Cell><Data ss:Type="String">入力レベル</Data></Cell> | ||
218 | <Cell><Data ss:Type="String">入力機器 (マイクãƒãƒ•ォン):</Data></Cell> | ||
219 | </Row> | ||
220 | <Row> | ||
221 | <Cell><Data ss:Type="String">panel_audio_device.xml</Data></Cell> | ||
222 | <Cell><Data ss:Type="String">/device_settings/Input device (microphone):</Data></Cell> | ||
223 | <Cell ss:Index="4"><Data ss:Type="String">Audio Devices</Data></Cell> | ||
224 | <Cell><Data ss:Type="String">Input Level</Data></Cell> | ||
225 | <Cell><Data ss:Type="String">入力レベル</Data></Cell> | ||
226 | <Cell><Data ss:Type="String">入力レベル</Data></Cell> | ||
227 | </Row> | ||
228 | <Row> | ||
229 | <Cell><Data ss:Type="String">panel_avatar.xml</Data></Cell> | ||
230 | <Cell><Data ss:Type="String">/Panel Avatar/tab/2nd Life/allow_publish</Data></Cell> | ||
231 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
232 | <Cell><Data ss:Type="String">Show In Search</Data></Cell> | ||
233 | <Cell><Data ss:Type="String">Show in search</Data></Cell> | ||
234 | <Cell><Data ss:Type="String">検索ã§è¡¨ç¤º</Data></Cell> | ||
235 | <Cell><Data ss:Type="String">検索ã«è¡¨ç¤º</Data></Cell> | ||
236 | </Row> | ||
237 | <Row> | ||
238 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
239 | <Cell><Data ss:Type="String">/general_tab/preferences_container/show_in_group_list</Data></Cell> | ||
240 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
241 | <Cell><Data ss:Type="String">Show In Search</Data></Cell> | ||
242 | <Cell><Data ss:Type="String">Show in search</Data></Cell> | ||
243 | <Cell><Data ss:Type="String">検索ã§è¡¨ç¤º</Data></Cell> | ||
244 | <Cell><Data ss:Type="String">検索ã«è¡¨ç¤º</Data></Cell> | ||
245 | </Row> | ||
246 | <Row> | ||
247 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
248 | <Cell><Data ss:Type="String">/general_tab/preferences_container/mature</Data></Cell> | ||
249 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
250 | <Cell><Data ss:Type="String">Mature Group</Data></Cell> | ||
251 | <Cell><Data ss:Type="String">Mature group</Data></Cell> | ||
252 | <Cell><Data ss:Type="String">æˆäººå‘グループ</Data></Cell> | ||
253 | <Cell><Data ss:Type="String">æˆäººå‘ã‘グループ</Data></Cell> | ||
254 | </Row> | ||
255 | <Row> | ||
256 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
257 | <Cell><Data ss:Type="String">/general_tab/preferences_container/open_enrollement</Data></Cell> | ||
258 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
259 | <Cell><Data ss:Type="String">Open Enrollment</Data></Cell> | ||
260 | <Cell><Data ss:Type="String">Open enrollment</Data></Cell> | ||
261 | <Cell><Data ss:Type="String">会員募集</Data></Cell> | ||
262 | <Cell><Data ss:Type="String">会員募集</Data></Cell> | ||
263 | </Row> | ||
264 | <Row> | ||
265 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
266 | <Cell><Data ss:Type="String">/general_tab/preferences_container/check_enrollment_fee</Data></Cell> | ||
267 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
268 | <Cell><Data ss:Type="String">Enrollment Fee: L$</Data></Cell> | ||
269 | <Cell><Data ss:Type="String">Enrollment fee: L$</Data></Cell> | ||
270 | <Cell><Data ss:Type="String">入会費:L$</Data></Cell> | ||
271 | <Cell><Data ss:Type="String">入会費:L$</Data></Cell> | ||
272 | </Row> | ||
273 | <Row> | ||
274 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
275 | <Cell><Data ss:Type="String">/general_tab/preferences_container/receive_notices</Data></Cell> | ||
276 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
277 | <Cell><Data ss:Type="String">Receive Group Notices</Data></Cell> | ||
278 | <Cell><Data ss:Type="String">Receive group notices</Data></Cell> | ||
279 | <Cell><Data ss:Type="String">グループ通知をå—ä¿¡</Data></Cell> | ||
280 | <Cell><Data ss:Type="String">グループ通知をå—ä¿¡</Data></Cell> | ||
281 | </Row> | ||
282 | <Row> | ||
283 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
284 | <Cell><Data ss:Type="String">/general_tab/preferences_container/list_groups_in_profile</Data></Cell> | ||
285 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
286 | <Cell><Data ss:Type="String">List Group in Profile</Data></Cell> | ||
287 | <Cell><Data ss:Type="String">List group in my profile</Data></Cell> | ||
288 | <Cell><Data ss:Type="String">プãƒãƒ•ィールã«ã‚°ãƒ«ãƒ¼ãƒ—をリスト</Data></Cell> | ||
289 | <Cell><Data ss:Type="String">プãƒãƒ•ィールã«ã‚°ãƒ«ãƒ¼ãƒ—をリスト</Data></Cell> | ||
290 | </Row> | ||
291 | <Row> | ||
292 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
293 | <Cell><Data ss:Type="String">/land_money_tab/total_contributed_land_value</Data></Cell> | ||
294 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
295 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
296 | <Cell><Data ss:Type="String">0平方メートル</Data></Cell> | ||
297 | <Cell><Data ss:Type="String">[AREA]平方メートル</Data></Cell> | ||
298 | </Row> | ||
299 | <Row> | ||
300 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
301 | <Cell><Data ss:Type="String">/land_money_tab/total_land_in_use_value</Data></Cell> | ||
302 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
303 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
304 | <Cell><Data ss:Type="String">0平方メートル</Data></Cell> | ||
305 | <Cell><Data ss:Type="String">[AREA]平方メートル</Data></Cell> | ||
306 | </Row> | ||
307 | <Row> | ||
308 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
309 | <Cell><Data ss:Type="String">/land_money_tab/land_available_value</Data></Cell> | ||
310 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
311 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
312 | <Cell><Data ss:Type="String">0平方メートル</Data></Cell> | ||
313 | <Cell><Data ss:Type="String">[AREA]平方メートル</Data></Cell> | ||
314 | </Row> | ||
315 | <Row> | ||
316 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
317 | <Cell><Data ss:Type="String">/land_money_tab/your_contribution_max_value</Data></Cell> | ||
318 | <Cell ss:Index="4"><Data ss:Type="String">([AMOUNT] max)</Data></Cell> | ||
319 | <Cell><Data ss:Type="String">sq. meters ([AMOUNT] max)</Data></Cell> | ||
320 | <Cell><Data ss:Type="String">([AMOUNT]最大)</Data></Cell> | ||
321 | <Cell><Data ss:Type="String">平方メートル ([AMOUNT]最大)</Data></Cell> | ||
322 | </Row> | ||
323 | <Row> | ||
324 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
325 | <Cell><Data ss:Type="String">/Place/traffic_text</Data></Cell> | ||
326 | <Cell ss:Index="4"><Data ss:Type="String">Traffic: [TRAFFIC].</Data></Cell> | ||
327 | <Cell><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell> | ||
328 | <Cell><Data ss:Type="String">交通é‡ï¼š [TRAFFIC].</Data></Cell> | ||
329 | <Cell><Data ss:Type="String">交通é‡ï¼š [TRAFFIC]</Data></Cell> | ||
330 | </Row> | ||
331 | <Row> | ||
332 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
333 | <Cell><Data ss:Type="String">/Place/area_text</Data></Cell> | ||
334 | <Cell ss:Index="4"><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell> | ||
335 | <Cell><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell> | ||
336 | <Cell><Data ss:Type="String">エリア:[AREA]平方メートル</Data></Cell> | ||
337 | <Cell><Data ss:Type="String">é¢ç©ï¼šï¼»AREA]平方メートル</Data></Cell> | ||
338 | </Row> | ||
339 | <Row> | ||
340 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
341 | <Cell><Data ss:Type="String">/Place/forsale_text</Data></Cell> | ||
342 | <Cell ss:Index="4"><Data ss:Type="String">For Sale for L$ [PRICE].</Data></Cell> | ||
343 | <Cell><Data ss:Type="String">For Sale for L$ [PRICE]</Data></Cell> | ||
344 | <Cell><Data ss:Type="String">L$[PRICE]ã§å£²ã‚Šå‡ºã—ä¸ã€‚</Data></Cell> | ||
345 | <Cell><Data ss:Type="String">L$[PRICE]ã§å£²ã‚Šå‡ºã—ä¸ã€‚</Data></Cell> | ||
346 | </Row> | ||
347 | <Row> | ||
348 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
349 | <Cell><Data ss:Type="String">/Place/auction_text</Data></Cell> | ||
350 | <Cell ss:Index="4"><Data ss:Type="String">Auction ID [ID].</Data></Cell> | ||
351 | <Cell><Data ss:Type="String">Auction ID [ID].</Data></Cell> | ||
352 | <Cell><Data ss:Type="String">オークションID [ID]。</Data></Cell> | ||
353 | <Cell><Data ss:Type="String">オークションID [ID]。</Data></Cell> | ||
354 | </Row> | ||
355 | <Row> | ||
356 | <Cell><Data ss:Type="String">panel_preferences_audio.xml</Data></Cell> | ||
357 | <Cell><Data ss:Type="String">/Media panel/doppler_effect_text</Data></Cell> | ||
358 | <Cell ss:Index="4"><Data ss:Type="String">Streaming Preferences:</Data></Cell> | ||
359 | <Cell><Data ss:Type="String">Audio Preferences:</Data></Cell> | ||
360 | <Cell><Data ss:Type="String">オーディオ環境è¨å®šï¼š</Data></Cell> | ||
361 | <Cell><Data ss:Type="String">オーディオ環境è¨å®šï¼š</Data></Cell> | ||
362 | </Row> | ||
363 | <Row> | ||
364 | <Cell><Data ss:Type="String">panel_preferences_im.xml</Data></Cell> | ||
365 | <Cell><Data ss:Type="String">/im/text_box3</Data></Cell> | ||
366 | <Cell ss:Index="4"><Data ss:Type="String">Busy Mode Response:</Data></Cell> | ||
367 | <Cell><Data ss:Type="String">Logging Options:</Data></Cell> | ||
368 | <Cell><Data ss:Type="String">ãƒã‚°ã‚¤ãƒ³ã‚ªãƒ—ション:</Data></Cell> | ||
369 | <Cell><Data ss:Type="String">ãƒã‚°ã‚¤ãƒ³ã‚ªãƒ—ション:</Data></Cell> | ||
370 | </Row> | ||
371 | <Row> | ||
372 | <Cell><Data ss:Type="String">panel_preferences_voice.xml</Data></Cell> | ||
373 | <Cell><Data ss:Type="String">/chat/ear_location/0</Data></Cell> | ||
374 | <Cell ss:Index="4"><Data ss:Type="String">Hear Voice Chat from camera position.</Data></Cell> | ||
375 | <Cell><Data ss:Type="String">Hear Voice Chat from camera position.</Data></Cell> | ||
376 | <Cell><Data ss:Type="String">カメラã®ä½ç½®ã‹ã‚‰ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’èžã。</Data></Cell> | ||
377 | <Cell><Data ss:Type="String">カメラã®ä½ç½®ã‹ã‚‰ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’èžã。</Data></Cell> | ||
378 | </Row> | ||
379 | <Row> | ||
380 | <Cell><Data ss:Type="String">panel_preferences_voice.xml</Data></Cell> | ||
381 | <Cell><Data ss:Type="String">/chat/ear_location/1</Data></Cell> | ||
382 | <Cell ss:Index="4"><Data ss:Type="String">Hear Voice Chat from avatar position.</Data></Cell> | ||
383 | <Cell><Data ss:Type="String">Hear Voice Chat from avatar position.</Data></Cell> | ||
384 | <Cell><Data ss:Type="String">ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‹ã‚‰ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’èžã。</Data></Cell> | ||
385 | <Cell><Data ss:Type="String">ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‹ã‚‰ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’èžã。</Data></Cell> | ||
386 | </Row> | ||
387 | <Row> | ||
388 | <Cell><Data ss:Type="String">panel_region_general.xml</Data></Cell> | ||
389 | <Cell><Data ss:Type="String">/General/block_parcel_search_check</Data></Cell> | ||
390 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
391 | <Cell><Data ss:Type="String">Block Parcel Search</Data></Cell> | ||
392 | <Cell><Data ss:Type="String">Block Land Show in Search</Data></Cell> | ||
393 | <Cell><Data ss:Type="String">åŒºç”»ã®æ¤œç´¢ã‚’ブãƒãƒƒã‚¯</Data></Cell> | ||
394 | <Cell><Data ss:Type="String">åœŸåœ°ã®æ¤œç´¢è¡¨ç¤ºã‚’ブãƒãƒƒã‚¯</Data></Cell> | ||
395 | </Row> | ||
396 | <Row> | ||
397 | <Cell><Data ss:Type="String">panel_voice_options.xml</Data></Cell> | ||
398 | <Cell><Data ss:Type="String">/content_panel/push_to_talk_check</Data></Cell> | ||
399 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
400 | <Cell><Data ss:Type="String">Only allow Friends to initiate Voice Calls with me</Data></Cell> | ||
401 | <Cell><Data ss:Type="String">Start Viewer in Push-to-Talk mode</Data></Cell> | ||
402 | <Cell><Data ss:Type="String">プッシュ・トゥ・トークモードã§ãƒ“ュアーを起動</Data></Cell> | ||
403 | <Cell><Data ss:Type="String">プッシュ・トゥ・トークモードã§ãƒ“ュアーを起動</Data></Cell> | ||
404 | </Row> | ||
405 | </Table> | ||
406 | <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> | ||
407 | <Selected/> | ||
408 | <Panes> | ||
409 | <Pane> | ||
410 | <Number>3</Number> | ||
411 | <ActiveRow>2</ActiveRow> | ||
412 | <ActiveCol>7</ActiveCol> | ||
413 | </Pane> | ||
414 | </Panes> | ||
415 | <ProtectObjects>False</ProtectObjects> | ||
416 | <ProtectScenarios>False</ProtectScenarios> | ||
417 | </WorksheetOptions> | ||
418 | </Worksheet> | ||
419 | </Workbook> | ||
diff --git a/linden/indra/newview/skins/xui/ja/panel_login.xml b/linden/indra/newview/skins/xui/ja/panel_login.xml index 6be17a1..e8ac742 100644 --- a/linden/indra/newview/skins/xui/ja/panel_login.xml +++ b/linden/indra/newview/skins/xui/ja/panel_login.xml | |||
@@ -1,44 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | 1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> |
2 | <panel name="panel_login"> | 2 | <panel name="panel_login"> |
3 | <text name="real_url"> | 3 | <text name="real_url"> |
4 | http://secondlife.com/app/login/ | 4 | https://secondlife.com/app/login/pt/?show_login_form=True |
5 | </text> | ||
6 | <text name="first_name_text"> | ||
7 | ファーストãƒãƒ¼ãƒ : | ||
8 | </text> | ||
9 | <text name="last_name_text"> | ||
10 | ラストãƒãƒ¼ãƒ : | ||
11 | </text> | ||
12 | <text name="password_text"> | ||
13 | パスワード: | ||
14 | </text> | ||
15 | <text name="start_location_text"> | ||
16 | é–‹å§‹ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ï¼š | ||
17 | </text> | ||
18 | <combo_box name="start_location_combo"> | ||
19 | <combo_item name="MyHome"> | ||
20 | 自宅(ホーム) | ||
21 | </combo_item> | ||
22 | <combo_item name="MyLastLocation"> | ||
23 | 最後ã®ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ | ||
24 | </combo_item> | ||
25 | <combo_item name="Typeregionname"> | ||
26 | <地域ã®åå‰å…¥åŠ›> | ||
27 | </combo_item> | ||
28 | </combo_box> | ||
29 | <check_box label="パスワードを記憶" name="remember_check" /> | ||
30 | <text name="full_screen_text"> | ||
31 | ãƒã‚°ã‚¤ãƒ³æ™‚ã«ã¯ãƒ•ルスクリーン表示ã«ãªã‚Šã¾ã™ | ||
32 | </text> | ||
33 | <button label="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..." label_selected="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..." | ||
34 | name="new_account_btn" /> | ||
35 | <button label="環境è¨å®š..." label_selected="環境è¨å®š..." name="preferences_btn" /> | ||
36 | <button label="接続" label_selected="接続" name="connect_btn" /> | ||
37 | <button label="終了" label_selected="終了" name="quit_btn" /> | ||
38 | <text name="version_text"> | ||
39 | 1.23.4 (5) | ||
40 | </text> | ||
41 | <text name="channel_text"> | ||
42 | [Viewer Channel Name] | ||
43 | </text> | 5 | </text> |
44 | </panel> | 6 | </panel> |
diff --git a/linden/indra/newview/skins/xui/ja/panel_preferences_LCD.xml b/linden/indra/newview/skins/xui/ja/panel_preferences_LCD.xml new file mode 100644 index 0000000..899de6d --- /dev/null +++ b/linden/indra/newview/skins/xui/ja/panel_preferences_LCD.xml | |||
@@ -0,0 +1,33 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <panel label="ãƒã‚¸ã‚¯ãƒ¼ãƒ«LCD" name="LCD Options"> | ||
3 | <text name="LCD Destination:"> | ||
4 | LCD出力先: | ||
5 | </text> | ||
6 | <radio_group name="LCDDestination"> | ||
7 | <radio_item name="DestinationG15" | ||
8 | tool_tip="é¸æŠžã—ãŸãƒ•ォームをãƒã‚¸ã‚¯ãƒ¼ãƒ«G15 Keyboardã®LCDç”»é¢è¡¨ç¤ºç”¨ã«è¡¨ç¤º"> | ||
9 | ãƒã‚¸ã‚¯ãƒ¼ãƒ« G15 Gaming Keyboard | ||
10 | </radio_item> | ||
11 | <radio_item name="DestinationZ10" | ||
12 | tool_tip="é¸æŠžã—ãŸãƒ•ォームをãƒã‚¸ã‚¯ãƒ¼ãƒ«G15 Keyboardã®LCDç”»é¢è¡¨ç¤ºç”¨ã«è¡¨ç¤º"> | ||
13 | ãƒã‚¸ã‚¯ãƒ¼ãƒ«Z10スピーカー | ||
14 | </radio_item> | ||
15 | </radio_group> | ||
16 | <text name="LCD Display Options"> | ||
17 | LCD表示オプション | ||
18 | </text> | ||
19 | <check_box label="ãƒãƒ£ãƒƒãƒˆã‚’表示" name="DisplayChat" | ||
20 | tool_tip="LCDウィンドウã«ç›´è¿‘ã®ãƒãƒ£ãƒƒãƒˆã‚’表示" /> | ||
21 | <check_box label="IMを表示" name="DisplayIM" | ||
22 | tool_tip="LCDウィンドウã«ç›´è¿‘ã®IMを表示" /> | ||
23 | <check_box label="åœŸåœ°æƒ…å ±ã‚’è¡¨ç¤º" name="DisplayRegion" | ||
24 | tool_tip="LCDウィンドウã«ç¾åœ¨ã®æ‰€åœ¨åœ°ã®æƒ…å ±ã‚’è¡¨ç¤º" /> | ||
25 | <check_box label="ã‚¢ã‚«ã‚¦ãƒ³ãƒˆæƒ…å ±ã‚’è¡¨ç¤º" name="DisplayLinden" | ||
26 | tool_tip="LCDウィンドウã«ç¾åœ¨ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆæƒ…å ±ã‚’è¡¨ç¤º" /> | ||
27 | <check_box label="ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³æƒ…å ±ã‚’è¡¨ç¤º" | ||
28 | name="DisplayDebug" | ||
29 | tool_tip="LCDウィンドウã«ãƒ‡ãƒãƒƒã‚°æƒ…å ±ã‚’è¡¨ç¤º" /> | ||
30 | <check_box label="コンソールã‹ã‚‰ã®ãƒ‡ãƒãƒƒã‚°æƒ…å ±ã‚’è¡¨ç¤º" | ||
31 | name="DisplayDebugConsole" | ||
32 | tool_tip="LCDウィンドウã«ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã®ãƒ‡ãƒãƒƒã‚°æƒ…å ±ã‚’è¡¨ç¤º" /> | ||
33 | </panel> | ||
diff --git a/linden/indra/newview/skins/xui/ko/LCD_text.xml b/linden/indra/newview/skins/xui/ko/LCD_text.xml new file mode 100644 index 0000000..0ebfae7 --- /dev/null +++ b/linden/indra/newview/skins/xui/ko/LCD_text.xml | |||
@@ -0,0 +1,75 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <panel name="panel_login"> | ||
3 | <text name="DebugInfo"> | ||
4 | 디버그 ì •ë³´ | ||
5 | </text> | ||
6 | <text name="FPS"> | ||
7 | FPS | ||
8 | </text> | ||
9 | <text name="SimFPS"> | ||
10 | SimFPS | ||
11 | </text> | ||
12 | <text name="Pin"> | ||
13 | 패킷 ìž…ë ¥ | ||
14 | </text> | ||
15 | <text name="Pout"> | ||
16 | 패킷 ì¶œë ¥ | ||
17 | </text> | ||
18 | <text name="PLoss"> | ||
19 | 패킷 ì†ì‹¤ | ||
20 | </text> | ||
21 | <text name="Ping"> | ||
22 | Ping | ||
23 | </text> | ||
24 | <text name="AccountDetails"> | ||
25 | ê³„ì • ì„¸ë¶€ì‚¬í• | ||
26 | </text> | ||
27 | <text name="LBal"> | ||
28 | L$ ìž”ê³ | ||
29 | </text> | ||
30 | <text name="Time"> | ||
31 | 시간 | ||
32 | </text> | ||
33 | <text name="LocationDetails1"> | ||
34 | 위치 ì„¸ë¶€ì‚¬í• 1 | ||
35 | </text> | ||
36 | <text name="LocationDetails2"> | ||
37 | 위치 ì„¸ë¶€ì‚¬í• 2 | ||
38 | </text> | ||
39 | <text name="Region"> | ||
40 | ì§€ì— | ||
41 | </text> | ||
42 | <text name="Parcel"> | ||
43 | êµ¬íš | ||
44 | </text> | ||
45 | <text name="Pos"> | ||
46 | Pos | ||
47 | </text> | ||
48 | <text name="Sqm"> | ||
49 | Sqm | ||
50 | </text> | ||
51 | <text name="Owner"> | ||
52 | ì†Œìœ ìž | ||
53 | </text> | ||
54 | <text name="Type"> | ||
55 | ìœ í˜• | ||
56 | </text> | ||
57 | <text name="Yes"> | ||
58 | 예 | ||
59 | </text> | ||
60 | <text name="No"> | ||
61 | 아니오 | ||
62 | </text> | ||
63 | <text name="Forsale"> | ||
64 | 매물 | ||
65 | </text> | ||
66 | <text name="Traffic"> | ||
67 | 통행량 | ||
68 | </text> | ||
69 | <text name="Last3ChatLines"> | ||
70 | 마지막 3개 채팅 행 | ||
71 | </text> | ||
72 | <text name="Last3IMLines"> | ||
73 | 마지막 3ê°œ ë©”ì‹ ì € í–‰ | ||
74 | </text> | ||
75 | </panel> | ||
diff --git a/linden/indra/newview/skins/xui/ko/floater_landmark_ctrl.xml b/linden/indra/newview/skins/xui/ko/floater_landmark_ctrl.xml new file mode 100644 index 0000000..dd72ea4 --- /dev/null +++ b/linden/indra/newview/skins/xui/ko/floater_landmark_ctrl.xml | |||
@@ -0,0 +1,10 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <floater name="landmarkpicker" title="구성: ëžœë“œë§ˆí¬ ë§Œë“¤ê¸°"> | ||
3 | <check_box label="í´ë” 표시" name="show_folders_check" /> | ||
4 | <button label="ì‹ ê·œ" label_selected="ì‹ ê·œ" name="New" /> | ||
5 | <button label="ì´ë¦„ 변경" label_selected="ì´ë¦„ 변경" name="Rename" /> | ||
6 | <button label="새 í´ë”" label_selected="새 í´ë”" name="NewFolder" /> | ||
7 | <button label="편집" label_selected="편집" name="Edit" /> | ||
8 | <button label="ì‚ì œ" label_selected="ì‚ì œ" name="Delete" /> | ||
9 | <button label="닫기" label_selected="닫기" name="Close" /> | ||
10 | </floater> | ||
diff --git a/linden/indra/newview/skins/xui/ko/floater_preview_classified.xml b/linden/indra/newview/skins/xui/ko/floater_preview_classified.xml new file mode 100644 index 0000000..c820fbf --- /dev/null +++ b/linden/indra/newview/skins/xui/ko/floater_preview_classified.xml | |||
@@ -0,0 +1,2 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <floater name="classified_preview" /> | ||
diff --git a/linden/indra/newview/skins/xui/ko/floater_preview_event.xml b/linden/indra/newview/skins/xui/ko/floater_preview_event.xml new file mode 100644 index 0000000..732e1fe --- /dev/null +++ b/linden/indra/newview/skins/xui/ko/floater_preview_event.xml | |||
@@ -0,0 +1,2 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <floater name="event_preview" /> | ||
diff --git a/linden/indra/newview/skins/xui/ko/floater_preview_url.xml b/linden/indra/newview/skins/xui/ko/floater_preview_url.xml new file mode 100644 index 0000000..fd6486c --- /dev/null +++ b/linden/indra/newview/skins/xui/ko/floater_preview_url.xml | |||
@@ -0,0 +1,2 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <floater name="url_preview" /> | ||
diff --git a/linden/indra/newview/skins/xui/ko/menu_slurl.xml b/linden/indra/newview/skins/xui/ko/menu_slurl.xml new file mode 100644 index 0000000..a52474b --- /dev/null +++ b/linden/indra/newview/skins/xui/ko/menu_slurl.xml | |||
@@ -0,0 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <menu name="Popup"> | ||
3 | <menu_item_call label="URL ì •ë³´" name="about_url" /> | ||
4 | <menu_item_call label="URL로 í…”ë ˆí¬íЏ" name="teleport_to_url" /> | ||
5 | <menu_item_call label="ì§€ë„ì— í‘œì‹œ" name="show_on_map" /> | ||
6 | </menu> | ||
diff --git a/linden/indra/newview/skins/xui/ko/need_to_long.xml b/linden/indra/newview/skins/xui/ko/need_to_long.xml new file mode 100644 index 0000000..cc21886 --- /dev/null +++ b/linden/indra/newview/skins/xui/ko/need_to_long.xml | |||
@@ -0,0 +1,85 @@ | |||
1 | <?xml version="1.0"?> | ||
2 | <?mso-application progid="Excel.Sheet"?> | ||
3 | <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" | ||
4 | xmlns:o="urn:schemas-microsoft-com:office:office" | ||
5 | xmlns:x="urn:schemas-microsoft-com:office:excel" | ||
6 | xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" | ||
7 | xmlns:html="http://www.w3.org/TR/REC-html40"> | ||
8 | <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> | ||
9 | <LastAuthor>Leyla Farazha</LastAuthor> | ||
10 | <Created>2007-11-21T01:01:28Z</Created> | ||
11 | <LastSaved>2007-11-21T01:01:28Z</LastSaved> | ||
12 | <Version>11.6568</Version> | ||
13 | </DocumentProperties> | ||
14 | <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> | ||
15 | <WindowHeight>10230</WindowHeight> | ||
16 | <WindowWidth>22875</WindowWidth> | ||
17 | <WindowTopX>-10950</WindowTopX> | ||
18 | <WindowTopY>2070</WindowTopY> | ||
19 | <ProtectStructure>False</ProtectStructure> | ||
20 | <ProtectWindows>False</ProtectWindows> | ||
21 | </ExcelWorkbook> | ||
22 | <Styles> | ||
23 | <Style ss:ID="Default" ss:Name="Normal"> | ||
24 | <Alignment ss:Vertical="Bottom"/> | ||
25 | <Borders/> | ||
26 | <Font/> | ||
27 | <Interior/> | ||
28 | <NumberFormat/> | ||
29 | <Protection/> | ||
30 | </Style> | ||
31 | <Style ss:ID="s21"> | ||
32 | <Font ss:Bold="1"/> | ||
33 | </Style> | ||
34 | <Style ss:ID="s22"> | ||
35 | <Font ss:Bold="1"/> | ||
36 | <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/> | ||
37 | </Style> | ||
38 | <Style ss:ID="s23"> | ||
39 | <Alignment ss:Vertical="Bottom" ss:WrapText="1"/> | ||
40 | </Style> | ||
41 | </Styles> | ||
42 | <Worksheet ss:Name="need_to_long2"> | ||
43 | <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="3" x:FullColumns="1" | ||
44 | x:FullRows="1"> | ||
45 | <Column ss:Width="63.75"/> | ||
46 | <Column ss:Width="70.5"/> | ||
47 | <Column ss:Width="88.5"/> | ||
48 | <Column ss:Width="63.75"/> | ||
49 | <Column ss:Width="69.75"/> | ||
50 | <Column ss:Width="90.75"/> | ||
51 | <Column ss:Width="97.5"/> | ||
52 | <Row> | ||
53 | <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell> | ||
54 | </Row> | ||
55 | <Row> | ||
56 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell> | ||
57 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell> | ||
58 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell> | ||
59 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell> | ||
60 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell> | ||
61 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell> | ||
62 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell> | ||
63 | </Row> | ||
64 | <Row ss:Height="409.5"> | ||
65 | <Cell><Data ss:Type="String">floater_about.xml</Data></Cell> | ||
66 | <Cell><Data ss:Type="String">/floater_about/credits_editor</Data></Cell> | ||
67 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa and many others. In Memory of Jesse Malthus, you will be fondly remembered by all who heard your voice. Thank you to the following residents for helping to ensure that this is the best version yet: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard. APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. All rights reserved. See licenses.txt for details. Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) Mr. Watson -- come here -- I want to see you.</Data></Cell> | ||
68 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa and many others. In Memory of Jesse Malthus, you will be fondly remembered by all who heard your voice. Thank you to the following residents for helping to ensure that this is the best version yet: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, Preciousse Moody, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard. APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. All rights reserved. See licenses.txt for details. Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) Mr. Watson -- come here -- I want to see you.</Data></Cell> | ||
69 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life ì œìž‘ìžë“¤: Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa, ê·¸ ì™¸ì— ë§Žì€ ë¶„ë“¤ì´ ìˆ˜ê³ í•´ 주셨습니다. Jesse Malthus를 기억하며... ê·¸ì˜ ëª©ì†Œë¦¬ë¥¼ ë“¤ì—ˆë˜ ëª¨ë“ ì‚¬ëžŒë“¤ì— ì˜í•´ 그는 ë‹¤ì •ìŠ¤ëŸ½ê²Œ 기억ë 것입니다. 현재 ë²„ì „ì´ ìµœê³ ë²„ì „ì´ ë 수 있ë„ë¡ ë„ì™€ì£¼ì‹ ì£¼ë¯¼ë“¤ê»˜ ê°ì‚¬ 드립니다: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard 등. APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. ì €ìž‘ê¶Œ ë³´ìœ ë¨. ìžì„¸í•œ ë‚´ìš©ì€ licenses.txt를 참조하ì‹ì‹œì˜¤. ìŒì„± 채팅 오디오 코딩: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) 와트슨씨. ì´ë¦¬ 오세요. ë³´ê³ ì‹¶êµ°ìš”.</Data></Cell> | ||
70 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life ì œìž‘ìžë“¤: Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa, ê·¸ ì™¸ì— ë§Žì€ ë¶„ë“¤ì´ ìˆ˜ê³ í•´ 주셨습니다. Jesse Malthus를 기억하며... ê·¸ì˜ ëª©ì†Œë¦¬ë¥¼ ë“¤ì—ˆë˜ ëª¨ë“ ì‚¬ëžŒë“¤ì— ì˜í•´ 그는 ë‹¤ì •ìŠ¤ëŸ½ê²Œ 기억ë 것입니다. 현재 ë²„ì „ì´ ìµœê³ ë²„ì „ì´ ë 수 있ë„ë¡ ë„ì™€ì£¼ì‹ ì£¼ë¯¼ë“¤ê»˜ ê°ì‚¬ 드립니다: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, Preciousse Moody, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard 등. APR Copyright (C) 2000-2004 The Apache Software Foundation cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se) expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd. FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org). GL Copyright (C) 1999-2004 Brian Paul. Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited. jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW) jpeglib Copyright (C) 1991-1998, Thomas G. Lane. ogg/vorbis Copyright (C) 2001, Xiphophorus OpenSSL Copyright (C) 1998-2002 The OpenSSL Project. SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) xmlrpc-epi Copyright (C) 2000 Epinions, Inc. zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler. ì €ìž‘ê¶Œ ë³´ìœ ë¨. ìžì„¸í•œ ë‚´ìš©ì€ licenses.txt를 참조하ì‹ì‹œì˜¤. ìŒì„± 채팅 오디오 코딩: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C) 와트슨씨, ì´ë¦¬ 오세요. ë³´ê³ ì‹¶êµ°ìš”.</Data></Cell> | ||
71 | </Row> | ||
72 | </Table> | ||
73 | <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> | ||
74 | <Selected/> | ||
75 | <Panes> | ||
76 | <Pane> | ||
77 | <Number>3</Number> | ||
78 | <ActiveRow>2</ActiveRow> | ||
79 | </Pane> | ||
80 | </Panes> | ||
81 | <ProtectObjects>False</ProtectObjects> | ||
82 | <ProtectScenarios>False</ProtectScenarios> | ||
83 | </WorksheetOptions> | ||
84 | </Worksheet> | ||
85 | </Workbook> | ||
diff --git a/linden/indra/newview/skins/xui/ko/need_to_translate.xml b/linden/indra/newview/skins/xui/ko/need_to_translate.xml new file mode 100644 index 0000000..2038925 --- /dev/null +++ b/linden/indra/newview/skins/xui/ko/need_to_translate.xml | |||
@@ -0,0 +1,1060 @@ | |||
1 | <?xml version="1.0"?> | ||
2 | <?mso-application progid="Excel.Sheet"?> | ||
3 | <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" | ||
4 | xmlns:o="urn:schemas-microsoft-com:office:office" | ||
5 | xmlns:x="urn:schemas-microsoft-com:office:excel" | ||
6 | xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" | ||
7 | xmlns:html="http://www.w3.org/TR/REC-html40"> | ||
8 | <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> | ||
9 | <LastAuthor>Leyla Farazha</LastAuthor> | ||
10 | <Created>2007-11-21T00:53:13Z</Created> | ||
11 | <LastSaved>2007-11-21T01:15:04Z</LastSaved> | ||
12 | <Version>11.6568</Version> | ||
13 | </DocumentProperties> | ||
14 | <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> | ||
15 | <WindowHeight>10230</WindowHeight> | ||
16 | <WindowWidth>22875</WindowWidth> | ||
17 | <WindowTopX>120</WindowTopX> | ||
18 | <WindowTopY>90</WindowTopY> | ||
19 | <ProtectStructure>False</ProtectStructure> | ||
20 | <ProtectWindows>False</ProtectWindows> | ||
21 | </ExcelWorkbook> | ||
22 | <Styles> | ||
23 | <Style ss:ID="Default" ss:Name="Normal"> | ||
24 | <Alignment ss:Vertical="Bottom"/> | ||
25 | <Borders/> | ||
26 | <Font/> | ||
27 | <Interior/> | ||
28 | <NumberFormat/> | ||
29 | <Protection/> | ||
30 | </Style> | ||
31 | <Style ss:ID="s21"> | ||
32 | <Font ss:Bold="1"/> | ||
33 | </Style> | ||
34 | <Style ss:ID="s22"> | ||
35 | <Font ss:Bold="1"/> | ||
36 | <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/> | ||
37 | </Style> | ||
38 | </Styles> | ||
39 | <Worksheet ss:Name="need_to_translate2"> | ||
40 | <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="155" x:FullColumns="1" | ||
41 | x:FullRows="1"> | ||
42 | <Column ss:Width="63.75"/> | ||
43 | <Column ss:Width="70.5"/> | ||
44 | <Column ss:Width="88.5"/> | ||
45 | <Column ss:Width="63.75"/> | ||
46 | <Column ss:Width="69.75"/> | ||
47 | <Column ss:Width="90.75"/> | ||
48 | <Column ss:Width="97.5"/> | ||
49 | <Row> | ||
50 | <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell> | ||
51 | </Row> | ||
52 | <Row> | ||
53 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell> | ||
54 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell> | ||
55 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell> | ||
56 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell> | ||
57 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell> | ||
58 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell> | ||
59 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell> | ||
60 | </Row> | ||
61 | <Row> | ||
62 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
63 | <Cell><Data ss:Type="String">//skipnexttime</Data></Cell> | ||
64 | <Cell ss:Index="5"><Data ss:Type="String">Don't show me this again</Data></Cell> | ||
65 | <Cell ss:Index="7"><Data ss:Type="String">ì´ ë©”ì‹œì§€ë¥¼ 다시 표시 안 함</Data></Cell> | ||
66 | </Row> | ||
67 | <Row> | ||
68 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
69 | <Cell><Data ss:Type="String">//alwayschoose</Data></Cell> | ||
70 | <Cell ss:Index="5"><Data ss:Type="String">Always choose this option</Data></Cell> | ||
71 | <Cell ss:Index="7"><Data ss:Type="String">í•ìƒ ì´ ì˜µì…˜ ì„ íƒ</Data></Cell> | ||
72 | </Row> | ||
73 | <Row> | ||
74 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
75 | <Cell><Data ss:Type="String">//TeleportFromLandmark/message</Data></Cell> | ||
76 | <Cell ss:Index="5"><Data ss:Type="String">Are you sure you want to teleport?</Data></Cell> | ||
77 | <Cell ss:Index="7"><Data ss:Type="String">텔리í¬íŠ¸í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</Data></Cell> | ||
78 | </Row> | ||
79 | <Row> | ||
80 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
81 | <Cell><Data ss:Type="String">//TeleportFromLandmark/ignore</Data></Cell> | ||
82 | <Cell ss:Index="5"><Data ss:Type="String">When teleporting from a landmark in inventory</Data></Cell> | ||
83 | <Cell ss:Index="7"><Data ss:Type="String">ì¸ë²¤í† ë¦¬ì˜ ëžœë“œë§ˆí¬ì—서 텔리í¬íŠ¸í•˜ëŠ” 경우</Data></Cell> | ||
84 | </Row> | ||
85 | <Row> | ||
86 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
87 | <Cell><Data ss:Type="String">//TeleportFromLandmark/Teleport</Data></Cell> | ||
88 | <Cell ss:Index="5"><Data ss:Type="String">Teleport</Data></Cell> | ||
89 | <Cell ss:Index="7"><Data ss:Type="String">텔리í¬íЏ</Data></Cell> | ||
90 | </Row> | ||
91 | <Row> | ||
92 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
93 | <Cell><Data ss:Type="String">//TeleportFromLandmark/Cancel</Data></Cell> | ||
94 | <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell> | ||
95 | <Cell ss:Index="7"><Data ss:Type="String">취소</Data></Cell> | ||
96 | </Row> | ||
97 | <Row> | ||
98 | <Cell><Data ss:Type="String">floater_active_speakers.xml</Data></Cell> | ||
99 | <Cell><Data ss:Type="String">/active_speakers/active_speakers_panel/speakers_list/speaking_status</Data></Cell> | ||
100 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
101 | </Row> | ||
102 | <Row> | ||
103 | <Cell><Data ss:Type="String">floater_chatterbox.xml</Data></Cell> | ||
104 | <Cell><Data ss:Type="String">/floater_chatterbox</Data></Cell> | ||
105 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
106 | <Cell ss:Index="5"><Data ss:Type="String">Communicate</Data></Cell> | ||
107 | <Cell ss:Index="7"><Data ss:Type="String">커뮤니케ì´íЏ</Data></Cell> | ||
108 | </Row> | ||
109 | <Row> | ||
110 | <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell> | ||
111 | <Cell><Data ss:Type="String">/chat floater/ringing</Data></Cell> | ||
112 | <Cell ss:Index="5"><Data ss:Type="String">Connecting to in-world Voice Chat...</Data></Cell> | ||
113 | <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± ì±„íŒ…ì— ì—°ê²°í•˜ëŠ” 중...</Data></Cell> | ||
114 | </Row> | ||
115 | <Row> | ||
116 | <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell> | ||
117 | <Cell><Data ss:Type="String">/chat floater/connected</Data></Cell> | ||
118 | <Cell ss:Index="5"><Data ss:Type="String">Connected</Data></Cell> | ||
119 | <Cell ss:Index="7"><Data ss:Type="String">ì—°ê²°ë¨</Data></Cell> | ||
120 | </Row> | ||
121 | <Row> | ||
122 | <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell> | ||
123 | <Cell><Data ss:Type="String">/chat floater/hang_up</Data></Cell> | ||
124 | <Cell ss:Index="5"><Data ss:Type="String">Disconnected from in-world Voice Chat</Data></Cell> | ||
125 | <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± 채팅 ì—°ê²° ëŠê¹€</Data></Cell> | ||
126 | </Row> | ||
127 | <Row> | ||
128 | <Cell><Data ss:Type="String">floater_device_settings.xml</Data></Cell> | ||
129 | <Cell><Data ss:Type="String">/floater_device_settings</Data></Cell> | ||
130 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
131 | <Cell ss:Index="5"><Data ss:Type="String">Voice Chat Device Settings</Data></Cell> | ||
132 | <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± 채팅 장치 ì„¤ì •</Data></Cell> | ||
133 | </Row> | ||
134 | <Row> | ||
135 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
136 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel</Data></Cell> | ||
137 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
138 | <Cell ss:Index="5"><Data ss:Type="String">All</Data></Cell> | ||
139 | <Cell ss:Index="7"><Data ss:Type="String">ì „ì²´</Data></Cell> | ||
140 | </Row> | ||
141 | <Row> | ||
142 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
143 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/back_btn</Data></Cell> | ||
144 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
145 | <Cell ss:Index="5"><Data ss:Type="String">Back</Data></Cell> | ||
146 | <Cell ss:Index="7"><Data ss:Type="String">뒤로</Data></Cell> | ||
147 | </Row> | ||
148 | <Row> | ||
149 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
150 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/forward_btn</Data></Cell> | ||
151 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
152 | <Cell ss:Index="5"><Data ss:Type="String">Forward</Data></Cell> | ||
153 | <Cell ss:Index="7"><Data ss:Type="String">앞으로</Data></Cell> | ||
154 | </Row> | ||
155 | <Row> | ||
156 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
157 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_editor</Data></Cell> | ||
158 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
159 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
160 | <Cell ss:Index="7"><Data ss:Type="String">검색</Data></Cell> | ||
161 | </Row> | ||
162 | <Row> | ||
163 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
164 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_editor</Data></Cell> | ||
165 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
166 | <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell> | ||
167 | <Cell ss:Index="7"><Data ss:Type="String">검색</Data></Cell> | ||
168 | </Row> | ||
169 | <Row> | ||
170 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
171 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_btn</Data></Cell> | ||
172 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
173 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
174 | <Cell ss:Index="7"><Data ss:Type="String">검색</Data></Cell> | ||
175 | </Row> | ||
176 | <Row> | ||
177 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
178 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/AnyCategory</Data></Cell> | ||
179 | <Cell ss:Index="5"><Data ss:Type="String">Any Category</Data></Cell> | ||
180 | <Cell ss:Index="7"><Data ss:Type="String">ëª¨ë“ ì¹´í…Œê³ ë¦¬</Data></Cell> | ||
181 | </Row> | ||
182 | <Row> | ||
183 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
184 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Classifieds</Data></Cell> | ||
185 | <Cell ss:Index="5"><Data ss:Type="String">Classifieds</Data></Cell> | ||
186 | <Cell ss:Index="7"><Data ss:Type="String">ê´‘ê³ </Data></Cell> | ||
187 | </Row> | ||
188 | <Row> | ||
189 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
190 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Events</Data></Cell> | ||
191 | <Cell ss:Index="5"><Data ss:Type="String">Events</Data></Cell> | ||
192 | <Cell ss:Index="7"><Data ss:Type="String">ì´ë²¤íЏ</Data></Cell> | ||
193 | </Row> | ||
194 | <Row> | ||
195 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
196 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Groups</Data></Cell> | ||
197 | <Cell ss:Index="5"><Data ss:Type="String">Groups</Data></Cell> | ||
198 | <Cell ss:Index="7"><Data ss:Type="String">그룹</Data></Cell> | ||
199 | </Row> | ||
200 | <Row> | ||
201 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
202 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/People</Data></Cell> | ||
203 | <Cell ss:Index="5"><Data ss:Type="String">People</Data></Cell> | ||
204 | <Cell ss:Index="7"><Data ss:Type="String">사람</Data></Cell> | ||
205 | </Row> | ||
206 | <Row> | ||
207 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
208 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Places</Data></Cell> | ||
209 | <Cell ss:Index="5"><Data ss:Type="String">Places</Data></Cell> | ||
210 | <Cell ss:Index="7"><Data ss:Type="String">장소</Data></Cell> | ||
211 | </Row> | ||
212 | <Row> | ||
213 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
214 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Wiki</Data></Cell> | ||
215 | <Cell ss:Index="5"><Data ss:Type="String">Wiki</Data></Cell> | ||
216 | <Cell ss:Index="7"><Data ss:Type="String">위키</Data></Cell> | ||
217 | </Row> | ||
218 | <Row> | ||
219 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
220 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/mature_check</Data></Cell> | ||
221 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
222 | <Cell ss:Index="5"><Data ss:Type="String">Include Mature content</Data></Cell> | ||
223 | <Cell ss:Index="7"><Data ss:Type="String">성ì¸ìš© 컨í…ì¸ í¬í•¨</Data></Cell> | ||
224 | </Row> | ||
225 | <Row> | ||
226 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
227 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/loading_text</Data></Cell> | ||
228 | <Cell ss:Index="5"><Data ss:Type="String">Loading...</Data></Cell> | ||
229 | <Cell ss:Index="7"><Data ss:Type="String">로딩 중...</Data></Cell> | ||
230 | </Row> | ||
231 | <Row> | ||
232 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
233 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/done_text</Data></Cell> | ||
234 | <Cell ss:Index="5"><Data ss:Type="String">Done</Data></Cell> | ||
235 | <Cell ss:Index="7"><Data ss:Type="String">완료</Data></Cell> | ||
236 | </Row> | ||
237 | <Row> | ||
238 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
239 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel</Data></Cell> | ||
240 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
241 | <Cell ss:Index="5"><Data ss:Type="String">All (old)</Data></Cell> | ||
242 | <Cell ss:Index="7"><Data ss:Type="String">ì „ì²´(구)</Data></Cell> | ||
243 | </Row> | ||
244 | <Row> | ||
245 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
246 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/< Prev</Data></Cell> | ||
247 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
248 | <Cell ss:Index="5"><Data ss:Type="String">< Prev</Data></Cell> | ||
249 | <Cell ss:Index="7"><Data ss:Type="String">< ì´ì „</Data></Cell> | ||
250 | </Row> | ||
251 | <Row> | ||
252 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
253 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/< Prev</Data></Cell> | ||
254 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
255 | <Cell ss:Index="5"><Data ss:Type="String">< Prev</Data></Cell> | ||
256 | <Cell ss:Index="7"><Data ss:Type="String">< ì´ì „</Data></Cell> | ||
257 | </Row> | ||
258 | <Row> | ||
259 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
260 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Next ></Data></Cell> | ||
261 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
262 | <Cell ss:Index="5"><Data ss:Type="String">Next ></Data></Cell> | ||
263 | <Cell ss:Index="7"><Data ss:Type="String">ë‹¤ìŒ ></Data></Cell> | ||
264 | </Row> | ||
265 | <Row> | ||
266 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
267 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Next ></Data></Cell> | ||
268 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
269 | <Cell ss:Index="5"><Data ss:Type="String">Next ></Data></Cell> | ||
270 | <Cell ss:Index="7"><Data ss:Type="String">ë‹¤ìŒ ></Data></Cell> | ||
271 | </Row> | ||
272 | <Row> | ||
273 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
274 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/find</Data></Cell> | ||
275 | <Cell ss:Index="5"><Data ss:Type="String">Find:</Data></Cell> | ||
276 | <Cell ss:Index="7"><Data ss:Type="String">찾기:</Data></Cell> | ||
277 | </Row> | ||
278 | <Row> | ||
279 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
280 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Search</Data></Cell> | ||
281 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
282 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
283 | <Cell ss:Index="7"><Data ss:Type="String">검색</Data></Cell> | ||
284 | </Row> | ||
285 | <Row> | ||
286 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
287 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Search</Data></Cell> | ||
288 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
289 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
290 | <Cell ss:Index="7"><Data ss:Type="String">검색</Data></Cell> | ||
291 | </Row> | ||
292 | <Row> | ||
293 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
294 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/incmature</Data></Cell> | ||
295 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
296 | <Cell ss:Index="5"><Data ss:Type="String">Include Mature content</Data></Cell> | ||
297 | <Cell ss:Index="7"><Data ss:Type="String">성ì¸ìš© 컨í…ì¸ í¬í•¨</Data></Cell> | ||
298 | </Row> | ||
299 | <Row> | ||
300 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
301 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/icon</Data></Cell> | ||
302 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
303 | </Row> | ||
304 | <Row> | ||
305 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
306 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/name</Data></Cell> | ||
307 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
308 | <Cell ss:Index="5"><Data ss:Type="String">Name</Data></Cell> | ||
309 | <Cell ss:Index="7"><Data ss:Type="String">ì´ë¦„</Data></Cell> | ||
310 | </Row> | ||
311 | <Row> | ||
312 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
313 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/price</Data></Cell> | ||
314 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
315 | <Cell ss:Index="5"><Data ss:Type="String">Price</Data></Cell> | ||
316 | <Cell ss:Index="7"><Data ss:Type="String">가격</Data></Cell> | ||
317 | </Row> | ||
318 | <Row> | ||
319 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
320 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/date</Data></Cell> | ||
321 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
322 | <Cell ss:Index="5"><Data ss:Type="String">Time (PT)</Data></Cell> | ||
323 | <Cell ss:Index="7"><Data ss:Type="String">시간(태í‰ì–‘시)</Data></Cell> | ||
324 | </Row> | ||
325 | <Row> | ||
326 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
327 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/time</Data></Cell> | ||
328 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
329 | <Cell ss:Index="5"><Data ss:Type="String">Time</Data></Cell> | ||
330 | <Cell ss:Index="7"><Data ss:Type="String">시간</Data></Cell> | ||
331 | </Row> | ||
332 | <Row> | ||
333 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
334 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/dwell</Data></Cell> | ||
335 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
336 | <Cell ss:Index="5"><Data ss:Type="String">Traffic</Data></Cell> | ||
337 | <Cell ss:Index="7"><Data ss:Type="String">통행량</Data></Cell> | ||
338 | </Row> | ||
339 | <Row> | ||
340 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
341 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/area</Data></Cell> | ||
342 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
343 | <Cell ss:Index="5"><Data ss:Type="String">Area</Data></Cell> | ||
344 | <Cell ss:Index="7"><Data ss:Type="String">ë©´ì </Data></Cell> | ||
345 | </Row> | ||
346 | <Row> | ||
347 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
348 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/per_meter</Data></Cell> | ||
349 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
350 | <Cell ss:Index="5"><Data ss:Type="String">L$/sq.m</Data></Cell> | ||
351 | <Cell ss:Index="7"><Data ss:Type="String">L$/sq.m</Data></Cell> | ||
352 | </Row> | ||
353 | <Row> | ||
354 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
355 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/online</Data></Cell> | ||
356 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
357 | <Cell ss:Index="5"><Data ss:Type="String">Online</Data></Cell> | ||
358 | <Cell ss:Index="7"><Data ss:Type="String">온ë¼ì¸</Data></Cell> | ||
359 | </Row> | ||
360 | <Row> | ||
361 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
362 | <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/members</Data></Cell> | ||
363 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
364 | <Cell ss:Index="5"><Data ss:Type="String">Members</Data></Cell> | ||
365 | <Cell ss:Index="7"><Data ss:Type="String">회ì›</Data></Cell> | ||
366 | </Row> | ||
367 | <Row> | ||
368 | <Cell><Data ss:Type="String">floater_groups.xml</Data></Cell> | ||
369 | <Cell><Data ss:Type="String">/groups/group list/name</Data></Cell> | ||
370 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
371 | </Row> | ||
372 | <Row> | ||
373 | <Cell><Data ss:Type="String">floater_im.xml</Data></Cell> | ||
374 | <Cell><Data ss:Type="String">/im_floater/invite_message</Data></Cell> | ||
375 | <Cell ss:Index="5"><Data ss:Type="String">Click the [BUTTON NAME] button to accept/connect to this voice chat.</Data></Cell> | ||
376 | <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± ì±„íŒ…ì„ ìˆ˜ë½/ì—°ê²°í•˜ë ¤ë©´ [BUTTON NAME] ë²„íŠ¼ì„ í´ë¦í•˜ì‹ì‹œì˜¤.</Data></Cell> | ||
377 | </Row> | ||
378 | <Row> | ||
379 | <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell> | ||
380 | <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell> | ||
381 | <Cell ss:Index="5"><Data ss:Type="String">Calling...</Data></Cell> | ||
382 | <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± 채팅 ì—°ê²° 중...</Data></Cell> | ||
383 | </Row> | ||
384 | <Row> | ||
385 | <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell> | ||
386 | <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell> | ||
387 | <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell> | ||
388 | <Cell ss:Index="7"><Data ss:Type="String">ì—°ê²°ë˜ì—ˆìŠµë‹ˆë‹¤. ì—°ê²°ì„ ëŠìœ¼ë ¤ë©´ 통화 종료 ë²„íŠ¼ì„ í´ë¦í•˜ì‹ì‹œì˜¤.</Data></Cell> | ||
389 | </Row> | ||
390 | <Row> | ||
391 | <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell> | ||
392 | <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell> | ||
393 | <Cell ss:Index="5"><Data ss:Type="String">Call ended</Data></Cell> | ||
394 | <Cell ss:Index="7"><Data ss:Type="String">통화 종료</Data></Cell> | ||
395 | </Row> | ||
396 | <Row> | ||
397 | <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell> | ||
398 | <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell> | ||
399 | <Cell ss:Index="5"><Data ss:Type="String">Joining Voice Chat...</Data></Cell> | ||
400 | <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± ì±„íŒ…ì— ì°¸ê°€ 중...</Data></Cell> | ||
401 | </Row> | ||
402 | <Row> | ||
403 | <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell> | ||
404 | <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell> | ||
405 | <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell> | ||
406 | <Cell ss:Index="7"><Data ss:Type="String">ì—°ê²°ë˜ì—ˆìŠµë‹ˆë‹¤. ì—°ê²°ì„ ëŠìœ¼ë ¤ë©´ 통화 종료 ë²„íŠ¼ì„ í´ë¦í•˜ì‹ì‹œì˜¤.</Data></Cell> | ||
407 | </Row> | ||
408 | <Row> | ||
409 | <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell> | ||
410 | <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell> | ||
411 | <Cell ss:Index="5"><Data ss:Type="String">Left Voice Chat</Data></Cell> | ||
412 | <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± 채팅ì—서 나왔습니다.</Data></Cell> | ||
413 | </Row> | ||
414 | <Row> | ||
415 | <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell> | ||
416 | <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell> | ||
417 | <Cell ss:Index="5"><Data ss:Type="String">Joining Voice Chat...</Data></Cell> | ||
418 | <Cell ss:Index="7"><Data ss:Type="String">그룹 ìŒì„± ì±„íŒ…ì— ì°¸ê°€ 중...</Data></Cell> | ||
419 | </Row> | ||
420 | <Row> | ||
421 | <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell> | ||
422 | <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell> | ||
423 | <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell> | ||
424 | <Cell ss:Index="7"><Data ss:Type="String">ì—°ê²°ë˜ì—ˆìŠµë‹ˆë‹¤. ì—°ê²°ì„ ëŠìœ¼ë ¤ë©´ 통화 종료 ë²„íŠ¼ì„ í´ë¦í•˜ì‹ì‹œì˜¤.</Data></Cell> | ||
425 | </Row> | ||
426 | <Row> | ||
427 | <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell> | ||
428 | <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell> | ||
429 | <Cell ss:Index="5"><Data ss:Type="String">Left Voice Chat</Data></Cell> | ||
430 | <Cell ss:Index="7"><Data ss:Type="String">그룹 ìŒì„± 채팅ì—서 나왔습니다.</Data></Cell> | ||
431 | </Row> | ||
432 | <Row> | ||
433 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
434 | <Cell><Data ss:Type="String">/landmarkpicker</Data></Cell> | ||
435 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
436 | <Cell ss:Index="5"><Data ss:Type="String">Organize: Landmarks</Data></Cell> | ||
437 | <Cell ss:Index="7"><Data ss:Type="String">구성: ëžœë“œë§ˆí¬ ë§Œë“¤ê¸°</Data></Cell> | ||
438 | </Row> | ||
439 | <Row> | ||
440 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
441 | <Cell><Data ss:Type="String">/landmarkpicker/show_folders_check</Data></Cell> | ||
442 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
443 | <Cell ss:Index="5"><Data ss:Type="String">Show Folders</Data></Cell> | ||
444 | <Cell ss:Index="7"><Data ss:Type="String">í´ë” 표시</Data></Cell> | ||
445 | </Row> | ||
446 | <Row> | ||
447 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
448 | <Cell><Data ss:Type="String">/landmarkpicker/New</Data></Cell> | ||
449 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
450 | <Cell ss:Index="5"><Data ss:Type="String">New</Data></Cell> | ||
451 | <Cell ss:Index="7"><Data ss:Type="String">ì‹ ê·œ</Data></Cell> | ||
452 | </Row> | ||
453 | <Row> | ||
454 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
455 | <Cell><Data ss:Type="String">/landmarkpicker/New</Data></Cell> | ||
456 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
457 | <Cell ss:Index="5"><Data ss:Type="String">New</Data></Cell> | ||
458 | <Cell ss:Index="7"><Data ss:Type="String">ì‹ ê·œ</Data></Cell> | ||
459 | </Row> | ||
460 | <Row> | ||
461 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
462 | <Cell><Data ss:Type="String">/landmarkpicker/Rename</Data></Cell> | ||
463 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
464 | <Cell ss:Index="5"><Data ss:Type="String">Rename</Data></Cell> | ||
465 | <Cell ss:Index="7"><Data ss:Type="String">ì´ë¦„ 변경</Data></Cell> | ||
466 | </Row> | ||
467 | <Row> | ||
468 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
469 | <Cell><Data ss:Type="String">/landmarkpicker/Rename</Data></Cell> | ||
470 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
471 | <Cell ss:Index="5"><Data ss:Type="String">Rename</Data></Cell> | ||
472 | <Cell ss:Index="7"><Data ss:Type="String">ì´ë¦„ 변경</Data></Cell> | ||
473 | </Row> | ||
474 | <Row> | ||
475 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
476 | <Cell><Data ss:Type="String">/landmarkpicker/NewFolder</Data></Cell> | ||
477 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
478 | <Cell ss:Index="5"><Data ss:Type="String">New Folder</Data></Cell> | ||
479 | <Cell ss:Index="7"><Data ss:Type="String">새 í´ë”</Data></Cell> | ||
480 | </Row> | ||
481 | <Row> | ||
482 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
483 | <Cell><Data ss:Type="String">/landmarkpicker/NewFolder</Data></Cell> | ||
484 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
485 | <Cell ss:Index="5"><Data ss:Type="String">New Folder</Data></Cell> | ||
486 | <Cell ss:Index="7"><Data ss:Type="String">새 í´ë”</Data></Cell> | ||
487 | </Row> | ||
488 | <Row> | ||
489 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
490 | <Cell><Data ss:Type="String">/landmarkpicker/Edit</Data></Cell> | ||
491 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
492 | <Cell ss:Index="5"><Data ss:Type="String">Edit</Data></Cell> | ||
493 | <Cell ss:Index="7"><Data ss:Type="String">편집</Data></Cell> | ||
494 | </Row> | ||
495 | <Row> | ||
496 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
497 | <Cell><Data ss:Type="String">/landmarkpicker/Edit</Data></Cell> | ||
498 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
499 | <Cell ss:Index="5"><Data ss:Type="String">Edit</Data></Cell> | ||
500 | <Cell ss:Index="7"><Data ss:Type="String">편집</Data></Cell> | ||
501 | </Row> | ||
502 | <Row> | ||
503 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
504 | <Cell><Data ss:Type="String">/landmarkpicker/Delete</Data></Cell> | ||
505 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
506 | <Cell ss:Index="5"><Data ss:Type="String">Delete</Data></Cell> | ||
507 | <Cell ss:Index="7"><Data ss:Type="String">ì‚ì œ</Data></Cell> | ||
508 | </Row> | ||
509 | <Row> | ||
510 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
511 | <Cell><Data ss:Type="String">/landmarkpicker/Delete</Data></Cell> | ||
512 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
513 | <Cell ss:Index="5"><Data ss:Type="String">Delete</Data></Cell> | ||
514 | <Cell ss:Index="7"><Data ss:Type="String">ì‚ì œ</Data></Cell> | ||
515 | </Row> | ||
516 | <Row> | ||
517 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
518 | <Cell><Data ss:Type="String">/landmarkpicker/Close</Data></Cell> | ||
519 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
520 | <Cell ss:Index="5"><Data ss:Type="String">Close</Data></Cell> | ||
521 | <Cell ss:Index="7"><Data ss:Type="String">닫기</Data></Cell> | ||
522 | </Row> | ||
523 | <Row> | ||
524 | <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell> | ||
525 | <Cell><Data ss:Type="String">/landmarkpicker/Close</Data></Cell> | ||
526 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
527 | <Cell ss:Index="5"><Data ss:Type="String">Close</Data></Cell> | ||
528 | <Cell ss:Index="7"><Data ss:Type="String">닫기</Data></Cell> | ||
529 | </Row> | ||
530 | <Row> | ||
531 | <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell> | ||
532 | <Cell><Data ss:Type="String">/land holdings floater/area_string</Data></Cell> | ||
533 | <Cell ss:Index="5"><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
534 | <Cell ss:Index="7"><Data ss:Type="String">[AREA]ì œê³±ë¯¸í„°</Data></Cell> | ||
535 | </Row> | ||
536 | <Row> | ||
537 | <Cell><Data ss:Type="String">floater_preview_classified.xml</Data></Cell> | ||
538 | <Cell><Data ss:Type="String">/classified_preview</Data></Cell> | ||
539 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
540 | <Cell ss:Index="5"><Data ss:Type="String">Classified Information</Data></Cell> | ||
541 | <Cell ss:Index="7"><Data ss:Type="String">ê´‘ê³ ì •ë³´</Data></Cell> | ||
542 | </Row> | ||
543 | <Row> | ||
544 | <Cell><Data ss:Type="String">floater_preview_event.xml</Data></Cell> | ||
545 | <Cell><Data ss:Type="String">/event_preview</Data></Cell> | ||
546 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
547 | <Cell ss:Index="5"><Data ss:Type="String">Event Information</Data></Cell> | ||
548 | <Cell ss:Index="7"><Data ss:Type="String">ì´ë²¤íЏ ì •ë³´</Data></Cell> | ||
549 | </Row> | ||
550 | <Row> | ||
551 | <Cell><Data ss:Type="String">floater_preview_url.xml</Data></Cell> | ||
552 | <Cell><Data ss:Type="String">/url_preview</Data></Cell> | ||
553 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
554 | <Cell ss:Index="5"><Data ss:Type="String">Place Information</Data></Cell> | ||
555 | <Cell ss:Index="7"><Data ss:Type="String">장소 ì •ë³´</Data></Cell> | ||
556 | </Row> | ||
557 | <Row> | ||
558 | <Cell><Data ss:Type="String">floater_select_key.xml</Data></Cell> | ||
559 | <Cell><Data ss:Type="String">/modal container</Data></Cell> | ||
560 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
561 | </Row> | ||
562 | <Row> | ||
563 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
564 | <Cell><Data ss:Type="String">/panel_login/DebugInfo</Data></Cell> | ||
565 | <Cell ss:Index="5"><Data ss:Type="String">Debug Info</Data></Cell> | ||
566 | <Cell ss:Index="7"><Data ss:Type="String">디버그 ì •ë³´</Data></Cell> | ||
567 | </Row> | ||
568 | <Row> | ||
569 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
570 | <Cell><Data ss:Type="String">/panel_login/FPS</Data></Cell> | ||
571 | <Cell ss:Index="5"><Data ss:Type="String">FPS</Data></Cell> | ||
572 | <Cell ss:Index="7"><Data ss:Type="String">FPS</Data></Cell> | ||
573 | </Row> | ||
574 | <Row> | ||
575 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
576 | <Cell><Data ss:Type="String">/panel_login/SimFPS</Data></Cell> | ||
577 | <Cell ss:Index="5"><Data ss:Type="String">SimFPS</Data></Cell> | ||
578 | <Cell ss:Index="7"><Data ss:Type="String">SimFPS</Data></Cell> | ||
579 | </Row> | ||
580 | <Row> | ||
581 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
582 | <Cell><Data ss:Type="String">/panel_login/Pin</Data></Cell> | ||
583 | <Cell ss:Index="5"><Data ss:Type="String">P-In</Data></Cell> | ||
584 | <Cell ss:Index="7"><Data ss:Type="String">패킷 ìž…ë ¥</Data></Cell> | ||
585 | </Row> | ||
586 | <Row> | ||
587 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
588 | <Cell><Data ss:Type="String">/panel_login/Pout</Data></Cell> | ||
589 | <Cell ss:Index="5"><Data ss:Type="String">P-Out</Data></Cell> | ||
590 | <Cell ss:Index="7"><Data ss:Type="String">패킷 ì¶œë ¥</Data></Cell> | ||
591 | </Row> | ||
592 | <Row> | ||
593 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
594 | <Cell><Data ss:Type="String">/panel_login/PLoss</Data></Cell> | ||
595 | <Cell ss:Index="5"><Data ss:Type="String">P-Loss</Data></Cell> | ||
596 | <Cell ss:Index="7"><Data ss:Type="String">패킷 ì†ì‹¤</Data></Cell> | ||
597 | </Row> | ||
598 | <Row> | ||
599 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
600 | <Cell><Data ss:Type="String">/panel_login/Ping</Data></Cell> | ||
601 | <Cell ss:Index="5"><Data ss:Type="String">Ping</Data></Cell> | ||
602 | <Cell ss:Index="7"><Data ss:Type="String">Ping</Data></Cell> | ||
603 | </Row> | ||
604 | <Row> | ||
605 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
606 | <Cell><Data ss:Type="String">/panel_login/AccountDetails</Data></Cell> | ||
607 | <Cell ss:Index="5"><Data ss:Type="String">Account Details</Data></Cell> | ||
608 | <Cell ss:Index="7"><Data ss:Type="String">ê³„ì • 세부사í•</Data></Cell> | ||
609 | </Row> | ||
610 | <Row> | ||
611 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
612 | <Cell><Data ss:Type="String">/panel_login/LBal</Data></Cell> | ||
613 | <Cell ss:Index="5"><Data ss:Type="String">L$ bal</Data></Cell> | ||
614 | <Cell ss:Index="7"><Data ss:Type="String">L$ ìž”ê³ </Data></Cell> | ||
615 | </Row> | ||
616 | <Row> | ||
617 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
618 | <Cell><Data ss:Type="String">/panel_login/Time</Data></Cell> | ||
619 | <Cell ss:Index="5"><Data ss:Type="String">Time</Data></Cell> | ||
620 | <Cell ss:Index="7"><Data ss:Type="String">시간</Data></Cell> | ||
621 | </Row> | ||
622 | <Row> | ||
623 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
624 | <Cell><Data ss:Type="String">/panel_login/LocationDetails1</Data></Cell> | ||
625 | <Cell ss:Index="5"><Data ss:Type="String">Location Details 1</Data></Cell> | ||
626 | <Cell ss:Index="7"><Data ss:Type="String">위치 ì„¸ë¶€ì‚¬í• 1</Data></Cell> | ||
627 | </Row> | ||
628 | <Row> | ||
629 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
630 | <Cell><Data ss:Type="String">/panel_login/LocationDetails2</Data></Cell> | ||
631 | <Cell ss:Index="5"><Data ss:Type="String">Location Details 2</Data></Cell> | ||
632 | <Cell ss:Index="7"><Data ss:Type="String">위치 ì„¸ë¶€ì‚¬í• 2</Data></Cell> | ||
633 | </Row> | ||
634 | <Row> | ||
635 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
636 | <Cell><Data ss:Type="String">/panel_login/Region</Data></Cell> | ||
637 | <Cell ss:Index="5"><Data ss:Type="String">Region</Data></Cell> | ||
638 | <Cell ss:Index="7"><Data ss:Type="String">ì§€ì—</Data></Cell> | ||
639 | </Row> | ||
640 | <Row> | ||
641 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
642 | <Cell><Data ss:Type="String">/panel_login/Parcel</Data></Cell> | ||
643 | <Cell ss:Index="5"><Data ss:Type="String">Parcel</Data></Cell> | ||
644 | <Cell ss:Index="7"><Data ss:Type="String">구íš</Data></Cell> | ||
645 | </Row> | ||
646 | <Row> | ||
647 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
648 | <Cell><Data ss:Type="String">/panel_login/Pos</Data></Cell> | ||
649 | <Cell ss:Index="5"><Data ss:Type="String">Pos</Data></Cell> | ||
650 | <Cell ss:Index="7"><Data ss:Type="String">Pos</Data></Cell> | ||
651 | </Row> | ||
652 | <Row> | ||
653 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
654 | <Cell><Data ss:Type="String">/panel_login/Sqm</Data></Cell> | ||
655 | <Cell ss:Index="5"><Data ss:Type="String">Sqm</Data></Cell> | ||
656 | <Cell ss:Index="7"><Data ss:Type="String">Sqm</Data></Cell> | ||
657 | </Row> | ||
658 | <Row> | ||
659 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
660 | <Cell><Data ss:Type="String">/panel_login/Owner</Data></Cell> | ||
661 | <Cell ss:Index="5"><Data ss:Type="String">Owner</Data></Cell> | ||
662 | <Cell ss:Index="7"><Data ss:Type="String">ì†Œìœ ìž</Data></Cell> | ||
663 | </Row> | ||
664 | <Row> | ||
665 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
666 | <Cell><Data ss:Type="String">/panel_login/Type</Data></Cell> | ||
667 | <Cell ss:Index="5"><Data ss:Type="String">Type</Data></Cell> | ||
668 | <Cell ss:Index="7"><Data ss:Type="String">ìœ í˜•</Data></Cell> | ||
669 | </Row> | ||
670 | <Row> | ||
671 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
672 | <Cell><Data ss:Type="String">/panel_login/Yes</Data></Cell> | ||
673 | <Cell ss:Index="5"><Data ss:Type="String">Yes</Data></Cell> | ||
674 | <Cell ss:Index="7"><Data ss:Type="String">예</Data></Cell> | ||
675 | </Row> | ||
676 | <Row> | ||
677 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
678 | <Cell><Data ss:Type="String">/panel_login/No</Data></Cell> | ||
679 | <Cell ss:Index="5"><Data ss:Type="String">No</Data></Cell> | ||
680 | <Cell ss:Index="7"><Data ss:Type="String">아니오</Data></Cell> | ||
681 | </Row> | ||
682 | <Row> | ||
683 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
684 | <Cell><Data ss:Type="String">/panel_login/Forsale</Data></Cell> | ||
685 | <Cell ss:Index="5"><Data ss:Type="String">ForSale</Data></Cell> | ||
686 | <Cell ss:Index="7"><Data ss:Type="String">매물</Data></Cell> | ||
687 | </Row> | ||
688 | <Row> | ||
689 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
690 | <Cell><Data ss:Type="String">/panel_login/Traffic</Data></Cell> | ||
691 | <Cell ss:Index="5"><Data ss:Type="String">Traffic</Data></Cell> | ||
692 | <Cell ss:Index="7"><Data ss:Type="String">통행량</Data></Cell> | ||
693 | </Row> | ||
694 | <Row> | ||
695 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
696 | <Cell><Data ss:Type="String">/panel_login/Last3ChatLines</Data></Cell> | ||
697 | <Cell ss:Index="5"><Data ss:Type="String">Last 3 Chat Lines</Data></Cell> | ||
698 | <Cell ss:Index="7"><Data ss:Type="String">마지막 3개 채팅 행</Data></Cell> | ||
699 | </Row> | ||
700 | <Row> | ||
701 | <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell> | ||
702 | <Cell><Data ss:Type="String">/panel_login/Last3IMLines</Data></Cell> | ||
703 | <Cell ss:Index="5"><Data ss:Type="String">Last 3 IM Lines</Data></Cell> | ||
704 | <Cell ss:Index="7"><Data ss:Type="String">마지막 3ê°œ ë©”ì‹ ì € í–‰</Data></Cell> | ||
705 | </Row> | ||
706 | <Row> | ||
707 | <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell> | ||
708 | <Cell><Data ss:Type="String">/Popup/about_url</Data></Cell> | ||
709 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
710 | <Cell ss:Index="5"><Data ss:Type="String">About URL</Data></Cell> | ||
711 | <Cell ss:Index="7"><Data ss:Type="String">URL ì •ë³´</Data></Cell> | ||
712 | </Row> | ||
713 | <Row> | ||
714 | <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell> | ||
715 | <Cell><Data ss:Type="String">/Popup/teleport_to_url</Data></Cell> | ||
716 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
717 | <Cell ss:Index="5"><Data ss:Type="String">Teleport to URL</Data></Cell> | ||
718 | <Cell ss:Index="7"><Data ss:Type="String">URL로 í…”ë ˆí¬íЏ</Data></Cell> | ||
719 | </Row> | ||
720 | <Row> | ||
721 | <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell> | ||
722 | <Cell><Data ss:Type="String">/Popup/show_on_map</Data></Cell> | ||
723 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
724 | <Cell ss:Index="5"><Data ss:Type="String">Show on Map</Data></Cell> | ||
725 | <Cell ss:Index="7"><Data ss:Type="String">ì§€ë„ì— í‘œì‹œ</Data></Cell> | ||
726 | </Row> | ||
727 | <Row> | ||
728 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
729 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting</Data></Cell> | ||
730 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
731 | <Cell ss:Index="5"><Data ss:Type="String">Bug Reporting</Data></Cell> | ||
732 | <Cell ss:Index="7"><Data ss:Type="String">버그 ì‹ ê³ </Data></Cell> | ||
733 | </Row> | ||
734 | <Row> | ||
735 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
736 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Public Issue Tracker...</Data></Cell> | ||
737 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
738 | <Cell ss:Index="5"><Data ss:Type="String">Public Issue Tracker...</Data></Cell> | ||
739 | <Cell ss:Index="7"><Data ss:Type="String">ì¼ë°˜ ë¬¸ì œ ì¶”ì 하기</Data></Cell> | ||
740 | </Row> | ||
741 | <Row> | ||
742 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
743 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Publc Issue Tracker Help...</Data></Cell> | ||
744 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
745 | <Cell ss:Index="5"><Data ss:Type="String">Public Issue Tracker Help...</Data></Cell> | ||
746 | <Cell ss:Index="7"><Data ss:Type="String">ì¼ë°˜ ë¬¸ì œ ì¶”ì 하기 ë„움ë§</Data></Cell> | ||
747 | </Row> | ||
748 | <Row> | ||
749 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
750 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/separator7</Data></Cell> | ||
751 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
752 | <Cell ss:Index="5"><Data ss:Type="String">-----------</Data></Cell> | ||
753 | <Cell ss:Index="7"><Data ss:Type="String">-----------</Data></Cell> | ||
754 | </Row> | ||
755 | <Row> | ||
756 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
757 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Bug Reporing 101...</Data></Cell> | ||
758 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
759 | <Cell ss:Index="5"><Data ss:Type="String">Bug Reporting 101...</Data></Cell> | ||
760 | <Cell ss:Index="7"><Data ss:Type="String">버그 ë³´ê³ 101</Data></Cell> | ||
761 | </Row> | ||
762 | <Row> | ||
763 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
764 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Security Issues...</Data></Cell> | ||
765 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
766 | <Cell ss:Index="5"><Data ss:Type="String">Security Issues...</Data></Cell> | ||
767 | <Cell ss:Index="7"><Data ss:Type="String">보안 ë¬¸ì œ</Data></Cell> | ||
768 | </Row> | ||
769 | <Row> | ||
770 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
771 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/QA Wiki...</Data></Cell> | ||
772 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
773 | <Cell ss:Index="5"><Data ss:Type="String">QA Wiki...</Data></Cell> | ||
774 | <Cell ss:Index="7"><Data ss:Type="String">QA 위키</Data></Cell> | ||
775 | </Row> | ||
776 | <Row> | ||
777 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
778 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/separator7</Data></Cell> | ||
779 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
780 | <Cell ss:Index="5"><Data ss:Type="String">-----------</Data></Cell> | ||
781 | <Cell ss:Index="7"><Data ss:Type="String">-----------</Data></Cell> | ||
782 | </Row> | ||
783 | <Row> | ||
784 | <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell> | ||
785 | <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Report Bug...</Data></Cell> | ||
786 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
787 | <Cell ss:Index="5"><Data ss:Type="String">Report Bug...</Data></Cell> | ||
788 | <Cell ss:Index="7"><Data ss:Type="String">버그 ì‹ ê³ </Data></Cell> | ||
789 | </Row> | ||
790 | <Row> | ||
791 | <Cell><Data ss:Type="String">notify.xml</Data></Cell> | ||
792 | <Cell><Data ss:Type="String">//VoiceChannelJoinFailed/message</Data></Cell> | ||
793 | <Cell ss:Index="5"><Data ss:Type="String">Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to spatial voice chat.</Data></Cell> | ||
794 | <Cell ss:Index="7"><Data ss:Type="String">[VOICE_CHANNEL_NAME]ì— ì—°ê²°í•˜ì§€ 못했습니다. ë‚˜ì¤‘ì— ë‹¤ì‹œ 시ë„하ì‹ì‹œì˜¤. ì´ì œ ê³µê°„ì´ ì¡´ìž¬í•˜ëŠ” ìŒì„± 채팅으로 다시 ì—°ê²°ë©ë‹ˆë‹¤.</Data></Cell> | ||
795 | </Row> | ||
796 | <Row> | ||
797 | <Cell><Data ss:Type="String">panel_avatar_classified.xml</Data></Cell> | ||
798 | <Cell><Data ss:Type="String">/Classified/update_txt</Data></Cell> | ||
799 | <Cell ss:Index="5"><Data ss:Type="String">Update</Data></Cell> | ||
800 | <Cell ss:Index="7"><Data ss:Type="String">ì—…ë°ì´íЏ</Data></Cell> | ||
801 | </Row> | ||
802 | <Row> | ||
803 | <Cell><Data ss:Type="String">panel_avatar_classified.xml</Data></Cell> | ||
804 | <Cell><Data ss:Type="String">/Classified/publish_txt</Data></Cell> | ||
805 | <Cell ss:Index="5"><Data ss:Type="String">Publish...</Data></Cell> | ||
806 | <Cell ss:Index="7"><Data ss:Type="String">게시하기¡¦</Data></Cell> | ||
807 | </Row> | ||
808 | <Row> | ||
809 | <Cell><Data ss:Type="String">panel_groups.xml</Data></Cell> | ||
810 | <Cell><Data ss:Type="String">/groups/group list/name</Data></Cell> | ||
811 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
812 | </Row> | ||
813 | <Row> | ||
814 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
815 | <Cell><Data ss:Type="String">/general_tab/group_info_unchanged</Data></Cell> | ||
816 | <Cell ss:Index="5"><Data ss:Type="String">General group information has changed.</Data></Cell> | ||
817 | <Cell ss:Index="7"><Data ss:Type="String">ì¼ë°˜ 그룹 ì •ë³´ê°€ 변경ë˜ì—ˆìŠµë‹ˆë‹¤.</Data></Cell> | ||
818 | </Row> | ||
819 | <Row> | ||
820 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
821 | <Cell><Data ss:Type="String">/land_money_tab/land_contrib_error</Data></Cell> | ||
822 | <Cell ss:Index="5"><Data ss:Type="String">Unable to set your land contribution.</Data></Cell> | ||
823 | <Cell ss:Index="7"><Data ss:Type="String">ê·€í•˜ì˜ í† ì§€ 기부를 ì„¤ì •í• ìˆ˜ 없습니다.</Data></Cell> | ||
824 | </Row> | ||
825 | <Row> | ||
826 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
827 | <Cell><Data ss:Type="String">/Place/server_update_text</Data></Cell> | ||
828 | <Cell ss:Index="5"><Data ss:Type="String">Place information not available without server update.</Data></Cell> | ||
829 | <Cell ss:Index="7"><Data ss:Type="String">서버를 ì—…ë°ì´íŠ¸í•˜ì§€ 않으면 í† ì§€ì†Œê°œë¥¼ ë³¼ 수 없습니다.</Data></Cell> | ||
830 | </Row> | ||
831 | <Row> | ||
832 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
833 | <Cell><Data ss:Type="String">/Place/server_error_text</Data></Cell> | ||
834 | <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable at this time, please try again later.</Data></Cell> | ||
835 | <Cell ss:Index="7"><Data ss:Type="String">현재 ì´ í† ì§€ì— ëŒ€í•œ 소개를 ë³¼ 수 없습니다. ë‚˜ì¤‘ì— ë‹¤ì‹œ 시ë„하ì‹ì‹œì˜¤.</Data></Cell> | ||
836 | </Row> | ||
837 | <Row> | ||
838 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
839 | <Cell><Data ss:Type="String">/Place/server_forbidden_text</Data></Cell> | ||
840 | <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.</Data></Cell> | ||
841 | <Cell ss:Index="7"><Data ss:Type="String">ì ‘ê·¼ ì œí•œìœ¼ë¡œ ì¸í•´ ì´ í† ì§€ì— ëŒ€í•œ 소개를 ë³¼ 수 없습니다. êµ¬íš ì†Œìœ ìžì—게 ê¶Œí•œì„ í™•ì¸í•˜ì‹ì‹œì˜¤.</Data></Cell> | ||
842 | </Row> | ||
843 | <Row> | ||
844 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
845 | <Cell><Data ss:Type="String">/Place/traffic_text</Data></Cell> | ||
846 | <Cell ss:Index="5"><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell> | ||
847 | <Cell ss:Index="7"><Data ss:Type="String">통행량: [TRAFFIC]</Data></Cell> | ||
848 | </Row> | ||
849 | <Row> | ||
850 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
851 | <Cell><Data ss:Type="String">/Place/area_text</Data></Cell> | ||
852 | <Cell ss:Index="5"><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell> | ||
853 | <Cell ss:Index="7"><Data ss:Type="String">ë©´ì : [AREA]ì œê³±ë¯¸í„°</Data></Cell> | ||
854 | </Row> | ||
855 | <Row> | ||
856 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
857 | <Cell><Data ss:Type="String">/Place/forsale_text</Data></Cell> | ||
858 | <Cell ss:Index="5"><Data ss:Type="String">For Sale for L$ [PRICE]</Data></Cell> | ||
859 | <Cell ss:Index="7"><Data ss:Type="String">L$ [PRICE]ì— íŒë§¤.</Data></Cell> | ||
860 | </Row> | ||
861 | <Row> | ||
862 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
863 | <Cell><Data ss:Type="String">/Place/auction_text</Data></Cell> | ||
864 | <Cell ss:Index="5"><Data ss:Type="String">Auction ID [ID].</Data></Cell> | ||
865 | <Cell ss:Index="7"><Data ss:Type="String">경매 ID [ID].</Data></Cell> | ||
866 | </Row> | ||
867 | <Row> | ||
868 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
869 | <Cell><Data ss:Type="String">/Place/server_update_text</Data></Cell> | ||
870 | <Cell ss:Index="5"><Data ss:Type="String">Place information not available without server update.</Data></Cell> | ||
871 | <Cell ss:Index="7"><Data ss:Type="String">서버를 ì—…ë°ì´íŠ¸í•˜ì§€ 않으면 ì§€ì— ì†Œê°œë¥¼ ë³¼ 수 없습니다.</Data></Cell> | ||
872 | </Row> | ||
873 | <Row> | ||
874 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
875 | <Cell><Data ss:Type="String">/Place/server_error_text</Data></Cell> | ||
876 | <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable at this time, please try again later.</Data></Cell> | ||
877 | <Cell ss:Index="7"><Data ss:Type="String">현재 ì´ í† ì§€ì— ëŒ€í•œ 소개를 ë³¼ 수 없습니다. ë‚˜ì¤‘ì— ë‹¤ì‹œ 시ë„하ì‹ì‹œì˜¤.</Data></Cell> | ||
878 | </Row> | ||
879 | <Row> | ||
880 | <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell> | ||
881 | <Cell><Data ss:Type="String">/Place/server_forbidden_text</Data></Cell> | ||
882 | <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.</Data></Cell> | ||
883 | <Cell ss:Index="7"><Data ss:Type="String">ì ‘ê·¼ ì œí•œìœ¼ë¡œ ì¸í•´ ì´ í† ì§€ì— ëŒ€í•œ 소개를 ë³¼ 수 없습니다. êµ¬íš ì†Œìœ ìžì—게 ê¶Œí•œì„ í™•ì¸í•˜ì‹ì‹œì˜¤.</Data></Cell> | ||
884 | </Row> | ||
885 | <Row> | ||
886 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
887 | <Cell><Data ss:Type="String">/LCD Options</Data></Cell> | ||
888 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
889 | <Cell ss:Index="5"><Data ss:Type="String">Logitech LCD</Data></Cell> | ||
890 | <Cell ss:Index="7"><Data ss:Type="String">Logitech LCD</Data></Cell> | ||
891 | </Row> | ||
892 | <Row> | ||
893 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
894 | <Cell><Data ss:Type="String">/LCD Options/LCD Destination:</Data></Cell> | ||
895 | <Cell ss:Index="5"><Data ss:Type="String">LCD Destination:</Data></Cell> | ||
896 | <Cell ss:Index="7"><Data ss:Type="String">LCD 대ìƒ:</Data></Cell> | ||
897 | </Row> | ||
898 | <Row> | ||
899 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
900 | <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationG15</Data></Cell> | ||
901 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
902 | <Cell ss:Index="5"><Data ss:Type="String">Display forms selected appear on Logitech G15 Keyboard LCD</Data></Cell> | ||
903 | <Cell ss:Index="7"><Data ss:Type="String">ì„ íƒí•œ ë””ìŠ¤í”Œë ˆì´ í˜•ì‹ì´ Logitech G15 키보드 LCDì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤.</Data></Cell> | ||
904 | </Row> | ||
905 | <Row> | ||
906 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
907 | <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationG15</Data></Cell> | ||
908 | <Cell ss:Index="5"><Data ss:Type="String">Logitech G15 Gaming Keyboard</Data></Cell> | ||
909 | <Cell ss:Index="7"><Data ss:Type="String">Logitech G15 게임 키보드</Data></Cell> | ||
910 | </Row> | ||
911 | <Row> | ||
912 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
913 | <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationZ10</Data></Cell> | ||
914 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
915 | <Cell ss:Index="5"><Data ss:Type="String">Display forms selected appear on Logitech Z10 Speaker LCD</Data></Cell> | ||
916 | <Cell ss:Index="7"><Data ss:Type="String">ì„ íƒí•œ ë””ìŠ¤í”Œë ˆì´ í˜•ì‹ì´ Logitech Z10 스피커 LCDì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤.</Data></Cell> | ||
917 | </Row> | ||
918 | <Row> | ||
919 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
920 | <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationZ10</Data></Cell> | ||
921 | <Cell ss:Index="5"><Data ss:Type="String">Logitech Z10 Speakers</Data></Cell> | ||
922 | <Cell ss:Index="7"><Data ss:Type="String">Logitech Z10 스피커</Data></Cell> | ||
923 | </Row> | ||
924 | <Row> | ||
925 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
926 | <Cell><Data ss:Type="String">/LCD Options/LCD Display Options</Data></Cell> | ||
927 | <Cell ss:Index="5"><Data ss:Type="String">LCD Display Options:</Data></Cell> | ||
928 | <Cell ss:Index="7"><Data ss:Type="String">LCD ë””ìŠ¤í”Œë ˆì´ ì˜µì…˜:</Data></Cell> | ||
929 | </Row> | ||
930 | <Row> | ||
931 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
932 | <Cell><Data ss:Type="String">/LCD Options/DisplayChat</Data></Cell> | ||
933 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
934 | <Cell ss:Index="5"><Data ss:Type="String">Display Chat</Data></Cell> | ||
935 | <Cell ss:Index="7"><Data ss:Type="String">채팅 표시</Data></Cell> | ||
936 | </Row> | ||
937 | <Row> | ||
938 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
939 | <Cell><Data ss:Type="String">/LCD Options/DisplayChat</Data></Cell> | ||
940 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
941 | <Cell ss:Index="5"><Data ss:Type="String">Display Last Chat line in LCD Window</Data></Cell> | ||
942 | <Cell ss:Index="7"><Data ss:Type="String">LCD ì°½ì— ë§ˆì§€ë§‰ 채팅 í–‰ 표시</Data></Cell> | ||
943 | </Row> | ||
944 | <Row> | ||
945 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
946 | <Cell><Data ss:Type="String">/LCD Options/DisplayIM</Data></Cell> | ||
947 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
948 | <Cell ss:Index="5"><Data ss:Type="String">Display IM's</Data></Cell> | ||
949 | <Cell ss:Index="7"><Data ss:Type="String">ë©”ì‹ ì € 표시</Data></Cell> | ||
950 | </Row> | ||
951 | <Row> | ||
952 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
953 | <Cell><Data ss:Type="String">/LCD Options/DisplayIM</Data></Cell> | ||
954 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
955 | <Cell ss:Index="5"><Data ss:Type="String">Display Last IM in LCD Window</Data></Cell> | ||
956 | <Cell ss:Index="7"><Data ss:Type="String">LCD ì°½ì— ë§ˆì§€ë§‰ ë©”ì‹ ì € 표시</Data></Cell> | ||
957 | </Row> | ||
958 | <Row> | ||
959 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
960 | <Cell><Data ss:Type="String">/LCD Options/DisplayRegion</Data></Cell> | ||
961 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
962 | <Cell ss:Index="5"><Data ss:Type="String">Show Location Information</Data></Cell> | ||
963 | <Cell ss:Index="7"><Data ss:Type="String">위치 ì •ë³´ 표시</Data></Cell> | ||
964 | </Row> | ||
965 | <Row> | ||
966 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
967 | <Cell><Data ss:Type="String">/LCD Options/DisplayRegion</Data></Cell> | ||
968 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
969 | <Cell ss:Index="5"><Data ss:Type="String">Display current location information in LCD Window</Data></Cell> | ||
970 | <Cell ss:Index="7"><Data ss:Type="String">LCD ì°½ì— í˜„ìž¬ 위치 ì •ë³´ 표시</Data></Cell> | ||
971 | </Row> | ||
972 | <Row> | ||
973 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
974 | <Cell><Data ss:Type="String">/LCD Options/DisplayLinden</Data></Cell> | ||
975 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
976 | <Cell ss:Index="5"><Data ss:Type="String">Show Account Information</Data></Cell> | ||
977 | <Cell ss:Index="7"><Data ss:Type="String">ê³„ì • ì •ë³´ 표시</Data></Cell> | ||
978 | </Row> | ||
979 | <Row> | ||
980 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
981 | <Cell><Data ss:Type="String">/LCD Options/DisplayLinden</Data></Cell> | ||
982 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
983 | <Cell ss:Index="5"><Data ss:Type="String">Display current account information in LCD Window</Data></Cell> | ||
984 | <Cell ss:Index="7"><Data ss:Type="String">LCD ì°½ì— í˜„ìž¬ ê³„ì • ì •ë³´ 표시</Data></Cell> | ||
985 | </Row> | ||
986 | <Row> | ||
987 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
988 | <Cell><Data ss:Type="String">/LCD Options/DisplayDebug</Data></Cell> | ||
989 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
990 | <Cell ss:Index="5"><Data ss:Type="String">Display Network Comms Info</Data></Cell> | ||
991 | <Cell ss:Index="7"><Data ss:Type="String">ë„¤íŠ¸ì›Œí¬ í†µì‹ ì •ë³´ 표시</Data></Cell> | ||
992 | </Row> | ||
993 | <Row> | ||
994 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
995 | <Cell><Data ss:Type="String">/LCD Options/DisplayDebug</Data></Cell> | ||
996 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
997 | <Cell ss:Index="5"><Data ss:Type="String">Display debug information in LCD Window</Data></Cell> | ||
998 | <Cell ss:Index="7"><Data ss:Type="String">LCD ì°½ì— ë””ë²„ê·¸ ì •ë³´ 표시</Data></Cell> | ||
999 | </Row> | ||
1000 | <Row> | ||
1001 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
1002 | <Cell><Data ss:Type="String">/LCD Options/DisplayDebugConsole</Data></Cell> | ||
1003 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
1004 | <Cell ss:Index="5"><Data ss:Type="String">Display Debug Info from Console</Data></Cell> | ||
1005 | <Cell ss:Index="7"><Data ss:Type="String">ì½˜ì†”ì˜ ë””ë²„ê·¸ ì •ë³´ 표시</Data></Cell> | ||
1006 | </Row> | ||
1007 | <Row> | ||
1008 | <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell> | ||
1009 | <Cell><Data ss:Type="String">/LCD Options/DisplayDebugConsole</Data></Cell> | ||
1010 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
1011 | <Cell ss:Index="5"><Data ss:Type="String">Display console debug information in LCD Window</Data></Cell> | ||
1012 | <Cell ss:Index="7"><Data ss:Type="String">LCD ì°½ì— ì½˜ì†” 디버그 ì •ë³´ 표시</Data></Cell> | ||
1013 | </Row> | ||
1014 | <Row> | ||
1015 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1016 | <Cell><Data ss:Type="String">/status/search_editor</Data></Cell> | ||
1017 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
1018 | <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell> | ||
1019 | <Cell ss:Index="7"><Data ss:Type="String">검색</Data></Cell> | ||
1020 | </Row> | ||
1021 | <Row> | ||
1022 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1023 | <Cell><Data ss:Type="String">/status/search_editor</Data></Cell> | ||
1024 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
1025 | <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell> | ||
1026 | <Cell ss:Index="7"><Data ss:Type="String">Second Life 검색</Data></Cell> | ||
1027 | </Row> | ||
1028 | <Row> | ||
1029 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1030 | <Cell><Data ss:Type="String">/status/search_btn</Data></Cell> | ||
1031 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
1032 | </Row> | ||
1033 | <Row> | ||
1034 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1035 | <Cell><Data ss:Type="String">/status/search_btn</Data></Cell> | ||
1036 | <Cell><Data ss:Type="String">label_selected</Data></Cell> | ||
1037 | </Row> | ||
1038 | <Row> | ||
1039 | <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell> | ||
1040 | <Cell><Data ss:Type="String">/status/search_btn</Data></Cell> | ||
1041 | <Cell><Data ss:Type="String">tool_tip</Data></Cell> | ||
1042 | <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell> | ||
1043 | <Cell ss:Index="7"><Data ss:Type="String">Second Life 검색</Data></Cell> | ||
1044 | </Row> | ||
1045 | </Table> | ||
1046 | <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> | ||
1047 | <Selected/> | ||
1048 | <TopRowVisible>18</TopRowVisible> | ||
1049 | <Panes> | ||
1050 | <Pane> | ||
1051 | <Number>3</Number> | ||
1052 | <ActiveRow>10</ActiveRow> | ||
1053 | <ActiveCol>2</ActiveCol> | ||
1054 | </Pane> | ||
1055 | </Panes> | ||
1056 | <ProtectObjects>False</ProtectObjects> | ||
1057 | <ProtectScenarios>False</ProtectScenarios> | ||
1058 | </WorksheetOptions> | ||
1059 | </Worksheet> | ||
1060 | </Workbook> | ||
diff --git a/linden/indra/newview/skins/xui/ko/need_to_update.xml b/linden/indra/newview/skins/xui/ko/need_to_update.xml new file mode 100644 index 0000000..f4f06dd --- /dev/null +++ b/linden/indra/newview/skins/xui/ko/need_to_update.xml | |||
@@ -0,0 +1,420 @@ | |||
1 | <?xml version="1.0"?> | ||
2 | <?mso-application progid="Excel.Sheet"?> | ||
3 | <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" | ||
4 | xmlns:o="urn:schemas-microsoft-com:office:office" | ||
5 | xmlns:x="urn:schemas-microsoft-com:office:excel" | ||
6 | xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" | ||
7 | xmlns:html="http://www.w3.org/TR/REC-html40"> | ||
8 | <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> | ||
9 | <LastAuthor>Leyla Farazha</LastAuthor> | ||
10 | <Created>2007-11-21T00:54:19Z</Created> | ||
11 | <LastSaved>2007-11-21T01:15:31Z</LastSaved> | ||
12 | <Version>11.6568</Version> | ||
13 | </DocumentProperties> | ||
14 | <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> | ||
15 | <WindowHeight>10230</WindowHeight> | ||
16 | <WindowWidth>22875</WindowWidth> | ||
17 | <WindowTopX>-2880</WindowTopX> | ||
18 | <WindowTopY>2355</WindowTopY> | ||
19 | <ProtectStructure>False</ProtectStructure> | ||
20 | <ProtectWindows>False</ProtectWindows> | ||
21 | </ExcelWorkbook> | ||
22 | <Styles> | ||
23 | <Style ss:ID="Default" ss:Name="Normal"> | ||
24 | <Alignment ss:Vertical="Bottom"/> | ||
25 | <Borders/> | ||
26 | <Font/> | ||
27 | <Interior/> | ||
28 | <NumberFormat/> | ||
29 | <Protection/> | ||
30 | </Style> | ||
31 | <Style ss:ID="s21"> | ||
32 | <Font ss:Bold="1"/> | ||
33 | </Style> | ||
34 | <Style ss:ID="s22"> | ||
35 | <Font ss:Bold="1"/> | ||
36 | <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/> | ||
37 | </Style> | ||
38 | <Style ss:ID="s23"> | ||
39 | <Alignment ss:Vertical="Bottom" ss:WrapText="1"/> | ||
40 | </Style> | ||
41 | </Styles> | ||
42 | <Worksheet ss:Name="need_to_update2"> | ||
43 | <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="43" x:FullColumns="1" | ||
44 | x:FullRows="1"> | ||
45 | <Column ss:Width="63.75"/> | ||
46 | <Column ss:Width="70.5"/> | ||
47 | <Column ss:Width="88.5"/> | ||
48 | <Column ss:Width="63.75"/> | ||
49 | <Column ss:Width="69.75"/> | ||
50 | <Column ss:Width="90.75"/> | ||
51 | <Column ss:Width="97.5"/> | ||
52 | <Row> | ||
53 | <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell> | ||
54 | </Row> | ||
55 | <Row> | ||
56 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell> | ||
57 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell> | ||
58 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell> | ||
59 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell> | ||
60 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell> | ||
61 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell> | ||
62 | <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell> | ||
63 | </Row> | ||
64 | <Row ss:Height="153"> | ||
65 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
66 | <Cell><Data ss:Type="String">//ClickPublishHelpAvatar/message</Data></Cell> | ||
67 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Selecting the "Publish in Search" will show: - my profile in search results - a link to my profile in public group pages</Data></Cell> | ||
68 | <Cell ss:StyleID="s23"><Data ss:Type="String">Selecting "Show in Search" will show: - my profile in search results - a link to my profile in public group pages</Data></Cell> | ||
69 | <Cell ss:StyleID="s23"><Data ss:Type="String">ì›¹ì— ê²Œì‹œ ì˜µì…˜ì„ ì„ íƒí•˜ë©´ [SECOND_LIFE] 웹 사ì´íŠ¸ì— ë‚´ ì´ë¦„, ì´ë¯¸ì§€ ë° 'ìžê¸° 소개' í…스트를 ê²Œì‹œí• ìˆ˜ 있습니다.</Data></Cell> | ||
70 | <Cell ss:StyleID="s23"><Data ss:Type="String">"검색 보기" ì˜µì…˜ì„ ì„ íƒí•˜ë©´ 웹 사ì´íЏì—서 ë‚´ ì´ë¦„, ì´ë¯¸ì§€ ë° 'ìžê¸° 소개' í…스트를 ë³¼ 수 있습니다.</Data></Cell> | ||
71 | </Row> | ||
72 | <Row> | ||
73 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
74 | <Cell><Data ss:Type="String">//ErrorEncodingSnapshot/message</Data></Cell> | ||
75 | <Cell ss:Index="4"><Data ss:Type="String">Error encoding snapshot.</Data></Cell> | ||
76 | <Cell><Data ss:Type="String">Error encoding snapshot!</Data></Cell> | ||
77 | <Cell><Data ss:Type="String">스냅샷 ì¸ì½”딩 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.</Data></Cell> | ||
78 | <Cell><Data ss:Type="String">스냅샷 ì¸ì½”딩 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.</Data></Cell> | ||
79 | </Row> | ||
80 | <Row ss:Height="409.5"> | ||
81 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
82 | <Cell><Data ss:Type="String">//AddClassified/message</Data></Cell> | ||
83 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the Search directory and on www.secondlife.com for one week. Fill out your ad, then click 'Publish...' to add it to the directory. You'll be asked for a price to pay when clicking Publish. Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords.</Data></Cell> | ||
84 | <Cell ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the Find directory for one week. Fill out your ad, then click 'Publish...' to add it to the directory. You'll be asked for a price to pay when clicking Publish. Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords.</Data></Cell> | ||
85 | <Cell ss:StyleID="s23"><Data ss:Type="String">ë¶„ë¥˜ëœ ê´‘ê³ ê°€ 1ì£¼ì¼ ë™ì•ˆ 찾기 ë””ë ‰í† ë¦¬ì˜ 'ê´‘ê³ ' ì„¹ì…˜ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤. ê´‘ê³ ë¥¼ 작성한 후 '게시하기'를 í´ë¦í•˜ì—¬ ë””ë ‰í† ë¦¬ì— ì¶”ê°€í•©ë‹ˆë‹¤. 게시하기를 í´ë¦í•˜ë©´ 요금 ê²°ì œë¥¼ 묻는 메시지가 나타납니다. ë” ë†’ì€ ê°€ê²©ì„ ì§€ë¶ˆí• ìˆ˜ë¡ ëª©ë¡ì—서 ë” ë†’ì€ ìœ„ì¹˜ì— ê²Œìž¬ë˜ê³ 키워드 검색 시 ê²°ê³¼ì— ë” ìš°ì„ ì 으로 표시ë©ë‹ˆë‹¤.</Data></Cell> | ||
86 | <Cell ss:StyleID="s23"><Data ss:Type="String">ë¶„ë¥˜ëœ ê´‘ê³ ê°€ 1ì£¼ì¼ ë™ì•ˆ ë””ë ‰í† ë¦¬ì˜ 'ê´‘ê³ ' ì„¹ì…˜ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤. ê´‘ê³ ë¥¼ 작성한 후 '게시하기'를 í´ë¦í•˜ì—¬ ë””ë ‰í† ë¦¬ì— ì¶”ê°€í•©ë‹ˆë‹¤. 게시하기를 í´ë¦í•˜ë©´ 요금 ê²°ì œë¥¼ 묻는 메시지가 나타납니다. ë” ë†’ì€ ê°€ê²©ì„ ì§€ë¶ˆí• ìˆ˜ë¡ ëª©ë¡ì—서 ë” ë†’ì€ ìœ„ì¹˜ì— ê²Œìž¬ë˜ê³ 키워드 검색 시 ê²°ê³¼ì— ë” ìš°ì„ ì 으로 표시ë©ë‹ˆë‹¤.</Data></Cell> | ||
87 | </Row> | ||
88 | <Row ss:Height="178.5"> | ||
89 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
90 | <Cell><Data ss:Type="String">//HelpEstateExternallyVisible/message</Data></Cell> | ||
91 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">This checkbox sets whether Residents who are on other estates can enter this estate without being on an access list. Default: on</Data></Cell> | ||
92 | <Cell ss:StyleID="s23"><Data ss:Type="String">This checkbox sets whether Residents who are on other estates can enter this estate without being on an access list. Default: on</Data></Cell> | ||
93 | <Cell ss:StyleID="s23"><Data ss:Type="String">다른 ì‚¬ìœ ì§€ ë‚´ì— ìžˆëŠ” ì£¼ë¯¼ë“¤ì´ ì ‘ê·¼ 권한 ë¦¬ìŠ¤íŠ¸ì— ì˜¬ë¼ìžˆì§€ ì•Šì•„ë„ ì´ ì‚¬ìœ ì§€ì— ë“¤ì–´ê°ˆ 수 있는지 여부를 ì„¤ì •í•©ë‹ˆë‹¤. 기본 ì„¤ì •: 켜ì§</Data></Cell> | ||
94 | <Cell ss:StyleID="s23"><Data ss:Type="String">다른 ì‚¬ìœ ì§€ ë‚´ì— ìžˆëŠ” ì£¼ë¯¼ë“¤ì´ ì ‘ê·¼ 권한 ë¦¬ìŠ¤íŠ¸ì— ì˜¬ë¼ìžˆì§€ ì•Šì•„ë„ ì´ ì‚¬ìœ ì§€ì— ë“¤ì–´ê°ˆ 수 있는지 여부를 ì„¤ì •í•©ë‹ˆë‹¤. 기본 ì„¤ì •: 켜ì§</Data></Cell> | ||
95 | </Row> | ||
96 | <Row ss:Height="204"> | ||
97 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
98 | <Cell><Data ss:Type="String">//HelpEstateAllowResident/message</Data></Cell> | ||
99 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to Residents listed here and any groups below. This setting is only available when Visible from Mainland is unchecked.</Data></Cell> | ||
100 | <Cell ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to Residents listed here and any groups below. This setting is only available when Visible from Mainland is unchecked.</Data></Cell> | ||
101 | <Cell ss:StyleID="s23"><Data ss:Type="String">ì‚¬ìœ ì§€ ì‚¬ìš©ê¶Œí•œì€ ëª©ë¡ì— 있는 주민들과 아래 목ë¡ì— 그룹들로 ì œí•œë©ë‹ˆë‹¤. (ì‚¬ìœ ì§€ë¥¼ ë©”ì¸ëžœë“œì—서 확ì¸í• 수 있는 경우, ì‚¬ìš©ê¶Œí•œì€ ì£¼ë¯¼ ë˜ëŠ” 목ë¡ìƒì˜ 그룹으로 ì œí•œë 수 ì—†ê³ , ì´ëŸ¬í•œ ì œì–´ëŠ” 비활성화 ë©ë‹ˆë‹¤. 'ì ‘ê·¼ ê±°ë¶€' 목ë¡ë§Œ 사용ë¨).</Data></Cell> | ||
102 | <Cell ss:StyleID="s23"><Data ss:Type="String">ì‚¬ìœ ì§€ ì‚¬ìš©ê¶Œí•œì€ ëª©ë¡ì— 있는 주민들과 아래 목ë¡ì— 그룹들로 ì œí•œë©ë‹ˆë‹¤. (ì‚¬ìœ ì§€ë¥¼ ë©”ì¸ëžœë“œì—서 확ì¸í• 수 있는 경우, ì‚¬ìš©ê¶Œí•œì€ ì£¼ë¯¼ ë˜ëŠ” 목ë¡ìƒì˜ 그룹으로 ì œí•œë 수 ì—†ê³ , ì´ëŸ¬í•œ ì œì–´ëŠ” 비활성화ë©ë‹ˆë‹¤. 'ì ‘ê·¼ ê±°ë¶€' 목ë¡ë§Œ 사용ë¨)</Data></Cell> | ||
103 | </Row> | ||
104 | <Row ss:Height="204"> | ||
105 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
106 | <Cell><Data ss:Type="String">//HelpEstateAllowGroup/message</Data></Cell> | ||
107 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to groups listed here and any Residents above. This setting is only available when Visible from Mainland is unchecked.</Data></Cell> | ||
108 | <Cell ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to groups listed here and any Residents above. This setting is only available when Visible from Mainland is unchecked.</Data></Cell> | ||
109 | <Cell ss:StyleID="s23"><Data ss:Type="String">ì‚¬ìœ ì§€ ì‚¬ìš©ê¶Œí•œì€ ëª©ë¡ìƒì˜ 그룹들과 ìœ„ì— íŠ¹ë³„ížˆ í—ˆë½ëœ 주민들로 ì œí•œë©ë‹ˆë‹¤. (ì‚¬ìœ ì§€ë¥¼ ë©”ì¸ëžœë“œì—서 확ì¸í• 수 있는 경우, ì‚¬ìš©ê¶Œí•œì€ ì£¼ë¯¼ ë˜ëŠ” 목ë¡ìƒì˜ 그룹으로 ì œí•œë 수 ì—†ê³ , ì´ëŸ¬í•œ ì œì–´ëŠ” 비활성화 ë©ë‹ˆë‹¤. 'ì ‘ê·¼ ê±°ë¶€' 목ë¡ë§Œ 사용ë¨).</Data></Cell> | ||
110 | <Cell ss:StyleID="s23"><Data ss:Type="String">ì‚¬ìœ ì§€ ì‚¬ìš©ê¶Œí•œì€ ëª©ë¡ìƒì˜ 그룹들과 ìœ„ì— íŠ¹ë³„ížˆ í—ˆë½ëœ 주민들로 ì œí•œë©ë‹ˆë‹¤. (ì‚¬ìœ ì§€ë¥¼ ë©”ì¸ëžœë“œì—서 확ì¸í• 수 있는 경우, ì‚¬ìš©ê¶Œí•œì€ ì£¼ë¯¼ ë˜ëŠ” 목ë¡ìƒì˜ 그룹으로 ì œí•œë 수 ì—†ê³ , ì´ëŸ¬í•œ ì œì–´ëŠ” 비활성화ë©ë‹ˆë‹¤. 'ì ‘ê·¼ ê±°ë¶€' 목ë¡ë§Œ 사용ë¨)</Data></Cell> | ||
111 | </Row> | ||
112 | <Row ss:Height="191.25"> | ||
113 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
114 | <Cell><Data ss:Type="String">//HelpEstateVoiceChat/message</Data></Cell> | ||
115 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Parcels in this estate are allowed to have their own voice channels in which residents may hear and talk with others nearby. Default: off</Data></Cell> | ||
116 | <Cell ss:StyleID="s23"><Data ss:Type="String">Parcels in this estate are allowed to have their own voice channels in which residents may hear and talk with others nearby. Default: off</Data></Cell> | ||
117 | <Cell ss:StyleID="s23"><Data ss:Type="String">ì´ ì‚¬ìœ ì§€ì˜ êµ¬íšì€ ì£¼ë¯¼ë“¤ì´ ë¶€ê·¼ì— ìžˆëŠ” 다른 사람들과 ëŒ€í™”í• ìˆ˜ 있는 ìŒì„± 대화를 í• ìˆ˜ 있게 ì„¤ì •í•©ë‹ˆë‹¤. 기본 ì„¤ì •: 꺼ì§</Data></Cell> | ||
118 | <Cell ss:StyleID="s23"><Data ss:Type="String">ì´ ì‚¬ìœ ì§€ì˜ êµ¬íšì€ ì£¼ë¯¼ë“¤ì´ ë¶€ê·¼ì— ìžˆëŠ” 다른 사람들과 ëŒ€í™”í• ìˆ˜ 있는 ìŒì„± 대화를 í• ìˆ˜ 있게 ì„¤ì •í•©ë‹ˆë‹¤. 기본 ì„¤ì •: 꺼ì§</Data></Cell> | ||
119 | </Row> | ||
120 | <Row ss:Height="331.5"> | ||
121 | <Cell><Data ss:Type="String">alerts.xml</Data></Cell> | ||
122 | <Cell><Data ss:Type="String">//BadURL/message</Data></Cell> | ||
123 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life doesn't know how to handle the link: [SLURL] Most links are similar to this: secondlife://app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about Please check the spelling and try again.</Data></Cell> | ||
124 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life doesn't know how to handle the link: [SLURL] Most links are similar to this: secondlife:///app/agent/0e346d8b-4433-4d66-a6b0- fd37083abc4c/about Please check the spelling and try again.</Data></Cell> | ||
125 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Lifeì—서 ë§í¬ë¡œ ì—°ê²°ë˜ì§€ 않습니다: [SLURL] ëŒ€ë¶€ë¶„ì˜ ë§í¬ 형ì‹ì€ 다ìŒê³¼ ìœ ì‚¬í•©ë‹ˆë‹¤: secondlife://app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about ë§žì¶¤ë²•ì„ í™•ì¸í•˜ê³ 다시 시ë„하ì‹ì‹œì˜¤.</Data></Cell> | ||
126 | <Cell ss:StyleID="s23"><Data ss:Type="String">Second Lifeì—서 ë§í¬ë¡œ ì—°ê²°ë˜ì§€ 않습니다: [SLURL] ëŒ€ë¶€ë¶„ì˜ ë§í¬ 형ì‹ì€ 다ìŒê³¼ ìœ ì‚¬í•©ë‹ˆë‹¤: secondlife:///app/agent/0e346d8b-4433-4d66-a6b0- fd37083abc4c/about ë§žì¶¤ë²•ì„ í™•ì¸í•˜ê³ 다시 시ë„하ì‹ì‹œì˜¤.</Data></Cell> | ||
127 | </Row> | ||
128 | <Row> | ||
129 | <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell> | ||
130 | <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/ShowDirectoryCheck</Data></Cell> | ||
131 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
132 | <Cell><Data ss:Type="String">Show in Search > Places (L$30/week) under</Data></Cell> | ||
133 | <Cell><Data ss:Type="String">Show Place in Search (L$30/week) under</Data></Cell> | ||
134 | <Cell><Data ss:Type="String">검색 > 장소(L$30/주)ì— ë³´ì´ê¸°</Data></Cell> | ||
135 | <Cell><Data ss:Type="String">장소 검색(L$30/주) 표시 위치</Data></Cell> | ||
136 | </Row> | ||
137 | <Row ss:Height="25.5"> | ||
138 | <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell> | ||
139 | <Cell><Data ss:Type="String">/floaterland/landtab/land_media_panel/Media texture:</Data></Cell> | ||
140 | <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Media texture:</Data></Cell> | ||
141 | <Cell ss:StyleID="s23"><Data ss:Type="String">Sound Settings:</Data></Cell> | ||
142 | <Cell ss:StyleID="s23"><Data ss:Type="String">사운드 ì„¤ì •:</Data></Cell> | ||
143 | <Cell ss:StyleID="s23"><Data ss:Type="String">사운드 ì„¤ì •:</Data></Cell> | ||
144 | </Row> | ||
145 | <Row> | ||
146 | <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell> | ||
147 | <Cell><Data ss:Type="String">/directory</Data></Cell> | ||
148 | <Cell><Data ss:Type="String">title</Data></Cell> | ||
149 | <Cell><Data ss:Type="String">Search</Data></Cell> | ||
150 | <Cell><Data ss:Type="String">Search Second Life</Data></Cell> | ||
151 | <Cell><Data ss:Type="String">검색</Data></Cell> | ||
152 | <Cell><Data ss:Type="String">Second Life 검색</Data></Cell> | ||
153 | </Row> | ||
154 | <Row> | ||
155 | <Cell><Data ss:Type="String">floater_html_help.xml</Data></Cell> | ||
156 | <Cell><Data ss:Type="String">/htmlhelp/status_text</Data></Cell> | ||
157 | <Cell ss:Index="4"><Data ss:Type="String">Done</Data></Cell> | ||
158 | <Cell><Data ss:Type="String">Ready</Data></Cell> | ||
159 | <Cell><Data ss:Type="String">완료</Data></Cell> | ||
160 | <Cell><Data ss:Type="String">준비</Data></Cell> | ||
161 | </Row> | ||
162 | <Row> | ||
163 | <Cell><Data ss:Type="String">floater_lagmeter.xml</Data></Cell> | ||
164 | <Cell><Data ss:Type="String">/floater_lagmeter/network_ping_warning_ms</Data></Cell> | ||
165 | <Cell ss:Index="4"><Data ss:Type="Number">250</Data></Cell> | ||
166 | <Cell><Data ss:Type="Number">300</Data></Cell> | ||
167 | <Cell><Data ss:Type="Number">250</Data></Cell> | ||
168 | <Cell><Data ss:Type="Number">300</Data></Cell> | ||
169 | </Row> | ||
170 | <Row> | ||
171 | <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell> | ||
172 | <Cell><Data ss:Type="String">/land holdings floater/allowed_text</Data></Cell> | ||
173 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
174 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
175 | <Cell><Data ss:Type="String">0ì œê³±ë¯¸í„°</Data></Cell> | ||
176 | <Cell><Data ss:Type="String">[AREA]ì œê³±ë¯¸í„°</Data></Cell> | ||
177 | </Row> | ||
178 | <Row> | ||
179 | <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell> | ||
180 | <Cell><Data ss:Type="String">/land holdings floater/current_text</Data></Cell> | ||
181 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
182 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
183 | <Cell><Data ss:Type="String">0ì œê³±ë¯¸í„°</Data></Cell> | ||
184 | <Cell><Data ss:Type="String">[AREA]ì œê³±ë¯¸í„°</Data></Cell> | ||
185 | </Row> | ||
186 | <Row> | ||
187 | <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell> | ||
188 | <Cell><Data ss:Type="String">/land holdings floater/available_text</Data></Cell> | ||
189 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
190 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
191 | <Cell><Data ss:Type="String">0ì œê³±ë¯¸í„°</Data></Cell> | ||
192 | <Cell><Data ss:Type="String">[AREA]ì œê³±ë¯¸í„°</Data></Cell> | ||
193 | </Row> | ||
194 | <Row> | ||
195 | <Cell><Data ss:Type="String">floater_tools.xml</Data></Cell> | ||
196 | <Cell><Data ss:Type="String">/toolbox floater/Object Info Tabs/General/search_check</Data></Cell> | ||
197 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
198 | <Cell><Data ss:Type="String">Show in Search</Data></Cell> | ||
199 | <Cell><Data ss:Type="String">Show in search</Data></Cell> | ||
200 | <Cell><Data ss:Type="String">검색 보기</Data></Cell> | ||
201 | <Cell><Data ss:Type="String">검색 보기</Data></Cell> | ||
202 | </Row> | ||
203 | <Row> | ||
204 | <Cell><Data ss:Type="String">menu_inventory.xml</Data></Cell> | ||
205 | <Cell><Data ss:Type="String">/Popup/Teleport To Landmark</Data></Cell> | ||
206 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
207 | <Cell><Data ss:Type="String">Teleport To Landmark</Data></Cell> | ||
208 | <Cell><Data ss:Type="String">About Landmark</Data></Cell> | ||
209 | <Cell><Data ss:Type="String">랜드마í¬ë¡œ 텔리í¬íЏ</Data></Cell> | ||
210 | <Cell><Data ss:Type="String">ëžœë“œë§ˆí¬ ì •ë³´</Data></Cell> | ||
211 | </Row> | ||
212 | <Row> | ||
213 | <Cell><Data ss:Type="String">panel_audio_device.xml</Data></Cell> | ||
214 | <Cell><Data ss:Type="String">/device_settings/Input device (microphone):</Data></Cell> | ||
215 | <Cell ss:Index="4"><Data ss:Type="String">Audio Devices</Data></Cell> | ||
216 | <Cell><Data ss:Type="String">Input device (microphone):</Data></Cell> | ||
217 | <Cell><Data ss:Type="String">ìž…ë ¥ ë ˆë²¨</Data></Cell> | ||
218 | <Cell><Data ss:Type="String">ìž…ë ¥ 장치(마ì´í¬):</Data></Cell> | ||
219 | </Row> | ||
220 | <Row> | ||
221 | <Cell><Data ss:Type="String">panel_audio_device.xml</Data></Cell> | ||
222 | <Cell><Data ss:Type="String">/device_settings/Input device (microphone):</Data></Cell> | ||
223 | <Cell ss:Index="4"><Data ss:Type="String">Audio Devices</Data></Cell> | ||
224 | <Cell><Data ss:Type="String">Input Level</Data></Cell> | ||
225 | <Cell><Data ss:Type="String">ìž…ë ¥ ë ˆë²¨</Data></Cell> | ||
226 | <Cell><Data ss:Type="String">ìž…ë ¥ ë ˆë²¨</Data></Cell> | ||
227 | </Row> | ||
228 | <Row> | ||
229 | <Cell><Data ss:Type="String">panel_avatar.xml</Data></Cell> | ||
230 | <Cell><Data ss:Type="String">/Panel Avatar/tab/2nd Life/allow_publish</Data></Cell> | ||
231 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
232 | <Cell><Data ss:Type="String">Show In Search</Data></Cell> | ||
233 | <Cell><Data ss:Type="String">Show in search</Data></Cell> | ||
234 | <Cell><Data ss:Type="String">검색 보기</Data></Cell> | ||
235 | <Cell><Data ss:Type="String">검색 보기</Data></Cell> | ||
236 | </Row> | ||
237 | <Row> | ||
238 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
239 | <Cell><Data ss:Type="String">/general_tab/preferences_container/show_in_group_list</Data></Cell> | ||
240 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
241 | <Cell><Data ss:Type="String">Show In Search</Data></Cell> | ||
242 | <Cell><Data ss:Type="String">Show in search</Data></Cell> | ||
243 | <Cell><Data ss:Type="String">검색 보기</Data></Cell> | ||
244 | <Cell><Data ss:Type="String">검색 보기</Data></Cell> | ||
245 | </Row> | ||
246 | <Row> | ||
247 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
248 | <Cell><Data ss:Type="String">/general_tab/preferences_container/mature</Data></Cell> | ||
249 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
250 | <Cell><Data ss:Type="String">Mature Group</Data></Cell> | ||
251 | <Cell><Data ss:Type="String">Mature group</Data></Cell> | ||
252 | <Cell><Data ss:Type="String">ì„±ì¸ ê·¸ë£¹</Data></Cell> | ||
253 | <Cell><Data ss:Type="String">ì„±ì¸ ê·¸ë£¹</Data></Cell> | ||
254 | </Row> | ||
255 | <Row> | ||
256 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
257 | <Cell><Data ss:Type="String">/general_tab/preferences_container/open_enrollement</Data></Cell> | ||
258 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
259 | <Cell><Data ss:Type="String">Open Enrollment</Data></Cell> | ||
260 | <Cell><Data ss:Type="String">Open enrollment</Data></Cell> | ||
261 | <Cell><Data ss:Type="String">ìžìœ 가입</Data></Cell> | ||
262 | <Cell><Data ss:Type="String">ìžìœ 가입</Data></Cell> | ||
263 | </Row> | ||
264 | <Row> | ||
265 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
266 | <Cell><Data ss:Type="String">/general_tab/preferences_container/check_enrollment_fee</Data></Cell> | ||
267 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
268 | <Cell><Data ss:Type="String">Enrollment Fee: L$</Data></Cell> | ||
269 | <Cell><Data ss:Type="String">Enrollment fee: L$</Data></Cell> | ||
270 | <Cell><Data ss:Type="String">가입비: L$</Data></Cell> | ||
271 | <Cell><Data ss:Type="String">가입비: L$</Data></Cell> | ||
272 | </Row> | ||
273 | <Row> | ||
274 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
275 | <Cell><Data ss:Type="String">/general_tab/preferences_container/receive_notices</Data></Cell> | ||
276 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
277 | <Cell><Data ss:Type="String">Receive Group Notices</Data></Cell> | ||
278 | <Cell><Data ss:Type="String">Receive group notices</Data></Cell> | ||
279 | <Cell><Data ss:Type="String">그룹 공지 ìˆ˜ë ¹</Data></Cell> | ||
280 | <Cell><Data ss:Type="String">그룹 공지 ìˆ˜ë ¹</Data></Cell> | ||
281 | </Row> | ||
282 | <Row> | ||
283 | <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell> | ||
284 | <Cell><Data ss:Type="String">/general_tab/preferences_container/list_groups_in_profile</Data></Cell> | ||
285 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
286 | <Cell><Data ss:Type="String">List Group in Profile</Data></Cell> | ||
287 | <Cell><Data ss:Type="String">List group in my profile</Data></Cell> | ||
288 | <Cell><Data ss:Type="String">í”„ë¡œí•„ì— ê·¸ë£¹ í¬í•¨í•˜ê¸°</Data></Cell> | ||
289 | <Cell><Data ss:Type="String">í”„ë¡œí•„ì— ê·¸ë£¹ í¬í•¨í•˜ê¸°</Data></Cell> | ||
290 | </Row> | ||
291 | <Row> | ||
292 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
293 | <Cell><Data ss:Type="String">/land_money_tab/total_contributed_land_value</Data></Cell> | ||
294 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
295 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
296 | <Cell><Data ss:Type="String">0ì œê³±ë¯¸í„°</Data></Cell> | ||
297 | <Cell><Data ss:Type="String">[AREA]ì œê³±ë¯¸í„°</Data></Cell> | ||
298 | </Row> | ||
299 | <Row> | ||
300 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
301 | <Cell><Data ss:Type="String">/land_money_tab/total_land_in_use_value</Data></Cell> | ||
302 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
303 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
304 | <Cell><Data ss:Type="String">0ì œê³±ë¯¸í„°</Data></Cell> | ||
305 | <Cell><Data ss:Type="String">[AREA]ì œê³±ë¯¸í„°</Data></Cell> | ||
306 | </Row> | ||
307 | <Row> | ||
308 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
309 | <Cell><Data ss:Type="String">/land_money_tab/land_available_value</Data></Cell> | ||
310 | <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell> | ||
311 | <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell> | ||
312 | <Cell><Data ss:Type="String">0ì œê³±ë¯¸í„°</Data></Cell> | ||
313 | <Cell><Data ss:Type="String">[AREA]ì œê³±ë¯¸í„°</Data></Cell> | ||
314 | </Row> | ||
315 | <Row> | ||
316 | <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell> | ||
317 | <Cell><Data ss:Type="String">/land_money_tab/your_contribution_max_value</Data></Cell> | ||
318 | <Cell ss:Index="4"><Data ss:Type="String">([AMOUNT] max)</Data></Cell> | ||
319 | <Cell><Data ss:Type="String">sq. meters ([AMOUNT] max)</Data></Cell> | ||
320 | <Cell><Data ss:Type="String">(최대 [AMOUNT])</Data></Cell> | ||
321 | <Cell><Data ss:Type="String">ì œê³±ë¯¸í„°(최대 [AMOUNT])</Data></Cell> | ||
322 | </Row> | ||
323 | <Row> | ||
324 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
325 | <Cell><Data ss:Type="String">/Place/traffic_text</Data></Cell> | ||
326 | <Cell ss:Index="4"><Data ss:Type="String">Traffic: [TRAFFIC].</Data></Cell> | ||
327 | <Cell><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell> | ||
328 | <Cell><Data ss:Type="String">통행량: [TRAFFIC].</Data></Cell> | ||
329 | <Cell><Data ss:Type="String">통행량: [TRAFFIC]</Data></Cell> | ||
330 | </Row> | ||
331 | <Row> | ||
332 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
333 | <Cell><Data ss:Type="String">/Place/area_text</Data></Cell> | ||
334 | <Cell ss:Index="4"><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell> | ||
335 | <Cell><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell> | ||
336 | <Cell><Data ss:Type="String">ë©´ì : [AREA]sq. m.</Data></Cell> | ||
337 | <Cell><Data ss:Type="String">ë©´ì : [AREA]ì œê³±ë¯¸í„°</Data></Cell> | ||
338 | </Row> | ||
339 | <Row> | ||
340 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
341 | <Cell><Data ss:Type="String">/Place/forsale_text</Data></Cell> | ||
342 | <Cell ss:Index="4"><Data ss:Type="String">For Sale for L$ [PRICE].</Data></Cell> | ||
343 | <Cell><Data ss:Type="String">For Sale for L$ [PRICE]</Data></Cell> | ||
344 | <Cell><Data ss:Type="String">L$ [PRICE]ì— íŒë§¤.</Data></Cell> | ||
345 | <Cell><Data ss:Type="String">L$ [PRICE]ì— íŒë§¤.</Data></Cell> | ||
346 | </Row> | ||
347 | <Row> | ||
348 | <Cell><Data ss:Type="String">panel_place.xml</Data></Cell> | ||
349 | <Cell><Data ss:Type="String">/Place/auction_text</Data></Cell> | ||
350 | <Cell ss:Index="4"><Data ss:Type="String">Auction ID [ID].</Data></Cell> | ||
351 | <Cell><Data ss:Type="String">Auction ID [ID].</Data></Cell> | ||
352 | <Cell><Data ss:Type="String">경매 ID [ID].</Data></Cell> | ||
353 | <Cell><Data ss:Type="String">경매 ID [ID].</Data></Cell> | ||
354 | </Row> | ||
355 | <Row> | ||
356 | <Cell><Data ss:Type="String">panel_preferences_audio.xml</Data></Cell> | ||
357 | <Cell><Data ss:Type="String">/Media panel/doppler_effect_text</Data></Cell> | ||
358 | <Cell ss:Index="4"><Data ss:Type="String">Streaming Preferences:</Data></Cell> | ||
359 | <Cell><Data ss:Type="String">Audio Preferences:</Data></Cell> | ||
360 | <Cell><Data ss:Type="String">오디오 환경 ì„¤ì •:</Data></Cell> | ||
361 | <Cell><Data ss:Type="String">오디오 환경 ì„¤ì •:</Data></Cell> | ||
362 | </Row> | ||
363 | <Row> | ||
364 | <Cell><Data ss:Type="String">panel_preferences_im.xml</Data></Cell> | ||
365 | <Cell><Data ss:Type="String">/im/text_box3</Data></Cell> | ||
366 | <Cell ss:Index="4"><Data ss:Type="String">Busy Mode Response:</Data></Cell> | ||
367 | <Cell><Data ss:Type="String">Logging Options:</Data></Cell> | ||
368 | <Cell><Data ss:Type="String">ë¡œê·¸ì¸ ì˜µì…˜:</Data></Cell> | ||
369 | <Cell><Data ss:Type="String">ë¡œê·¸ì¸ ì˜µì…˜:</Data></Cell> | ||
370 | </Row> | ||
371 | <Row> | ||
372 | <Cell><Data ss:Type="String">panel_preferences_voice.xml</Data></Cell> | ||
373 | <Cell><Data ss:Type="String">/chat/ear_location/0</Data></Cell> | ||
374 | <Cell ss:Index="4"><Data ss:Type="String">Hear Voice Chat from camera position.</Data></Cell> | ||
375 | <Cell><Data ss:Type="String">Hear Voice Chat from camera position.</Data></Cell> | ||
376 | <Cell><Data ss:Type="String">ì¹´ë©”ë¼ ìœ„ì¹˜ì—서 ìŒì„± 채팅 ì²ì·¨</Data></Cell> | ||
377 | <Cell><Data ss:Type="String">ì¹´ë©”ë¼ ìœ„ì¹˜ì—서 ìŒì„± 채팅 ì²ì·¨</Data></Cell> | ||
378 | </Row> | ||
379 | <Row> | ||
380 | <Cell><Data ss:Type="String">panel_preferences_voice.xml</Data></Cell> | ||
381 | <Cell><Data ss:Type="String">/chat/ear_location/1</Data></Cell> | ||
382 | <Cell ss:Index="4"><Data ss:Type="String">Hear Voice Chat from avatar position.</Data></Cell> | ||
383 | <Cell><Data ss:Type="String">Hear Voice Chat from avatar position.</Data></Cell> | ||
384 | <Cell><Data ss:Type="String">아바타 위치ì—서 ìŒì„± 채팅 ì²ì·¨</Data></Cell> | ||
385 | <Cell><Data ss:Type="String">아바타 위치ì—서 ìŒì„± 채팅 ì²ì·¨</Data></Cell> | ||
386 | </Row> | ||
387 | <Row> | ||
388 | <Cell><Data ss:Type="String">panel_region_general.xml</Data></Cell> | ||
389 | <Cell><Data ss:Type="String">/General/block_parcel_search_check</Data></Cell> | ||
390 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
391 | <Cell><Data ss:Type="String">Block Parcel Search</Data></Cell> | ||
392 | <Cell><Data ss:Type="String">Block Land Show in Search</Data></Cell> | ||
393 | <Cell><Data ss:Type="String">êµ¬íš ê²€ìƒ‰ 차단</Data></Cell> | ||
394 | <Cell><Data ss:Type="String">í† ì§€ 검색 차단</Data></Cell> | ||
395 | </Row> | ||
396 | <Row> | ||
397 | <Cell><Data ss:Type="String">panel_voice_options.xml</Data></Cell> | ||
398 | <Cell><Data ss:Type="String">/content_panel/push_to_talk_check</Data></Cell> | ||
399 | <Cell><Data ss:Type="String">label</Data></Cell> | ||
400 | <Cell><Data ss:Type="String">Only allow Friends to initiate Voice Calls with me</Data></Cell> | ||
401 | <Cell><Data ss:Type="String">Start Viewer in Push-to-Talk mode</Data></Cell> | ||
402 | <Cell><Data ss:Type="String">Push-to-Talk 모드로 세컨드ë¼ì´í”„ 시작</Data></Cell> | ||
403 | <Cell><Data ss:Type="String">Push-to-Talk 모드로 세컨드ë¼ì´í”„ 시작</Data></Cell> | ||
404 | </Row> | ||
405 | </Table> | ||
406 | <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> | ||
407 | <Selected/> | ||
408 | <Panes> | ||
409 | <Pane> | ||
410 | <Number>3</Number> | ||
411 | <ActiveRow>2</ActiveRow> | ||
412 | <ActiveCol>4</ActiveCol> | ||
413 | <RangeSelection>R3C5:R43C5</RangeSelection> | ||
414 | </Pane> | ||
415 | </Panes> | ||
416 | <ProtectObjects>False</ProtectObjects> | ||
417 | <ProtectScenarios>False</ProtectScenarios> | ||
418 | </WorksheetOptions> | ||
419 | </Worksheet> | ||
420 | </Workbook> | ||
diff --git a/linden/indra/newview/skins/xui/ko/panel_login.xml b/linden/indra/newview/skins/xui/ko/panel_login.xml index 5ce6895..dbac837 100644 --- a/linden/indra/newview/skins/xui/ko/panel_login.xml +++ b/linden/indra/newview/skins/xui/ko/panel_login.xml | |||
@@ -1,43 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | 1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> |
2 | <panel name="panel_login"> | 2 | <panel name="panel_login"> |
3 | <text name="real_url"> | 3 | <text name="real_url"> |
4 | http://secondlife.com/app/login/ | 4 | https://secondlife.com/app/login/ko/?show_login_form=True |
5 | </text> | ||
6 | <text name="first_name_text"> | ||
7 | ì´ë¦„: | ||
8 | </text> | ||
9 | <text name="last_name_text"> | ||
10 | 성 | ||
11 | </text> | ||
12 | <text name="password_text"> | ||
13 | 비밀번호: | ||
14 | </text> | ||
15 | <text name="start_location_text"> | ||
16 | 시작 위치: | ||
17 | </text> | ||
18 | <combo_box name="start_location_combo"> | ||
19 | <combo_item name="MyHome"> | ||
20 | 홈 | ||
21 | </combo_item> | ||
22 | <combo_item name="MyLastLocation"> | ||
23 | 최종 방문지 | ||
24 | </combo_item> | ||
25 | <combo_item name="Typeregionname"> | ||
26 | <ì§€ì—명 ìž…ë ¥> | ||
27 | </combo_item> | ||
28 | </combo_box> | ||
29 | <check_box label="비밀번호 기억" name="remember_check" /> | ||
30 | <text name="full_screen_text"> | ||
31 | 로그ì¸í• 때 ë·°ì–´ì— ì „ì²´ í™”ë©´ì´ í‘œì‹œë©ë‹ˆë‹¤. | ||
32 | </text> | ||
33 | <button label="ì‹ ê·œ ê³„ì •" label_selected="ì‹ ê·œ ê³„ì •" name="new_account_btn" /> | ||
34 | <button label="환경 ì„¤ì •" label_selected="환경 ì„¤ì •" name="preferences_btn" /> | ||
35 | <button label="ì—°ê²°" label_selected="ì—°ê²°" name="connect_btn" /> | ||
36 | <button label="종료" label_selected="종료" name="quit_btn" /> | ||
37 | <text name="version_text"> | ||
38 | 1.23.4 (5) | ||
39 | </text> | ||
40 | <text name="channel_text"> | ||
41 | [Viewer Channel Name] | ||
42 | </text> | 5 | </text> |
43 | </panel> | 6 | </panel> |
diff --git a/linden/indra/newview/skins/xui/ko/panel_preferences_LCD.xml b/linden/indra/newview/skins/xui/ko/panel_preferences_LCD.xml new file mode 100644 index 0000000..6ee1536 --- /dev/null +++ b/linden/indra/newview/skins/xui/ko/panel_preferences_LCD.xml | |||
@@ -0,0 +1,31 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | ||
2 | <panel label="Logitech LCD" name="LCD Options"> | ||
3 | <text name="LCD Destination:"> | ||
4 | LCD 대ìƒ: | ||
5 | </text> | ||
6 | <radio_group name="LCDDestination"> | ||
7 | <radio_item name="DestinationG15" | ||
8 | tool_tip="ì„ íƒí•œ ë””ìŠ¤í”Œë ˆì´ í˜•ì‹ì´ Logitech G15 키보드 LCDì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤."> | ||
9 | Logitech G15 게임 키보드 | ||
10 | </radio_item> | ||
11 | <radio_item name="DestinationZ10" | ||
12 | tool_tip="ì„ íƒí•œ ë””ìŠ¤í”Œë ˆì´ í˜•ì‹ì´ Logitech Z10 스피커 LCDì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤."> | ||
13 | Logitech Z10 스피커 | ||
14 | </radio_item> | ||
15 | </radio_group> | ||
16 | <text name="LCD Display Options"> | ||
17 | LCD ë””ìŠ¤í”Œë ˆì´ ì˜µì…˜: | ||
18 | </text> | ||
19 | <check_box label="채팅 표시" name="DisplayChat" | ||
20 | tool_tip="LCD ì°½ì— ë§ˆì§€ë§‰ 채팅 í–‰ 표시" /> | ||
21 | <check_box label="ë©”ì‹ ì € 표시" name="DisplayIM" | ||
22 | tool_tip="LCD ì°½ì— ë§ˆì§€ë§‰ ë©”ì‹ ì € 표시" /> | ||
23 | <check_box label="위치 ì •ë³´ 표시" name="DisplayRegion" | ||
24 | tool_tip="LCD ì°½ì— í˜„ìž¬ 위치 ì •ë³´ 표시" /> | ||
25 | <check_box label="ê³„ì • ì •ë³´ 표시" name="DisplayLinden" | ||
26 | tool_tip="LCD ì°½ì— í˜„ìž¬ ê³„ì • ì •ë³´ 표시" /> | ||
27 | <check_box label="ë„¤íŠ¸ì›Œí¬ í†µì‹ ì •ë³´ 표시" name="DisplayDebug" | ||
28 | tool_tip="LCD ì°½ì— ë””ë²„ê·¸ ì •ë³´ 표시" /> | ||
29 | <check_box label="ì½˜ì†”ì˜ ë””ë²„ê·¸ ì •ë³´ 표시" name="DisplayDebugConsole" | ||
30 | tool_tip="LCD ì°½ì— ì½˜ì†” 디버그 ì •ë³´ 표시" /> | ||
31 | </panel> | ||
diff --git a/linden/indra/newview/skins/xui/pt/panel_login.xml b/linden/indra/newview/skins/xui/pt/panel_login.xml index f2703df..9cee6c9 100644 --- a/linden/indra/newview/skins/xui/pt/panel_login.xml +++ b/linden/indra/newview/skins/xui/pt/panel_login.xml | |||
@@ -1,23 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> | 1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> |
2 | <panel bottom="0" follows="left|top|right|bottom" height="600" hidden="false" left="0" mouse_opaque="true" name="panel_login" width="800"><web_browser border_visible="false" bottom="0" follows="top|left|bottom|right" left="0" name="login_html" right="-1" start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody bgcolor=%22#000000%22 text=%22ffffff%22%3E%3Ch1%3E%3Ctt%3Eloading...%3C/tt%3E%3C/h1%3E %3C/body%3E %3C/html%3E" top="-1" /> | 2 | <panel name="panel_login"> |
3 | <text hidden="true" name="real_url">http://www.secondlifebrasil.com.br/client/capa.aspx?v=1_17_0_12</text> | 3 | <text name="real_url"> |
4 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" bottom="54" drop_shadow_visible="true" follows="left|bottom" font="SansSerif" h_pad="0" halign="left" height="20" hidden="false" left="32" mouse_opaque="true" name="first_name_text" v_pad="0" width="120">Primeiro nome:</text> | 4 | https://secondlife.com/app/login/pt/?show_login_form=True |
5 | <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24" follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true" height="20" hidden="false" left="32" max_length="31" mouse_opaque="true" name="first_name_edit" select_all_on_focus_received="true" width="120" /> | 5 | </text> |
6 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" bottom="54" drop_shadow_visible="true" follows="left|bottom" font="SansSerif" h_pad="0" halign="left" height="16" hidden="false" left="164" mouse_opaque="true" name="last_name_text" v_pad="0" width="120">Sobrenome:</text> | ||
7 | <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24" follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true" height="20" hidden="false" left="164" max_length="31" mouse_opaque="true" name="last_name_edit" select_all_on_focus_received="true" width="120" /> | ||
8 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" bottom="54" drop_shadow_visible="true" follows="left|bottom" font="SansSerif" h_pad="0" halign="left" height="16" hidden="false" left="296" mouse_opaque="true" name="password_text" v_pad="0" width="120">Senha:</text> | ||
9 | <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24" follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true" height="20" hidden="false" left="296" max_length="16" mouse_opaque="true" name="password_edit" select_all_on_focus_received="true" width="120" /> | ||
10 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" bottom="10" drop_shadow_visible="true" follows="left|bottom" font="SansSerif" h_pad="0" halign="left" height="16" hidden="false" left="32" mouse_opaque="true" name="start_location_text" v_pad="0" width="85">Localização inicial:</text> | ||
11 | <combo_box allow_text_entry="true" bottom="8" follows="left|bottom" height="18" hidden="false" left_delta="97" max_chars="128" mouse_opaque="true" name="start_location_combo" width="140"><combo_item name="MyHome" value="My Home">Minha casa</combo_item> | ||
12 | <combo_item name="MyLastLocation" value="My Last Location">Minha última localização</combo_item> | ||
13 | <combo_item name="Typeregionname" value="<Type region name>">< Digite o nome da região; </combo_item> | ||
14 | </combo_box> | ||
15 | <check_box bottom="10" follows="left|bottom" font="SansSerifSmall" height="16" hidden="false" initial_value="false" label="Lembrar senha" left_delta="167" mouse_opaque="true" name="remember_check" width="138" /> | ||
16 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" bottom="74" drop_shadow_visible="true" follows="left|bottom" font="SansSerifSmall" h_pad="0" halign="left" height="20" hidden="false" left="32" mouse_opaque="true" name="full_screen_text" v_pad="0" width="252">O visor indicará a tela cheia quando entrar. </text> | ||
17 | |||
18 | <button bottom="46" follows="left|bottom" font="SansSerif" halign="center" height="24" hidden="false" label="Preferências..." label_selected="Preferências..." left="572" mouse_opaque="true" name="preferences_btn" scale_image="TRUE" width="120" /> | ||
19 | <combo_box allow_text_entry="true" bottom="48" follows="left|bottom" height="18" hidden="false" left_delta="128" max_chars="20" mouse_opaque="true" name="server_combo" width="120" /> | ||
20 | <button bottom_delta="-28" follows="left|bottom" font="SansSerif" halign="center" height="24" hidden="false" label="Conectar" label_selected="Conectar" left="440" mouse_opaque="true" name="connect_btn" scale_image="TRUE" width="120" /> | ||
21 | <button bottom_delta="0" follows="left|bottom" font="SansSerif" halign="center" height="24" hidden="false" label="Sair" label_selected="Sair" left="572" mouse_opaque="true" name="quit_btn" scale_image="TRUE" width="120" /> | ||
22 | <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" bottom="2" drop_shadow_visible="true" follows="right|bottom" font="SansSerifSmall" h_pad="0" halign="right" height="12" hidden="false" left="698" mouse_opaque="true" name="version_text" v_pad="0" width="100">1.23.4 (5)</text> | ||
23 | </panel> | 6 | </panel> |
diff --git a/linden/indra/newview/skins/xui/zh/panel_login.xml b/linden/indra/newview/skins/xui/zh/panel_login.xml index 5e78b00..a4652ac 100644 --- a/linden/indra/newview/skins/xui/zh/panel_login.xml +++ b/linden/indra/newview/skins/xui/zh/panel_login.xml | |||
@@ -1,40 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> | 1 | <?xml version="1.0" encoding="utf-8" standalone="yes" ?> |
2 | <panel name="panel_login"> | 2 | <panel name="panel_login"> |
3 | <text name="real_url"> | 3 | <text name="real_url"> |
4 | http://secondlife.com/app/login/ | 4 | https://secondlife.com/app/login/zh/?show_login_form=True |
5 | </text> | ||
6 | <text name="first_name_text"> | ||
7 | å§“: | ||
8 | </text> | ||
9 | <text name="last_name_text"> | ||
10 | å: | ||
11 | </text> | ||
12 | <text name="password_text"> | ||
13 | 密ç : | ||
14 | </text> | ||
15 | <text name="start_location_text"> | ||
16 | 开始定ä½: | ||
17 | </text> | ||
18 | <combo_box name="start_location_combo"> | ||
19 | <combo_item name="MyHome"> | ||
20 | 我的家 | ||
21 | </combo_item> | ||
22 | <combo_item name="MyLastLocation"> | ||
23 | 我的上个ä½ç½® | ||
24 | </combo_item> | ||
25 | <combo_item name="<Typeregionname>"> | ||
26 | <输入地域å> | ||
27 | </combo_item> | ||
28 | </combo_box> | ||
29 | <check_box label="è®°ä½å¯†ç " name="remember_check" /> | ||
30 | <text name="full_screen_text"> | ||
31 | ç™»é™†åŽæ˜¾ç¤ºå™¨ä¼šé‡‡ç”¨å…¨å±æ˜¾ç¤ºã€‚ | ||
32 | </text> | ||
33 | <button label="æ–°å¸æˆ·..." label_selected="æ–°å¸æˆ·..." name="new_account_btn" /> | ||
34 | <button label="连接" label_selected="连接" name="connect_btn" /> | ||
35 | <button label="傿•°é€‰æ‹©..." label_selected="傿•°é€‰æ‹©..." name="preferences_btn" /> | ||
36 | <button label="退出" label_selected="退出" name="quit_btn" /> | ||
37 | <text name="version_text"> | ||
38 | 1.23.4 (5) | ||
39 | </text> | 5 | </text> |
40 | </panel> | 6 | </panel> |
diff --git a/linden/indra/newview/viewer.cpp b/linden/indra/newview/viewer.cpp deleted file mode 100644 index 3b24371..0000000 --- a/linden/indra/newview/viewer.cpp +++ /dev/null | |||
@@ -1,6368 +0,0 @@ | |||
1 | /** | ||
2 | * @file viewer.cpp | ||
3 | * @brief A window into the virtual world. | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2000&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2000-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #include "llviewerprecompiledheaders.h" | ||
33 | |||
34 | #include "viewer.h" | ||
35 | |||
36 | #include "llparcel.h" | ||
37 | #include "llviewerparcelmgr.h" | ||
38 | #include "llviewerjoystick.h" | ||
39 | |||
40 | // System library headers | ||
41 | #include <errno.h> | ||
42 | #include <stdexcept> | ||
43 | #if LL_WINDOWS | ||
44 | # include <share.h> | ||
45 | #else | ||
46 | # include <sys/file.h> | ||
47 | # include <signal.h> | ||
48 | #endif | ||
49 | #include <sys/stat.h> | ||
50 | #include <memory> | ||
51 | #include <boost/tokenizer.hpp> | ||
52 | |||
53 | #if LL_WINDOWS | ||
54 | #include <fcntl.h> //_O_APPEND | ||
55 | #include <io.h> //_open_osfhandle() | ||
56 | #include <errorrep.h> // for AddERExcludedApplicationA() | ||
57 | #include <process.h> // _spawnl() | ||
58 | #include <tchar.h> // For TCHAR support | ||
59 | |||
60 | #if LL_WINDOWS && _MSC_VER < 1400 | ||
61 | //#define LL_USE_SMARTHEAP 0 | ||
62 | #else | ||
63 | #define LL_USE_SMARTHEAP 0 | ||
64 | #endif | ||
65 | |||
66 | #if LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP | ||
67 | #include "smrtheap/smrtheap.h" | ||
68 | #endif // LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP | ||
69 | |||
70 | #elif LL_DARWIN || LL_LINUX || LL_SOLARIS | ||
71 | |||
72 | # include <sys/socket.h> | ||
73 | // # include <sys/stat.h> // mkdir() | ||
74 | # include <netinet/in.h> | ||
75 | # include <arpa/inet.h> // inet_ntoa() | ||
76 | |||
77 | #if LL_LINUX | ||
78 | # include <dlfcn.h> // RTLD_LAZY | ||
79 | # include <execinfo.h> // backtrace - glibc only | ||
80 | # ifndef LL_ELFBIN | ||
81 | #define LL_ELFBIN 1 | ||
82 | # endif // LL_ELFBIN | ||
83 | # if LL_ELFBIN | ||
84 | # include <cxxabi.h> // for symbol demangling | ||
85 | # include "ELFIO.h" // for better backtraces | ||
86 | # endif // LL_ELFBIN | ||
87 | #elif LL_SOLARIS | ||
88 | # include <sys/types.h> | ||
89 | # include <unistd.h> | ||
90 | # include <fcntl.h> | ||
91 | # include <ucontext.h> | ||
92 | #endif | ||
93 | |||
94 | #if LL_DARWIN | ||
95 | #include <Carbon/Carbon.h> | ||
96 | // Apple sucks! AssertMacros.h defines these COMMONLY used names. | ||
97 | #ifdef check | ||
98 | #undef check | ||
99 | #endif | ||
100 | #ifdef verify | ||
101 | #undef verify | ||
102 | #endif // verify | ||
103 | #ifdef require | ||
104 | #undef require | ||
105 | #endif | ||
106 | #endif | ||
107 | #endif // !LL_WINDOWS | ||
108 | |||
109 | // Support for sending crash reports from the viewer? | ||
110 | //#define LL_SEND_CRASH_REPORTS 0 | ||
111 | |||
112 | |||
113 | // | ||
114 | // Linden library headers | ||
115 | // | ||
116 | |||
117 | #include "audioengine.h" | ||
118 | #include "llcommon.h" | ||
119 | #include "llapr.h" | ||
120 | #include "llares.h" | ||
121 | #include "llcachename.h" | ||
122 | #include "llcurl.h" | ||
123 | #include "llcriticaldamp.h" | ||
124 | #include "lldir.h" | ||
125 | #include "lleconomy.h" | ||
126 | #include "llerrorcontrol.h" | ||
127 | #include "llhttpnode.h" | ||
128 | #include "llflexibleobject.h" | ||
129 | #include "llfasttimer.h" | ||
130 | #include "llfocusmgr.h" | ||
131 | #include "llgroupmgr.h" | ||
132 | #include "llimage.h" | ||
133 | #include "llimageworker.h" | ||
134 | #include "lllfsthread.h" | ||
135 | #include "llmemtype.h" | ||
136 | #include "llmd5.h" | ||
137 | #include "llsecondlifeurls.h" | ||
138 | #include "llversionviewer.h" | ||
139 | #include "llvfile.h" | ||
140 | #include "llvfs.h" | ||
141 | #include "llwindow.h" // for shell_open | ||
142 | #include "llworkerthread.h" | ||
143 | #include "llvfsthread.h" | ||
144 | #include "llxfermanager.h" | ||
145 | #include "message.h" | ||
146 | #include "llvoavatar.h" | ||
147 | #include "llglslshader.h" | ||
148 | |||
149 | // | ||
150 | // Viewer headers | ||
151 | // | ||
152 | |||
153 | #include "llagent.h" | ||
154 | #include "llagentpilot.h" | ||
155 | #include "llbutton.h" // For constants | ||
156 | #include "llcallbacklist.h" | ||
157 | #include "llchatbar.h" | ||
158 | //#include "llcombobox.h" // For constants | ||
159 | #include "llconsole.h" | ||
160 | #include "llcontainerview.h" | ||
161 | #include "lldebugview.h" | ||
162 | #include "lldrawpoolbump.h" | ||
163 | #include "lldrawpoolterrain.h" | ||
164 | #include "lleventnotifier.h" | ||
165 | #include "llfasttimerview.h" | ||
166 | #include "llfeaturemanager.h" | ||
167 | #include "llfirstuse.h" | ||
168 | #include "llfloateractivespeakers.h" | ||
169 | #include "llfloatertools.h" | ||
170 | #include "llfloaterworldmap.h" | ||
171 | #include "llfloaterhtmlhelp.h" | ||
172 | #include "llfloatersaveavatar.h" | ||
173 | #include "llfloatersnapshot.h" | ||
174 | #include "llfolderview.h" | ||
175 | #include "llframestats.h" | ||
176 | #include "llgesturemgr.h" | ||
177 | #include "llhoverview.h" | ||
178 | #include "llhudeffecttrail.h" | ||
179 | #include "llhudmanager.h" | ||
180 | #include "llhttpclient.h" | ||
181 | #include "llimview.h" | ||
182 | #include "llimpanel.h" | ||
183 | #include "llinventorymodel.h" | ||
184 | #include "llinventoryview.h" | ||
185 | #include "llkeyboard.h" | ||
186 | #include "llkeyframemotion.h" | ||
187 | #include "llpanellogin.h" | ||
188 | #include "llmutelist.h" | ||
189 | #include "llmenugl.h" | ||
190 | #include "llnamelistctrl.h" | ||
191 | #include "llnamebox.h" | ||
192 | #include "llnameeditor.h" | ||
193 | #include "llpumpio.h" | ||
194 | #include "llnotify.h" | ||
195 | #include "llselectmgr.h" | ||
196 | #include "llsky.h" | ||
197 | #include "llsrv.h" | ||
198 | #include "llstartup.h" | ||
199 | #include "llstatusbar.h" | ||
200 | #include "llsurface.h" | ||
201 | #include "lltexlayer.h" | ||
202 | #include "lltexturecache.h" | ||
203 | #include "lltexturefetch.h" | ||
204 | #include "lltoolbar.h" | ||
205 | #include "lltoolmgr.h" | ||
206 | #include "lltracker.h" | ||
207 | #include "llurldispatcher.h" | ||
208 | #include "llurlsimstring.h" | ||
209 | #include "llurlwhitelist.h" | ||
210 | #include "llv4math.h" // LL_VECTORIZE | ||
211 | #include "llviewerbuild.h" | ||
212 | #include "llviewercamera.h" | ||
213 | #include "llviewercontrol.h" | ||
214 | #include "llviewerjointmesh.h" | ||
215 | #include "llviewerimagelist.h" | ||
216 | #include "llviewerkeyboard.h" | ||
217 | #include "llviewermenu.h" | ||
218 | #include "llviewermessage.h" | ||
219 | #include "llviewernetwork.h" | ||
220 | #include "llviewerobjectlist.h" | ||
221 | #include "llviewerparcelmgr.h" | ||
222 | #include "llviewerregion.h" | ||
223 | #include "llviewerstats.h" | ||
224 | #include "llviewerthrottle.h" | ||
225 | #include "llvieweruictrlfactory.h" | ||
226 | #include "llviewerwindow.h" | ||
227 | #include "llvlmanager.h" | ||
228 | #include "llvoavatar.h" | ||
229 | #include "llvograss.h" | ||
230 | #include "llvotree.h" | ||
231 | #include "llvovolume.h" // To set a static member. | ||
232 | #include "llvowater.h" | ||
233 | #include "llvolume.h" | ||
234 | #include "llvolumemgr.h" | ||
235 | #include "llvolumemessage.h" | ||
236 | #include "llweb.h" | ||
237 | #include "llworld.h" | ||
238 | #include "llworldmap.h" | ||
239 | #include "llworldmapview.h" | ||
240 | #include "pipeline.h" | ||
241 | #include "llface.h" | ||
242 | #include "audiosettings.h" | ||
243 | #include "res/resource.h" | ||
244 | #include "llvoiceclient.h" | ||
245 | |||
246 | #if LL_WINDOWS | ||
247 | #include "llwindebug.h" | ||
248 | #include "lldxhardware.h" | ||
249 | #include "llwindowwin32.h" | ||
250 | |||
251 | // for Logitech LCD keyboards / speakers | ||
252 | #ifndef LL_LOGITECH_LCD_H | ||
253 | #include "lllogitechlcd.h" | ||
254 | #endif | ||
255 | extern void CreateLCDDebugWindows(); | ||
256 | |||
257 | #endif // LL_WINDOWS | ||
258 | |||
259 | #if LL_QUICKTIME_ENABLED | ||
260 | #if LL_DARWIN | ||
261 | #include <QuickTime/QuickTime.h> | ||
262 | #else | ||
263 | // quicktime specific includes | ||
264 | #include "MacTypes.h" | ||
265 | #include "QTML.h" | ||
266 | #include "Movies.h" | ||
267 | #include "FixMath.h" | ||
268 | #endif | ||
269 | #endif | ||
270 | |||
271 | #if LL_GSTREAMER_ENABLED | ||
272 | // ugh, do this instead of pulling in the gstreamer headers which indirectly | ||
273 | // clash with expat in the monster that is viewer.cpp ... sigh. | ||
274 | void UnloadGStreamer(); | ||
275 | #endif // LL_GSTREAMER_ENABLED | ||
276 | |||
277 | #include "llmediaengine.h" | ||
278 | |||
279 | #if LL_LIBXUL_ENABLED | ||
280 | #include "llmozlib.h" | ||
281 | #endif // LL_LIBXUL_ENABLED | ||
282 | |||
283 | ///////////////////////////////////////////////////////////////////////////////// | ||
284 | // Support for crash handling. | ||
285 | ///////////////////////////////////////////////////////////////////////////////// | ||
286 | |||
287 | void errorCallback(const std::string &error_string); | ||
288 | S32 gCrashBehavior = CRASH_BEHAVIOR_ASK; | ||
289 | void (*gCrashCallback)(void) = NULL; | ||
290 | BOOL gReportedCrash = FALSE; | ||
291 | |||
292 | bool gVerifySSLCert = true; | ||
293 | |||
294 | BOOL gHandleKeysAsync = FALSE; | ||
295 | |||
296 | // Use DirectX 9 to probe for hardware | ||
297 | BOOL gProbeHardware = TRUE; | ||
298 | std::string gSerialNumber; | ||
299 | |||
300 | ///////////////////////////////////////////////////////////////////////////////// | ||
301 | // Application constants | ||
302 | ///////////////////////////////////////////////////////////////////////////////// | ||
303 | |||
304 | BOOL gAgentMovementCompleted = FALSE; | ||
305 | BOOL gHaveSavedSnapshot = FALSE; | ||
306 | |||
307 | S32 gYieldMS = 0; | ||
308 | BOOL gYieldTime = FALSE; | ||
309 | |||
310 | const U32 COLLISION_LIST_DEPTH = 300; // only looks at the first so many collisionable objects | ||
311 | const S32 MAX_CONSOLE_LINES = 500; | ||
312 | const S32 NUM_SESSIONS_BEFORE_SHOW_PROFILE = 5; | ||
313 | const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user flagged as Away From Keyboard | ||
314 | |||
315 | const char *VFS_DATA_FILE_BASE = "data.db2.x."; | ||
316 | const char *VFS_INDEX_FILE_BASE = "index.db2.x."; | ||
317 | |||
318 | F32 gSimLastTime; | ||
319 | F32 gSimFrames; | ||
320 | |||
321 | //#define RENDER_CLOUD_DENSITY // uncomment to look at cloud density | ||
322 | |||
323 | ///////////////////////////////////////////////////////////////////////////////// | ||
324 | // Globals | ||
325 | ///////////////////////////////////////////////////////////////////////////////// | ||
326 | |||
327 | // | ||
328 | // Core Application globals | ||
329 | // | ||
330 | #if LL_WINDOWS | ||
331 | llLCD *gLcdScreen = NULL; | ||
332 | #endif | ||
333 | |||
334 | LLString gSecondLife; | ||
335 | LLString gWindowTitle; | ||
336 | static char sWindowClass[] = "Second Life"; | ||
337 | LLString gDisabledMessage; | ||
338 | BOOL gHideLinks = FALSE; | ||
339 | |||
340 | // This is whether or not we are connect to a production grid. | ||
341 | BOOL gInProductionGrid = FALSE; | ||
342 | |||
343 | //#define APPLE_PREVIEW // Define this if you're doing a preview build on the Mac | ||
344 | #if LL_RELEASE_FOR_DOWNLOAD | ||
345 | // Default userserver for production builds is agni | ||
346 | #ifndef APPLE_PREVIEW | ||
347 | static EUserServerDomain UserServerDefaultChoice = USERSERVER_AGNI; | ||
348 | #else | ||
349 | static EUserServerDomain UserServerDefaultChoice = USERSERVER_ADITI; | ||
350 | #endif | ||
351 | #else | ||
352 | // Default userserver for development builds is dmz | ||
353 | static EUserServerDomain UserServerDefaultChoice = USERSERVER_DMZ; | ||
354 | #endif | ||
355 | |||
356 | #ifdef TOGGLE_HACKED_GODLIKE_VIEWER | ||
357 | BOOL gHackGodmode = FALSE; | ||
358 | #endif | ||
359 | |||
360 | std::vector<std::string> gLoginURIs; | ||
361 | static std::string gHelperURI; | ||
362 | |||
363 | LLAgent gAgent; | ||
364 | LLPipeline gPipeline; | ||
365 | |||
366 | // Set true when the viewer has been disconnected from the server, for example, | ||
367 | // by the user being kicked. | ||
368 | BOOL gDoDisconnect = FALSE; | ||
369 | BOOL gDisconnected = FALSE; | ||
370 | |||
371 | // Tells us to clean up the cache directory in the case of network corruption | ||
372 | BOOL gPurgeOnExit = FALSE; | ||
373 | BOOL gPurgeCache = FALSE; | ||
374 | |||
375 | // Allow multiple viewers in ReleaseForDownload | ||
376 | #if LL_RELEASE_FOR_DOWNLOAD | ||
377 | BOOL gMultipleViewersOK = FALSE; | ||
378 | #else | ||
379 | BOOL gMultipleViewersOK = TRUE; | ||
380 | #endif | ||
381 | BOOL gSecondInstance = FALSE; | ||
382 | BOOL gDisableVoice = FALSE; | ||
383 | |||
384 | LLString gArgs; | ||
385 | |||
386 | // Setting this true will cause the app to exit cleanly at the end of the frame. | ||
387 | BOOL gQuit = FALSE; | ||
388 | // Set when user has indicated desire to quit, but may have modified documents open | ||
389 | BOOL gQuitRequested = FALSE; | ||
390 | LLString gLaunchFileOnQuit; | ||
391 | BOOL gDoneLogout = FALSE; | ||
392 | |||
393 | BOOL gInitializationComplete = FALSE; // used in windows handlers to determine if OK to call idle() | ||
394 | BOOL gAutoLogin = FALSE; | ||
395 | LLString gOldSettingsFileName; | ||
396 | BOOL gPrintMessagesThisFrame = FALSE; | ||
397 | const char* DEFAULT_SETTINGS_FILE = "settings.xml"; | ||
398 | const char* LEGACY_DEFAULT_SETTINGS_FILE = "settings.ini"; | ||
399 | BOOL gUseWireframe = FALSE; | ||
400 | LLUUID gViewerDigest; // MD5 digest of the viewer's executable file. | ||
401 | LLPumpIO* gServicePump = NULL; | ||
402 | S32 gNumSessions = 0; | ||
403 | |||
404 | BOOL gAllowIdleAFK = TRUE; | ||
405 | F32 gAFKTimeout = DEFAULT_AFK_TIMEOUT; | ||
406 | F32 gMouseSensitivity = 3.f; | ||
407 | BOOL gInvertMouse = FALSE; | ||
408 | BOOL gLogoutRequestSent = FALSE; | ||
409 | LLTimer gLogoutTimer; | ||
410 | BOOL gShowObjectUpdates = FALSE; | ||
411 | |||
412 | const F32 LOGOUT_REQUEST_TIME = 6.f; // this will be cut short by the LogoutReply msg. | ||
413 | F32 gLogoutMaxTime = LOGOUT_REQUEST_TIME; | ||
414 | |||
415 | // Map scale in pixels per region | ||
416 | F32 gMapScale = 128.f; | ||
417 | F32 gMiniMapScale = 128.f; | ||
418 | |||
419 | // Sky object, globals | ||
420 | LLSky gSky; | ||
421 | |||
422 | // HUD display lines in lower right | ||
423 | BOOL gDisplayWindInfo = FALSE; | ||
424 | BOOL gDisplayCameraPos = FALSE; | ||
425 | BOOL gDisplayNearestWater = FALSE; | ||
426 | BOOL gDoNearestWaterSearch = FALSE; | ||
427 | BOOL gDisplayFOV = FALSE; | ||
428 | |||
429 | // used to restore texture state after a mode switch | ||
430 | LLFrameTimer gRestoreGLTimer; | ||
431 | BOOL gRestoreGL = FALSE; | ||
432 | |||
433 | |||
434 | // VFS globals - see viewer.h | ||
435 | LLVFS* gStaticVFS = NULL; | ||
436 | |||
437 | // Threads | ||
438 | LLTextureCache* gTextureCache = NULL; | ||
439 | LLWorkerThread* gImageDecodeThread = NULL; | ||
440 | LLTextureFetch* gTextureFetch = NULL; | ||
441 | |||
442 | // Debugging | ||
443 | FILE *gDebugFile = NULL; // File pointer used by the function which writes debug data. | ||
444 | BOOL gRandomizeFramerate = FALSE; | ||
445 | BOOL gPeriodicSlowFrame = FALSE; | ||
446 | std::map<S32,LLFrameTimer> gDebugTimers; | ||
447 | |||
448 | //LLVector3 gCameraVelocitySmoothed; | ||
449 | // | ||
450 | // Timing/Performance/statistics globals | ||
451 | // | ||
452 | |||
453 | // Frame timing | ||
454 | U64 gFrameTime = 0; | ||
455 | F32 gFrameTimeSeconds = 0.f; | ||
456 | F32 gFrameIntervalSeconds = 0.f; | ||
457 | U32 gFrameCount = 0; | ||
458 | U32 gForegroundFrameCount = 0; // number of frames that app window was in foreground | ||
459 | U64 gStartTime = 0; // gStartTime is "private", used only to calculate gFrameTimeSeconds | ||
460 | U64 gSpaceTime = 0; // gSpaceTime is the time, according to the spaceserver. | ||
461 | |||
462 | // Timing Globals | ||
463 | LLTimer gRenderStartTime; | ||
464 | LLFrameTimer gForegroundTime; | ||
465 | F32 gQuitAfterSeconds = 0.f; | ||
466 | BOOL gRotateRight = FALSE; | ||
467 | |||
468 | // Is the Pacific time zone (aka server time zone) | ||
469 | // current in daylight savings time? | ||
470 | BOOL gPacificDaylightTime = FALSE; | ||
471 | |||
472 | // | ||
473 | // Simulator/SpaceServer configuration information | ||
474 | // | ||
475 | U32 gSecondsPerDay = 0; | ||
476 | U32 gSecondsPerYear = 0; | ||
477 | |||
478 | LLString gLastVersionChannel; | ||
479 | |||
480 | // | ||
481 | // Region/Object globals | ||
482 | // | ||
483 | |||
484 | |||
485 | LLVector3 gWindVec(3.0, 3.0, 0.0); | ||
486 | LLVector3 gRelativeWindVec(0.0, 0.0, 0.0); | ||
487 | |||
488 | // | ||
489 | // Globals for controls... | ||
490 | // | ||
491 | |||
492 | BOOL gVelocityInterpolate = TRUE; // (These are written once/frame with the data from gSavedSettings) | ||
493 | BOOL gPingInterpolate = TRUE; | ||
494 | |||
495 | // | ||
496 | // System info | ||
497 | // | ||
498 | |||
499 | LLMemoryInfo gSysMemory; | ||
500 | LLOSInfo gSysOS; | ||
501 | |||
502 | // file globals | ||
503 | static const char USAGE[] = "\n" | ||
504 | "usage:\tviewer [options]\n" | ||
505 | "options:\n" | ||
506 | " -login <first> <last> <password> log in as a user\n" | ||
507 | " -autologin log in as last saved user\n" | ||
508 | " -loginuri <URI> login server and CGI script to use\n" | ||
509 | " -helperuri <URI> helper web CGI prefix to use\n" | ||
510 | " -settings <filename> specify the filename of a\n" | ||
511 | " configuration file\n" | ||
512 | " default is settings.xml\n" | ||
513 | " -setdefault <variable> <value> specify the value of a particular\n" | ||
514 | " configuration variable which can be\n" | ||
515 | " overridden by settings.xml\n" | ||
516 | " -set <variable> <value> specify the value of a particular\n" | ||
517 | " configuration variable that\n" | ||
518 | " overrides all other settings\n" | ||
519 | " -user <user_server_ip> specify userserver in dotted quad\n" | ||
520 | #if !LL_RELEASE_FOR_DOWNLOAD | ||
521 | " -sim <simulator_ip> specify the simulator ip address\n" | ||
522 | #endif | ||
523 | " -god log in as god if you have god access\n" | ||
524 | " -purge delete files in cache\n" | ||
525 | " -safe reset preferences, run in safe mode\n" | ||
526 | " -noutc logs in local time, not UTC\n" | ||
527 | " -nothread run vfs in single thread\n" | ||
528 | " -noinvlib Do not request inventory library\n" | ||
529 | " -multiple allow multiple viewers\n" | ||
530 | " -nomultiple block multiple viewers\n" | ||
531 | " -novoice disable voice\n" | ||
532 | " -ignorepixeldepth ignore pixel depth settings\n" | ||
533 | " -cooperative [ms] yield some idle time to local host\n" | ||
534 | " -skin ui/branding skin folder to use\n" | ||
535 | #if LL_WINDOWS | ||
536 | " -noprobe disable hardware probe\n" | ||
537 | #endif | ||
538 | " -noquicktime disable QuickTime movies, speeds startup\n" | ||
539 | " -nopreload don't preload UI images or sounds, speeds startup\n" | ||
540 | // these seem to be unused | ||
541 | //" -noenv turn off environmental effects\n" | ||
542 | //" -proxy <proxy_ip> specify the proxy ip address\n" | ||
543 | "\n"; | ||
544 | |||
545 | |||
546 | // Variables used for passing data out of main | ||
547 | BOOL gGodConnect = FALSE; | ||
548 | BOOL gUseConsole = TRUE; | ||
549 | BOOL gUseAudio = TRUE; | ||
550 | BOOL gUseFMOD = TRUE; | ||
551 | BOOL gLogMessages = FALSE; | ||
552 | BOOL gRequestInventoryLibrary = TRUE; | ||
553 | BOOL gAcceptTOS = FALSE; | ||
554 | BOOL gAcceptCriticalMessage = FALSE; | ||
555 | // this is the channel the viewer uses to check for updates/login | ||
556 | std::string gChannelName = LL_CHANNEL; | ||
557 | |||
558 | LLUUID gInventoryLibraryOwner; | ||
559 | LLUUID gInventoryLibraryRoot; | ||
560 | bool gPreloadImages = true; | ||
561 | bool gPreloadSounds = true; | ||
562 | |||
563 | LLString gCmdLineFirstName; | ||
564 | LLString gCmdLineLastName; | ||
565 | LLString gCmdLinePassword; | ||
566 | std::map<std::string, std::string> gCommandLineSettings; | ||
567 | std::map<std::string, std::string> gCommandLineForcedSettings; | ||
568 | BOOL gLastExecFroze = FALSE; | ||
569 | BOOL gIgnorePixelDepth = FALSE; | ||
570 | |||
571 | |||
572 | LLPointer<LLImageGL> gDisconnectedImagep = NULL; | ||
573 | |||
574 | |||
575 | /* | ||
576 | class LLFirstInventoryLoadObserver : public LLInventoryObserver | ||
577 | { | ||
578 | // Called when the inventory is first loaded. | ||
579 | // Must be allocated on the heap so that the inventory model can destroy it | ||
580 | // in case the app ends before the inventory finishes loading. | ||
581 | public: | ||
582 | virtual void changed(U32 mask); | ||
583 | void observe(LLInventoryModel* model); | ||
584 | protected: | ||
585 | LLInventoryModel* mInventory; | ||
586 | }; | ||
587 | */ | ||
588 | |||
589 | /////////////////////// | ||
590 | // | ||
591 | // Forward declarations | ||
592 | // | ||
593 | |||
594 | // | ||
595 | // Application initialization and cleanup | ||
596 | // | ||
597 | void init_marker_file(); | ||
598 | void init_crash_handler(); | ||
599 | void init_logging(); | ||
600 | void create_console(); | ||
601 | void write_system_info(); | ||
602 | int parse_args(int argc, char **argv); | ||
603 | void saved_settings_to_globals(); | ||
604 | BOOL init_cache(); | ||
605 | void purge_cache(); | ||
606 | void cleanup_app(); | ||
607 | void disconnect_viewer(void *); // Don't use directly - use do_disconnect() | ||
608 | |||
609 | // | ||
610 | // Debugging, logging, and error reporting | ||
611 | // | ||
612 | void write_debug(const char *str); // Write a string to the debug log | ||
613 | void write_debug(const std::string& str); | ||
614 | void close_debug(); // Close the debug log | ||
615 | void catch_signals(); | ||
616 | void viewer_crash_callback(); | ||
617 | void remove_marker_file(); | ||
618 | #if !LL_WINDOWS | ||
619 | void release_signals(); | ||
620 | #endif | ||
621 | |||
622 | void bad_network_handler(); | ||
623 | |||
624 | #if LL_WINDOWS | ||
625 | void disable_win_error_reporting(); | ||
626 | #endif | ||
627 | std::string get_serial_number(); | ||
628 | bool send_url_to_other_instance(const std::string& url); | ||
629 | BOOL another_instance_running(); | ||
630 | void main_loop(); | ||
631 | |||
632 | // | ||
633 | // Callbacks | ||
634 | // | ||
635 | // Callbacks and other stuff that's not directly used in main | ||
636 | // | ||
637 | void uuid_table_request_file_callback(void **user_data, S32 result, LLExtStat ext_status); | ||
638 | void send_stats(); | ||
639 | |||
640 | // | ||
641 | // Apple specific stuff | ||
642 | // | ||
643 | #if LL_DARWIN | ||
644 | void init_apple_menu(const char* product); | ||
645 | OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn); | ||
646 | OSErr AEQuitHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn); | ||
647 | OSStatus simpleDialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata); | ||
648 | OSStatus DisplayReleaseNotes(void); | ||
649 | #endif // LL_DARWIN | ||
650 | |||
651 | void ui_audio_callback(const LLUUID& uuid) | ||
652 | { | ||
653 | if (gAudiop) | ||
654 | { | ||
655 | F32 volume = gSavedSettings.getF32("AudioLevelUI"); | ||
656 | gAudiop->triggerSound(uuid, gAgent.getID(), volume); | ||
657 | } | ||
658 | } | ||
659 | |||
660 | #if LL_WINDOWS | ||
661 | BOOL CALLBACK login_dialog_func(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lparam) | ||
662 | { | ||
663 | char buffer[MAX_STRING]; /* Flawfinder: ignore */ | ||
664 | switch(msg) | ||
665 | { | ||
666 | case WM_INITDIALOG: | ||
667 | { | ||
668 | LLString first_name = gCmdLineFirstName; | ||
669 | LLString last_name = gCmdLineLastName; | ||
670 | LLString password = gCmdLinePassword; | ||
671 | |||
672 | if (!first_name.empty()) | ||
673 | { | ||
674 | SetDlgItemTextA( hwnd, IDC_EDIT_FIRSTNAME, first_name.c_str()); | ||
675 | } | ||
676 | if (!last_name.empty()) | ||
677 | { | ||
678 | SetDlgItemTextA( hwnd, IDC_EDIT_LASTNAME, last_name.c_str()); | ||
679 | } | ||
680 | if (!password.empty()) | ||
681 | { | ||
682 | SetDlgItemTextA( hwnd, IDC_EDIT_PASSWORD, password.c_str()); | ||
683 | } | ||
684 | |||
685 | first_name = gSavedSettings.getString("FirstName"); | ||
686 | last_name = gSavedSettings.getString("LastName"); | ||
687 | password = load_password_from_disk(); | ||
688 | |||
689 | if (!first_name.empty()) | ||
690 | { | ||
691 | SetDlgItemTextA( hwnd, IDC_EDIT_FIRSTNAME, first_name.c_str()); | ||
692 | } | ||
693 | if (!last_name.empty()) | ||
694 | { | ||
695 | SetDlgItemTextA( hwnd, IDC_EDIT_LASTNAME, last_name.c_str()); | ||
696 | } | ||
697 | if (!password.empty()) | ||
698 | { | ||
699 | SetDlgItemTextA( hwnd, IDC_EDIT_PASSWORD, password.c_str()); | ||
700 | } | ||
701 | |||
702 | // Focus on password if other fields are full | ||
703 | if (first_name.empty()) | ||
704 | { | ||
705 | SetFocus(GetDlgItem(hwnd, IDC_EDIT_FIRSTNAME)); | ||
706 | } | ||
707 | else if (last_name.empty()) | ||
708 | { | ||
709 | SetFocus(GetDlgItem(hwnd, IDC_EDIT_LASTNAME)); | ||
710 | } | ||
711 | else if (password.empty()) | ||
712 | { | ||
713 | SetFocus(GetDlgItem(hwnd, IDC_EDIT_PASSWORD)); | ||
714 | } | ||
715 | else | ||
716 | { | ||
717 | SetFocus(GetDlgItem(hwnd, IDC_EDIT_FIRSTNAME)); | ||
718 | } | ||
719 | |||
720 | BOOL remember_password = gSavedSettings.getBOOL("RememberPassword"); | ||
721 | if (remember_password) | ||
722 | { | ||
723 | CheckDlgButton(hwnd, IDC_REMEMBER_PASSWORD, BST_CHECKED); | ||
724 | } | ||
725 | else | ||
726 | { | ||
727 | CheckDlgButton(hwnd, IDC_REMEMBER_PASSWORD, BST_UNCHECKED); | ||
728 | } | ||
729 | return TRUE; | ||
730 | } | ||
731 | |||
732 | case WM_COMMAND: | ||
733 | switch(LOWORD(wParam)) | ||
734 | { | ||
735 | case IDOK: | ||
736 | { | ||
737 | // copy login name and password into buffer | ||
738 | if (GetDlgItemTextA(hwnd, IDC_EDIT_FIRSTNAME, buffer, MAX_STRING)) | ||
739 | { | ||
740 | gCmdLineFirstName = buffer; | ||
741 | } | ||
742 | if (GetDlgItemTextA(hwnd, IDC_EDIT_LASTNAME, buffer, MAX_STRING)) | ||
743 | { | ||
744 | gCmdLineLastName = buffer; | ||
745 | } | ||
746 | if (GetDlgItemTextA(hwnd, IDC_EDIT_PASSWORD, buffer, MAX_STRING)) | ||
747 | { | ||
748 | gCmdLinePassword = buffer; | ||
749 | } | ||
750 | BOOL remember_password = (IsDlgButtonChecked(hwnd, IDC_REMEMBER_PASSWORD) == BST_CHECKED); | ||
751 | gSavedSettings.setBOOL("RememberPassword", remember_password); | ||
752 | EndDialog(hwnd, 0); // return success | ||
753 | return TRUE; // handled | ||
754 | } | ||
755 | } | ||
756 | // If we get here, we didn't handle it | ||
757 | return FALSE; | ||
758 | |||
759 | case WM_CLOSE: | ||
760 | case WM_DESTROY: | ||
761 | EndDialog(hwnd, 666); // assume user wants normal login screen | ||
762 | return TRUE; // handled | ||
763 | |||
764 | default: | ||
765 | return FALSE; | ||
766 | } | ||
767 | } | ||
768 | #endif | ||
769 | |||
770 | #if LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP | ||
771 | |||
772 | MEM_BOOL MEM_CALLBACK second_mem_error_handler(MEM_ERROR_INFO *errorInfo); | ||
773 | |||
774 | MEM_BOOL MEM_CALLBACK first_mem_error_handler(MEM_ERROR_INFO *errorInfo) | ||
775 | { | ||
776 | MemSetErrorHandler(second_mem_error_handler); | ||
777 | |||
778 | // Really should free up reserved memory here and warn users | ||
779 | // with dialog they have precious little time left in Second | ||
780 | // Life! | ||
781 | |||
782 | llerrs << "Memory allocation failed; aborting." << llendl; | ||
783 | // llerrs << "Memory allocation failed; reserve memory released." << llendl; | ||
784 | |||
785 | // NOTREACHED better not be, but see second_mem_error_handler | ||
786 | // Could do that freeing up reserved memory thing here and | ||
787 | // return 1; | ||
788 | return 0; | ||
789 | } | ||
790 | |||
791 | MEM_BOOL MEM_CALLBACK second_mem_error_handler(MEM_ERROR_INFO *errorInfo) | ||
792 | { | ||
793 | // Just in case "llerrs" and "llendl" cause another out-of-memory. | ||
794 | LLError::crashAndLoop(""); | ||
795 | // NOTREACHED better not be! | ||
796 | return 0; | ||
797 | } | ||
798 | |||
799 | #endif // LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP | ||
800 | |||
801 | |||
802 | #if LL_WINDOWS | ||
803 | int APIENTRY WinMain(HINSTANCE hInstance, | ||
804 | HINSTANCE hPrevInstance, | ||
805 | LPSTR lpCmdLine, | ||
806 | int nCmdShow) | ||
807 | #else | ||
808 | int main( int argc, char **argv ) | ||
809 | #endif | ||
810 | { | ||
811 | LLMemType mt1(LLMemType::MTYPE_STARTUP); | ||
812 | |||
813 | #if LL_SOLARIS && defined(__sparc) | ||
814 | asm ("ta\t6"); // NOTE: Make sure memory alignment is enforced on SPARC | ||
815 | #endif | ||
816 | |||
817 | #if LL_DARWIN | ||
818 | // Set the working dir to <bundle>/Contents/Resources | ||
819 | (void) chdir(gDirUtilp->getAppRODataDir().c_str()); | ||
820 | #endif | ||
821 | |||
822 | #if 1 | ||
823 | // This will eventually be done in LLApp | ||
824 | LLCommon::initClass(); | ||
825 | // This should eventually be done in LLAppViewer | ||
826 | # if MEM_TRACK_MEM | ||
827 | static const bool enable_threads = false; | ||
828 | # else | ||
829 | static const bool enable_threads = true; | ||
830 | # endif | ||
831 | LLVFSThread::initClass(enable_threads && true); | ||
832 | LLLFSThread::initClass(enable_threads && true); | ||
833 | // Image decoding | ||
834 | gImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true); | ||
835 | gTextureCache = new LLTextureCache(enable_threads && true); | ||
836 | gTextureFetch = new LLTextureFetch(gTextureCache, enable_threads && false); | ||
837 | LLImageWorker::initClass(gImageDecodeThread); | ||
838 | LLImageJ2C::openDSO(); | ||
839 | #endif | ||
840 | |||
841 | #if LL_WINDOWS | ||
842 | // In Win32, we need to generate argc and argv ourselves... | ||
843 | // Note: GetCommandLine() returns a potentially return a LPTSTR | ||
844 | // which can resolve to a LPWSTR (unicode string). | ||
845 | // (That's why it's different from lpCmdLine which is a LPSTR.) | ||
846 | // We don't currently do unicode, so call the non-unicode version | ||
847 | // directly. | ||
848 | LPSTR cmd_line_including_exe_name = GetCommandLineA(); | ||
849 | |||
850 | gIconResource = MAKEINTRESOURCE(IDI_LL_ICON); | ||
851 | |||
852 | const S32 MAX_ARGS = 100; | ||
853 | int argc = 0; | ||
854 | char* argv[MAX_ARGS]; /* Flawfinder: ignore */ | ||
855 | |||
856 | char *token = NULL; | ||
857 | if( cmd_line_including_exe_name[0] == '\"' ) | ||
858 | { | ||
859 | // Exe name is enclosed in quotes | ||
860 | token = strtok( cmd_line_including_exe_name, "\"" ); | ||
861 | argv[argc++] = token; | ||
862 | token = strtok( NULL, " \t," ); | ||
863 | } | ||
864 | else | ||
865 | { | ||
866 | // Exe name is not enclosed in quotes | ||
867 | token = strtok( cmd_line_including_exe_name, " \t," ); | ||
868 | } | ||
869 | |||
870 | while( (token != NULL) && (argc < MAX_ARGS) ) | ||
871 | { | ||
872 | argv[argc++] = token; | ||
873 | /* Get next token: */ | ||
874 | if (*(token + strlen(token) + 1) == '\"') /* Flawfinder: ignore*/ | ||
875 | { | ||
876 | token = strtok( NULL, "\""); | ||
877 | } | ||
878 | else | ||
879 | { | ||
880 | token = strtok( NULL, " \t," ); | ||
881 | } | ||
882 | } | ||
883 | #endif | ||
884 | |||
885 | // HACK! We REALLY want to know what grid they were trying to connect to if they | ||
886 | // crashed hard. | ||
887 | // So we walk through the command line args ONLY looking for the | ||
888 | // userserver arguments first. And we don't do ANYTHING but set | ||
889 | // the gUserServerName (which gets passed to the crash reporter). | ||
890 | // We're assuming that they're trying to log into the same grid as last | ||
891 | // time, which seems fairly reasonable. | ||
892 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[UserServerDefaultChoice].mName); /* Flawfinder: ignore */ | ||
893 | S32 j; | ||
894 | for (j = 1; j < argc; j++) | ||
895 | { | ||
896 | if (!strcmp(argv[j], "--aditi")) | ||
897 | { | ||
898 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_ADITI].mName); /* Flawfinder: ignore */ | ||
899 | } | ||
900 | else if (!strcmp(argv[j], "--agni")) | ||
901 | { | ||
902 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_AGNI].mName); /* Flawfinder: ignore */ | ||
903 | } | ||
904 | else if (!strcmp(argv[j], "--dmz")) | ||
905 | { | ||
906 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_DMZ].mName); /* Flawfinder: ignore */ | ||
907 | } | ||
908 | else if (!strcmp(argv[j], "--siva")) | ||
909 | { | ||
910 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_SIVA].mName); /* Flawfinder: ignore */ | ||
911 | } | ||
912 | else if (!strcmp(argv[j], "--shakti")) | ||
913 | { | ||
914 | sprintf(gUserServerName,"%s", gUserServerDomainName[USERSERVER_SHAKTI].mName); | ||
915 | } | ||
916 | else if (!strcmp(argv[j], "--durga")) | ||
917 | { | ||
918 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_DURGA].mName); /* Flawfinder: ignore */ | ||
919 | } | ||
920 | else if (!strcmp(argv[j], "--soma")) | ||
921 | { | ||
922 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_SOMA].mName); /* Flawfinder: ignore */ | ||
923 | } | ||
924 | else if (!strcmp(argv[j], "--ganga")) | ||
925 | { | ||
926 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_GANGA].mName); /* Flawfinder: ignore */ | ||
927 | } | ||
928 | else if (!strcmp(argv[j], "--vaak")) | ||
929 | { | ||
930 | sprintf(gUserServerName,"%s", gUserServerDomainName[USERSERVER_VAAK].mName); | ||
931 | } | ||
932 | else if (!strcmp(argv[j], "--uma")) | ||
933 | { | ||
934 | sprintf(gUserServerName,"%s", gUserServerDomainName[USERSERVER_UMA].mName); | ||
935 | } | ||
936 | else if (!strcmp(argv[j], "-user") && (++j < argc)) | ||
937 | { | ||
938 | if (!strcmp(argv[j], "-")) | ||
939 | { | ||
940 | snprintf(gUserServerName, MAX_STRING, "%s", LOOPBACK_ADDRESS_STRING); /* Flawfinder: ignore */ | ||
941 | } | ||
942 | else | ||
943 | { | ||
944 | snprintf(gUserServerName, MAX_STRING, "%s", argv[j]); /* Flawfinder: ignore */ | ||
945 | } | ||
946 | } | ||
947 | else if (!strcmp(argv[j], "-multiple")) | ||
948 | { | ||
949 | // Hack to detect -multiple so we can disable the marker file check (which will always fail) | ||
950 | gMultipleViewersOK = TRUE; | ||
951 | } | ||
952 | else if (!strcmp(argv[j], "-novoice")) | ||
953 | { | ||
954 | // May need to know this early also | ||
955 | gDisableVoice = TRUE; | ||
956 | } | ||
957 | } | ||
958 | |||
959 | // | ||
960 | // Start of the application | ||
961 | // | ||
962 | // IMPORTANT! Do NOT put anything that will write | ||
963 | // into the log files during normal startup until AFTER | ||
964 | // we run the "program crashed last time" error handler below. | ||
965 | // | ||
966 | |||
967 | // Need to do this initialization before we do anything else, since anything | ||
968 | // that touches files should really go through the lldir API | ||
969 | gDirUtilp->initAppDirs("SecondLife"); | ||
970 | |||
971 | // | ||
972 | // Set up logging defaults for the viewer | ||
973 | // | ||
974 | LLError::initForApplication( | ||
975 | gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); | ||
976 | LLError::setFatalFunction(errorCallback); | ||
977 | |||
978 | |||
979 | #if LL_RELEASE_FOR_DOWNLOAD && LL_SEND_CRASH_REPORTS | ||
980 | // | ||
981 | // Crash log if we hard crashed. | ||
982 | // Initialize crash logging | ||
983 | // | ||
984 | init_crash_handler(); | ||
985 | #endif | ||
986 | // Set up SecondLife.log | ||
987 | init_logging(); | ||
988 | |||
989 | // | ||
990 | // OK to write stuff to logs now, we've now crash reported if necessary | ||
991 | // | ||
992 | |||
993 | // Set up some defaults... | ||
994 | gSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, DEFAULT_SETTINGS_FILE); | ||
995 | gOldSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, LEGACY_DEFAULT_SETTINGS_FILE); | ||
996 | |||
997 | ///////////////////////////////////////// | ||
998 | // | ||
999 | // Process command line arguments | ||
1000 | // | ||
1001 | S32 args_result = 0; | ||
1002 | |||
1003 | #if LL_DARWIN | ||
1004 | { | ||
1005 | // On the Mac, read in arguments.txt (if it exists) and process it for additional arguments. | ||
1006 | std::string args; | ||
1007 | if(_read_file_into_string(args, "arguments.txt")) | ||
1008 | { | ||
1009 | // The arguments file exists. | ||
1010 | // It should consist of command line arguments separated by newlines. | ||
1011 | // Split it into individual arguments and build a fake argv[] to pass to parse_args. | ||
1012 | std::vector<std::string> arglist; | ||
1013 | |||
1014 | arglist.push_back("newview"); | ||
1015 | |||
1016 | llinfos << "Reading additional command line arguments from arguments.txt..." << llendl; | ||
1017 | |||
1018 | typedef boost::tokenizer<boost::escaped_list_separator<char> > tokenizer; | ||
1019 | boost::escaped_list_separator<char> sep("\\", "\r\n ", "\"'"); | ||
1020 | tokenizer tokens(args, sep); | ||
1021 | tokenizer::iterator token_iter; | ||
1022 | |||
1023 | for(token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter) | ||
1024 | { | ||
1025 | llinfos << "argument: '" << (token_iter->c_str()) << "'" << llendl; | ||
1026 | |||
1027 | arglist.push_back(*token_iter); | ||
1028 | } | ||
1029 | |||
1030 | char **fakeargv = new char*[arglist.size()]; | ||
1031 | int i; | ||
1032 | for(i=0; i < arglist.size(); i++) | ||
1033 | fakeargv[i] = const_cast<char*>(arglist[i].c_str()); | ||
1034 | |||
1035 | args_result = parse_args(arglist.size(), fakeargv); | ||
1036 | delete[] fakeargv; | ||
1037 | } | ||
1038 | |||
1039 | // Get the user's preferred language string based on the Mac OS localization mechanism. | ||
1040 | // To add a new localization: | ||
1041 | // go to the "Resources" section of the project | ||
1042 | // get info on "language.txt" | ||
1043 | // in the "General" tab, click the "Add Localization" button | ||
1044 | // create a new localization for the language you're adding | ||
1045 | // set the contents of the new localization of the file to the string corresponding to our localization | ||
1046 | // (i.e. "en-us", "ja", etc. Use the existing ones as a guide.) | ||
1047 | CFURLRef url = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("language"), CFSTR("txt"), NULL); | ||
1048 | char path[MAX_PATH]; | ||
1049 | if(CFURLGetFileSystemRepresentation(url, false, (UInt8 *)path, sizeof(path))) | ||
1050 | { | ||
1051 | std::string lang; | ||
1052 | if(_read_file_into_string(lang, path)) | ||
1053 | { | ||
1054 | gCommandLineForcedSettings["SystemLanguage"] = lang; | ||
1055 | } | ||
1056 | } | ||
1057 | CFRelease(url); | ||
1058 | } | ||
1059 | #endif | ||
1060 | |||
1061 | // | ||
1062 | // Parse the command line arguments | ||
1063 | // | ||
1064 | args_result |= parse_args(argc, argv); | ||
1065 | if (args_result) | ||
1066 | { | ||
1067 | remove_marker_file(); | ||
1068 | return args_result; | ||
1069 | } | ||
1070 | |||
1071 | if (!strcmp(gUserServerName, gUserServerDomainName[USERSERVER_AGNI].mName)) | ||
1072 | { | ||
1073 | gInProductionGrid = TRUE; | ||
1074 | } | ||
1075 | |||
1076 | // *TODO:translate | ||
1077 | gSecondLife = "Second Life"; | ||
1078 | |||
1079 | // Read skin/branding settings if specified. | ||
1080 | if (! gDirUtilp->getSkinDir().empty() ) | ||
1081 | { | ||
1082 | std::string skin_def_file = gDirUtilp->getExpandedFilename(LL_PATH_TOP_SKIN, "skin.xml"); | ||
1083 | LLXmlTree skin_def_tree; | ||
1084 | |||
1085 | if (!skin_def_tree.parseFile(skin_def_file)) | ||
1086 | { | ||
1087 | llerrs << "Failed to parse skin definition." << llendl; | ||
1088 | } | ||
1089 | |||
1090 | LLXmlTreeNode* rootp = skin_def_tree.getRoot(); | ||
1091 | LLXmlTreeNode* disabled_message_node = rootp->getChildByName("disabled_message"); | ||
1092 | if (disabled_message_node) | ||
1093 | { | ||
1094 | gDisabledMessage = disabled_message_node->getContents(); | ||
1095 | } | ||
1096 | |||
1097 | static LLStdStringHandle hide_links_string = LLXmlTree::addAttributeString("hide_links"); | ||
1098 | rootp->getFastAttributeBOOL(hide_links_string, gHideLinks); | ||
1099 | |||
1100 | // Legacy string. This flag really meant we didn't want to expose references to "Second Life". | ||
1101 | // Just set gHideLinks instead. | ||
1102 | static LLStdStringHandle silent_string = LLXmlTree::addAttributeString("silent_update"); | ||
1103 | BOOL silent_update; | ||
1104 | rootp->getFastAttributeBOOL(silent_string, silent_update); | ||
1105 | gHideLinks = (gHideLinks || silent_update); | ||
1106 | } | ||
1107 | |||
1108 | #if LL_DARWIN | ||
1109 | // Initialize apple menubar and various callbacks | ||
1110 | init_apple_menu(gSecondLife.c_str()); | ||
1111 | |||
1112 | #if __ppc__ | ||
1113 | // If the CPU doesn't have Altivec (i.e. it's not at least a G4), don't go any further. | ||
1114 | // Only test PowerPC - all Intel Macs have SSE. | ||
1115 | if(!gSysCPU.hasAltivec()) | ||
1116 | { | ||
1117 | std::ostringstream msg; | ||
1118 | msg << gSecondLife << " requires a processor with AltiVec (G4 or later)."; | ||
1119 | OSMessageBox( | ||
1120 | msg.str().c_str(), | ||
1121 | NULL, | ||
1122 | OSMB_OK); | ||
1123 | remove_marker_file(); | ||
1124 | return 1; | ||
1125 | } | ||
1126 | #endif | ||
1127 | |||
1128 | #endif // LL_DARWIN | ||
1129 | |||
1130 | // Display splash screen. Must be after above check for previous | ||
1131 | // crash as this dialog is always frontmost. | ||
1132 | std::ostringstream splash_msg; | ||
1133 | // *TODO:translate | ||
1134 | splash_msg << "Loading " << gSecondLife << "..."; | ||
1135 | LLSplashScreen::show(); | ||
1136 | LLSplashScreen::update(splash_msg.str().c_str()); | ||
1137 | |||
1138 | LLVolumeMgr::initClass(); | ||
1139 | |||
1140 | // Initialize the feature manager | ||
1141 | // The feature manager is responsible for determining what features | ||
1142 | // are turned on/off in the app. | ||
1143 | gFeatureManagerp = new LLFeatureManager; | ||
1144 | |||
1145 | gStartTime = totalTime(); | ||
1146 | |||
1147 | |||
1148 | //////////////////////////////////////// | ||
1149 | // | ||
1150 | // Process ini files | ||
1151 | // | ||
1152 | |||
1153 | // declare all possible setting variables | ||
1154 | declare_settings(); | ||
1155 | |||
1156 | #if !LL_RELEASE_FOR_DOWNLOAD | ||
1157 | // only write the defaults for non-release builds! | ||
1158 | gSavedSettings.saveToFile(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings_default.xml").c_str(), FALSE); | ||
1159 | #endif | ||
1160 | |||
1161 | // | ||
1162 | // Set the name of the window | ||
1163 | // | ||
1164 | #if LL_RELEASE_FOR_DOWNLOAD | ||
1165 | gWindowTitle = gSecondLife; | ||
1166 | #elif LL_DEBUG | ||
1167 | gWindowTitle = gSecondLife + LLString(" [DEBUG] ") + gArgs; | ||
1168 | #else | ||
1169 | gWindowTitle = gSecondLife + LLString(" ") + gArgs; | ||
1170 | #endif | ||
1171 | LLString::truncate(gWindowTitle, 255); | ||
1172 | |||
1173 | if (!gMultipleViewersOK) | ||
1174 | { | ||
1175 | // | ||
1176 | // Check for another instance of the app running | ||
1177 | // | ||
1178 | |||
1179 | // RN: if we received a URL, hand it off to the existing instance | ||
1180 | // don't call another_instance_running() when doing URL handoff, as | ||
1181 | // it relies on checking a marker file which will not work when running | ||
1182 | // out of different directories | ||
1183 | std::string slurl; | ||
1184 | if (!LLStartUp::sSLURLCommand.empty()) | ||
1185 | { | ||
1186 | slurl = LLStartUp::sSLURLCommand; | ||
1187 | } | ||
1188 | else if (LLURLSimString::parse()) | ||
1189 | { | ||
1190 | slurl = LLURLSimString::getURL(); | ||
1191 | } | ||
1192 | if (!slurl.empty()) | ||
1193 | { | ||
1194 | if (send_url_to_other_instance(slurl)) | ||
1195 | { | ||
1196 | // successfully handed off URL to existing instance, exit | ||
1197 | return 1; | ||
1198 | } | ||
1199 | } | ||
1200 | |||
1201 | gSecondInstance = another_instance_running(); | ||
1202 | |||
1203 | if (gSecondInstance) | ||
1204 | { | ||
1205 | std::ostringstream msg; | ||
1206 | msg << | ||
1207 | gSecondLife << " is already running.\n" | ||
1208 | "\n" | ||
1209 | "Check your task bar for a minimized copy of the program.\n" | ||
1210 | "If this message persists, restart your computer.", | ||
1211 | OSMessageBox( | ||
1212 | msg.str().c_str(), | ||
1213 | NULL, | ||
1214 | OSMB_OK); | ||
1215 | return 1; | ||
1216 | } | ||
1217 | |||
1218 | init_marker_file(); | ||
1219 | |||
1220 | #if LL_SEND_CRASH_REPORTS | ||
1221 | if (gLastExecFroze) | ||
1222 | { | ||
1223 | llinfos << "Last execution froze, requesting to send crash report." << llendl; | ||
1224 | // | ||
1225 | // Pop up a freeze or crash warning dialog | ||
1226 | // | ||
1227 | std::ostringstream msg; | ||
1228 | msg << gSecondLife | ||
1229 | << " appears to have frozen or crashed on the previous run.\n" | ||
1230 | << "Would you like to send a crash report?"; | ||
1231 | std::string alert; | ||
1232 | alert = gSecondLife; | ||
1233 | alert += " Alert"; | ||
1234 | S32 choice = OSMessageBox(msg.str().c_str(), | ||
1235 | alert.c_str(), | ||
1236 | OSMB_YESNO); | ||
1237 | if (OSBTN_YES == choice) | ||
1238 | { | ||
1239 | llinfos << "Sending crash report." << llendl; | ||
1240 | |||
1241 | remove_marker_file(); | ||
1242 | #if LL_WINDOWS | ||
1243 | std::string exe_path = gDirUtilp->getAppRODataDir(); | ||
1244 | exe_path += gDirUtilp->getDirDelimiter(); | ||
1245 | exe_path += "win_crash_logger.exe"; | ||
1246 | |||
1247 | std::string arg_string = "-previous -user "; | ||
1248 | arg_string += gUserServerName; | ||
1249 | arg_string += " -name \""; | ||
1250 | arg_string += gSecondLife; | ||
1251 | arg_string += "\""; | ||
1252 | // Spawn crash logger. | ||
1253 | // NEEDS to wait until completion, otherwise log files will get smashed. | ||
1254 | _spawnl(_P_WAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL); | ||
1255 | #elif LL_DARWIN | ||
1256 | std::string command_str; | ||
1257 | command_str = "crashreporter.app/Contents/MacOS/crashreporter "; | ||
1258 | command_str += "-previous -user "; | ||
1259 | command_str += gUserServerName; | ||
1260 | // XXX -- We need to exit fullscreen mode for this to work. | ||
1261 | // XXX -- system() also doesn't wait for completion. Hmm... | ||
1262 | system(command_str.c_str()); /* Flawfinder: Ignore */ | ||
1263 | #elif LL_LINUX || LL_SOLARIS | ||
1264 | std::string cmd =gDirUtilp->getAppRODataDir(); | ||
1265 | cmd += gDirUtilp->getDirDelimiter(); | ||
1266 | #if LL_LINUX | ||
1267 | cmd += "linux-crash-logger.bin"; | ||
1268 | #else // LL_SOLARIS | ||
1269 | cmd += "bin/solaris-crash-logger"; | ||
1270 | #endif | ||
1271 | char* const cmdargv[] = | ||
1272 | {(char*)cmd.c_str(), | ||
1273 | (char*)"-previous", | ||
1274 | (char*)"-user", | ||
1275 | (char*)gUserServerName, | ||
1276 | (char*)"-name", | ||
1277 | (char*)gSecondLife.c_str(), | ||
1278 | NULL}; | ||
1279 | fflush(NULL); | ||
1280 | pid_t pid = fork(); | ||
1281 | if (pid == 0) | ||
1282 | { // child | ||
1283 | execv(cmd.c_str(), cmdargv); /* Flawfinder: Ignore */ | ||
1284 | llwarns << "execv failure when trying to start " << cmd << llendl; | ||
1285 | _exit(1); // avoid atexit() | ||
1286 | } else { | ||
1287 | if (pid > 0) | ||
1288 | { | ||
1289 | // wait for child proc to die | ||
1290 | int childExitStatus; | ||
1291 | waitpid(pid, &childExitStatus, 0); | ||
1292 | } else { | ||
1293 | llwarns << "fork failure." << llendl; | ||
1294 | } | ||
1295 | } | ||
1296 | #endif | ||
1297 | } | ||
1298 | else | ||
1299 | { | ||
1300 | llinfos << "Not sending crash report." << llendl; | ||
1301 | } | ||
1302 | } | ||
1303 | #endif // #if LL_SEND_CRASH_REPORTS | ||
1304 | } | ||
1305 | else | ||
1306 | { | ||
1307 | gSecondInstance = another_instance_running(); | ||
1308 | |||
1309 | if (gSecondInstance) | ||
1310 | { | ||
1311 | gDisableVoice = TRUE; | ||
1312 | } | ||
1313 | |||
1314 | init_marker_file(); | ||
1315 | } | ||
1316 | |||
1317 | // | ||
1318 | // Write system information into the debug log (CPU, OS, etc.) | ||
1319 | // | ||
1320 | write_system_info(); | ||
1321 | |||
1322 | #if LL_WINDOWS | ||
1323 | // | ||
1324 | // Turn off Windows XP Error Reporting | ||
1325 | // (Don't send our data to Microsoft--at least until we are Logo approved and have a way | ||
1326 | // of getting the data back from them.) | ||
1327 | // | ||
1328 | llinfos << "Turning off Windows error reporting." << llendl; | ||
1329 | disable_win_error_reporting(); | ||
1330 | #endif // LL_WINDOWS | ||
1331 | |||
1332 | // Build a string representing the current version number. | ||
1333 | gCurrentVersion = llformat("%s %d.%d.%d.%d", gChannelName.c_str(), LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VERSION_BUILD ); | ||
1334 | |||
1335 | // | ||
1336 | // Various introspection concerning the libs we're using | ||
1337 | // | ||
1338 | llinfos << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << llendl; | ||
1339 | |||
1340 | // | ||
1341 | // Load the feature tables | ||
1342 | // | ||
1343 | llinfos << "Loading feature tables." << llendl; | ||
1344 | |||
1345 | gFeatureManagerp->loadFeatureTables(); | ||
1346 | gFeatureManagerp->initCPUFeatureMasks(); | ||
1347 | |||
1348 | // Merge with the command line overrides | ||
1349 | gSavedSettings.applyOverrides(gCommandLineSettings); | ||
1350 | |||
1351 | // Need to do this before calling parseAlerts | ||
1352 | gUICtrlFactory = new LLViewerUICtrlFactory(); | ||
1353 | |||
1354 | // Pre-load alerts.xml to define the warnings settings (always loads from skins/xui/en-us/) | ||
1355 | // Do this *before* loading the settings file | ||
1356 | LLAlertDialog::parseAlerts("alerts.xml", &gSavedSettings, TRUE); | ||
1357 | |||
1358 | // Overwrite default settings with user settings | ||
1359 | llinfos << "Loading configuration file " << gSettingsFileName << llendl; | ||
1360 | if (0 == gSavedSettings.loadFromFile(gSettingsFileName)) | ||
1361 | { | ||
1362 | llinfos << "Failed to load settings from " << gSettingsFileName << llendl; | ||
1363 | llinfos << "Loading legacy settings from " << gOldSettingsFileName << llendl; | ||
1364 | gSavedSettings.loadFromFileLegacy(gOldSettingsFileName); | ||
1365 | } | ||
1366 | |||
1367 | // need to do this here - need to have initialized global settings first | ||
1368 | LLString nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" ); | ||
1369 | if ( nextLoginLocation.length() ) | ||
1370 | { | ||
1371 | LLURLSimString::setString( nextLoginLocation.c_str() ); | ||
1372 | }; | ||
1373 | |||
1374 | // Merge with the command line overrides | ||
1375 | gSavedSettings.applyOverrides(gCommandLineForcedSettings); | ||
1376 | |||
1377 | gLastRunVersion = gSavedSettings.getString("LastRunVersion"); | ||
1378 | |||
1379 | fixup_settings(); | ||
1380 | |||
1381 | // Get the single value from the crash settings file, if it exists | ||
1382 | std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); | ||
1383 | gCrashSettings.loadFromFile(crash_settings_filename.c_str()); | ||
1384 | |||
1385 | ///////////////////////////////////////////////// | ||
1386 | // OS-specific login dialogs | ||
1387 | ///////////////////////////////////////////////// | ||
1388 | #if LL_WINDOWS | ||
1389 | /* | ||
1390 | // Display initial login screen, comes up quickly. JC | ||
1391 | { | ||
1392 | LLSplashScreen::hide(); | ||
1393 | |||
1394 | INT_PTR result = DialogBox(hInstance, L"CONNECTBOX", NULL, login_dialog_func); | ||
1395 | if (result < 0) | ||
1396 | { | ||
1397 | llwarns << "Connect dialog box failed, returned " << result << llendl; | ||
1398 | return 1; | ||
1399 | } | ||
1400 | // success, result contains which button user clicked | ||
1401 | llinfos << "Connect dialog box clicked " << result << llendl; | ||
1402 | |||
1403 | LLSplashScreen::show(); | ||
1404 | } | ||
1405 | */ | ||
1406 | #endif | ||
1407 | |||
1408 | // track number of times that app has run | ||
1409 | gNumSessions = gSavedSettings.getS32("NumSessions"); | ||
1410 | gNumSessions++; | ||
1411 | gSavedSettings.setS32("NumSessions", gNumSessions); | ||
1412 | |||
1413 | gSavedSettings.setString("HelpLastVisitedURL",gSavedSettings.getString("HelpHomeURL")); | ||
1414 | |||
1415 | if (gSavedSettings.getBOOL("VerboseLogs")) | ||
1416 | { | ||
1417 | LLError::setPrintLocation(true); | ||
1418 | } | ||
1419 | |||
1420 | #if !LL_RELEASE_FOR_DOWNLOAD | ||
1421 | if (gUserServerChoice == USERSERVER_NONE) | ||
1422 | { | ||
1423 | // Development version: load last server choice by default (overridden by cmd line args) | ||
1424 | |||
1425 | S32 server = gSavedSettings.getS32("ServerChoice"); | ||
1426 | if (server != 0) | ||
1427 | gUserServerChoice = (EUserServerDomain)llclamp(server, 0, (S32)USERSERVER_COUNT - 1); | ||
1428 | if (server == USERSERVER_OTHER) | ||
1429 | { | ||
1430 | LLString custom_server = gSavedSettings.getString("CustomServer"); | ||
1431 | if (custom_server.empty()) | ||
1432 | { | ||
1433 | snprintf(gUserServerName, MAX_STRING, "none"); /* Flawfinder: ignore */ | ||
1434 | } | ||
1435 | else | ||
1436 | { | ||
1437 | snprintf(gUserServerName, MAX_STRING, "%s", custom_server.c_str()); /* Flawfinder: ignore */ | ||
1438 | } | ||
1439 | } | ||
1440 | } | ||
1441 | #endif | ||
1442 | |||
1443 | if (gUserServerChoice == USERSERVER_NONE) | ||
1444 | { | ||
1445 | gUserServerChoice = UserServerDefaultChoice; | ||
1446 | } | ||
1447 | |||
1448 | // Load art UUID information, don't require these strings to be declared in code. | ||
1449 | LLString viewer_art_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"viewerart.xml"); | ||
1450 | llinfos << "Loading art table from " << viewer_art_filename << llendl; | ||
1451 | gViewerArt.loadFromFile(viewer_art_filename.c_str(), FALSE); | ||
1452 | LLString textures_filename = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, "textures", "textures.xml"); | ||
1453 | llinfos << "Loading art table from " << textures_filename << llendl; | ||
1454 | gViewerArt.loadFromFile(textures_filename.c_str(), FALSE); | ||
1455 | |||
1456 | LLString colors_base_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors_base.xml"); | ||
1457 | llinfos << "Loading base colors from " << colors_base_filename << llendl; | ||
1458 | gColors.loadFromFile(colors_base_filename.c_str(), FALSE, TYPE_COL4U); | ||
1459 | |||
1460 | // Load overrides from user colors file | ||
1461 | LLString user_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.xml"); | ||
1462 | llinfos << "Loading user colors from " << user_colors_filename << llendl; | ||
1463 | if (gColors.loadFromFile(user_colors_filename.c_str(), FALSE, TYPE_COL4U) == 0) | ||
1464 | { | ||
1465 | llinfos << "Failed to load user colors from " << user_colors_filename << llendl; | ||
1466 | LLString user_legacy_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.ini"); | ||
1467 | llinfos << "Loading legacy colors from " << user_legacy_colors_filename << llendl; | ||
1468 | gColors.loadFromFileLegacy(user_legacy_colors_filename.c_str(), FALSE, TYPE_COL4U); | ||
1469 | } | ||
1470 | |||
1471 | // Widget construction depends on LLUI being initialized | ||
1472 | LLUI::initClass(&gSavedSettings, | ||
1473 | &gColors, | ||
1474 | &gViewerArt, | ||
1475 | &gImageList, | ||
1476 | ui_audio_callback, | ||
1477 | &LLUI::sGLScaleFactor); | ||
1478 | |||
1479 | gUICtrlFactory->setupPaths(); // update paths with correct language set | ||
1480 | |||
1481 | ///////////////////////////////////////////////// | ||
1482 | // | ||
1483 | // Load settings files | ||
1484 | // | ||
1485 | // | ||
1486 | LLGroupMgr::parseRoleActions("role_actions.xml"); | ||
1487 | |||
1488 | LLAgent::parseTeleportMessages("teleport_strings.xml"); | ||
1489 | |||
1490 | // Move certain saved settings into global variables for speed | ||
1491 | saved_settings_to_globals(); | ||
1492 | |||
1493 | // 1.6.10: Default crash reporting to on, because this dialog doesn't | ||
1494 | // make any sense for a new user. | ||
1495 | /* | ||
1496 | if (!gSavedSettings.getBOOL("AskedAboutCrashReports")) | ||
1497 | { | ||
1498 | // NOTE: Be sure to use gSecondLife if this becomes uncommented. | ||
1499 | S32 retval = OSMessageBox( | ||
1500 | "Welcome! You have successfully installed Second Life.\n" | ||
1501 | "\n" | ||
1502 | "Should performance issues or crashes occur, Second Life\n" | ||
1503 | "can automatically send technical data about your computer\n" | ||
1504 | "to Linden Lab to diagnose and correct the problem.\n" | ||
1505 | "This information is used solely to address technical issues\n" | ||
1506 | "and is kept strictly confidential.\n" | ||
1507 | "You can change this setting under Preferences / General.\n" | ||
1508 | "Automatically send technical data if problems occur?", | ||
1509 | "Second Life", | ||
1510 | OSMB_YESNO); | ||
1511 | if (OSBTN_YES == retval) | ||
1512 | { | ||
1513 | gAutoReportCrashes = TRUE; | ||
1514 | } | ||
1515 | else | ||
1516 | { | ||
1517 | gAutoReportCrashes = FALSE; | ||
1518 | } | ||
1519 | |||
1520 | // Setting will be saved automatically at shutdown. | ||
1521 | gSavedSettings.setBOOL("AskedAboutCrashReports", TRUE); | ||
1522 | } | ||
1523 | */ | ||
1524 | |||
1525 | // Find partition serial number (Windows) or hardware serial (Mac) | ||
1526 | gSerialNumber = get_serial_number(); | ||
1527 | |||
1528 | #if LL_WINDOWS | ||
1529 | // | ||
1530 | // Do driver verification and initialization based on DirectX | ||
1531 | // hardware polling and driver versions | ||
1532 | // | ||
1533 | if (gProbeHardware) | ||
1534 | { | ||
1535 | BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup"); | ||
1536 | |||
1537 | LLSplashScreen::update("Detecting hardware..."); | ||
1538 | |||
1539 | llinfos << "Attempting to poll DirectX for hardware info" << llendl; | ||
1540 | gDXHardware.setWriteDebugFunc(write_debug); | ||
1541 | BOOL probe_ok = gDXHardware.getInfo(vram_only); | ||
1542 | |||
1543 | if (!probe_ok | ||
1544 | && gSavedSettings.getWarning("AboutDirectX9")) | ||
1545 | { | ||
1546 | llinfos << "DirectX probe failed, alerting user." << llendl; | ||
1547 | |||
1548 | // Warn them that runnin without DirectX 9 will | ||
1549 | // not allow us to tell them about driver issues | ||
1550 | std::ostringstream msg; | ||
1551 | msg << | ||
1552 | gSecondLife << " is unable to detect DirectX 9.0b or greater.\n" | ||
1553 | "\n" << | ||
1554 | gSecondLife << " uses DirectX to detect hardware and/or\n" | ||
1555 | "outdated drivers that can cause stability problems,\n" | ||
1556 | "poor performance and crashes. While you can run\n" << | ||
1557 | gSecondLife << " without it, we highly recommend running\n" | ||
1558 | "with DirectX 9.0b\n" | ||
1559 | "\n" | ||
1560 | "Do you wish to continue?\n"; | ||
1561 | S32 button = OSMessageBox( | ||
1562 | msg.str().c_str(), | ||
1563 | "Warning", | ||
1564 | OSMB_YESNO); | ||
1565 | if (OSBTN_NO== button) | ||
1566 | { | ||
1567 | llinfos << "User quitting after failed DirectX 9 detection" << llendl; | ||
1568 | LLWeb::loadURLExternal(DIRECTX_9_URL); | ||
1569 | return 0; | ||
1570 | } | ||
1571 | gSavedSettings.setWarning("AboutDirectX9", FALSE); | ||
1572 | } | ||
1573 | llinfos << "Done polling DirectX for hardware info" << llendl; | ||
1574 | |||
1575 | // Only probe once after installation | ||
1576 | gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE); | ||
1577 | |||
1578 | // Disable so debugger can work | ||
1579 | LLSplashScreen::update(splash_msg.str().c_str()); | ||
1580 | } | ||
1581 | |||
1582 | if (!LLWinDebug::setupExceptionHandler()) | ||
1583 | { | ||
1584 | llwarns << " Someone took over my exception handler (post hardware probe)!" << llendl; | ||
1585 | } | ||
1586 | |||
1587 | gGLManager.mVRAM = gDXHardware.getVRAM(); | ||
1588 | llinfos << "Detected VRAM: " << gGLManager.mVRAM << llendl; | ||
1589 | #endif | ||
1590 | |||
1591 | // Always fetch the Ethernet MAC address, needed both for login | ||
1592 | // and password load. | ||
1593 | LLUUID::getNodeID(gMACAddress); | ||
1594 | |||
1595 | // Prepare for out-of-memory situations, during which we will crash on | ||
1596 | // purpose and save a dump. | ||
1597 | #if LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP | ||
1598 | MemSetErrorHandler(first_mem_error_handler); | ||
1599 | #endif // LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP | ||
1600 | |||
1601 | gViewerStats = new LLViewerStats(); | ||
1602 | |||
1603 | // | ||
1604 | // Initialize the VFS, and gracefully handle initialization errors | ||
1605 | // | ||
1606 | |||
1607 | if (!init_cache()) | ||
1608 | { | ||
1609 | std::ostringstream msg; | ||
1610 | msg << | ||
1611 | gSecondLife << " is unable to access a file that it needs.\n" | ||
1612 | "\n" | ||
1613 | "This can be because you somehow have multiple copies running, " | ||
1614 | "or your system incorrectly thinks a file is open. " | ||
1615 | "If this message persists, restart your computer and try again. " | ||
1616 | "If it continues to persist, you may need to completely uninstall " << | ||
1617 | gSecondLife << " and reinstall it."; | ||
1618 | OSMessageBox( | ||
1619 | msg.str().c_str(), | ||
1620 | NULL, | ||
1621 | OSMB_OK); | ||
1622 | return 1; | ||
1623 | } | ||
1624 | |||
1625 | #if LL_DARWIN | ||
1626 | // Display the release notes for the current version | ||
1627 | if(!gHideLinks && gCurrentVersion != gLastRunVersion) | ||
1628 | { | ||
1629 | // Current version and last run version don't match exactly. Display the release notes. | ||
1630 | DisplayReleaseNotes(); | ||
1631 | } | ||
1632 | #endif | ||
1633 | |||
1634 | // | ||
1635 | // Initialize the window | ||
1636 | // | ||
1637 | |||
1638 | // pop up debug console if necessary | ||
1639 | #if LL_WINDOWS | ||
1640 | if (gUseConsole && gSavedSettings.getBOOL("ShowConsoleWindow")) | ||
1641 | { | ||
1642 | create_console(); | ||
1643 | } | ||
1644 | #endif | ||
1645 | |||
1646 | llinfos << "Initializing window..." << llendl; | ||
1647 | |||
1648 | // store setting in a global for easy access and modification | ||
1649 | gNoRender = gSavedSettings.getBOOL("DisableRendering"); | ||
1650 | |||
1651 | // Hide the splash screen | ||
1652 | LLSplashScreen::hide(); | ||
1653 | |||
1654 | // HACK: Need a non-const char * for stupid window name (propagated deep down) | ||
1655 | char window_title_str[256]; /* Flawfinder: ignore */ | ||
1656 | strncpy(window_title_str, gWindowTitle.c_str(), sizeof(window_title_str) - 1); /* Flawfinder: ignore */ | ||
1657 | window_title_str[sizeof(window_title_str) - 1] = '\0'; | ||
1658 | |||
1659 | // always start windowed | ||
1660 | gViewerWindow = new LLViewerWindow(window_title_str, sWindowClass, | ||
1661 | gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"), | ||
1662 | gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"), | ||
1663 | FALSE, gIgnorePixelDepth); | ||
1664 | |||
1665 | if (gSavedSettings.getBOOL("FullScreen")) | ||
1666 | { | ||
1667 | gViewerWindow->toggleFullscreen(FALSE); | ||
1668 | // request to go full screen... which will be delayed until login | ||
1669 | } | ||
1670 | |||
1671 | if (gSavedSettings.getBOOL("WindowMaximized")) | ||
1672 | { | ||
1673 | gViewerWindow->mWindow->maximize(); | ||
1674 | gViewerWindow->getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio")); | ||
1675 | } | ||
1676 | |||
1677 | LLUI::sWindow = gViewerWindow->getWindow(); | ||
1678 | |||
1679 | LLAlertDialog::parseAlerts("alerts.xml"); | ||
1680 | LLNotifyBox::parseNotify("notify.xml"); | ||
1681 | |||
1682 | LLMediaEngine::initClass(); | ||
1683 | |||
1684 | // | ||
1685 | // Clean up the feature manager lookup table - settings were updated | ||
1686 | // in the LLViewerWindow constructor | ||
1687 | // | ||
1688 | gFeatureManagerp->cleanupFeatureTables(); | ||
1689 | |||
1690 | // Show watch cursor | ||
1691 | gViewerWindow->setCursor(UI_CURSOR_WAIT); | ||
1692 | |||
1693 | |||
1694 | #if LL_WINDOWS && LL_LCD_COMPILE | ||
1695 | // start up an LCD window on a logitech keyboard, if there is one | ||
1696 | gLcdScreen = new llLCD(hInstance); | ||
1697 | CreateLCDDebugWindows(); | ||
1698 | #endif | ||
1699 | |||
1700 | // Finish view initialization | ||
1701 | gViewerWindow->initBase(); | ||
1702 | |||
1703 | // show viewer window | ||
1704 | gViewerWindow->mWindow->show(); | ||
1705 | |||
1706 | write_debug(gGLManager.getGLInfoString()); | ||
1707 | llinfos << gGLManager.getGLInfoString() << llendl; | ||
1708 | |||
1709 | //load key settings | ||
1710 | bind_keyboard_functions(); | ||
1711 | |||
1712 | // Load Default bindings | ||
1713 | if (!gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"keys.ini").c_str())) | ||
1714 | { | ||
1715 | llerrs << "Unable to open keys.ini" << llendl; | ||
1716 | } | ||
1717 | // Load Custom bindings (override defaults) | ||
1718 | gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"custom_keys.ini").c_str()); | ||
1719 | |||
1720 | // Calculate the digest for the executable (takes < 90ms on a fast machine). | ||
1721 | FILE* app_file = LLFile::fopen( gDirUtilp->getExecutablePathAndName().c_str(), "rb" ); /* Flawfinder: ignore */ | ||
1722 | if( app_file ) | ||
1723 | { | ||
1724 | LLMD5 app_md5; | ||
1725 | app_md5.update( app_file ); // Automatically closes the file | ||
1726 | app_md5.finalize(); | ||
1727 | app_md5.raw_digest( gViewerDigest.mData ); | ||
1728 | } | ||
1729 | llinfos << "Viewer Digest: " << gViewerDigest << llendl; | ||
1730 | |||
1731 | // If we don't have the right GL requirements, exit. | ||
1732 | // BUG: This should just be changed to a generic GL "Not good enough" flag | ||
1733 | if (!gGLManager.mHasMultitexture && !gNoRender) | ||
1734 | { | ||
1735 | std::ostringstream msg; | ||
1736 | msg << | ||
1737 | "You do not appear to have the proper hardware requirements " | ||
1738 | "for " << gSecondLife << ". " << gSecondLife << " requires an OpenGL graphics " | ||
1739 | "card that has multitexture support. If this is the case, " | ||
1740 | "you may want to make sure that you have the latest drivers for " | ||
1741 | "your graphics card, and service packs and patches for your " | ||
1742 | "operating system.\n" | ||
1743 | "If you continue to have problems, please go to: " | ||
1744 | "www.secondlife.com/support "; | ||
1745 | OSMessageBox( | ||
1746 | msg.str().c_str(), | ||
1747 | NULL, | ||
1748 | OSMB_OK); | ||
1749 | return 0; | ||
1750 | } | ||
1751 | |||
1752 | // Save the current version to the prefs file | ||
1753 | gSavedSettings.setString("LastRunVersion", gCurrentVersion); | ||
1754 | |||
1755 | gSimLastTime = gRenderStartTime.getElapsedTimeF32(); | ||
1756 | gSimFrames = (F32)gFrameCount; | ||
1757 | |||
1758 | //------------------------------------------- | ||
1759 | // Run main loop until time to quit | ||
1760 | //------------------------------------------- | ||
1761 | main_loop(); | ||
1762 | |||
1763 | cleanup_app(); | ||
1764 | |||
1765 | // If we're exiting to launch an URL, do that here so the screen | ||
1766 | // is at the right resolution before we launch IE. | ||
1767 | if (!gLaunchFileOnQuit.empty()) | ||
1768 | { | ||
1769 | #if LL_WINDOWS | ||
1770 | // Indicate an application is starting. | ||
1771 | SetCursor(LoadCursor(NULL, IDC_WAIT)); | ||
1772 | #endif | ||
1773 | |||
1774 | // HACK: Attempt to wait until the screen res. switch is complete. | ||
1775 | ms_sleep(1000); | ||
1776 | |||
1777 | LLWeb::loadURLExternal( gLaunchFileOnQuit ); | ||
1778 | } | ||
1779 | |||
1780 | llinfos << "Goodbye" << llendflush; | ||
1781 | return 0; | ||
1782 | } | ||
1783 | |||
1784 | bool send_url_to_other_instance(const std::string& url) | ||
1785 | { | ||
1786 | #if LL_WINDOWS | ||
1787 | wchar_t window_class[256]; /* Flawfinder: ignore */ // Assume max length < 255 chars. | ||
1788 | mbstowcs(window_class, sWindowClass, 255); | ||
1789 | window_class[255] = 0; | ||
1790 | // Use the class instead of the window name. | ||
1791 | HWND other_window = FindWindow(window_class, NULL); | ||
1792 | if (other_window != NULL) | ||
1793 | { | ||
1794 | lldebugs << "Found other window with the name '" << gWindowTitle << "'" << llendl; | ||
1795 | COPYDATASTRUCT cds; | ||
1796 | const S32 SLURL_MESSAGE_TYPE = 0; | ||
1797 | cds.dwData = SLURL_MESSAGE_TYPE; | ||
1798 | cds.cbData = url.length() + 1; | ||
1799 | cds.lpData = (void*)url.c_str(); | ||
1800 | |||
1801 | LRESULT msg_result = SendMessage(other_window, WM_COPYDATA, NULL, (LPARAM)&cds); | ||
1802 | lldebugs << "SendMessage(WM_COPYDATA) to other window '" | ||
1803 | << gWindowTitle << "' returned " << msg_result << llendl; | ||
1804 | return true; | ||
1805 | } | ||
1806 | #endif | ||
1807 | return false; | ||
1808 | } | ||
1809 | |||
1810 | BOOL another_instance_running() | ||
1811 | { | ||
1812 | // We create a marker file when the program starts and remove the file when it finishes. | ||
1813 | // If the file is currently locked, that means another process is already running. | ||
1814 | |||
1815 | std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker"); | ||
1816 | llinfos << "Checking marker file for lock..." << llendl; | ||
1817 | |||
1818 | // If file doesn't exist, we create it | ||
1819 | // If file does exist, try to get writing privilages | ||
1820 | FILE* fMarker = LLFile::fopen(marker_file.c_str(), "rb"); /* Flawfinder: ignore */ | ||
1821 | if (fMarker != NULL) | ||
1822 | { | ||
1823 | // File exists, try opening with write permissions | ||
1824 | fclose(fMarker); | ||
1825 | fMarker = LLFile::fopen(marker_file.c_str(), "wb"); /* Flawfinder: ignore */ | ||
1826 | if (fMarker == NULL) | ||
1827 | { | ||
1828 | llinfos << "Marker file is locked." << llendl; | ||
1829 | return TRUE; | ||
1830 | } | ||
1831 | #if LL_DARWIN | ||
1832 | // Try to lock it. On Mac, this is the only way to test if it's actually locked. | ||
1833 | if (flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1) | ||
1834 | { | ||
1835 | // Lock failed - somebody else has it. | ||
1836 | fclose(fMarker); | ||
1837 | llinfos << "Marker file is locked." << llendl; | ||
1838 | return TRUE; | ||
1839 | } | ||
1840 | #endif | ||
1841 | fclose(fMarker); | ||
1842 | } | ||
1843 | llinfos << "Marker file isn't locked." << llendl; | ||
1844 | return FALSE; | ||
1845 | } | ||
1846 | |||
1847 | |||
1848 | void check_for_events() | ||
1849 | { | ||
1850 | LLFastTimer t2(LLFastTimer::FTM_MESSAGES); | ||
1851 | #if LL_WINDOWS | ||
1852 | if (!LLWinDebug::setupExceptionHandler()) | ||
1853 | { | ||
1854 | llwarns << " Someone took over my exception handler (post messagehandling)!" << llendl; | ||
1855 | } | ||
1856 | #endif | ||
1857 | |||
1858 | gViewerWindow->mWindow->gatherInput(); | ||
1859 | } | ||
1860 | |||
1861 | #include "moviemaker.h" | ||
1862 | extern BOOL gbCapturing; | ||
1863 | |||
1864 | #if !LL_SOLARIS | ||
1865 | extern MovieMaker gMovieMaker; | ||
1866 | #endif | ||
1867 | |||
1868 | void main_loop() | ||
1869 | { | ||
1870 | // Create IO Pump to use for HTTP Requests. | ||
1871 | gServicePump = new LLPumpIO(gAPRPoolp); | ||
1872 | LLHTTPClient::setPump(*gServicePump); | ||
1873 | LLHTTPClient::setCABundle(gDirUtilp->getCAFile()); | ||
1874 | |||
1875 | // initialize voice stuff here | ||
1876 | gLocalSpeakerMgr = new LLLocalSpeakerMgr(); | ||
1877 | gActiveChannelSpeakerMgr = new LLActiveSpeakerMgr(); | ||
1878 | |||
1879 | LLVoiceChannel::initClass(); | ||
1880 | LLVoiceClient::init(gServicePump); | ||
1881 | |||
1882 | LLMemType mt1(LLMemType::MTYPE_MAIN); | ||
1883 | LLTimer frameTimer,idleTimer; | ||
1884 | LLTimer debugTime; | ||
1885 | |||
1886 | // Handle messages | ||
1887 | while (!gQuit) | ||
1888 | { | ||
1889 | LLFastTimer::reset(); // Should be outside of any timer instances | ||
1890 | { | ||
1891 | LLFastTimer t(LLFastTimer::FTM_FRAME); | ||
1892 | |||
1893 | check_for_events(); | ||
1894 | |||
1895 | #if 1 && !RELEASE_FOR_DOWNLOAD | ||
1896 | // once per second debug info | ||
1897 | if (debugTime.getElapsedTimeF32() > 1.f) | ||
1898 | { | ||
1899 | debugTime.reset(); | ||
1900 | } | ||
1901 | #endif | ||
1902 | if (!gQuit) | ||
1903 | { | ||
1904 | // Scan keyboard for movement keys. Command keys and typing | ||
1905 | // are handled by windows callbacks. Don't do this until we're | ||
1906 | // done initializing. JC | ||
1907 | if (gViewerWindow->mWindow->getVisible() | ||
1908 | && gViewerWindow->getActive() | ||
1909 | && !gViewerWindow->mWindow->getMinimized() | ||
1910 | && LLStartUp::getStartupState() == STATE_STARTED | ||
1911 | && !gViewerWindow->getShowProgress() | ||
1912 | && !gFocusMgr.focusLocked()) | ||
1913 | { | ||
1914 | gKeyboard->scanKeyboard(); | ||
1915 | LLViewerJoystick::scanJoystick(); | ||
1916 | } | ||
1917 | |||
1918 | // Update state based on messages, user input, object idle. | ||
1919 | { | ||
1920 | LLFastTimer t3(LLFastTimer::FTM_IDLE); | ||
1921 | idle(); | ||
1922 | LLCurl::process(); | ||
1923 | gAres->process(); | ||
1924 | // this pump is necessary to make the login screen show up | ||
1925 | gServicePump->pump(); | ||
1926 | gServicePump->callback(); | ||
1927 | } | ||
1928 | |||
1929 | if (gDoDisconnect && (LLStartUp::getStartupState() == STATE_STARTED)) | ||
1930 | { | ||
1931 | save_final_snapshot(NULL); | ||
1932 | disconnect_viewer(NULL); | ||
1933 | } | ||
1934 | |||
1935 | // Render scene. | ||
1936 | if (!gQuit) | ||
1937 | { | ||
1938 | display(); | ||
1939 | |||
1940 | LLFloaterSnapshot::update(); // take snapshots | ||
1941 | |||
1942 | #if !LL_SOLARIS | ||
1943 | if (gbCapturing) | ||
1944 | { | ||
1945 | gMovieMaker.Snap(); | ||
1946 | } | ||
1947 | #endif | ||
1948 | #if LL_WINDOWS && LL_LCD_COMPILE | ||
1949 | // update LCD Screen | ||
1950 | gLcdScreen->UpdateDisplay(); | ||
1951 | #endif | ||
1952 | } | ||
1953 | } | ||
1954 | |||
1955 | // Sleep and run background threads | ||
1956 | { | ||
1957 | LLFastTimer t2(LLFastTimer::FTM_SLEEP); | ||
1958 | bool run_multiple_threads = gSavedSettings.getBOOL("RunMultipleThreads"); | ||
1959 | |||
1960 | // yield some time to the os based on command line option | ||
1961 | if(gYieldTime) | ||
1962 | { | ||
1963 | ms_sleep(gYieldMS); | ||
1964 | } | ||
1965 | |||
1966 | // yield cooperatively when not running as foreground window | ||
1967 | if ( gNoRender | ||
1968 | || !gViewerWindow->mWindow->getVisible() | ||
1969 | || !gFocusMgr.getAppHasFocus()) | ||
1970 | { | ||
1971 | // Sleep if we're not rendering, or the window is minimized. | ||
1972 | S32 milliseconds_to_sleep = llclamp(gSavedSettings.getS32("BackgroundYieldTime"), 0, 1000); | ||
1973 | // don't sleep when BackgroundYieldTime set to 0, since this will still yield to other threads | ||
1974 | // of equal priority on Windows | ||
1975 | if (milliseconds_to_sleep > 0) | ||
1976 | { | ||
1977 | ms_sleep(milliseconds_to_sleep); | ||
1978 | // also pause worker threads during this wait period | ||
1979 | gTextureCache->pause(); | ||
1980 | gImageDecodeThread->pause(); | ||
1981 | } | ||
1982 | } | ||
1983 | |||
1984 | if (gRandomizeFramerate) | ||
1985 | { | ||
1986 | ms_sleep(rand() % 200); | ||
1987 | } | ||
1988 | |||
1989 | if (gPeriodicSlowFrame | ||
1990 | && (gFrameCount % 10 == 0)) | ||
1991 | { | ||
1992 | llinfos << "Periodic slow frame - sleeping 500 ms" << llendl; | ||
1993 | ms_sleep(500); | ||
1994 | } | ||
1995 | |||
1996 | |||
1997 | const F64 min_frame_time = 0.0; //(.0333 - .0010); // max video frame rate = 30 fps | ||
1998 | const F64 min_idle_time = 0.0; //(.0010); // min idle time = 1 ms | ||
1999 | const F64 max_idle_time = run_multiple_threads ? min_idle_time : .005; // 5 ms | ||
2000 | idleTimer.reset(); | ||
2001 | while(1) | ||
2002 | { | ||
2003 | S32 work_pending = 0; | ||
2004 | S32 io_pending = 0; | ||
2005 | work_pending += gTextureCache->update(1); // unpauses the texture cache thread | ||
2006 | work_pending += gImageDecodeThread->update(1); // unpauses the image thread | ||
2007 | work_pending += gTextureFetch->update(1); // unpauses the texture fetch thread | ||
2008 | io_pending += LLVFSThread::updateClass(1); | ||
2009 | io_pending += LLLFSThread::updateClass(1); | ||
2010 | if (io_pending > 1000) | ||
2011 | { | ||
2012 | ms_sleep(llmin(io_pending/100,100)); // give the vfs some time to catch up | ||
2013 | } | ||
2014 | |||
2015 | F64 frame_time = frameTimer.getElapsedTimeF64(); | ||
2016 | F64 idle_time = idleTimer.getElapsedTimeF64(); | ||
2017 | if (frame_time >= min_frame_time && | ||
2018 | idle_time >= min_idle_time && | ||
2019 | (!work_pending || idle_time >= max_idle_time)) | ||
2020 | { | ||
2021 | break; | ||
2022 | } | ||
2023 | } | ||
2024 | frameTimer.reset(); | ||
2025 | |||
2026 | // Prevent the worker threads from running while rendering. | ||
2027 | // if (LLThread::processorCount()==1) //pause() should only be required when on a single processor client... | ||
2028 | if (run_multiple_threads == FALSE) | ||
2029 | { | ||
2030 | gTextureCache->pause(); | ||
2031 | gImageDecodeThread->pause(); | ||
2032 | // gTextureFetch->pause(); // Don't pause the fetch (IO) thread | ||
2033 | } | ||
2034 | //LLVFSThread::sLocal->pause(); // Prevent the VFS thread from running while rendering. | ||
2035 | //LLLFSThread::sLocal->pause(); // Prevent the LFS thread from running while rendering. | ||
2036 | } | ||
2037 | |||
2038 | } | ||
2039 | } | ||
2040 | |||
2041 | // Save snapshot for next time, if we made it through initialization | ||
2042 | if (STATE_STARTED == LLStartUp::getStartupState()) | ||
2043 | { | ||
2044 | save_final_snapshot(NULL); | ||
2045 | } | ||
2046 | |||
2047 | delete gServicePump; | ||
2048 | |||
2049 | llinfos << "Exiting main_loop" << llendflush; | ||
2050 | } | ||
2051 | |||
2052 | |||
2053 | void process_keystrokes_async() | ||
2054 | { | ||
2055 | #if LL_WINDOWS | ||
2056 | MSG msg; | ||
2057 | // look through all input messages, leaving them in the event queue | ||
2058 | while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE | PM_NOYIELD)) | ||
2059 | { | ||
2060 | // on first mouse message, break out | ||
2061 | if (msg.message >= WM_MOUSEFIRST && | ||
2062 | msg.message <= WM_MOUSELAST || | ||
2063 | msg.message == WM_QUIT) | ||
2064 | { | ||
2065 | break; | ||
2066 | } | ||
2067 | |||
2068 | // this is a message we want to handle now, so remove it from the event queue | ||
2069 | PeekMessage(&msg, NULL, msg.message, msg.message, PM_REMOVE | PM_NOYIELD); | ||
2070 | // if (msg.message == WM_KEYDOWN) | ||
2071 | // { | ||
2072 | // llinfos << "Process async key down " << (U32)msg.wParam << llendl; | ||
2073 | // } | ||
2074 | TranslateMessage(&msg); | ||
2075 | DispatchMessage(&msg); | ||
2076 | } | ||
2077 | |||
2078 | // Scan keyboard for movement keys. Command keys and typing | ||
2079 | // are handled by windows callbacks. Don't do this until we're | ||
2080 | // done initializing. JC | ||
2081 | if (gViewerWindow->mWindow->getVisible() | ||
2082 | && gViewerWindow->getActive() | ||
2083 | && !gViewerWindow->mWindow->getMinimized() | ||
2084 | && LLStartUp::getStartupState() == STATE_STARTED | ||
2085 | && !gViewerWindow->getShowProgress() | ||
2086 | && !gFocusMgr.focusLocked()) | ||
2087 | { | ||
2088 | gKeyboard->scanKeyboard(); | ||
2089 | } | ||
2090 | #endif | ||
2091 | } | ||
2092 | |||
2093 | //////////////////////////////////////////////// | ||
2094 | // | ||
2095 | // Functions | ||
2096 | // | ||
2097 | |||
2098 | FILE *gMarkerFile = NULL; | ||
2099 | |||
2100 | void remove_marker_file() | ||
2101 | { | ||
2102 | llinfos << "remove_marker_file()" << llendl; | ||
2103 | if (gMarkerFile != NULL) | ||
2104 | { | ||
2105 | fclose(gMarkerFile); | ||
2106 | gMarkerFile = NULL; | ||
2107 | } | ||
2108 | if( gDirUtilp ) | ||
2109 | { | ||
2110 | LLString marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker"); | ||
2111 | ll_apr_file_remove( marker_file ); | ||
2112 | } | ||
2113 | } | ||
2114 | |||
2115 | void init_marker_file() | ||
2116 | { | ||
2117 | #if LL_SOLARIS | ||
2118 | struct flock fl; | ||
2119 | fl.l_whence = SEEK_SET; | ||
2120 | fl.l_start = 0; | ||
2121 | fl.l_len = 1; | ||
2122 | #endif | ||
2123 | // We create a marker file when the program starts and remove the file when it finishes. | ||
2124 | // If the file is currently locked, that means another process is already running. | ||
2125 | // If the file exists and isn't locked, we crashed on the last run. | ||
2126 | |||
2127 | std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker"); | ||
2128 | llinfos << "Checking marker file for lock..." << llendl; | ||
2129 | |||
2130 | FILE* fMarker = LLFile::fopen(marker_file.c_str(), "rb"); /* Flawfinder: ignore */ | ||
2131 | if (fMarker != NULL) | ||
2132 | { | ||
2133 | // File exists, try opening with write permissions | ||
2134 | fclose(fMarker); | ||
2135 | fMarker = LLFile::fopen(marker_file.c_str(), "wb"); /* Flawfinder: ignore */ | ||
2136 | if (fMarker == NULL) | ||
2137 | { | ||
2138 | // Another instance is running. Skip the rest of these operations. | ||
2139 | llinfos << "Marker file is locked." << llendl; | ||
2140 | return; | ||
2141 | } | ||
2142 | #if LL_DARWIN | ||
2143 | // Try to lock it. On Mac, this is the only way to test if it's actually locked. | ||
2144 | if (flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1) | ||
2145 | { | ||
2146 | // Lock failed - somebody else has it. | ||
2147 | fclose(fMarker); | ||
2148 | llinfos << "Marker file is locked." << llendl; | ||
2149 | return; | ||
2150 | } | ||
2151 | #endif | ||
2152 | |||
2153 | // No other instances; we'll lock this file now & delete on quit. | ||
2154 | fclose(fMarker); | ||
2155 | gLastExecFroze = TRUE; | ||
2156 | llinfos << "Exec marker found: program froze on previous execution" << llendl; | ||
2157 | } | ||
2158 | |||
2159 | // Create the marker file for this execution & lock it | ||
2160 | // FILE *fp_executing_marker; | ||
2161 | #if LL_WINDOWS | ||
2162 | gMarkerFile = LLFile::_fsopen(marker_file.c_str(), "w", _SH_DENYWR); | ||
2163 | #else | ||
2164 | gMarkerFile = LLFile::fopen(marker_file.c_str(), "w"); /* Flawfinder: ignore */ | ||
2165 | if (gMarkerFile) | ||
2166 | { | ||
2167 | int fd = fileno(gMarkerFile); | ||
2168 | // Attempt to lock | ||
2169 | #if LL_SOLARIS | ||
2170 | fl.l_type = F_WRLCK; | ||
2171 | if (fcntl(fd, F_SETLK, &fl) == -1) | ||
2172 | #else | ||
2173 | if (flock(fd, LOCK_EX | LOCK_NB) == -1) | ||
2174 | #endif | ||
2175 | { | ||
2176 | llinfos << "Failed to lock file." << llendl; | ||
2177 | } | ||
2178 | } | ||
2179 | #endif | ||
2180 | if (gMarkerFile) | ||
2181 | { | ||
2182 | llinfos << "Marker file created." << llendl; | ||
2183 | } | ||
2184 | else | ||
2185 | { | ||
2186 | llinfos << "Failed to create marker file." << llendl; | ||
2187 | } | ||
2188 | |||
2189 | #if LL_WINDOWS | ||
2190 | // Clean up SecondLife.dmp files, to avoid confusion | ||
2191 | llinfos << "Removing SecondLife.dmp" << llendl; | ||
2192 | std::string dmp_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.dmp"); | ||
2193 | LLFile::remove(dmp_filename.c_str()); | ||
2194 | #endif | ||
2195 | |||
2196 | // This is to keep the crash reporter from constantly sending stale message logs | ||
2197 | // We wipe the message file now. | ||
2198 | llinfos << "Removing message.log" << llendl; | ||
2199 | std::string message_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "message.log"); | ||
2200 | LLFile::remove(message_filename.c_str()); | ||
2201 | |||
2202 | llinfos << "Exiting init_marker_file()." << llendl; | ||
2203 | } | ||
2204 | |||
2205 | void init_crash_handler() | ||
2206 | { | ||
2207 | ////////////////////////////////////////// | ||
2208 | // | ||
2209 | // Set up error handling and logging for LL_RELEASE_FOR_DOWNLOAD | ||
2210 | // | ||
2211 | |||
2212 | // Signal handling (or Win32 exception handling | ||
2213 | catch_signals(); | ||
2214 | |||
2215 | // Set the crash callback for the viewer | ||
2216 | gCrashCallback = viewer_crash_callback; | ||
2217 | } | ||
2218 | |||
2219 | void init_logging() | ||
2220 | { | ||
2221 | // Remove the last ".old" log file. | ||
2222 | std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, | ||
2223 | "SecondLife.old"); | ||
2224 | LLFile::remove(old_log_file.c_str()); | ||
2225 | |||
2226 | #if LL_LINUX || LL_SOLARIS | ||
2227 | // Remove the last stack trace, if any | ||
2228 | std::string old_stack_file = | ||
2229 | gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); | ||
2230 | LLFile::remove(old_stack_file.c_str()); | ||
2231 | #endif // LL_LINUX || LL_SOLARIS | ||
2232 | |||
2233 | // Rename current log file to ".old" | ||
2234 | std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, | ||
2235 | "SecondLife.log"); | ||
2236 | LLFile::rename(log_file.c_str(), old_log_file.c_str()); | ||
2237 | |||
2238 | // Set the log file to SecondLife.log | ||
2239 | |||
2240 | LLError::logToFile(log_file); | ||
2241 | } | ||
2242 | |||
2243 | void write_system_info() | ||
2244 | { | ||
2245 | write_debug("SL Log: "); | ||
2246 | write_debug(LLError::logFileName()); | ||
2247 | write_debug("\n"); | ||
2248 | |||
2249 | std::string tmp_str = gSecondLife | ||
2250 | + llformat(" version %d.%d.%d build %d", | ||
2251 | LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD); | ||
2252 | write_debug(tmp_str.c_str()); | ||
2253 | write_debug("\n"); | ||
2254 | write_debug(gSysCPU.getCPUString()); | ||
2255 | write_debug("\n"); | ||
2256 | |||
2257 | tmp_str = llformat("RAM: %u KB\n", gSysMemory.getPhysicalMemoryKB()); | ||
2258 | write_debug(tmp_str.c_str()); | ||
2259 | write_debug("OS: "); | ||
2260 | write_debug(gSysOS.getOSString().c_str()); | ||
2261 | write_debug("\n"); | ||
2262 | |||
2263 | // Dump some debugging info | ||
2264 | llinfos << gSecondLife << " version " | ||
2265 | << LL_VERSION_MAJOR << "." | ||
2266 | << LL_VERSION_MINOR << "." | ||
2267 | << LL_VERSION_PATCH | ||
2268 | << llendl; | ||
2269 | |||
2270 | // Dump the local time and time zone | ||
2271 | time_t now; | ||
2272 | time(&now); | ||
2273 | char tbuffer[256]; /* Flawfinder: ignore */ | ||
2274 | strftime(tbuffer, 256, "%Y-%m-%dT%H:%M:%S %Z", localtime(&now)); | ||
2275 | llinfos << "Local time: " << tbuffer << llendl; | ||
2276 | |||
2277 | // query some system information | ||
2278 | llinfos << "CPU info:\n" << gSysCPU << llendl; | ||
2279 | llinfos << "Memory info:\n" << gSysMemory << llendl; | ||
2280 | llinfos << "OS info: " << gSysOS << llendl; | ||
2281 | } | ||
2282 | |||
2283 | #if LL_WINDOWS | ||
2284 | void disable_win_error_reporting() | ||
2285 | { | ||
2286 | const char win_xp_string[] = "Microsoft Windows XP"; | ||
2287 | BOOL is_win_xp = ( gSysOS.getOSString().substr(0, strlen(win_xp_string) ) == win_xp_string ); /* Flawfinder: ignore*/ | ||
2288 | if( is_win_xp ) | ||
2289 | { | ||
2290 | // Note: we need to use run-time dynamic linking, because load-time dynamic linking will fail | ||
2291 | // on systems that don't have the library installed (all non-Windows XP systems) | ||
2292 | HINSTANCE fault_rep_dll_handle = LoadLibrary(L"faultrep.dll"); /* Flawfinder: ignore */ | ||
2293 | if( fault_rep_dll_handle ) | ||
2294 | { | ||
2295 | pfn_ADDEREXCLUDEDAPPLICATIONA pAddERExcludedApplicationA = (pfn_ADDEREXCLUDEDAPPLICATIONA) GetProcAddress(fault_rep_dll_handle, "AddERExcludedApplicationA"); | ||
2296 | if( pAddERExcludedApplicationA ) | ||
2297 | { | ||
2298 | |||
2299 | // Strip the path off the name | ||
2300 | const char* executable_name = gDirUtilp->getExecutableFilename().c_str(); | ||
2301 | |||
2302 | if( 0 == pAddERExcludedApplicationA( executable_name ) ) | ||
2303 | { | ||
2304 | U32 error_code = GetLastError(); | ||
2305 | llinfos << "AddERExcludedApplication() failed with error code " << error_code << llendl; | ||
2306 | } | ||
2307 | else | ||
2308 | { | ||
2309 | llinfos << "AddERExcludedApplication() success for " << executable_name << llendl; | ||
2310 | } | ||
2311 | } | ||
2312 | FreeLibrary( fault_rep_dll_handle ); | ||
2313 | } | ||
2314 | } | ||
2315 | } | ||
2316 | #endif // LL_WINDOWS | ||
2317 | |||
2318 | // On Windows, get the C:\ volume serial number. | ||
2319 | // On Mac, return the hardware serial number. | ||
2320 | std::string get_serial_number() | ||
2321 | { | ||
2322 | char serial_md5[MD5HEX_STR_SIZE]; /* Flawfinder: ignore */ | ||
2323 | serial_md5[0] = 0; | ||
2324 | |||
2325 | #if LL_WINDOWS | ||
2326 | DWORD serial = 0; | ||
2327 | DWORD flags = 0; | ||
2328 | BOOL success = GetVolumeInformation( | ||
2329 | L"C:\\", | ||
2330 | NULL, // volume name buffer | ||
2331 | 0, // volume name buffer size | ||
2332 | &serial, // volume serial | ||
2333 | NULL, // max component length | ||
2334 | &flags, // file system flags | ||
2335 | NULL, // file system name buffer | ||
2336 | 0); // file system name buffer size | ||
2337 | if (success) | ||
2338 | { | ||
2339 | LLMD5 md5; | ||
2340 | md5.update( (unsigned char*)&serial, sizeof(DWORD)); | ||
2341 | md5.finalize(); | ||
2342 | md5.hex_digest(serial_md5); | ||
2343 | } | ||
2344 | else | ||
2345 | { | ||
2346 | llwarns << "GetVolumeInformation failed" << llendl; | ||
2347 | } | ||
2348 | return serial_md5; | ||
2349 | |||
2350 | #elif LL_DARWIN | ||
2351 | // JC: Sample code from http://developer.apple.com/technotes/tn/tn1103.html | ||
2352 | CFStringRef serialNumber = NULL; | ||
2353 | io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, | ||
2354 | IOServiceMatching("IOPlatformExpertDevice")); | ||
2355 | if (platformExpert) { | ||
2356 | serialNumber = (CFStringRef) IORegistryEntryCreateCFProperty(platformExpert, | ||
2357 | CFSTR(kIOPlatformSerialNumberKey), | ||
2358 | kCFAllocatorDefault, 0); | ||
2359 | IOObjectRelease(platformExpert); | ||
2360 | } | ||
2361 | |||
2362 | if (serialNumber) | ||
2363 | { | ||
2364 | char buffer[MAX_STRING]; /* Flawfinder: ignore */ | ||
2365 | if (CFStringGetCString(serialNumber, buffer, MAX_STRING, kCFStringEncodingASCII)) | ||
2366 | { | ||
2367 | LLMD5 md5( (unsigned char*)buffer ); | ||
2368 | md5.hex_digest(serial_md5); | ||
2369 | } | ||
2370 | CFRelease(serialNumber); | ||
2371 | } | ||
2372 | |||
2373 | return serial_md5; | ||
2374 | |||
2375 | #elif LL_LINUX || LL_SOLARIS | ||
2376 | // TODO | ||
2377 | return serial_md5; | ||
2378 | |||
2379 | #endif | ||
2380 | } | ||
2381 | |||
2382 | #if LL_LINUX | ||
2383 | #define MAX_STACK_TRACE_DEPTH 40 | ||
2384 | // This uses glibc's basic built-in stack-trace functions for a not very | ||
2385 | // amazing backtrace. | ||
2386 | static inline BOOL do_basic_glibc_backtrace() | ||
2387 | { | ||
2388 | void *array[MAX_STACK_TRACE_DEPTH]; | ||
2389 | size_t size; | ||
2390 | char **strings; | ||
2391 | size_t i; | ||
2392 | BOOL success = FALSE; | ||
2393 | |||
2394 | size = backtrace(array, MAX_STACK_TRACE_DEPTH); | ||
2395 | strings = backtrace_symbols(array, size); | ||
2396 | |||
2397 | std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); | ||
2398 | llinfos << "Opening stack trace file " << strace_filename << llendl; | ||
2399 | FILE* StraceFile = LLFile::fopen(strace_filename.c_str(), "w"); /* Flawfinder: ignore */ | ||
2400 | if (!StraceFile) | ||
2401 | { | ||
2402 | llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl; | ||
2403 | StraceFile = stderr; | ||
2404 | } | ||
2405 | |||
2406 | if (size) | ||
2407 | { | ||
2408 | for (i = 0; i < size; i++) | ||
2409 | fputs((std::string(strings[i])+"\n").c_str(), | ||
2410 | StraceFile); | ||
2411 | |||
2412 | success = TRUE; | ||
2413 | } | ||
2414 | |||
2415 | if (StraceFile != stderr) | ||
2416 | fclose(StraceFile); | ||
2417 | |||
2418 | free (strings); | ||
2419 | return success; | ||
2420 | } | ||
2421 | |||
2422 | #if LL_ELFBIN | ||
2423 | // This uses glibc's basic built-in stack-trace functions together with | ||
2424 | // ELFIO's ability to parse the .symtab ELF section for better symbol | ||
2425 | // extraction without exporting symbols (which'd cause subtle, fatal bugs). | ||
2426 | static inline BOOL do_elfio_glibc_backtrace() | ||
2427 | { | ||
2428 | void *array[MAX_STACK_TRACE_DEPTH]; | ||
2429 | size_t btsize; | ||
2430 | char **strings; | ||
2431 | BOOL success = FALSE; | ||
2432 | |||
2433 | std::string appfilename = gDirUtilp->getExecutablePathAndName(); | ||
2434 | |||
2435 | std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); | ||
2436 | llinfos << "Opening stack trace file " << strace_filename << llendl; | ||
2437 | FILE* StraceFile = LLFile::fopen(strace_filename.c_str(), "w"); /* Flawfinder: ignore */ | ||
2438 | if (!StraceFile) | ||
2439 | { | ||
2440 | llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl; | ||
2441 | StraceFile = stderr; | ||
2442 | } | ||
2443 | |||
2444 | // get backtrace address list and basic symbol info | ||
2445 | btsize = backtrace(array, MAX_STACK_TRACE_DEPTH); | ||
2446 | strings = backtrace_symbols(array, btsize); | ||
2447 | |||
2448 | // create ELF reader for our app binary | ||
2449 | IELFI* pReader; | ||
2450 | const IELFISection* pSec = NULL; | ||
2451 | IELFISymbolTable* pSymTbl = 0; | ||
2452 | if (ERR_ELFIO_NO_ERROR != ELFIO::GetInstance()->CreateELFI(&pReader) || | ||
2453 | ERR_ELFIO_NO_ERROR != pReader->Load(appfilename.c_str()) || | ||
2454 | // find symbol table, create reader-object | ||
2455 | NULL == (pSec = pReader->GetSection( ".symtab" )) || | ||
2456 | ERR_ELFIO_NO_ERROR != pReader->CreateSectionReader(IELFI::ELFI_SYMBOL, pSec, (void**)&pSymTbl) ) | ||
2457 | { | ||
2458 | // Failed to open our binary and read its symbol table somehow | ||
2459 | llinfos << "Could not initialize ELF symbol reading - doing basic backtrace." << llendl; | ||
2460 | if (StraceFile != stderr) | ||
2461 | fclose(StraceFile); | ||
2462 | // note that we may be leaking some of the above ELFIO | ||
2463 | // objects now, but it's expected that we'll be dead soon | ||
2464 | // and we want to tread delicately until we get *some* kind | ||
2465 | // of useful backtrace. | ||
2466 | return do_basic_glibc_backtrace(); | ||
2467 | } | ||
2468 | |||
2469 | // iterate over trace and symtab, looking for plausible symbols | ||
2470 | std::string name; | ||
2471 | Elf32_Addr value; | ||
2472 | Elf32_Word ssize; | ||
2473 | unsigned char bind; | ||
2474 | unsigned char type; | ||
2475 | Elf32_Half section; | ||
2476 | int nSymNo = pSymTbl->GetSymbolNum(); | ||
2477 | size_t btpos; | ||
2478 | for (btpos = 0; btpos < btsize; ++btpos) | ||
2479 | { | ||
2480 | fprintf(StraceFile, "%d:\t", btpos); | ||
2481 | int symidx; | ||
2482 | for (symidx = 0; symidx < nSymNo; ++symidx) | ||
2483 | { | ||
2484 | if (ERR_ELFIO_NO_ERROR == | ||
2485 | pSymTbl->GetSymbol(symidx, name, value, ssize, | ||
2486 | bind, type, section)) | ||
2487 | { | ||
2488 | // check if trace address within symbol range | ||
2489 | if (uintptr_t(array[btpos]) >= value && | ||
2490 | uintptr_t(array[btpos]) < value+ssize) | ||
2491 | { | ||
2492 | char *demangled_str = NULL; | ||
2493 | int demangle_result = 1; | ||
2494 | demangled_str = | ||
2495 | abi::__cxa_demangle | ||
2496 | (name.c_str(), NULL, NULL, | ||
2497 | &demangle_result); | ||
2498 | if (0 == demangle_result && | ||
2499 | NULL != demangled_str) { | ||
2500 | fprintf(StraceFile, | ||
2501 | "ELF(%s", demangled_str); | ||
2502 | free(demangled_str); | ||
2503 | } | ||
2504 | else // failed demangle; print it raw | ||
2505 | { | ||
2506 | fprintf(StraceFile, | ||
2507 | "ELF(%s", name.c_str()); | ||
2508 | } | ||
2509 | // print offset from symbol start | ||
2510 | fprintf(StraceFile, | ||
2511 | "+0x%lx) [%p]\n", | ||
2512 | uintptr_t(array[btpos]) - | ||
2513 | value, | ||
2514 | array[btpos]); | ||
2515 | goto got_sym; // early escape | ||
2516 | } | ||
2517 | } | ||
2518 | } | ||
2519 | // Fallback: | ||
2520 | // Didn't find a suitable symbol in the binary - it's probably | ||
2521 | // a symbol in a DSO; use glibc's idea of what it should be. | ||
2522 | fprintf(StraceFile, "%s\n", strings[btpos]); | ||
2523 | got_sym:; | ||
2524 | } | ||
2525 | |||
2526 | if (StraceFile != stderr) | ||
2527 | fclose(StraceFile); | ||
2528 | |||
2529 | pSymTbl->Release(); | ||
2530 | pSec->Release(); | ||
2531 | pReader->Release(); | ||
2532 | |||
2533 | free(strings); | ||
2534 | |||
2535 | llinfos << "Finished generating stack trace." << llendl; | ||
2536 | |||
2537 | success = TRUE; | ||
2538 | return success; | ||
2539 | } | ||
2540 | #endif // LL_ELFBIN | ||
2541 | #endif // LL_LINUX | ||
2542 | |||
2543 | /* Report whether we're being run under the control of a debugger. */ | ||
2544 | static inline bool being_debugged() | ||
2545 | { | ||
2546 | static enum {unknown, no, yes} debugged = unknown; | ||
2547 | |||
2548 | if (debugged == unknown) | ||
2549 | { | ||
2550 | #if LL_LINUX | ||
2551 | pid_t ppid = getppid(); | ||
2552 | char *name; | ||
2553 | int ret; | ||
2554 | |||
2555 | ret = asprintf(&name, "/proc/%d/exe", ppid); | ||
2556 | if (ret != -1) | ||
2557 | { | ||
2558 | char buf[1024]; | ||
2559 | ssize_t n; | ||
2560 | |||
2561 | n = readlink(name, buf, sizeof(buf) - 1); | ||
2562 | if (n != -1) | ||
2563 | { | ||
2564 | char *base = strrchr(buf, '/'); | ||
2565 | buf[n + 1] = '\0'; | ||
2566 | if (base == NULL) | ||
2567 | { | ||
2568 | base = buf; | ||
2569 | } else { | ||
2570 | base += 1; | ||
2571 | } | ||
2572 | |||
2573 | if (strcmp(base, "gdb") == 0) | ||
2574 | { | ||
2575 | debugged = yes; | ||
2576 | } | ||
2577 | } | ||
2578 | free(name); | ||
2579 | } | ||
2580 | #endif // LL_LINUX | ||
2581 | } | ||
2582 | |||
2583 | return debugged == yes; | ||
2584 | } | ||
2585 | |||
2586 | #ifdef LL_SOLARIS | ||
2587 | static inline BOOL do_basic_glibc_backtrace() | ||
2588 | { | ||
2589 | BOOL success = FALSE; | ||
2590 | |||
2591 | std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log"); | ||
2592 | llinfos << "Opening stack trace file " << strace_filename << llendl; | ||
2593 | FILE* StraceFile = LLFile::fopen(strace_filename.c_str(), "w"); | ||
2594 | if (!StraceFile) | ||
2595 | { | ||
2596 | llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl; | ||
2597 | StraceFile = stderr; | ||
2598 | } | ||
2599 | |||
2600 | printstack(fileno(StraceFile)); | ||
2601 | |||
2602 | if (StraceFile != stderr) | ||
2603 | fclose(StraceFile); | ||
2604 | |||
2605 | return success; | ||
2606 | } | ||
2607 | #endif // LL_SOLARIS | ||
2608 | |||
2609 | void viewer_crash_callback() | ||
2610 | { | ||
2611 | // This will drop us into the debugger. | ||
2612 | if (being_debugged()) | ||
2613 | { | ||
2614 | abort(); | ||
2615 | } | ||
2616 | |||
2617 | // Returns whether a dialog was shown. | ||
2618 | // Only do the logic in here once | ||
2619 | if (gReportedCrash) | ||
2620 | { | ||
2621 | return; | ||
2622 | } | ||
2623 | gReportedCrash = TRUE; | ||
2624 | |||
2625 | BOOL do_crash_report = FALSE; | ||
2626 | |||
2627 | do_crash_report = TRUE; | ||
2628 | |||
2629 | write_debug("Viewer exe: "); | ||
2630 | write_debug(gDirUtilp->getExecutablePathAndName().c_str()); | ||
2631 | write_debug("\n"); | ||
2632 | write_debug("Cur path: "); | ||
2633 | write_debug(gDirUtilp->getCurPath().c_str()); | ||
2634 | write_debug("\n\n"); | ||
2635 | |||
2636 | if (gMessageSystem && gDirUtilp) | ||
2637 | { | ||
2638 | std::string filename; | ||
2639 | filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "stats.log"); | ||
2640 | llofstream file(filename.c_str(), llofstream::binary); | ||
2641 | if(file.good()) | ||
2642 | { | ||
2643 | gMessageSystem->summarizeLogs(file); | ||
2644 | } | ||
2645 | } | ||
2646 | |||
2647 | if (gMessageSystem) | ||
2648 | { | ||
2649 | write_debug(gMessageSystem->getCircuitInfoString()); | ||
2650 | gMessageSystem->stopLogging(); | ||
2651 | } | ||
2652 | write_debug("\n"); | ||
2653 | if (gWorldp) | ||
2654 | { | ||
2655 | write_debug(gWorldp->getInfoString()); | ||
2656 | } | ||
2657 | |||
2658 | // Close the debug file | ||
2659 | close_debug(); | ||
2660 | LLError::logToFile(""); | ||
2661 | |||
2662 | // Close the SecondLife.log | ||
2663 | |||
2664 | remove_marker_file(); | ||
2665 | |||
2666 | #if LL_WINDOWS | ||
2667 | // Windows | ||
2668 | std::string exe_path = gDirUtilp->getAppRODataDir(); | ||
2669 | exe_path += gDirUtilp->getDirDelimiter(); | ||
2670 | exe_path += "win_crash_logger.exe"; | ||
2671 | |||
2672 | std::string arg_string = "-user "; | ||
2673 | arg_string += gUserServerName; | ||
2674 | |||
2675 | switch(gCrashBehavior) | ||
2676 | { | ||
2677 | case CRASH_BEHAVIOR_ASK: | ||
2678 | default: | ||
2679 | arg_string += " -dialog "; | ||
2680 | _spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL); | ||
2681 | break; | ||
2682 | |||
2683 | case CRASH_BEHAVIOR_ALWAYS_SEND: | ||
2684 | _spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL); | ||
2685 | break; | ||
2686 | |||
2687 | case CRASH_BEHAVIOR_NEVER_SEND: | ||
2688 | break; | ||
2689 | } | ||
2690 | |||
2691 | #elif LL_DARWIN | ||
2692 | // Macintosh | ||
2693 | LLString command_str; | ||
2694 | command_str = "crashreporter.app/Contents/MacOS/crashreporter "; | ||
2695 | command_str += "-user "; | ||
2696 | command_str += gUserServerName; | ||
2697 | command_str += " &"; // This backgrounds the command so system() doesn't block until the crashreporter exits. | ||
2698 | system(command_str.c_str()); /* Flawfinder: ignore */ | ||
2699 | |||
2700 | // Sometimes signals don't seem to quit the viewer. | ||
2701 | // Make sure we exit so as to not totally confuse the user. | ||
2702 | exit(1); | ||
2703 | #elif LL_LINUX || LL_SOLARIS | ||
2704 | // Always generate the report, have the logger do the asking, and | ||
2705 | // don't wait for the logger before exiting (-> total cleanup). | ||
2706 | if (CRASH_BEHAVIOR_NEVER_SEND != gCrashBehavior) | ||
2707 | { | ||
2708 | // This backtrace writes into stack_trace.log | ||
2709 | # if LL_ELFBIN | ||
2710 | do_elfio_glibc_backtrace(); // more useful backtrace | ||
2711 | # else | ||
2712 | do_basic_glibc_backtrace(); // only slightly useful backtrace | ||
2713 | # endif // LL_ELFBIN | ||
2714 | // launch the actual crash logger | ||
2715 | char* ask_dialog = "-dialog"; | ||
2716 | if (CRASH_BEHAVIOR_ASK != gCrashBehavior) | ||
2717 | ask_dialog = ""; // omit '-dialog' option | ||
2718 | std::string cmd =gDirUtilp->getAppRODataDir(); | ||
2719 | cmd += gDirUtilp->getDirDelimiter(); | ||
2720 | cmd += "linux-crash-logger.bin"; | ||
2721 | char* const cmdargv[] = | ||
2722 | {(char*)cmd.c_str(), | ||
2723 | ask_dialog, | ||
2724 | (char*)"-user", | ||
2725 | (char*)gUserServerName, | ||
2726 | (char*)"-name", | ||
2727 | (char*)gSecondLife.c_str(), | ||
2728 | NULL}; | ||
2729 | fflush(NULL); | ||
2730 | pid_t pid = fork(); | ||
2731 | if (pid == 0) | ||
2732 | { // child | ||
2733 | execv(cmd.c_str(), cmdargv); /* Flawfinder: ignore */ | ||
2734 | llwarns << "execv failure when trying to start " << cmd << llendl; | ||
2735 | _exit(1); // avoid atexit() | ||
2736 | } else { | ||
2737 | if (pid > 0) | ||
2738 | { | ||
2739 | // DO NOT wait for child proc to die; we want | ||
2740 | // the logger to outlive us while we quit to | ||
2741 | // free up the screen/keyboard/etc. | ||
2742 | ////int childExitStatus; | ||
2743 | ////waitpid(pid, &childExitStatus, 0); | ||
2744 | } else { | ||
2745 | llwarns << "fork failure." << llendl; | ||
2746 | } | ||
2747 | } | ||
2748 | } | ||
2749 | // Sometimes signals don't seem to quit the viewer. | ||
2750 | // Make sure we exit so as to not totally confuse the user. | ||
2751 | exit(1); | ||
2752 | #else | ||
2753 | #error do something with your platform. | ||
2754 | #endif // LL_DARWIN | ||
2755 | |||
2756 | return; | ||
2757 | } | ||
2758 | |||
2759 | |||
2760 | |||
2761 | BOOL init_cache() | ||
2762 | { | ||
2763 | gPurgeCache = FALSE; | ||
2764 | // Purge cache if user requested it | ||
2765 | if (gSavedSettings.getBOOL("PurgeCacheOnStartup") || | ||
2766 | gSavedSettings.getBOOL("PurgeCacheOnNextStartup")) | ||
2767 | { | ||
2768 | gSavedSettings.setBOOL("PurgeCacheOnNextStartup", FALSE); | ||
2769 | gPurgeCache = TRUE; | ||
2770 | } | ||
2771 | // Purge cache if it belongs to an old version | ||
2772 | else | ||
2773 | { | ||
2774 | static const S32 cache_version = 5; | ||
2775 | if (gSavedSettings.getS32("LocalCacheVersion") != cache_version) | ||
2776 | { | ||
2777 | gPurgeCache = TRUE; | ||
2778 | gSavedSettings.setS32("LocalCacheVersion", cache_version); | ||
2779 | } | ||
2780 | } | ||
2781 | |||
2782 | // Setup and verify the cache location | ||
2783 | LLString cache_location = gSavedSettings.getString("CacheLocation"); | ||
2784 | LLString new_cache_location = gSavedSettings.getString("NewCacheLocation"); | ||
2785 | if (new_cache_location != cache_location) | ||
2786 | { | ||
2787 | gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation")); | ||
2788 | purge_cache(); // purge old cache | ||
2789 | gSavedSettings.setString("CacheLocation", new_cache_location); | ||
2790 | } | ||
2791 | |||
2792 | if (!gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation"))) | ||
2793 | { | ||
2794 | llwarns << "Unable to set cache location" << llendl; | ||
2795 | gSavedSettings.setString("CacheLocation", ""); | ||
2796 | } | ||
2797 | |||
2798 | if (gPurgeCache) | ||
2799 | { | ||
2800 | LLSplashScreen::update("Clearing cache..."); | ||
2801 | purge_cache(); | ||
2802 | } | ||
2803 | |||
2804 | LLSplashScreen::update("Initializing Texture Cache..."); | ||
2805 | |||
2806 | // Init the texture cache | ||
2807 | // Allocate 80% of the cache size for textures | ||
2808 | BOOL read_only = gSecondInstance ? TRUE : FALSE; | ||
2809 | const S32 MB = 1024*1024; | ||
2810 | S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB; | ||
2811 | const S64 MAX_CACHE_SIZE = 1024*MB; | ||
2812 | cache_size = llmin(cache_size, MAX_CACHE_SIZE); | ||
2813 | S64 texture_cache_size = ((cache_size * 8)/10); | ||
2814 | S64 extra = gTextureCache->initCache(LL_PATH_CACHE, texture_cache_size, read_only); | ||
2815 | texture_cache_size -= extra; | ||
2816 | |||
2817 | LLSplashScreen::update("Initializing VFS..."); | ||
2818 | |||
2819 | // Init the VFS | ||
2820 | S64 vfs_size = cache_size - texture_cache_size; | ||
2821 | const S64 MAX_VFS_SIZE = 1024 * MB; // 1 GB | ||
2822 | vfs_size = llmin(vfs_size, MAX_VFS_SIZE); | ||
2823 | vfs_size = (vfs_size / MB) * MB; // make sure it is MB aligned | ||
2824 | U32 vfs_size_u32 = (U32)vfs_size; | ||
2825 | U32 old_vfs_size = gSavedSettings.getU32("VFSOldSize") * MB; | ||
2826 | bool resize_vfs = (vfs_size_u32 != old_vfs_size); | ||
2827 | if (resize_vfs) | ||
2828 | { | ||
2829 | gSavedSettings.setU32("VFSOldSize", vfs_size_u32/MB); | ||
2830 | } | ||
2831 | llinfos << "VFS CACHE SIZE: " << vfs_size/(1024*1024) << " MB" << llendl; | ||
2832 | |||
2833 | // This has to happen BEFORE starting the vfs | ||
2834 | //time_t ltime; | ||
2835 | srand(time(NULL)); /* Flawfinder: ignore */ | ||
2836 | U32 old_salt = gSavedSettings.getU32("VFSSalt"); | ||
2837 | U32 new_salt; | ||
2838 | char old_vfs_data_file[LL_MAX_PATH]; /* Flawfinder: ignore */ | ||
2839 | char old_vfs_index_file[LL_MAX_PATH]; /* Flawfinder: ignore */ | ||
2840 | char new_vfs_data_file[LL_MAX_PATH]; /* Flawfinder: ignore */ | ||
2841 | char new_vfs_index_file[LL_MAX_PATH]; /* Flawfinder: ignore */ | ||
2842 | char static_vfs_index_file[LL_MAX_PATH]; /* Flawfinder: ignore */ | ||
2843 | char static_vfs_data_file[LL_MAX_PATH]; /* Flawfinder: ignore */ | ||
2844 | |||
2845 | if (gMultipleViewersOK) | ||
2846 | { | ||
2847 | // don't mess with renaming the VFS in this case | ||
2848 | new_salt = old_salt; | ||
2849 | } | ||
2850 | else | ||
2851 | { | ||
2852 | do | ||
2853 | { | ||
2854 | new_salt = rand(); | ||
2855 | } while( new_salt == old_salt ); | ||
2856 | } | ||
2857 | |||
2858 | snprintf(old_vfs_data_file, LL_MAX_PATH, "%s%u", /* Flawfinder: ignore */ | ||
2859 | gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE).c_str(), | ||
2860 | old_salt); | ||
2861 | |||
2862 | // make sure this file exists | ||
2863 | llstat s; | ||
2864 | S32 stat_result = LLFile::stat(old_vfs_data_file, &s); | ||
2865 | if (stat_result) | ||
2866 | { | ||
2867 | // doesn't exist, look for a data file | ||
2868 | std::string mask; | ||
2869 | mask = gDirUtilp->getDirDelimiter(); | ||
2870 | mask += VFS_DATA_FILE_BASE; | ||
2871 | mask += "*"; | ||
2872 | |||
2873 | std::string dir; | ||
2874 | dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""); | ||
2875 | |||
2876 | std::string found_file; | ||
2877 | if (gDirUtilp->getNextFileInDir(dir, mask, found_file, FALSE)) | ||
2878 | { | ||
2879 | snprintf(old_vfs_data_file, LL_MAX_PATH, "%s%s%s", dir.c_str(), gDirUtilp->getDirDelimiter().c_str(), found_file.c_str()); /* Flawfinder: ignore */ | ||
2880 | |||
2881 | S32 start_pos; | ||
2882 | S32 length = strlen(found_file.c_str()); /* Flawfinder: ignore*/ | ||
2883 | for (start_pos = length - 1; start_pos >= 0; start_pos--) | ||
2884 | { | ||
2885 | if (found_file[start_pos] == '.') | ||
2886 | { | ||
2887 | start_pos++; | ||
2888 | break; | ||
2889 | } | ||
2890 | } | ||
2891 | if (start_pos > 0) | ||
2892 | { | ||
2893 | sscanf(found_file.c_str() + start_pos, "%d", &old_salt); | ||
2894 | } | ||
2895 | llinfos << "Default vfs data file not present, found " << old_vfs_data_file << llendl; | ||
2896 | llinfos << "Old salt: " << old_salt << llendl; | ||
2897 | } | ||
2898 | } | ||
2899 | |||
2900 | snprintf(old_vfs_index_file, LL_MAX_PATH, "%s%u", /* Flawfinder: ignore */ | ||
2901 | gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_INDEX_FILE_BASE).c_str(), | ||
2902 | old_salt); | ||
2903 | |||
2904 | stat_result = LLFile::stat(old_vfs_index_file, &s); | ||
2905 | if (stat_result) | ||
2906 | { | ||
2907 | // We've got a bad/missing index file, nukem! | ||
2908 | llwarns << "Bad or missing vfx index file " << old_vfs_index_file << llendl; | ||
2909 | llwarns << "Removing old vfs data file " << old_vfs_data_file << llendl; | ||
2910 | LLFile::remove(old_vfs_data_file); | ||
2911 | LLFile::remove(old_vfs_index_file); | ||
2912 | |||
2913 | // Just in case, nuke any other old cache files in the directory. | ||
2914 | std::string dir; | ||
2915 | dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""); | ||
2916 | |||
2917 | std::string mask; | ||
2918 | mask = gDirUtilp->getDirDelimiter(); | ||
2919 | mask += VFS_DATA_FILE_BASE; | ||
2920 | mask += "*"; | ||
2921 | |||
2922 | gDirUtilp->deleteFilesInDir(dir, mask); | ||
2923 | |||
2924 | mask = gDirUtilp->getDirDelimiter(); | ||
2925 | mask += VFS_INDEX_FILE_BASE; | ||
2926 | mask += "*"; | ||
2927 | |||
2928 | gDirUtilp->deleteFilesInDir(dir, mask); | ||
2929 | } | ||
2930 | |||
2931 | snprintf(new_vfs_data_file, LL_MAX_PATH, "%s%u", /* Flawfinder: ignore */ | ||
2932 | gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE).c_str(), | ||
2933 | new_salt); | ||
2934 | |||
2935 | snprintf(new_vfs_index_file, LL_MAX_PATH, "%s%u", gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_INDEX_FILE_BASE).c_str(), /* Flawfinder: ignore */ | ||
2936 | new_salt); | ||
2937 | |||
2938 | |||
2939 | strncpy(static_vfs_data_file, gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_data.db2").c_str(), LL_MAX_PATH -1); /* Flawfinder: ignore */ | ||
2940 | static_vfs_data_file[LL_MAX_PATH -1] = '\0'; | ||
2941 | strncpy(static_vfs_index_file, gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_index.db2").c_str(), LL_MAX_PATH -1); /* Flawfinder: ignore */ | ||
2942 | static_vfs_index_file[LL_MAX_PATH -1] = '\0'; | ||
2943 | |||
2944 | if (resize_vfs) | ||
2945 | { | ||
2946 | llinfos << "Removing old vfs and re-sizing" << llendl; | ||
2947 | |||
2948 | LLFile::remove(old_vfs_data_file); | ||
2949 | LLFile::remove(old_vfs_index_file); | ||
2950 | } | ||
2951 | else if (old_salt != new_salt) | ||
2952 | { | ||
2953 | // move the vfs files to a new name before opening | ||
2954 | llinfos << "Renaming " << old_vfs_data_file << " to " << new_vfs_data_file << llendl; | ||
2955 | llinfos << "Renaming " << old_vfs_index_file << " to " << new_vfs_index_file << llendl; | ||
2956 | LLFile::rename(old_vfs_data_file, new_vfs_data_file); | ||
2957 | LLFile::rename(old_vfs_index_file, new_vfs_index_file); | ||
2958 | } | ||
2959 | |||
2960 | // Startup the VFS... | ||
2961 | gSavedSettings.setU32("VFSSalt", new_salt); | ||
2962 | |||
2963 | // Don't remove VFS after viewer crashes. If user has corrupt data, they can reinstall. JC | ||
2964 | gVFS = new LLVFS(new_vfs_index_file, new_vfs_data_file, FALSE, vfs_size_u32, FALSE); | ||
2965 | if( VFSVALID_BAD_CORRUPT == gVFS->getValidState() ) | ||
2966 | { | ||
2967 | // Try again with fresh files | ||
2968 | // (The constructor deletes corrupt files when it finds them.) | ||
2969 | llwarns << "VFS corrupt, deleted. Making new VFS." << llendl; | ||
2970 | delete gVFS; | ||
2971 | gVFS = new LLVFS(new_vfs_index_file, new_vfs_data_file, FALSE, vfs_size_u32, FALSE); | ||
2972 | } | ||
2973 | |||
2974 | gStaticVFS = new LLVFS(static_vfs_index_file, static_vfs_data_file, TRUE, 0, FALSE); | ||
2975 | |||
2976 | BOOL success = gVFS->isValid() && gStaticVFS->isValid(); | ||
2977 | if( !success ) | ||
2978 | { | ||
2979 | return FALSE; | ||
2980 | } | ||
2981 | else | ||
2982 | { | ||
2983 | LLVFile::initClass(); | ||
2984 | return TRUE; | ||
2985 | } | ||
2986 | } | ||
2987 | |||
2988 | #if LL_DARWIN | ||
2989 | |||
2990 | OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn) | ||
2991 | { | ||
2992 | OSErr result = noErr; | ||
2993 | DescType actualType; | ||
2994 | char buffer[1024]; /* Flawfinder: ignore */ | ||
2995 | Size size; | ||
2996 | |||
2997 | result = AEGetParamPtr ( | ||
2998 | messagein, | ||
2999 | keyDirectObject, | ||
3000 | typeCString, | ||
3001 | &actualType, | ||
3002 | (Ptr)buffer, | ||
3003 | sizeof(buffer), | ||
3004 | &size); | ||
3005 | |||
3006 | if(result == noErr) | ||
3007 | { | ||
3008 | std::string url = buffer; | ||
3009 | LLURLDispatcher::dispatch(url); | ||
3010 | } | ||
3011 | |||
3012 | return(result); | ||
3013 | } | ||
3014 | |||
3015 | OSErr AEQuitHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn) | ||
3016 | { | ||
3017 | OSErr result = noErr; | ||
3018 | |||
3019 | app_user_quit(); | ||
3020 | |||
3021 | return(result); | ||
3022 | } | ||
3023 | |||
3024 | OSStatus simpleDialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata) | ||
3025 | { | ||
3026 | OSStatus result = eventNotHandledErr; | ||
3027 | OSStatus err; | ||
3028 | UInt32 evtClass = GetEventClass(event); | ||
3029 | UInt32 evtKind = GetEventKind(event); | ||
3030 | WindowRef window = (WindowRef)userdata; | ||
3031 | |||
3032 | if((evtClass == kEventClassCommand) && (evtKind == kEventCommandProcess)) | ||
3033 | { | ||
3034 | HICommand cmd; | ||
3035 | err = GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(cmd), NULL, &cmd); | ||
3036 | |||
3037 | if(err == noErr) | ||
3038 | { | ||
3039 | switch(cmd.commandID) | ||
3040 | { | ||
3041 | case kHICommandOK: | ||
3042 | QuitAppModalLoopForWindow(window); | ||
3043 | result = noErr; | ||
3044 | break; | ||
3045 | |||
3046 | case kHICommandCancel: | ||
3047 | QuitAppModalLoopForWindow(window); | ||
3048 | result = userCanceledErr; | ||
3049 | break; | ||
3050 | } | ||
3051 | } | ||
3052 | } | ||
3053 | |||
3054 | return(result); | ||
3055 | } | ||
3056 | |||
3057 | OSStatus DisplayReleaseNotes(void) | ||
3058 | { | ||
3059 | OSStatus err; | ||
3060 | IBNibRef nib = NULL; | ||
3061 | WindowRef window = NULL; | ||
3062 | |||
3063 | err = CreateNibReference(CFSTR("SecondLife"), &nib); | ||
3064 | |||
3065 | if(err == noErr) | ||
3066 | { | ||
3067 | CreateWindowFromNib(nib, CFSTR("Release Notes"), &window); | ||
3068 | } | ||
3069 | |||
3070 | if(err == noErr) | ||
3071 | { | ||
3072 | // Get the text view control | ||
3073 | HIViewRef textView; | ||
3074 | ControlID id; | ||
3075 | |||
3076 | id.signature = 'text'; | ||
3077 | id.id = 0; | ||
3078 | |||
3079 | std::string releaseNotesText; | ||
3080 | _read_file_into_string(releaseNotesText, "releasenotes.txt"); | ||
3081 | |||
3082 | err = HIViewFindByID(HIViewGetRoot(window), id, &textView); | ||
3083 | |||
3084 | if(err == noErr) | ||
3085 | { | ||
3086 | // Convert from the encoding used in the release notes. | ||
3087 | CFStringRef str = CFStringCreateWithBytes( | ||
3088 | NULL, | ||
3089 | (const UInt8*)releaseNotesText.c_str(), | ||
3090 | releaseNotesText.size(), | ||
3091 | kCFStringEncodingWindowsLatin1, // This matches the way the Windows version displays the release notes. | ||
3092 | FALSE); | ||
3093 | |||
3094 | if(str != NULL) | ||
3095 | { | ||
3096 | int size = CFStringGetLength(str); | ||
3097 | |||
3098 | if(size > 0) | ||
3099 | { | ||
3100 | UniChar *chars = new UniChar[size + 1]; | ||
3101 | CFStringGetCharacters(str, CFRangeMake(0, size), chars); | ||
3102 | |||
3103 | err = TXNSetData(HITextViewGetTXNObject(textView), kTXNUnicodeTextData, chars, size * sizeof(UniChar), kTXNStartOffset, kTXNStartOffset); | ||
3104 | |||
3105 | delete[] chars; | ||
3106 | } | ||
3107 | |||
3108 | CFRelease(str); | ||
3109 | } | ||
3110 | else | ||
3111 | { | ||
3112 | // Creating the string failed. Probably an encoding problem. Display SOMETHING... | ||
3113 | err = TXNSetData(HITextViewGetTXNObject(textView), kTXNTextData, releaseNotesText.c_str(), releaseNotesText.size(), kTXNStartOffset, kTXNStartOffset); | ||
3114 | } | ||
3115 | } | ||
3116 | |||
3117 | // Set the selection to the beginning of the text and scroll it into view. | ||
3118 | if(err == noErr) | ||
3119 | { | ||
3120 | err = TXNSetSelection(HITextViewGetTXNObject(textView), kTXNStartOffset, kTXNStartOffset); | ||
3121 | } | ||
3122 | |||
3123 | if(err == noErr) | ||
3124 | { | ||
3125 | // This function returns void. | ||
3126 | TXNShowSelection(HITextViewGetTXNObject(textView), false); | ||
3127 | } | ||
3128 | } | ||
3129 | |||
3130 | if(err == noErr) | ||
3131 | { | ||
3132 | ShowWindow(window); | ||
3133 | } | ||
3134 | |||
3135 | if(err == noErr) | ||
3136 | { | ||
3137 | // Set up an event handler for the window. | ||
3138 | EventHandlerRef handler = NULL; | ||
3139 | EventTypeSpec handlerEvents[] = | ||
3140 | { | ||
3141 | { kEventClassCommand, kEventCommandProcess } | ||
3142 | }; | ||
3143 | |||
3144 | InstallWindowEventHandler( | ||
3145 | window, | ||
3146 | NewEventHandlerUPP(simpleDialogHandler), | ||
3147 | GetEventTypeCount (handlerEvents), | ||
3148 | handlerEvents, | ||
3149 | (void*)window, | ||
3150 | &handler); | ||
3151 | } | ||
3152 | |||
3153 | if(err == noErr) | ||
3154 | { | ||
3155 | RunAppModalLoopForWindow(window); | ||
3156 | } | ||
3157 | |||
3158 | if(window != NULL) | ||
3159 | { | ||
3160 | DisposeWindow(window); | ||
3161 | } | ||
3162 | |||
3163 | if(nib != NULL) | ||
3164 | { | ||
3165 | DisposeNibReference(nib); | ||
3166 | } | ||
3167 | |||
3168 | return(err); | ||
3169 | } | ||
3170 | |||
3171 | void init_apple_menu(const char* product) | ||
3172 | { | ||
3173 | // Load up a proper menu bar. | ||
3174 | { | ||
3175 | OSStatus err; | ||
3176 | IBNibRef nib = NULL; | ||
3177 | // NOTE: DO NOT translate or brand this string. It's an internal name in the .nib file, and MUST match exactly. | ||
3178 | err = CreateNibReference(CFSTR("SecondLife"), &nib); | ||
3179 | |||
3180 | if(err == noErr) | ||
3181 | { | ||
3182 | // NOTE: DO NOT translate or brand this string. It's an internal name in the .nib file, and MUST match exactly. | ||
3183 | SetMenuBarFromNib(nib, CFSTR("MenuBar")); | ||
3184 | } | ||
3185 | |||
3186 | if(nib != NULL) | ||
3187 | { | ||
3188 | DisposeNibReference(nib); | ||
3189 | } | ||
3190 | } | ||
3191 | |||
3192 | // Install a handler for 'gurl' AppleEvents. This is how secondlife:// URLs get passed to the viewer. | ||
3193 | |||
3194 | if(AEInstallEventHandler('GURL', 'GURL', NewAEEventHandlerUPP(AEGURLHandler),0, false) != noErr) | ||
3195 | { | ||
3196 | // Couldn't install AppleEvent handler. This error shouldn't be fatal. | ||
3197 | llinfos << "Couldn't install 'GURL' AppleEvent handler. Continuing..." << llendl; | ||
3198 | } | ||
3199 | |||
3200 | // Install a handler for 'quit' AppleEvents. This makes quitting the application from the dock work. | ||
3201 | if(AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP(AEQuitHandler),0, false) != noErr) | ||
3202 | { | ||
3203 | // Couldn't install AppleEvent handler. This error shouldn't be fatal. | ||
3204 | llinfos << "Couldn't install Quit AppleEvent handler. Continuing..." << llendl; | ||
3205 | } | ||
3206 | } | ||
3207 | #endif | ||
3208 | |||
3209 | void user_logout() | ||
3210 | { | ||
3211 | if (!gDoneLogout) | ||
3212 | { | ||
3213 | LLMessageSystem* msg = gMessageSystem; | ||
3214 | if (msg) | ||
3215 | { | ||
3216 | gSavedSettings.setBOOL("LoggedIn", FALSE); | ||
3217 | } | ||
3218 | gDoneLogout = TRUE; | ||
3219 | } | ||
3220 | } | ||
3221 | |||
3222 | |||
3223 | // This routine may get called more than once during the shutdown process. | ||
3224 | // This can happen because we need to get the screenshot before the window | ||
3225 | // is destroyed. | ||
3226 | void save_final_snapshot(void*) | ||
3227 | { | ||
3228 | if (!gHaveSavedSnapshot && !gNoRender) | ||
3229 | { | ||
3230 | gSavedSettings.setVector3d("FocusPosOnLogout", gAgent.calcFocusPositionTargetGlobal()); | ||
3231 | gSavedSettings.setVector3d("CameraPosOnLogout", gAgent.calcCameraPositionTargetGlobal()); | ||
3232 | gViewerWindow->setCursor(UI_CURSOR_WAIT); | ||
3233 | gAgent.changeCameraToThirdPerson( FALSE ); // don't animate, need immediate switch | ||
3234 | gSavedSettings.setBOOL("ShowParcelOwners", FALSE); | ||
3235 | idle(); | ||
3236 | |||
3237 | LLString snap_filename = gDirUtilp->getLindenUserDir(); | ||
3238 | snap_filename += gDirUtilp->getDirDelimiter(); | ||
3239 | snap_filename += SCREEN_LAST_FILENAME; | ||
3240 | gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidth(), gViewerWindow->getWindowHeight(), FALSE, TRUE); | ||
3241 | gHaveSavedSnapshot = TRUE; | ||
3242 | } | ||
3243 | } | ||
3244 | |||
3245 | // If you pass a path+file or URL in as a | ||
3246 | // Note: This may get called multiple times during shutdown. | ||
3247 | void app_force_quit(const char* launch_file_on_quit) | ||
3248 | { | ||
3249 | // Don't actually DO anything complicated here, because | ||
3250 | // it's called from signal handlers for the Mac on SIGTERM. | ||
3251 | // It calls this with NULL. | ||
3252 | if (launch_file_on_quit) | ||
3253 | { | ||
3254 | gLaunchFileOnQuit.assign( (const char*)launch_file_on_quit ); | ||
3255 | } | ||
3256 | |||
3257 | gQuit = TRUE; | ||
3258 | } | ||
3259 | |||
3260 | static void finish_quit(S32 option, void *userdata) | ||
3261 | { | ||
3262 | if (option == 0) | ||
3263 | { | ||
3264 | app_request_quit(); | ||
3265 | } | ||
3266 | } | ||
3267 | |||
3268 | void app_user_quit() | ||
3269 | { | ||
3270 | gViewerWindow->alertXml("ConfirmQuit", finish_quit, NULL); | ||
3271 | } | ||
3272 | |||
3273 | |||
3274 | // Don't quit instantly. Instead, request to be logged off. | ||
3275 | // Called from control-Q handler, Windows(tm) close-window message (WM_CLOSE), and Mac Quit AppleEvent handler. | ||
3276 | void app_request_quit() | ||
3277 | { | ||
3278 | llinfos << "app_request_quit" << llendl; | ||
3279 | |||
3280 | LLViewerRegion* region = gAgent.getRegion(); | ||
3281 | |||
3282 | if( (LLStartUp::getStartupState() < STATE_STARTED) || !region ) | ||
3283 | { | ||
3284 | // Quit immediately | ||
3285 | app_force_quit(NULL); | ||
3286 | return; | ||
3287 | } | ||
3288 | |||
3289 | if (gHUDManager) | ||
3290 | { | ||
3291 | LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral*)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); | ||
3292 | effectp->setPositionGlobal(gAgent.getPositionGlobal()); | ||
3293 | effectp->setColor(LLColor4U(gAgent.getEffectColor())); | ||
3294 | gHUDManager->sendEffects(); | ||
3295 | } | ||
3296 | |||
3297 | // Attempt to close all floaters that might be | ||
3298 | // editing things. | ||
3299 | if (gFloaterView) | ||
3300 | { | ||
3301 | // application is quitting | ||
3302 | gFloaterView->closeAllChildren(true); | ||
3303 | } | ||
3304 | |||
3305 | send_stats(); | ||
3306 | |||
3307 | gLogoutTimer.reset(); | ||
3308 | gQuitRequested = TRUE; | ||
3309 | } | ||
3310 | |||
3311 | |||
3312 | // User didn't really want to quit, for example, clicked "Cancel" | ||
3313 | // in a floater save dialog. | ||
3314 | void app_abort_quit() | ||
3315 | { | ||
3316 | llinfos << "app_abort_quit()" << llendl; | ||
3317 | gQuitRequested = FALSE; | ||
3318 | } | ||
3319 | |||
3320 | void idle_shutdown() | ||
3321 | { | ||
3322 | // Wait for all modal alerts to get resolved | ||
3323 | if (LLModalDialog::activeCount() > 0) | ||
3324 | { | ||
3325 | return; | ||
3326 | } | ||
3327 | |||
3328 | // close IM interface | ||
3329 | if(gIMMgr) | ||
3330 | { | ||
3331 | gIMMgr->disconnectAllSessions(); | ||
3332 | } | ||
3333 | |||
3334 | // Wait for all floaters to get resolved | ||
3335 | if (gFloaterView | ||
3336 | && !gFloaterView->allChildrenClosed()) | ||
3337 | { | ||
3338 | return; | ||
3339 | } | ||
3340 | |||
3341 | static bool saved_snapshot = false; | ||
3342 | if (!saved_snapshot) | ||
3343 | { | ||
3344 | saved_snapshot = true; | ||
3345 | save_final_snapshot(NULL); | ||
3346 | return; | ||
3347 | } | ||
3348 | |||
3349 | const F32 SHUTDOWN_UPLOAD_SAVE_TIME = 5.f; | ||
3350 | |||
3351 | S32 pending_uploads = gAssetStorage->getNumPendingUploads(); | ||
3352 | if (pending_uploads > 0 | ||
3353 | && gLogoutTimer.getElapsedTimeF32() < SHUTDOWN_UPLOAD_SAVE_TIME | ||
3354 | && !gLogoutRequestSent) | ||
3355 | { | ||
3356 | static S32 total_uploads = 0; | ||
3357 | // Sometimes total upload count can change during logout. | ||
3358 | total_uploads = llmax(total_uploads, pending_uploads); | ||
3359 | gViewerWindow->setShowProgress(TRUE); | ||
3360 | S32 finished_uploads = total_uploads - pending_uploads; | ||
3361 | F32 percent = 100.f * finished_uploads / total_uploads; | ||
3362 | gViewerWindow->setProgressPercent(percent); | ||
3363 | char buffer[MAX_STRING]; /* Flawfinder: ignore */ | ||
3364 | snprintf(buffer, MAX_STRING, "Saving final data..."); /* Flawfinder: ignore */ | ||
3365 | gViewerWindow->setProgressString(buffer); | ||
3366 | return; | ||
3367 | } | ||
3368 | |||
3369 | // All floaters are closed. Tell server we want to quit. | ||
3370 | if( !gLogoutRequestSent ) | ||
3371 | { | ||
3372 | send_logout_request(); | ||
3373 | |||
3374 | // Wait for a LogoutReply message | ||
3375 | gViewerWindow->setShowProgress(TRUE); | ||
3376 | gViewerWindow->setProgressPercent(100.f); | ||
3377 | gViewerWindow->setProgressString("Logging out..."); | ||
3378 | return; | ||
3379 | } | ||
3380 | |||
3381 | // Make sure that we quit if we haven't received a reply from the server. | ||
3382 | if( gLogoutRequestSent | ||
3383 | && gLogoutTimer.getElapsedTimeF32() > gLogoutMaxTime ) | ||
3384 | { | ||
3385 | app_force_quit(NULL); | ||
3386 | return; | ||
3387 | } | ||
3388 | } | ||
3389 | |||
3390 | |||
3391 | U32 gTotalLandIn = 0, gTotalLandOut = 0; | ||
3392 | U32 gTotalWaterIn = 0, gTotalWaterOut = 0; | ||
3393 | |||
3394 | F32 gAveLandCompression = 0.f, gAveWaterCompression = 0.f; | ||
3395 | F32 gBestLandCompression = 1.f, gBestWaterCompression = 1.f; | ||
3396 | F32 gWorstLandCompression = 0.f, gWorstWaterCompression = 0.f; | ||
3397 | |||
3398 | F32 gFPSClamped = 10.f; // Pretend we start at target rate. | ||
3399 | F32 gFrameDTClamped = 0.f; // Time between adjacent checks to network for packets | ||
3400 | F32 gFrameDT = 0.f; | ||
3401 | |||
3402 | //S32 gDecodedBits = 0; | ||
3403 | U32 gPacketsIn = 0; | ||
3404 | |||
3405 | U32 gTotalWorldBytes = 0, gTotalObjectBytes = 0, gTotalTextureBytes = 0, gSimPingCount = 0; | ||
3406 | U32 gObjectBits = 0; | ||
3407 | F32 gAvgSimPing = 0.f; | ||
3408 | |||
3409 | |||
3410 | extern U32 gVisCompared; | ||
3411 | extern U32 gVisTested; | ||
3412 | |||
3413 | |||
3414 | void update_statistics(U32 frame_count) | ||
3415 | { | ||
3416 | gTotalWorldBytes += gVLManager.getTotalBytes(); | ||
3417 | gTotalObjectBytes += gObjectBits / 8; | ||
3418 | gTotalTextureBytes += LLViewerImageList::sTextureBits / 8; | ||
3419 | |||
3420 | // make sure we have a valid time delta for this frame | ||
3421 | if (gFrameIntervalSeconds > 0.f) | ||
3422 | { | ||
3423 | if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) | ||
3424 | { | ||
3425 | gViewerStats->incStat(LLViewerStats::ST_MOUSELOOK_SECONDS, gFrameIntervalSeconds); | ||
3426 | } | ||
3427 | else if (gAgent.getCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR) | ||
3428 | { | ||
3429 | gViewerStats->incStat(LLViewerStats::ST_AVATAR_EDIT_SECONDS, gFrameIntervalSeconds); | ||
3430 | } | ||
3431 | else if (gFloaterTools && gFloaterTools->getVisible()) | ||
3432 | { | ||
3433 | gViewerStats->incStat(LLViewerStats::ST_TOOLBOX_SECONDS, gFrameIntervalSeconds); | ||
3434 | } | ||
3435 | } | ||
3436 | gViewerStats->setStat(LLViewerStats::ST_ENABLE_VBO, (F64)gSavedSettings.getBOOL("RenderVBOEnable")); | ||
3437 | gViewerStats->setStat(LLViewerStats::ST_LIGHTING_DETAIL, (F64)gSavedSettings.getS32("RenderLightingDetail")); | ||
3438 | gViewerStats->setStat(LLViewerStats::ST_DRAW_DIST, (F64)gSavedSettings.getF32("RenderFarClip")); | ||
3439 | gViewerStats->setStat(LLViewerStats::ST_CHAT_BUBBLES, (F64)gSavedSettings.getBOOL("UseChatBubbles")); | ||
3440 | #if 0 // 1.9.2 | ||
3441 | gViewerStats->setStat(LLViewerStats::ST_SHADER_OBJECTS, (F64)gSavedSettings.getS32("VertexShaderLevelObject")); | ||
3442 | gViewerStats->setStat(LLViewerStats::ST_SHADER_AVATAR, (F64)gSavedSettings.getBOOL("VertexShaderLevelAvatar")); | ||
3443 | gViewerStats->setStat(LLViewerStats::ST_SHADER_ENVIRONMENT, (F64)gSavedSettings.getBOOL("VertexShaderLevelEnvironment")); | ||
3444 | #endif | ||
3445 | gViewerStats->setStat(LLViewerStats::ST_FRAME_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_FRAME)); | ||
3446 | F64 idle_secs = gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_IDLE); | ||
3447 | F64 network_secs = gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_NETWORK); | ||
3448 | gViewerStats->setStat(LLViewerStats::ST_UPDATE_SECS, idle_secs - network_secs); | ||
3449 | gViewerStats->setStat(LLViewerStats::ST_NETWORK_SECS, network_secs); | ||
3450 | gViewerStats->setStat(LLViewerStats::ST_IMAGE_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_IMAGE_UPDATE)); | ||
3451 | gViewerStats->setStat(LLViewerStats::ST_REBUILD_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_REBUILD)); | ||
3452 | gViewerStats->setStat(LLViewerStats::ST_RENDER_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_RENDER_GEOMETRY)); | ||
3453 | |||
3454 | LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(gAgent.getRegion()->getHost()); | ||
3455 | if (cdp) | ||
3456 | { | ||
3457 | gViewerStats->mSimPingStat.addValue(cdp->getPingDelay()); | ||
3458 | gAvgSimPing = ((gAvgSimPing * (F32)gSimPingCount) + (F32)(cdp->getPingDelay())) / ((F32)gSimPingCount + 1); | ||
3459 | gSimPingCount++; | ||
3460 | } | ||
3461 | else | ||
3462 | { | ||
3463 | gViewerStats->mSimPingStat.addValue(10000); | ||
3464 | } | ||
3465 | |||
3466 | if (gFocusMgr.getAppHasFocus()) | ||
3467 | { | ||
3468 | gViewerStats->mFPSStat.addValue(1); | ||
3469 | } | ||
3470 | F32 layer_bits = (F32)(gVLManager.getLandBits() + gVLManager.getWindBits() + gVLManager.getCloudBits()); | ||
3471 | gViewerStats->mLayersKBitStat.addValue(layer_bits/1024.f); | ||
3472 | gViewerStats->mObjectKBitStat.addValue(gObjectBits/1024.f); | ||
3473 | gViewerStats->mTextureKBitStat.addValue(LLViewerImageList::sTextureBits/1024.f); | ||
3474 | gViewerStats->mVFSPendingOperations.addValue(LLVFile::getVFSThread()->getPending()); | ||
3475 | gViewerStats->mAssetKBitStat.addValue(gTransferManager.getTransferBitsIn(LLTCT_ASSET)/1024.f); | ||
3476 | gTransferManager.resetTransferBitsIn(LLTCT_ASSET); | ||
3477 | |||
3478 | static S32 tex_bits_idle_count = 0; | ||
3479 | if (LLViewerImageList::sTextureBits == 0) | ||
3480 | { | ||
3481 | if (++tex_bits_idle_count >= 30) | ||
3482 | gDebugTimers[0].pause(); | ||
3483 | } | ||
3484 | else | ||
3485 | { | ||
3486 | tex_bits_idle_count = 0; | ||
3487 | gDebugTimers[0].unpause(); | ||
3488 | } | ||
3489 | |||
3490 | gViewerStats->mTexturePacketsStat.addValue(LLViewerImageList::sTexturePackets); | ||
3491 | |||
3492 | gViewerStats->mUserserverPingStat.addValue(0); // userserver doesn't exist, therefore ping time is always awesome | ||
3493 | |||
3494 | // log when the LibXUL (aka Mozilla) widget is used and opened so we can monitor framerate changes | ||
3495 | #if LL_LIBXUL_ENABLED | ||
3496 | { | ||
3497 | BOOL result = gViewerHtmlHelp.getFloaterOpened(); | ||
3498 | gViewerStats->setStat(LLViewerStats::ST_LIBXUL_WIDGET_USED, (F64)result); | ||
3499 | } | ||
3500 | #endif | ||
3501 | |||
3502 | { | ||
3503 | static F32 visible_avatar_frames = 0.f; | ||
3504 | static F32 avg_visible_avatars = 0; | ||
3505 | F32 visible_avatars = (F32)LLVOAvatar::sNumVisibleAvatars; | ||
3506 | if (visible_avatars > 0.f) | ||
3507 | { | ||
3508 | visible_avatar_frames = 1.f; | ||
3509 | avg_visible_avatars = (avg_visible_avatars * (F32)(visible_avatar_frames - 1.f) + visible_avatars) / visible_avatar_frames; | ||
3510 | } | ||
3511 | gViewerStats->setStat(LLViewerStats::ST_VISIBLE_AVATARS, (F64)avg_visible_avatars); | ||
3512 | } | ||
3513 | gWorldp->updateNetStats(); | ||
3514 | gWorldp->requestCacheMisses(); | ||
3515 | |||
3516 | // Reset all of these values. | ||
3517 | gVLManager.resetBitCounts(); | ||
3518 | gObjectBits = 0; | ||
3519 | // gDecodedBits = 0; | ||
3520 | |||
3521 | LLViewerImageList::sTextureBits = 0; | ||
3522 | LLViewerImageList::sTexturePackets = 0; | ||
3523 | |||
3524 | #if LL_WINDOWS && LL_LCD_COMPILE | ||
3525 | bool LCDenabled = gLcdScreen->Enabled(); | ||
3526 | gViewerStats->setStat(LLViewerStats::ST_LOGITECH_LCD, LCDenabled); | ||
3527 | #else | ||
3528 | gViewerStats->setStat(LLViewerStats::ST_LOGITECH_LCD, false); | ||
3529 | #endif | ||
3530 | |||
3531 | } | ||
3532 | |||
3533 | // | ||
3534 | // Handle messages, and all message related stuff | ||
3535 | // | ||
3536 | |||
3537 | #define TIME_THROTTLE_MESSAGES | ||
3538 | |||
3539 | #ifdef TIME_THROTTLE_MESSAGES | ||
3540 | #define CHECK_MESSAGES_DEFAULT_MAX_TIME .020f // 50 ms = 50 fps (just for messages!) | ||
3541 | static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME; | ||
3542 | #endif | ||
3543 | |||
3544 | void idle_network() | ||
3545 | { | ||
3546 | gObjectList.mNumNewObjects = 0; | ||
3547 | S32 total_decoded = 0; | ||
3548 | |||
3549 | if (!gSavedSettings.getBOOL("SpeedTest")) | ||
3550 | { | ||
3551 | LLFastTimer t(LLFastTimer::FTM_IDLE_NETWORK); // decode | ||
3552 | |||
3553 | // deal with any queued name requests and replies. | ||
3554 | gCacheName->processPending(); | ||
3555 | |||
3556 | LLTimer check_message_timer; | ||
3557 | // Read all available packets from network | ||
3558 | stop_glerror(); | ||
3559 | const S64 frame_count = gFrameCount; // U32->S64 | ||
3560 | F32 total_time = 0.0f; | ||
3561 | while (gMessageSystem->checkAllMessages(frame_count, gServicePump)) | ||
3562 | { | ||
3563 | if (gDoDisconnect) | ||
3564 | { | ||
3565 | // We're disconnecting, don't process any more messages from the server | ||
3566 | // We're usually disconnecting due to either network corruption or a | ||
3567 | // server going down, so this is OK. | ||
3568 | break; | ||
3569 | } | ||
3570 | stop_glerror(); | ||
3571 | |||
3572 | total_decoded++; | ||
3573 | gPacketsIn++; | ||
3574 | |||
3575 | if (total_decoded > MESSAGE_MAX_PER_FRAME) | ||
3576 | { | ||
3577 | break; | ||
3578 | } | ||
3579 | |||
3580 | #ifdef TIME_THROTTLE_MESSAGES | ||
3581 | // Prevent slow packets from completely destroying the frame rate. | ||
3582 | // This usually happens due to clumps of avatars taking huge amount | ||
3583 | // of network processing time (which needs to be fixed, but this is | ||
3584 | // a good limit anyway). | ||
3585 | total_time = check_message_timer.getElapsedTimeF32(); | ||
3586 | if (total_time >= CheckMessagesMaxTime) | ||
3587 | break; | ||
3588 | #endif | ||
3589 | } | ||
3590 | // Handle per-frame message system processing. | ||
3591 | gMessageSystem->processAcks(); | ||
3592 | |||
3593 | #ifdef TIME_THROTTLE_MESSAGES | ||
3594 | if (total_time >= CheckMessagesMaxTime) | ||
3595 | { | ||
3596 | // Increase CheckMessagesMaxTime so that we will eventually catch up | ||
3597 | CheckMessagesMaxTime *= 1.035f; // 3.5% ~= x2 in 20 frames, ~8x in 60 frames | ||
3598 | } | ||
3599 | else | ||
3600 | { | ||
3601 | // Reset CheckMessagesMaxTime to default value | ||
3602 | CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME; | ||
3603 | } | ||
3604 | #endif | ||
3605 | |||
3606 | |||
3607 | |||
3608 | // we want to clear the control after sending out all necessary agent updates | ||
3609 | gAgent.resetControlFlags(); | ||
3610 | stop_glerror(); | ||
3611 | |||
3612 | |||
3613 | // Decode enqueued messages... | ||
3614 | S32 remaining_possible_decodes = MESSAGE_MAX_PER_FRAME - total_decoded; | ||
3615 | |||
3616 | if( remaining_possible_decodes <= 0 ) | ||
3617 | { | ||
3618 | llinfos << "Maxed out number of messages per frame at " << MESSAGE_MAX_PER_FRAME << llendl; | ||
3619 | } | ||
3620 | |||
3621 | if (gPrintMessagesThisFrame) | ||
3622 | { | ||
3623 | llinfos << "Decoded " << total_decoded << " msgs this frame!" << llendl; | ||
3624 | gPrintMessagesThisFrame = FALSE; | ||
3625 | } | ||
3626 | } | ||
3627 | |||
3628 | gObjectList.mNumNewObjectsStat.addValue(gObjectList.mNumNewObjects); | ||
3629 | |||
3630 | // Retransmit unacknowledged packets. | ||
3631 | gXferManager->retransmitUnackedPackets(); | ||
3632 | gAssetStorage->checkForTimeouts(); | ||
3633 | |||
3634 | gViewerThrottle.updateDynamicThrottle(); | ||
3635 | } | ||
3636 | |||
3637 | void idle_afk_check() | ||
3638 | { | ||
3639 | // check idle timers | ||
3640 | if (gAllowIdleAFK && (gAwayTriggerTimer.getElapsedTimeF32() > gAFKTimeout)) | ||
3641 | { | ||
3642 | gAgent.setAFK(); | ||
3643 | } | ||
3644 | } | ||
3645 | void request_initial_instant_messages() | ||
3646 | { | ||
3647 | static BOOL requested = FALSE; | ||
3648 | if (!requested | ||
3649 | && gMuteListp | ||
3650 | && gMuteListp->isLoaded() | ||
3651 | && gAgent.getAvatarObject()) | ||
3652 | { | ||
3653 | // Auto-accepted inventory items may require the avatar object | ||
3654 | // to build a correct name. Likewise, inventory offers from | ||
3655 | // muted avatars require the mute list to properly mute. | ||
3656 | LLMessageSystem* msg = gMessageSystem; | ||
3657 | msg->newMessageFast(_PREHASH_RetrieveInstantMessages); | ||
3658 | msg->nextBlockFast(_PREHASH_AgentData); | ||
3659 | msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); | ||
3660 | msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); | ||
3661 | gAgent.sendReliableMessage(); | ||
3662 | requested = TRUE; | ||
3663 | } | ||
3664 | } | ||
3665 | |||
3666 | /////////////////////////////////////////////////////// | ||
3667 | // idle() | ||
3668 | // | ||
3669 | // Called every time the window is not doing anything. | ||
3670 | // Receive packets, update statistics, and schedule a redisplay. | ||
3671 | /////////////////////////////////////////////////////// | ||
3672 | |||
3673 | void idle() | ||
3674 | { | ||
3675 | // Update frame timers | ||
3676 | static LLTimer idle_timer; | ||
3677 | |||
3678 | LLControlBase::updateAllListeners(); | ||
3679 | |||
3680 | LLFrameTimer::updateFrameTime(); | ||
3681 | LLEventTimer::updateClass(); | ||
3682 | LLCriticalDamp::updateInterpolants(); | ||
3683 | LLMortician::updateClass(); | ||
3684 | F32 dt_raw = idle_timer.getElapsedTimeAndResetF32(); | ||
3685 | |||
3686 | // Cap out-of-control frame times | ||
3687 | // Too low because in menus, swapping, debugger, etc. | ||
3688 | // Too high because idle called with no objects in view, etc. | ||
3689 | const F32 MIN_FRAME_RATE = 1.f; | ||
3690 | const F32 MAX_FRAME_RATE = 200.f; | ||
3691 | |||
3692 | F32 frame_rate_clamped = 1.f / dt_raw; | ||
3693 | frame_rate_clamped = llclamp(frame_rate_clamped, MIN_FRAME_RATE, MAX_FRAME_RATE); | ||
3694 | gFrameDTClamped = 1.f / frame_rate_clamped; | ||
3695 | |||
3696 | // Global frame timer | ||
3697 | // Smoothly weight toward current frame | ||
3698 | gFPSClamped = (frame_rate_clamped + (4.f * gFPSClamped)) / 5.f; | ||
3699 | |||
3700 | if (gQuitAfterSeconds > 0.f) | ||
3701 | { | ||
3702 | if (gRenderStartTime.getElapsedTimeF32() > gQuitAfterSeconds) | ||
3703 | { | ||
3704 | app_force_quit(NULL); | ||
3705 | } | ||
3706 | } | ||
3707 | |||
3708 | // Must wait until both have avatar object and mute list, so poll | ||
3709 | // here. | ||
3710 | request_initial_instant_messages(); | ||
3711 | |||
3712 | /////////////////////////////////// | ||
3713 | // | ||
3714 | // Special case idle if still starting up | ||
3715 | // | ||
3716 | |||
3717 | if (LLStartUp::getStartupState() < STATE_STARTED) | ||
3718 | { | ||
3719 | // Skip rest if idle startup returns false (essentially, no world yet) | ||
3720 | if (!idle_startup()) | ||
3721 | { | ||
3722 | return; | ||
3723 | } | ||
3724 | } | ||
3725 | |||
3726 | |||
3727 | F32 yaw = 0.f; // radians | ||
3728 | |||
3729 | if (!gDisconnected) | ||
3730 | { | ||
3731 | LLFastTimer t(LLFastTimer::FTM_NETWORK); | ||
3732 | |||
3733 | // Update spaceserver timeinfo | ||
3734 | gWorldp->setSpaceTimeUSec(gWorldp->getSpaceTimeUSec() + (U32)(dt_raw * SEC_TO_MICROSEC)); | ||
3735 | |||
3736 | |||
3737 | ////////////////////////////////////// | ||
3738 | // | ||
3739 | // Update simulator agent state | ||
3740 | // | ||
3741 | |||
3742 | if (gRotateRight) | ||
3743 | { | ||
3744 | gAgent.moveYaw(-1.f); | ||
3745 | } | ||
3746 | |||
3747 | // Handle automatic walking towards points | ||
3748 | gAgentPilot.updateTarget(); | ||
3749 | gAgent.autoPilot(&yaw); | ||
3750 | |||
3751 | static LLFrameTimer agent_update_timer; | ||
3752 | static U32 last_control_flags; | ||
3753 | |||
3754 | // When appropriate, update agent location to the simulator. | ||
3755 | F32 agent_update_time = agent_update_timer.getElapsedTimeF32(); | ||
3756 | BOOL flags_changed = gAgent.controlFlagsDirty() || (last_control_flags != gAgent.getControlFlags()); | ||
3757 | |||
3758 | if (flags_changed || (agent_update_time > (1.0f / (F32) AGENT_UPDATES_PER_SECOND))) | ||
3759 | { | ||
3760 | // Send avatar and camera info | ||
3761 | last_control_flags = gAgent.getControlFlags(); | ||
3762 | send_agent_update(TRUE); | ||
3763 | agent_update_timer.reset(); | ||
3764 | } | ||
3765 | } | ||
3766 | |||
3767 | ////////////////////////////////////// | ||
3768 | // | ||
3769 | // Manage statistics | ||
3770 | // | ||
3771 | // | ||
3772 | |||
3773 | { | ||
3774 | static LLFrameTimer viewer_stats_timer; | ||
3775 | reset_statistics(); | ||
3776 | |||
3777 | // Update session stats every large chunk of time | ||
3778 | // *FIX: (???) SAMANTHA | ||
3779 | |||
3780 | if (viewer_stats_timer.getElapsedTimeF32() >= 300.f && !gDisconnected) | ||
3781 | { | ||
3782 | llinfos << "Transmitting sessions stats" << llendl; | ||
3783 | send_stats(); | ||
3784 | viewer_stats_timer.reset(); | ||
3785 | } | ||
3786 | |||
3787 | // Print the object debugging stats | ||
3788 | static LLFrameTimer object_debug_timer; | ||
3789 | if (object_debug_timer.getElapsedTimeF32() > 5.f) | ||
3790 | { | ||
3791 | object_debug_timer.reset(); | ||
3792 | if (gObjectList.mNumDeadObjectUpdates) | ||
3793 | { | ||
3794 | llinfos << "Dead object updates: " << gObjectList.mNumDeadObjectUpdates << llendl; | ||
3795 | gObjectList.mNumDeadObjectUpdates = 0; | ||
3796 | } | ||
3797 | if (gObjectList.mNumUnknownKills) | ||
3798 | { | ||
3799 | llinfos << "Kills on unknown objects: " << gObjectList.mNumUnknownKills << llendl; | ||
3800 | gObjectList.mNumUnknownKills = 0; | ||
3801 | } | ||
3802 | if (gObjectList.mNumUnknownUpdates) | ||
3803 | { | ||
3804 | llinfos << "Unknown object updates: " << gObjectList.mNumUnknownUpdates << llendl; | ||
3805 | gObjectList.mNumUnknownUpdates = 0; | ||
3806 | } | ||
3807 | } | ||
3808 | gFrameStats.addFrameData(); | ||
3809 | } | ||
3810 | |||
3811 | if (!gDisconnected) | ||
3812 | { | ||
3813 | LLFastTimer t(LLFastTimer::FTM_NETWORK); | ||
3814 | |||
3815 | //////////////////////////////////////////////// | ||
3816 | // | ||
3817 | // Network processing | ||
3818 | // | ||
3819 | // NOTE: Starting at this point, we may still have pointers to "dead" objects | ||
3820 | // floating throughout the various object lists. | ||
3821 | // | ||
3822 | |||
3823 | gFrameStats.start(LLFrameStats::IDLE_NETWORK); | ||
3824 | idle_network(); | ||
3825 | stop_glerror(); | ||
3826 | |||
3827 | gFrameStats.start(LLFrameStats::AGENT_MISC); | ||
3828 | |||
3829 | // Check for away from keyboard, kick idle agents. | ||
3830 | idle_afk_check(); | ||
3831 | |||
3832 | // Update statistics for this frame | ||
3833 | update_statistics(gFrameCount); | ||
3834 | |||
3835 | gViewerWindow->updateDebugText(); | ||
3836 | } | ||
3837 | |||
3838 | //////////////////////////////////////// | ||
3839 | // | ||
3840 | // Handle the regular UI idle callbacks as well as | ||
3841 | // hover callbacks | ||
3842 | // | ||
3843 | |||
3844 | { | ||
3845 | // LLFastTimer t(LLFastTimer::FTM_IDLE_CB); | ||
3846 | |||
3847 | // Do event notifications if necessary. Yes, we may want to move this elsewhere. | ||
3848 | gEventNotifier.update(); | ||
3849 | |||
3850 | gIdleCallbacks.callFunctions(); | ||
3851 | } | ||
3852 | |||
3853 | if (gDisconnected) | ||
3854 | { | ||
3855 | return; | ||
3856 | } | ||
3857 | |||
3858 | gViewerWindow->handlePerFrameHover(); | ||
3859 | |||
3860 | /////////////////////////////////////// | ||
3861 | // Agent and camera movement | ||
3862 | // | ||
3863 | LLCoordGL current_mouse = gViewerWindow->getCurrentMouse(); | ||
3864 | |||
3865 | // BOOL was_in_prelude = gAgent.inPrelude(); | ||
3866 | |||
3867 | { | ||
3868 | //LLFastTimer t(LLFastTimer::FTM_TEMP1); | ||
3869 | |||
3870 | // After agent and camera moved, figure out if we need to | ||
3871 | // deselect objects. | ||
3872 | gSelectMgr->deselectAllIfTooFar(); | ||
3873 | gSelectMgr->update(); // once per frame updat | ||
3874 | } | ||
3875 | |||
3876 | { | ||
3877 | LLFastTimer t(LLFastTimer::FTM_RESET_DRAWORDER); | ||
3878 | |||
3879 | ////////////////////////////////////////////// | ||
3880 | // | ||
3881 | // Clear draw orders | ||
3882 | // | ||
3883 | // Should actually be done after render, but handlePerFrameHover actually does a "render" | ||
3884 | // to do its selection. | ||
3885 | // | ||
3886 | |||
3887 | gPipeline.resetDrawOrders(); | ||
3888 | } | ||
3889 | { | ||
3890 | // Handle pending gesture processing | ||
3891 | gGestureManager.update(); | ||
3892 | |||
3893 | gAgent.updateAgentPosition(gFrameDTClamped, yaw, current_mouse.mX, current_mouse.mY); | ||
3894 | } | ||
3895 | |||
3896 | { | ||
3897 | LLFastTimer t(LLFastTimer::FTM_OBJECTLIST_UPDATE); // Actually "object update" | ||
3898 | gFrameStats.start(LLFrameStats::OBJECT_UPDATE); | ||
3899 | |||
3900 | if (!(gLogoutRequestSent && gHaveSavedSnapshot)) | ||
3901 | { | ||
3902 | gObjectList.update(gAgent, *gWorldp); | ||
3903 | } | ||
3904 | } | ||
3905 | |||
3906 | { | ||
3907 | LLFastTimer t(LLFastTimer::FTM_UPDATE_SKY); | ||
3908 | gSky.updateSky(); | ||
3909 | } | ||
3910 | |||
3911 | ////////////////////////////////////// | ||
3912 | // | ||
3913 | // Deletes objects... | ||
3914 | // Has to be done after doing idleUpdates (which can kill objects) | ||
3915 | // | ||
3916 | |||
3917 | { | ||
3918 | LLFastTimer t(LLFastTimer::FTM_CLEANUP); | ||
3919 | gFrameStats.start(LLFrameStats::CLEAN_DEAD); | ||
3920 | gObjectList.cleanDeadObjects(); | ||
3921 | LLDrawable::cleanupDeadDrawables(); | ||
3922 | } | ||
3923 | |||
3924 | // | ||
3925 | // After this point, in theory we should never see a dead object | ||
3926 | // in the various object/drawable lists. | ||
3927 | // | ||
3928 | |||
3929 | ////////////////////////////////////// | ||
3930 | // | ||
3931 | // Update/send HUD effects | ||
3932 | // | ||
3933 | // At this point, HUD effects may clean up some references to | ||
3934 | // dead objects. | ||
3935 | // | ||
3936 | |||
3937 | { | ||
3938 | //LLFastTimer t(LLFastTimer::FTM_TEMP3); | ||
3939 | |||
3940 | gFrameStats.start(LLFrameStats::UPDATE_EFFECTS); | ||
3941 | gSelectMgr->updateEffects(); | ||
3942 | gHUDManager->cleanupEffects(); | ||
3943 | gHUDManager->sendEffects(); | ||
3944 | } | ||
3945 | |||
3946 | stop_glerror(); | ||
3947 | |||
3948 | //////////////////////////////////////// | ||
3949 | // | ||
3950 | // Unpack layer data that we've received | ||
3951 | // | ||
3952 | |||
3953 | { | ||
3954 | LLFastTimer t(LLFastTimer::FTM_NETWORK); | ||
3955 | gVLManager.unpackData(); | ||
3956 | } | ||
3957 | |||
3958 | ///////////////////////// | ||
3959 | // | ||
3960 | // Update surfaces, and surface textures as well. | ||
3961 | // | ||
3962 | |||
3963 | gWorldp->updateVisibilities(); | ||
3964 | { | ||
3965 | const F32 max_region_update_time = .001f; // 1ms | ||
3966 | LLFastTimer t(LLFastTimer::FTM_REGION_UPDATE); | ||
3967 | gWorldp->updateRegions(max_region_update_time); | ||
3968 | } | ||
3969 | |||
3970 | ///////////////////////// | ||
3971 | // | ||
3972 | // Update weather effects | ||
3973 | // | ||
3974 | |||
3975 | if (!gNoRender) | ||
3976 | { | ||
3977 | gWorldp->updateClouds(gFrameDTClamped); | ||
3978 | gSky.propagateHeavenlyBodies(gFrameDTClamped); // moves sun, moon, and planets | ||
3979 | |||
3980 | // Update wind vector | ||
3981 | LLVector3 wind_position_region; | ||
3982 | static LLVector3 average_wind; | ||
3983 | |||
3984 | LLViewerRegion *regionp; | ||
3985 | regionp = gWorldp->resolveRegionGlobal(wind_position_region, gAgent.getPositionGlobal()); // puts agent's local coords into wind_position | ||
3986 | if (regionp) | ||
3987 | { | ||
3988 | gWindVec = regionp->mWind.getVelocity(wind_position_region); | ||
3989 | |||
3990 | // Compute average wind and use to drive motion of water | ||
3991 | |||
3992 | average_wind = regionp->mWind.getAverage(); | ||
3993 | F32 cloud_density = regionp->mCloudLayer.getDensityRegion(wind_position_region); | ||
3994 | |||
3995 | gSky.setCloudDensityAtAgent(cloud_density); | ||
3996 | gSky.setWind(average_wind); | ||
3997 | //LLVOWater::setWind(average_wind); | ||
3998 | } | ||
3999 | else | ||
4000 | { | ||
4001 | gWindVec.setVec(0.0f, 0.0f, 0.0f); | ||
4002 | } | ||
4003 | } | ||
4004 | stop_glerror(); | ||
4005 | |||
4006 | ////////////////////////////////////// | ||
4007 | // | ||
4008 | // Update images, using the image stats generated during object update/culling | ||
4009 | // | ||
4010 | // Can put objects onto the retextured list. | ||
4011 | // | ||
4012 | gFrameStats.start(LLFrameStats::IMAGE_UPDATE); | ||
4013 | |||
4014 | LLFastTimer t(LLFastTimer::FTM_IMAGE_UPDATE); | ||
4015 | |||
4016 | LLViewerImage::updateClass(gCamera->getVelocityStat()->getMean(), | ||
4017 | gCamera->getAngularVelocityStat()->getMean()); | ||
4018 | |||
4019 | gBumpImageList.updateImages(); // must be called before gImageList version so that it's textures are thrown out first. | ||
4020 | |||
4021 | const F32 max_image_decode_time = 0.005f; // 5 ms decode time | ||
4022 | gImageList.updateImages(max_image_decode_time); | ||
4023 | stop_glerror(); | ||
4024 | |||
4025 | ////////////////////////////////////// | ||
4026 | // | ||
4027 | // Sort and cull in the new renderer are moved to pipeline.cpp | ||
4028 | // Here, particles are updated and drawables are moved. | ||
4029 | // | ||
4030 | |||
4031 | if (!gNoRender) | ||
4032 | { | ||
4033 | gFrameStats.start(LLFrameStats::UPDATE_MOVE); | ||
4034 | gPipeline.updateMove(); | ||
4035 | |||
4036 | gFrameStats.start(LLFrameStats::UPDATE_PARTICLES); | ||
4037 | gWorldp->updateParticles(); | ||
4038 | } | ||
4039 | stop_glerror(); | ||
4040 | |||
4041 | if (!LLViewerJoystick::sOverrideCamera) | ||
4042 | { | ||
4043 | gAgent.updateCamera(); | ||
4044 | } | ||
4045 | else | ||
4046 | { | ||
4047 | LLViewerJoystick::updateCamera(); | ||
4048 | } | ||
4049 | |||
4050 | // objects and camera should be in sync, do LOD calculations now | ||
4051 | { | ||
4052 | LLFastTimer t(LLFastTimer::FTM_LOD_UPDATE); | ||
4053 | gObjectList.updateApparentAngles(gAgent); | ||
4054 | } | ||
4055 | |||
4056 | { | ||
4057 | gFrameStats.start(LLFrameStats::AUDIO); | ||
4058 | LLFastTimer t(LLFastTimer::FTM_AUDIO_UPDATE); | ||
4059 | |||
4060 | if (gAudiop) | ||
4061 | { | ||
4062 | audio_update_volume(false); | ||
4063 | audio_update_listener(); | ||
4064 | audio_update_wind(false); | ||
4065 | |||
4066 | // this line actually commits the changes we've made to source positions, etc. | ||
4067 | const F32 max_audio_decode_time = 0.002f; // 2 ms decode time | ||
4068 | gAudiop->idle(max_audio_decode_time); | ||
4069 | } | ||
4070 | } | ||
4071 | |||
4072 | // Handle shutdown process, for example, | ||
4073 | // wait for floaters to close, send quit message, | ||
4074 | // forcibly quit if it has taken too long | ||
4075 | if (gQuitRequested) | ||
4076 | { | ||
4077 | idle_shutdown(); | ||
4078 | } | ||
4079 | |||
4080 | stop_glerror(); | ||
4081 | } | ||
4082 | |||
4083 | |||
4084 | F32 mouse_x_from_center(S32 x) | ||
4085 | { | ||
4086 | return ((F32) x / (F32) gViewerWindow->getWindowWidth() ) - 0.5f; | ||
4087 | } | ||
4088 | |||
4089 | |||
4090 | F32 mouse_y_from_center(S32 y) | ||
4091 | { | ||
4092 | return ((F32) y / (F32) gViewerWindow->getWindowHeight() ) - 0.5f; | ||
4093 | } | ||
4094 | |||
4095 | |||
4096 | ///////////////////////////////////////////////////////// | ||
4097 | |||
4098 | void init_audio() | ||
4099 | { | ||
4100 | if (!gAudiop) | ||
4101 | { | ||
4102 | llwarns << "Failed to create an appropriate Audio Engine" << llendl; | ||
4103 | return; | ||
4104 | } | ||
4105 | LLVector3d lpos_global = gAgent.getCameraPositionGlobal(); | ||
4106 | LLVector3 lpos_global_f; | ||
4107 | |||
4108 | lpos_global_f.setVec(lpos_global); | ||
4109 | |||
4110 | gAudiop->setListener(lpos_global_f, | ||
4111 | LLVector3::zero, // gCamera->getVelocity(), // !!! BUG need to replace this with smoothed velocity! | ||
4112 | gCamera->getUpAxis(), | ||
4113 | gCamera->getAtAxis()); | ||
4114 | |||
4115 | // load up our initial set of sounds we'll want so they're in memory and ready to be played | ||
4116 | |||
4117 | BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); | ||
4118 | |||
4119 | if (!mute_audio && gPreloadSounds) | ||
4120 | { | ||
4121 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert"))); | ||
4122 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke"))); | ||
4123 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndChatFromObject"))); | ||
4124 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClick"))); | ||
4125 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClickRelease"))); | ||
4126 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionF"))); | ||
4127 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionM"))); | ||
4128 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingChat"))); | ||
4129 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingIM"))); | ||
4130 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvApplyToObject"))); | ||
4131 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvalidOp"))); | ||
4132 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInventoryCopyToInv"))); | ||
4133 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeDown"))); | ||
4134 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeUp"))); | ||
4135 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCopyToInv"))); | ||
4136 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCreate"))); | ||
4137 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectDelete"))); | ||
4138 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezIn"))); | ||
4139 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezOut"))); | ||
4140 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuAppear"))); | ||
4141 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuHide"))); | ||
4142 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight0"))); | ||
4143 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight1"))); | ||
4144 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight2"))); | ||
4145 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight3"))); | ||
4146 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight4"))); | ||
4147 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight5"))); | ||
4148 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight6"))); | ||
4149 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight7"))); | ||
4150 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndSnapshot"))); | ||
4151 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartAutopilot"))); | ||
4152 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartFollowpilot"))); | ||
4153 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartIM"))); | ||
4154 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStopAutopilot"))); | ||
4155 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTeleportOut"))); | ||
4156 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureApplyToObject"))); | ||
4157 | //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureCopyToInv"))); | ||
4158 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTyping"))); | ||
4159 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose"))); | ||
4160 | gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen"))); | ||
4161 | } | ||
4162 | |||
4163 | audio_update_volume(true); | ||
4164 | } | ||
4165 | |||
4166 | void audio_update_volume(bool force_update) | ||
4167 | { | ||
4168 | F32 master_volume = gSavedSettings.getF32("AudioLevelMaster"); | ||
4169 | BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); | ||
4170 | if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized"))) | ||
4171 | { | ||
4172 | mute_audio = TRUE; | ||
4173 | } | ||
4174 | F32 mute_volume = mute_audio ? 0.0f : 1.0f; | ||
4175 | |||
4176 | // Sound Effects | ||
4177 | if (gAudiop) | ||
4178 | { | ||
4179 | gAudiop->setMasterGain ( master_volume ); | ||
4180 | |||
4181 | gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler")); | ||
4182 | gAudiop->setDistanceFactor(gSavedSettings.getF32("AudioLevelDistance")); | ||
4183 | gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff")); | ||
4184 | #ifdef kAUDIO_ENABLE_WIND | ||
4185 | gAudiop->enableWind(!mute_audio); | ||
4186 | #endif | ||
4187 | |||
4188 | gAudiop->setMuted(mute_audio); | ||
4189 | |||
4190 | if (force_update) | ||
4191 | { | ||
4192 | audio_update_wind(true); | ||
4193 | } | ||
4194 | } | ||
4195 | |||
4196 | // Streaming Music | ||
4197 | if (gAudiop) | ||
4198 | { | ||
4199 | F32 music_volume = gSavedSettings.getF32("AudioLevelMusic"); | ||
4200 | music_volume = mute_volume * master_volume * (music_volume*music_volume); | ||
4201 | gAudiop->setInternetStreamGain ( music_volume ); | ||
4202 | } | ||
4203 | |||
4204 | // Streaming Media | ||
4205 | if(LLMediaEngine::getInstance()) | ||
4206 | { | ||
4207 | F32 media_volume = gSavedSettings.getF32("AudioLevelMedia"); | ||
4208 | media_volume = mute_volume * master_volume * (media_volume*media_volume); | ||
4209 | LLMediaEngine::getInstance()->setVolume(media_volume); | ||
4210 | } | ||
4211 | |||
4212 | // Voice | ||
4213 | if (gVoiceClient) | ||
4214 | { | ||
4215 | F32 voice_volume = gSavedSettings.getF32("AudioLevelVoice"); | ||
4216 | voice_volume = mute_volume * master_volume * voice_volume; | ||
4217 | gVoiceClient->setVoiceVolume(voice_volume); | ||
4218 | gVoiceClient->setMicGain(gSavedSettings.getF32("AudioLevelMic")); | ||
4219 | |||
4220 | if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized"))) | ||
4221 | { | ||
4222 | gVoiceClient->setMuteMic(true); | ||
4223 | } | ||
4224 | else | ||
4225 | { | ||
4226 | gVoiceClient->setMuteMic(false); | ||
4227 | } | ||
4228 | } | ||
4229 | } | ||
4230 | |||
4231 | void audio_update_listener() | ||
4232 | { | ||
4233 | if (gAudiop) | ||
4234 | { | ||
4235 | // update listener position because agent has moved | ||
4236 | LLVector3d lpos_global = gAgent.getCameraPositionGlobal(); | ||
4237 | LLVector3 lpos_global_f; | ||
4238 | lpos_global_f.setVec(lpos_global); | ||
4239 | |||
4240 | gAudiop->setListener(lpos_global_f, | ||
4241 | // gCameraVelocitySmoothed, | ||
4242 | // LLVector3::zero, | ||
4243 | gAgent.getVelocity(), // !!! *TODO: need to replace this with smoothed velocity! | ||
4244 | gCamera->getUpAxis(), | ||
4245 | gCamera->getAtAxis()); | ||
4246 | } | ||
4247 | } | ||
4248 | |||
4249 | void audio_update_wind(bool force_update) | ||
4250 | { | ||
4251 | #ifdef kAUDIO_ENABLE_WIND | ||
4252 | // | ||
4253 | // Extract height above water to modulate filter by whether above/below water | ||
4254 | // | ||
4255 | LLViewerRegion* region = gAgent.getRegion(); | ||
4256 | if (region) | ||
4257 | { | ||
4258 | static F32 last_camera_water_height = -1000.f; | ||
4259 | LLVector3 camera_pos = gAgent.getCameraPositionAgent(); | ||
4260 | F32 camera_water_height = camera_pos.mV[VZ] - region->getWaterHeight(); | ||
4261 | |||
4262 | // | ||
4263 | // Don't update rolloff factor unless water surface has been crossed | ||
4264 | // | ||
4265 | if (force_update || (last_camera_water_height * camera_water_height) < 0.f) | ||
4266 | { | ||
4267 | if (camera_water_height < 0.f) | ||
4268 | { | ||
4269 | gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff") * LL_ROLLOFF_MULTIPLIER_UNDER_WATER); | ||
4270 | } | ||
4271 | else | ||
4272 | { | ||
4273 | gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff")); | ||
4274 | } | ||
4275 | } | ||
4276 | // this line rotates the wind vector to be listener (agent) relative | ||
4277 | // unfortunately we have to pre-translate to undo the translation that | ||
4278 | // occurs in the transform call | ||
4279 | gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal(gWindVec - gAgent.getVelocity()); | ||
4280 | |||
4281 | // don't use the setter setMaxWindGain() because we don't | ||
4282 | // want to screw up the fade-in on startup by setting actual source gain | ||
4283 | // outside the fade-in. | ||
4284 | gAudiop->mMaxWindGain = gSavedSettings.getF32("AudioLevelAmbient"); | ||
4285 | |||
4286 | last_camera_water_height = camera_water_height; | ||
4287 | gAudiop->updateWind(gRelativeWindVec, camera_water_height); | ||
4288 | } | ||
4289 | #endif | ||
4290 | } | ||
4291 | |||
4292 | |||
4293 | ///////////////////////////////////////////////////////// | ||
4294 | |||
4295 | BOOL raycast_for_new_obj_pos( S32 x, S32 y, LLViewerObject** hit_obj, S32* hit_face, | ||
4296 | BOOL* b_hit_land, LLVector3* ray_start_region, LLVector3* ray_end_region, LLViewerRegion** region ) | ||
4297 | { | ||
4298 | F32 max_dist_from_camera = gSavedSettings.getF32( "MaxSelectDistance" ) - 1.f; | ||
4299 | |||
4300 | // Viewer-side pick to find the right sim to create the object on. | ||
4301 | // First find the surface the object will be created on. | ||
4302 | gViewerWindow->hitObjectOrLandGlobalImmediate(x, y, NULL, FALSE); | ||
4303 | |||
4304 | // Note: use the frontmost non-flora version because (a) plants usually have lots of alpha and (b) pants' Havok | ||
4305 | // representations (if any) are NOT the same as their viewer representation. | ||
4306 | *hit_obj = gObjectList.findObject( gLastHitNonFloraObjectID ); | ||
4307 | *hit_face = gLastHitNonFloraObjectFace; | ||
4308 | *b_hit_land = !(*hit_obj) && !gLastHitNonFloraPosGlobal.isExactlyZero(); | ||
4309 | LLVector3d land_pos_global = gLastHitNonFloraPosGlobal; | ||
4310 | |||
4311 | // Make sure there's a surface to place the new object on. | ||
4312 | BOOL bypass_sim_raycast = FALSE; | ||
4313 | LLVector3d surface_pos_global; | ||
4314 | if (*b_hit_land) | ||
4315 | { | ||
4316 | surface_pos_global = land_pos_global; | ||
4317 | bypass_sim_raycast = TRUE; | ||
4318 | } | ||
4319 | else | ||
4320 | if (*hit_obj) | ||
4321 | { | ||
4322 | surface_pos_global = (*hit_obj)->getPositionGlobal(); | ||
4323 | } | ||
4324 | else | ||
4325 | { | ||
4326 | return FALSE; | ||
4327 | } | ||
4328 | |||
4329 | // Make sure the surface isn't too far away. | ||
4330 | LLVector3d ray_start_global = gAgent.getCameraPositionGlobal(); | ||
4331 | F32 dist_to_surface_sq = (F32)((surface_pos_global - ray_start_global).magVecSquared()); | ||
4332 | if( dist_to_surface_sq > (max_dist_from_camera * max_dist_from_camera) ) | ||
4333 | { | ||
4334 | return FALSE; | ||
4335 | } | ||
4336 | |||
4337 | // Find the sim where the surface lives. | ||
4338 | LLViewerRegion *regionp = gWorldp->getRegionFromPosGlobal(surface_pos_global); | ||
4339 | if (!regionp) | ||
4340 | { | ||
4341 | llwarns << "Trying to add object outside of all known regions!" << llendl; | ||
4342 | return FALSE; | ||
4343 | } | ||
4344 | |||
4345 | // Find the simulator-side ray that will be used to place the object accurately | ||
4346 | LLVector3d mouse_direction; | ||
4347 | mouse_direction.setVec( gViewerWindow->mouseDirectionGlobal( x, y ) ); | ||
4348 | |||
4349 | *region = regionp; | ||
4350 | *ray_start_region = regionp->getPosRegionFromGlobal( ray_start_global ); | ||
4351 | F32 near_clip = gCamera->getNear() + 0.01f; // Include an epsilon to avoid rounding issues. | ||
4352 | *ray_start_region += gCamera->getAtAxis() * near_clip; | ||
4353 | |||
4354 | if( bypass_sim_raycast ) | ||
4355 | { | ||
4356 | // Hack to work around Havok's inability to ray cast onto height fields | ||
4357 | *ray_end_region = regionp->getPosRegionFromGlobal( surface_pos_global ); // ray end is the viewer's intersection point | ||
4358 | } | ||
4359 | else | ||
4360 | { | ||
4361 | LLVector3d ray_end_global = ray_start_global + (1.f + max_dist_from_camera) * mouse_direction; // add an epsilon to the sim version of the ray to avoid rounding problems. | ||
4362 | *ray_end_region = regionp->getPosRegionFromGlobal( ray_end_global ); | ||
4363 | } | ||
4364 | |||
4365 | return TRUE; | ||
4366 | } | ||
4367 | |||
4368 | const LLVector3 DEFAULT_OBJECT_SCALE(0.5f, 0.5f, 0.5f); | ||
4369 | |||
4370 | BOOL add_object( LLPCode pcode, S32 x, S32 y, U8 use_physics ) | ||
4371 | { | ||
4372 | LLVector3 ray_start_region; | ||
4373 | LLVector3 ray_end_region; | ||
4374 | LLViewerRegion* regionp = NULL; | ||
4375 | BOOL b_hit_land = FALSE; | ||
4376 | S32 hit_face = -1; | ||
4377 | LLViewerObject* hit_obj = NULL; | ||
4378 | U8 state = 0; | ||
4379 | BOOL success = raycast_for_new_obj_pos( x, y, &hit_obj, &hit_face, &b_hit_land, &ray_start_region, &ray_end_region, ®ionp ); | ||
4380 | if( !success ) | ||
4381 | { | ||
4382 | return FALSE; | ||
4383 | } | ||
4384 | |||
4385 | if( hit_obj && (hit_obj->isAvatar() || hit_obj->isAttachment()) ) | ||
4386 | { | ||
4387 | // Can't create objects on avatars or attachments | ||
4388 | return FALSE; | ||
4389 | } | ||
4390 | |||
4391 | if (NULL == regionp) | ||
4392 | { | ||
4393 | llwarns << "regionp was NULL; aborting function." << llendl; | ||
4394 | return FALSE; | ||
4395 | } | ||
4396 | |||
4397 | if (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX) | ||
4398 | { | ||
4399 | LLFirstUse::useSandbox(); | ||
4400 | } | ||
4401 | |||
4402 | // Set params for new object based on its PCode. | ||
4403 | LLQuaternion rotation; | ||
4404 | LLVector3 scale = DEFAULT_OBJECT_SCALE; | ||
4405 | U8 material = LL_MCODE_WOOD; | ||
4406 | BOOL create_selected = FALSE; | ||
4407 | LLVolumeParams volume_params; | ||
4408 | |||
4409 | switch (pcode) | ||
4410 | { | ||
4411 | case LL_PCODE_LEGACY_GRASS: | ||
4412 | // Randomize size of grass patch | ||
4413 | scale.setVec(10.f + ll_frand(20.f), 10.f + ll_frand(20.f), 1.f + ll_frand(2.f)); | ||
4414 | state = rand() % LLVOGrass::sMaxGrassSpecies; | ||
4415 | break; | ||
4416 | |||
4417 | |||
4418 | case LL_PCODE_LEGACY_TREE: | ||
4419 | case LL_PCODE_TREE_NEW: | ||
4420 | state = rand() % LLVOTree::sMaxTreeSpecies; | ||
4421 | break; | ||
4422 | |||
4423 | case LL_PCODE_SPHERE: | ||
4424 | case LL_PCODE_CONE: | ||
4425 | case LL_PCODE_CUBE: | ||
4426 | case LL_PCODE_CYLINDER: | ||
4427 | case LL_PCODE_TORUS: | ||
4428 | case LLViewerObject::LL_VO_SQUARE_TORUS: | ||
4429 | case LLViewerObject::LL_VO_TRIANGLE_TORUS: | ||
4430 | default: | ||
4431 | create_selected = TRUE; | ||
4432 | break; | ||
4433 | } | ||
4434 | |||
4435 | // Play creation sound | ||
4436 | if (gAudiop) | ||
4437 | { | ||
4438 | F32 volume = gSavedSettings.getF32("AudioLevelUI"); | ||
4439 | gAudiop->triggerSound( LLUUID(gSavedSettings.getString("UISndObjectCreate")), gAgent.getID(), volume); | ||
4440 | } | ||
4441 | |||
4442 | gMessageSystem->newMessageFast(_PREHASH_ObjectAdd); | ||
4443 | gMessageSystem->nextBlockFast(_PREHASH_AgentData); | ||
4444 | gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); | ||
4445 | gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); | ||
4446 | gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID()); | ||
4447 | gMessageSystem->nextBlockFast(_PREHASH_ObjectData); | ||
4448 | gMessageSystem->addU8Fast(_PREHASH_Material, material); | ||
4449 | |||
4450 | U32 flags = 0; // not selected | ||
4451 | if (use_physics) | ||
4452 | { | ||
4453 | flags |= FLAGS_USE_PHYSICS; | ||
4454 | } | ||
4455 | if (create_selected) | ||
4456 | { | ||
4457 | flags |= FLAGS_CREATE_SELECTED; | ||
4458 | } | ||
4459 | gMessageSystem->addU32Fast(_PREHASH_AddFlags, flags ); | ||
4460 | |||
4461 | LLPCode volume_pcode; // ...PCODE_VOLUME, or the original on error | ||
4462 | switch (pcode) | ||
4463 | { | ||
4464 | case LL_PCODE_SPHERE: | ||
4465 | rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis); | ||
4466 | |||
4467 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE ); | ||
4468 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
4469 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
4470 | volume_params.setRatio ( 1, 1 ); | ||
4471 | volume_params.setShear ( 0, 0 ); | ||
4472 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
4473 | volume_pcode = LL_PCODE_VOLUME; | ||
4474 | break; | ||
4475 | |||
4476 | case LL_PCODE_TORUS: | ||
4477 | rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis); | ||
4478 | |||
4479 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_CIRCLE ); | ||
4480 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
4481 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
4482 | volume_params.setRatio ( 1.f, 0.25f ); // "top size" | ||
4483 | volume_params.setShear ( 0, 0 ); | ||
4484 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
4485 | volume_pcode = LL_PCODE_VOLUME; | ||
4486 | break; | ||
4487 | |||
4488 | case LLViewerObject::LL_VO_SQUARE_TORUS: | ||
4489 | rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis); | ||
4490 | |||
4491 | volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_CIRCLE ); | ||
4492 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
4493 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
4494 | volume_params.setRatio ( 1.f, 0.25f ); // "top size" | ||
4495 | volume_params.setShear ( 0, 0 ); | ||
4496 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
4497 | volume_pcode = LL_PCODE_VOLUME; | ||
4498 | break; | ||
4499 | |||
4500 | case LLViewerObject::LL_VO_TRIANGLE_TORUS: | ||
4501 | rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis); | ||
4502 | |||
4503 | volume_params.setType( LL_PCODE_PROFILE_EQUALTRI, LL_PCODE_PATH_CIRCLE ); | ||
4504 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
4505 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
4506 | volume_params.setRatio ( 1.f, 0.25f ); // "top size" | ||
4507 | volume_params.setShear ( 0, 0 ); | ||
4508 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
4509 | volume_pcode = LL_PCODE_VOLUME; | ||
4510 | break; | ||
4511 | |||
4512 | case LL_PCODE_SPHERE_HEMI: | ||
4513 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE ); | ||
4514 | //volume_params.setBeginAndEndS( 0.5f, 1.f ); | ||
4515 | volume_params.setBeginAndEndT( 0.f, 0.5f ); | ||
4516 | volume_params.setRatio ( 1, 1 ); | ||
4517 | volume_params.setShear ( 0, 0 ); | ||
4518 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
4519 | volume_pcode = LL_PCODE_VOLUME; | ||
4520 | break; | ||
4521 | |||
4522 | case LL_PCODE_CUBE: | ||
4523 | volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE ); | ||
4524 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
4525 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
4526 | volume_params.setRatio ( 1, 1 ); | ||
4527 | volume_params.setShear ( 0, 0 ); | ||
4528 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
4529 | volume_pcode = LL_PCODE_VOLUME; | ||
4530 | break; | ||
4531 | |||
4532 | case LL_PCODE_PRISM: | ||
4533 | volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE ); | ||
4534 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
4535 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
4536 | volume_params.setRatio ( 0, 1 ); | ||
4537 | volume_params.setShear ( -0.5f, 0 ); | ||
4538 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
4539 | volume_pcode = LL_PCODE_VOLUME; | ||
4540 | break; | ||
4541 | |||
4542 | case LL_PCODE_PYRAMID: | ||
4543 | volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE ); | ||
4544 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
4545 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
4546 | volume_params.setRatio ( 0, 0 ); | ||
4547 | volume_params.setShear ( 0, 0 ); | ||
4548 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
4549 | volume_pcode = LL_PCODE_VOLUME; | ||
4550 | break; | ||
4551 | |||
4552 | case LL_PCODE_TETRAHEDRON: | ||
4553 | volume_params.setType( LL_PCODE_PROFILE_EQUALTRI, LL_PCODE_PATH_LINE ); | ||
4554 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
4555 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
4556 | volume_params.setRatio ( 0, 0 ); | ||
4557 | volume_params.setShear ( 0, 0 ); | ||
4558 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
4559 | volume_pcode = LL_PCODE_VOLUME; | ||
4560 | break; | ||
4561 | |||
4562 | case LL_PCODE_CYLINDER: | ||
4563 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE ); | ||
4564 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
4565 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
4566 | volume_params.setRatio ( 1, 1 ); | ||
4567 | volume_params.setShear ( 0, 0 ); | ||
4568 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
4569 | volume_pcode = LL_PCODE_VOLUME; | ||
4570 | break; | ||
4571 | |||
4572 | case LL_PCODE_CYLINDER_HEMI: | ||
4573 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE ); | ||
4574 | volume_params.setBeginAndEndS( 0.25f, 0.75f ); | ||
4575 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
4576 | volume_params.setRatio ( 1, 1 ); | ||
4577 | volume_params.setShear ( 0, 0 ); | ||
4578 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
4579 | volume_pcode = LL_PCODE_VOLUME; | ||
4580 | break; | ||
4581 | |||
4582 | case LL_PCODE_CONE: | ||
4583 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE ); | ||
4584 | volume_params.setBeginAndEndS( 0.f, 1.f ); | ||
4585 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
4586 | volume_params.setRatio ( 0, 0 ); | ||
4587 | volume_params.setShear ( 0, 0 ); | ||
4588 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
4589 | volume_pcode = LL_PCODE_VOLUME; | ||
4590 | break; | ||
4591 | |||
4592 | case LL_PCODE_CONE_HEMI: | ||
4593 | volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE ); | ||
4594 | volume_params.setBeginAndEndS( 0.25f, 0.75f ); | ||
4595 | volume_params.setBeginAndEndT( 0.f, 1.f ); | ||
4596 | volume_params.setRatio ( 0, 0 ); | ||
4597 | volume_params.setShear ( 0, 0 ); | ||
4598 | LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem); | ||
4599 | volume_pcode = LL_PCODE_VOLUME; | ||
4600 | break; | ||
4601 | |||
4602 | default: | ||
4603 | LLVolumeMessage::packVolumeParams(0, gMessageSystem); | ||
4604 | volume_pcode = pcode; | ||
4605 | break; | ||
4606 | } | ||
4607 | gMessageSystem->addU8Fast(_PREHASH_PCode, volume_pcode); | ||
4608 | |||
4609 | gMessageSystem->addVector3Fast(_PREHASH_Scale, scale ); | ||
4610 | gMessageSystem->addQuatFast(_PREHASH_Rotation, rotation ); | ||
4611 | gMessageSystem->addVector3Fast(_PREHASH_RayStart, ray_start_region ); | ||
4612 | gMessageSystem->addVector3Fast(_PREHASH_RayEnd, ray_end_region ); | ||
4613 | gMessageSystem->addU8Fast(_PREHASH_BypassRaycast, (U8)b_hit_land ); | ||
4614 | gMessageSystem->addU8Fast(_PREHASH_RayEndIsIntersection, (U8)FALSE ); | ||
4615 | gMessageSystem->addU8Fast(_PREHASH_State, state); | ||
4616 | |||
4617 | // Limit raycast to a single object. | ||
4618 | // Speeds up server raycast + avoid problems with server ray hitting objects | ||
4619 | // that were clipped by the near plane or culled on the viewer. | ||
4620 | LLUUID ray_target_id; | ||
4621 | if( hit_obj ) | ||
4622 | { | ||
4623 | ray_target_id = hit_obj->getID(); | ||
4624 | } | ||
4625 | else | ||
4626 | { | ||
4627 | ray_target_id.setNull(); | ||
4628 | } | ||
4629 | gMessageSystem->addUUIDFast(_PREHASH_RayTargetID, ray_target_id ); | ||
4630 | |||
4631 | // Pack in name value pairs | ||
4632 | gMessageSystem->sendReliable(regionp->getHost()); | ||
4633 | |||
4634 | // Spawns a message, so must be after above send | ||
4635 | if (create_selected) | ||
4636 | { | ||
4637 | gSelectMgr->deselectAll(); | ||
4638 | gViewerWindow->getWindow()->incBusyCount(); | ||
4639 | } | ||
4640 | |||
4641 | // VEFFECT: AddObject | ||
4642 | LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); | ||
4643 | effectp->setSourceObject(gAgent.getAvatarObject()); | ||
4644 | effectp->setPositionGlobal(regionp->getPosGlobalFromRegion(ray_end_region)); | ||
4645 | effectp->setDuration(LL_HUD_DUR_SHORT); | ||
4646 | effectp->setColor(LLColor4U(gAgent.getEffectColor())); | ||
4647 | |||
4648 | gViewerStats->incStat(LLViewerStats::ST_CREATE_COUNT); | ||
4649 | |||
4650 | return TRUE; | ||
4651 | } | ||
4652 | |||
4653 | |||
4654 | |||
4655 | #if LL_WINDOWS | ||
4656 | void create_console() | ||
4657 | { | ||
4658 | int h_con_handle; | ||
4659 | long l_std_handle; | ||
4660 | |||
4661 | CONSOLE_SCREEN_BUFFER_INFO coninfo; | ||
4662 | FILE *fp; | ||
4663 | |||
4664 | // allocate a console for this app | ||
4665 | AllocConsole(); | ||
4666 | |||
4667 | // set the screen buffer to be big enough to let us scroll text | ||
4668 | GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); | ||
4669 | coninfo.dwSize.Y = MAX_CONSOLE_LINES; | ||
4670 | SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); | ||
4671 | |||
4672 | // redirect unbuffered STDOUT to the console | ||
4673 | l_std_handle = (long)GetStdHandle(STD_OUTPUT_HANDLE); | ||
4674 | h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); | ||
4675 | fp = _fdopen( h_con_handle, "w" ); | ||
4676 | *stdout = *fp; | ||
4677 | setvbuf( stdout, NULL, _IONBF, 0 ); | ||
4678 | |||
4679 | // redirect unbuffered STDIN to the console | ||
4680 | l_std_handle = (long)GetStdHandle(STD_INPUT_HANDLE); | ||
4681 | h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); | ||
4682 | fp = _fdopen( h_con_handle, "r" ); | ||
4683 | *stdin = *fp; | ||
4684 | setvbuf( stdin, NULL, _IONBF, 0 ); | ||
4685 | |||
4686 | // redirect unbuffered STDERR to the console | ||
4687 | l_std_handle = (long)GetStdHandle(STD_ERROR_HANDLE); | ||
4688 | h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); | ||
4689 | fp = _fdopen( h_con_handle, "w" ); | ||
4690 | *stderr = *fp; | ||
4691 | setvbuf( stderr, NULL, _IONBF, 0 ); | ||
4692 | } | ||
4693 | #endif | ||
4694 | |||
4695 | |||
4696 | |||
4697 | //------------------------------------------------------------------- | ||
4698 | //------------------------------------------------------------------- | ||
4699 | // Vector Performance Options | ||
4700 | //------------------------------------------------------------------- | ||
4701 | //------------------------------------------------------------------- | ||
4702 | |||
4703 | // Initially, we test the performance of the vectorization code, then | ||
4704 | // turn it off if it ends up being slower. JC | ||
4705 | BOOL gVectorizePerfTest = TRUE; | ||
4706 | BOOL gVectorizeEnable = FALSE; | ||
4707 | U32 gVectorizeProcessor = 0; | ||
4708 | BOOL gVectorizeSkin = FALSE; | ||
4709 | |||
4710 | void update_vector_performances(void) | ||
4711 | { | ||
4712 | char *vp; | ||
4713 | |||
4714 | switch(gVectorizeProcessor) | ||
4715 | { | ||
4716 | case 2: vp = "SSE2"; break; // *TODO: replace the magic #s | ||
4717 | case 1: vp = "SSE"; break; | ||
4718 | default: vp = "COMPILER DEFAULT"; break; | ||
4719 | } | ||
4720 | llinfos << "Vectorization : " << ( gVectorizeEnable ? "ENABLED" : "DISABLED" ) << llendl ; | ||
4721 | llinfos << "Vector Processor : " << vp << llendl ; | ||
4722 | llinfos << "Vectorized Skinning : " << ( gVectorizeSkin ? "ENABLED" : "DISABLED" ) << llendl ; | ||
4723 | |||
4724 | if(gVectorizeEnable && gVectorizeSkin) | ||
4725 | { | ||
4726 | switch(gVectorizeProcessor) | ||
4727 | { | ||
4728 | case 2: | ||
4729 | LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometrySSE2; | ||
4730 | break; | ||
4731 | case 1: | ||
4732 | LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometrySSE; | ||
4733 | break; | ||
4734 | default: | ||
4735 | LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometryVectorized; | ||
4736 | break; | ||
4737 | } | ||
4738 | } | ||
4739 | else | ||
4740 | { | ||
4741 | LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometryOriginal; | ||
4742 | } | ||
4743 | } | ||
4744 | |||
4745 | |||
4746 | class LLVectorizationEnableListener: public LLSimpleListener | ||
4747 | { | ||
4748 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
4749 | { | ||
4750 | gVectorizeEnable = event->getValue().asBoolean(); | ||
4751 | update_vector_performances(); | ||
4752 | return true; | ||
4753 | } | ||
4754 | }; | ||
4755 | static LLVectorizationEnableListener vectorization_enable_listener; | ||
4756 | |||
4757 | class LLVectorizeSkinListener: public LLSimpleListener | ||
4758 | { | ||
4759 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
4760 | { | ||
4761 | gVectorizeSkin = event->getValue().asBoolean(); | ||
4762 | update_vector_performances(); | ||
4763 | return true; | ||
4764 | } | ||
4765 | }; | ||
4766 | static LLVectorizeSkinListener vectorize_skin_listener; | ||
4767 | |||
4768 | class LLVectorProcessorListener: public LLSimpleListener | ||
4769 | { | ||
4770 | bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) | ||
4771 | { | ||
4772 | gVectorizeProcessor = event->getValue().asInteger(); | ||
4773 | update_vector_performances(); | ||
4774 | return true; | ||
4775 | } | ||
4776 | }; | ||
4777 | static LLVectorProcessorListener vector_processor_listener; | ||
4778 | |||
4779 | // Use these strictly for things that are constructed at startup, | ||
4780 | // or for things that are performance critical. JC | ||
4781 | void saved_settings_to_globals() | ||
4782 | { | ||
4783 | LLBUTTON_H_PAD = gSavedSettings.getS32("ButtonHPad"); | ||
4784 | LLBUTTON_V_PAD = gSavedSettings.getS32("ButtonVPad"); | ||
4785 | BTN_HEIGHT_SMALL = gSavedSettings.getS32("ButtonHeightSmall"); | ||
4786 | BTN_HEIGHT = gSavedSettings.getS32("ButtonHeight"); | ||
4787 | |||
4788 | MENU_BAR_HEIGHT = gSavedSettings.getS32("MenuBarHeight"); | ||
4789 | MENU_BAR_WIDTH = gSavedSettings.getS32("MenuBarWidth"); | ||
4790 | STATUS_BAR_HEIGHT = gSavedSettings.getS32("StatusBarHeight"); | ||
4791 | |||
4792 | LLCOMBOBOX_HEIGHT = BTN_HEIGHT - 2; | ||
4793 | LLCOMBOBOX_WIDTH = 128; | ||
4794 | |||
4795 | LLSurface::setTextureSize(gSavedSettings.getU32("RegionTextureSize")); | ||
4796 | |||
4797 | LLVOSky::sNighttimeBrightness = gSavedSettings.getF32("RenderNightBrightness"); | ||
4798 | |||
4799 | LLImageGL::sGlobalUseAnisotropic = gSavedSettings.getBOOL("RenderAnisotropic"); | ||
4800 | LLVOVolume::sLODFactor = gSavedSettings.getF32("RenderVolumeLODFactor"); | ||
4801 | LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f; | ||
4802 | LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor"); | ||
4803 | LLVOTree::sTreeFactor = gSavedSettings.getF32("RenderTreeLODFactor"); | ||
4804 | LLVOAvatar::sLODFactor = gSavedSettings.getF32("RenderAvatarLODFactor"); | ||
4805 | LLVOAvatar::sMaxVisible = gSavedSettings.getS32("RenderAvatarMaxVisible"); | ||
4806 | LLVOAvatar::sVisibleInFirstPerson = gSavedSettings.getBOOL("FirstPersonAvatarVisible"); | ||
4807 | // clamp auto-open time to some minimum usable value | ||
4808 | LLFolderView::sAutoOpenTime = llmax(0.25f, gSavedSettings.getF32("FolderAutoOpenDelay")); | ||
4809 | LLToolBar::sInventoryAutoOpenTime = gSavedSettings.getF32("InventoryAutoOpenDelay"); | ||
4810 | LLSelectMgr::sRectSelectInclusive = gSavedSettings.getBOOL("RectangleSelectInclusive"); | ||
4811 | LLSelectMgr::sRenderHiddenSelections = gSavedSettings.getBOOL("RenderHiddenSelections"); | ||
4812 | LLSelectMgr::sRenderLightRadius = gSavedSettings.getBOOL("RenderLightRadius"); | ||
4813 | |||
4814 | gFrameStats.setTrackStats(gSavedSettings.getBOOL("StatsSessionTrackFrameStats")); | ||
4815 | gAgentPilot.mNumRuns = gSavedSettings.getS32("StatsNumRuns"); | ||
4816 | gAgentPilot.mQuitAfterRuns = gSavedSettings.getBOOL("StatsQuitAfterRuns"); | ||
4817 | gAgent.mHideGroupTitle = gSavedSettings.getBOOL("RenderHideGroupTitle"); | ||
4818 | |||
4819 | gDebugWindowProc = gSavedSettings.getBOOL("DebugWindowProc"); | ||
4820 | gAllowIdleAFK = gSavedSettings.getBOOL("AllowIdleAFK"); | ||
4821 | gAFKTimeout = gSavedSettings.getF32("AFKTimeout"); | ||
4822 | gMouseSensitivity = gSavedSettings.getF32("MouseSensitivity"); | ||
4823 | gInvertMouse = gSavedSettings.getBOOL("InvertMouse"); | ||
4824 | gShowObjectUpdates = gSavedSettings.getBOOL("ShowObjectUpdates"); | ||
4825 | gMapScale = gSavedSettings.getF32("MapScale"); | ||
4826 | gMiniMapScale = gSavedSettings.getF32("MiniMapScale"); | ||
4827 | gHandleKeysAsync = gSavedSettings.getBOOL("AsyncKeyboard"); | ||
4828 | LLHoverView::sShowHoverTips = gSavedSettings.getBOOL("ShowHoverTips"); | ||
4829 | |||
4830 | #if LL_VECTORIZE | ||
4831 | if (gSysCPU.hasAltivec()) | ||
4832 | { | ||
4833 | gSavedSettings.setBOOL("VectorizeEnable", TRUE ); | ||
4834 | gSavedSettings.setU32("VectorizeProcessor", 0 ); | ||
4835 | } | ||
4836 | else | ||
4837 | if (gSysCPU.hasSSE2()) | ||
4838 | { | ||
4839 | gSavedSettings.setBOOL("VectorizeEnable", TRUE ); | ||
4840 | gSavedSettings.setU32("VectorizeProcessor", 2 ); | ||
4841 | } | ||
4842 | else | ||
4843 | if (gSysCPU.hasSSE()) | ||
4844 | { | ||
4845 | gSavedSettings.setBOOL("VectorizeEnable", TRUE ); | ||
4846 | gSavedSettings.setU32("VectorizeProcessor", 1 ); | ||
4847 | } | ||
4848 | else | ||
4849 | { | ||
4850 | // Don't bother testing or running if CPU doesn't support it. JC | ||
4851 | gSavedSettings.setBOOL("VectorizePerfTest", FALSE ); | ||
4852 | gSavedSettings.setBOOL("VectorizeEnable", FALSE ); | ||
4853 | gSavedSettings.setU32("VectorizeProcessor", 0 ); | ||
4854 | gSavedSettings.setBOOL("VectorizeSkin", FALSE); | ||
4855 | } | ||
4856 | #else | ||
4857 | // This build target doesn't support SSE, don't test/run. | ||
4858 | gSavedSettings.setBOOL("VectorizePerfTest", FALSE ); | ||
4859 | gSavedSettings.setBOOL("VectorizeEnable", FALSE ); | ||
4860 | gSavedSettings.setU32("VectorizeProcessor", 0 ); | ||
4861 | gSavedSettings.setBOOL("VectorizeSkin", FALSE); | ||
4862 | #endif | ||
4863 | |||
4864 | gVectorizePerfTest = gSavedSettings.getBOOL("VectorizePerfTest"); | ||
4865 | gVectorizeEnable = gSavedSettings.getBOOL("VectorizeEnable"); | ||
4866 | gVectorizeProcessor = gSavedSettings.getU32("VectorizeProcessor"); | ||
4867 | gVectorizeSkin = gSavedSettings.getBOOL("VectorizeSkin"); | ||
4868 | update_vector_performances(); | ||
4869 | |||
4870 | // Into a global in case we corrupt the list on crash. | ||
4871 | gCrashBehavior = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); | ||
4872 | |||
4873 | // propagate push to talk preference to current status | ||
4874 | gSavedSettings.setBOOL("PTTCurrentlyEnabled", gSavedSettings.getBOOL("EnablePushToTalk")); | ||
4875 | |||
4876 | settings_setup_listeners(); | ||
4877 | |||
4878 | // these are currently static in this file, so they can't move to settings_setup_listeners | ||
4879 | gSavedSettings.getControl("VectorizeEnable")->addListener(&vectorization_enable_listener); | ||
4880 | gSavedSettings.getControl("VectorizeProcessor")->addListener(&vector_processor_listener); | ||
4881 | gSavedSettings.getControl("VectorizeSkin")->addListener(&vectorize_skin_listener); | ||
4882 | |||
4883 | // gAgent.init() also loads from saved settings. | ||
4884 | } | ||
4885 | |||
4886 | void cleanup_saved_settings() | ||
4887 | { | ||
4888 | gSavedSettings.setBOOL("MouseSun", FALSE); | ||
4889 | |||
4890 | gSavedSettings.setBOOL("FlyBtnState", FALSE); | ||
4891 | |||
4892 | gSavedSettings.setBOOL("FirstPersonBtnState", FALSE); | ||
4893 | gSavedSettings.setBOOL("ThirdPersonBtnState", TRUE); | ||
4894 | gSavedSettings.setBOOL("BuildBtnState", FALSE); | ||
4895 | |||
4896 | gSavedSettings.setBOOL("UseEnergy", TRUE); // force toggle to turn off, since sends message to simulator | ||
4897 | |||
4898 | gSavedSettings.setBOOL("DebugWindowProc", gDebugWindowProc); | ||
4899 | |||
4900 | gSavedSettings.setBOOL("AllowIdleAFK", gAllowIdleAFK); | ||
4901 | gSavedSettings.setBOOL("ShowObjectUpdates", gShowObjectUpdates); | ||
4902 | |||
4903 | if (!gNoRender) | ||
4904 | { | ||
4905 | if (gDebugView) | ||
4906 | { | ||
4907 | gSavedSettings.setBOOL("ShowDebugConsole", gDebugView->mDebugConsolep->getVisible()); | ||
4908 | gSavedSettings.setBOOL("ShowDebugStats", gDebugView->mStatViewp->getVisible()); | ||
4909 | } | ||
4910 | } | ||
4911 | |||
4912 | // save window position if not fullscreen | ||
4913 | // as we don't track it in callbacks | ||
4914 | BOOL fullscreen = gViewerWindow->mWindow->getFullscreen(); | ||
4915 | BOOL maximized = gViewerWindow->mWindow->getMaximized(); | ||
4916 | if (!fullscreen && !maximized) | ||
4917 | { | ||
4918 | LLCoordScreen window_pos; | ||
4919 | |||
4920 | if (gViewerWindow->mWindow->getPosition(&window_pos)) | ||
4921 | { | ||
4922 | gSavedSettings.setS32("WindowX", window_pos.mX); | ||
4923 | gSavedSettings.setS32("WindowY", window_pos.mY); | ||
4924 | } | ||
4925 | } | ||
4926 | |||
4927 | gSavedSettings.setF32("MapScale", gMapScale ); | ||
4928 | gSavedSettings.setF32("MiniMapScale", gMiniMapScale ); | ||
4929 | gSavedSettings.setBOOL("AsyncKeyboard", gHandleKeysAsync); | ||
4930 | gSavedSettings.setBOOL("ShowHoverTips", LLHoverView::sShowHoverTips); | ||
4931 | |||
4932 | // Some things are cached in LLAgent. | ||
4933 | if (gAgent.mInitialized) | ||
4934 | { | ||
4935 | gSavedSettings.setF32("RenderFarClip", gAgent.mDrawDistance); | ||
4936 | } | ||
4937 | |||
4938 | gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, gCrashBehavior); | ||
4939 | } | ||
4940 | |||
4941 | |||
4942 | void callback_cache_name(const LLUUID& id, const char* firstname, const char* lastname, BOOL is_group, void* data) | ||
4943 | { | ||
4944 | LLNameListCtrl::refreshAll(id, firstname, lastname, is_group); | ||
4945 | LLNameBox::refreshAll(id, firstname, lastname, is_group); | ||
4946 | LLNameEditor::refreshAll(id, firstname, lastname, is_group); | ||
4947 | |||
4948 | // TODO: Actually be intelligent about the refresh. | ||
4949 | // For now, just brute force refresh the dialogs. | ||
4950 | dialog_refresh_all(); | ||
4951 | } | ||
4952 | |||
4953 | |||
4954 | void write_debug(const std::string& str) | ||
4955 | { | ||
4956 | write_debug(str.c_str()); | ||
4957 | } | ||
4958 | |||
4959 | void write_debug(const char *str) | ||
4960 | { | ||
4961 | if (!gDebugFile) | ||
4962 | { | ||
4963 | std::string debug_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log"); | ||
4964 | llinfos << "Opening debug file " << debug_filename << llendl; | ||
4965 | gDebugFile = LLFile::fopen(debug_filename.c_str(), "w"); /* Flawfinder: ignore */ | ||
4966 | if (!gDebugFile) | ||
4967 | { | ||
4968 | llinfos << "Opening debug file " << debug_filename << " failed. Using stderr." << llendl; | ||
4969 | gDebugFile = stderr; | ||
4970 | } | ||
4971 | } | ||
4972 | fputs(str, gDebugFile); | ||
4973 | fflush(gDebugFile); | ||
4974 | } | ||
4975 | |||
4976 | void close_debug() | ||
4977 | { | ||
4978 | if (gDebugFile) | ||
4979 | { | ||
4980 | fclose(gDebugFile); | ||
4981 | } | ||
4982 | gDebugFile = NULL; | ||
4983 | } | ||
4984 | |||
4985 | void print_agent_nvpairs(void*) | ||
4986 | { | ||
4987 | LLViewerObject *objectp; | ||
4988 | |||
4989 | llinfos << "Agent Name Value Pairs" << llendl; | ||
4990 | |||
4991 | objectp = gObjectList.findObject(gAgentID); | ||
4992 | if (objectp) | ||
4993 | { | ||
4994 | objectp->printNameValuePairs(); | ||
4995 | } | ||
4996 | else | ||
4997 | { | ||
4998 | llinfos << "Can't find agent object" << llendl; | ||
4999 | } | ||
5000 | |||
5001 | llinfos << "Camera at " << gAgent.getCameraPositionGlobal() << llendl; | ||
5002 | } | ||
5003 | |||
5004 | |||
5005 | void reset_statistics() | ||
5006 | { | ||
5007 | gPipeline.resetFrameStats(); // Reset per-frame statistics. | ||
5008 | if (LLSurface::sTextureUpdateTime) | ||
5009 | { | ||
5010 | LLSurface::sTexelsUpdatedPerSecStat.addValue(0.001f*(LLSurface::sTexelsUpdated / LLSurface::sTextureUpdateTime)); | ||
5011 | LLSurface::sTexelsUpdated = 0; | ||
5012 | LLSurface::sTextureUpdateTime = 0.f; | ||
5013 | } | ||
5014 | } | ||
5015 | |||
5016 | |||
5017 | void output_statistics(void*) | ||
5018 | { | ||
5019 | llinfos << "Number of orphans: " << gObjectList.getOrphanCount() << llendl; | ||
5020 | llinfos << "Number of dead objects: " << gObjectList.mNumDeadObjects << llendl; | ||
5021 | llinfos << "Num images: " << gImageList.getNumImages() << llendl; | ||
5022 | llinfos << "Texture usage: " << LLImageGL::sGlobalTextureMemory << llendl; | ||
5023 | llinfos << "Texture working set: " << LLImageGL::sBoundTextureMemory << llendl; | ||
5024 | llinfos << "Raw usage: " << LLImageRaw::sGlobalRawMemory << llendl; | ||
5025 | llinfos << "Formatted usage: " << LLImageFormatted::sGlobalFormattedMemory << llendl; | ||
5026 | llinfos << "Zombie Viewer Objects: " << LLViewerObject::getNumZombieObjects() << llendl; | ||
5027 | llinfos << "Number of lights: " << gPipeline.getLightCount() << llendl; | ||
5028 | |||
5029 | llinfos << "Memory Usage:" << llendl; | ||
5030 | llinfos << "--------------------------------" << llendl; | ||
5031 | llinfos << "Pipeline:" << llendl; | ||
5032 | llinfos << llendl; | ||
5033 | |||
5034 | #if LL_SMARTHEAP | ||
5035 | llinfos << "--------------------------------" << llendl; | ||
5036 | { | ||
5037 | llinfos << "sizeof(LLVOVolume) = " << sizeof(LLVOVolume) << llendl; | ||
5038 | |||
5039 | U32 total_pool_size = 0; | ||
5040 | U32 total_used_size = 0; | ||
5041 | MEM_POOL_INFO pool_info; | ||
5042 | MEM_POOL_STATUS pool_status; | ||
5043 | U32 pool_num = 0; | ||
5044 | for(pool_status = MemPoolFirst( &pool_info, 1 ); | ||
5045 | pool_status != MEM_POOL_END; | ||
5046 | pool_status = MemPoolNext( &pool_info, 1 ) ) | ||
5047 | { | ||
5048 | llinfos << "Pool #" << pool_num << llendl; | ||
5049 | if( MEM_POOL_OK != pool_status ) | ||
5050 | { | ||
5051 | llwarns << "Pool not ok" << llendl; | ||
5052 | continue; | ||
5053 | } | ||
5054 | |||
5055 | llinfos << "Pool blockSizeFS " << pool_info.blockSizeFS | ||
5056 | << " pageSize " << pool_info.pageSize | ||
5057 | << llendl; | ||
5058 | |||
5059 | U32 pool_count = MemPoolCount(pool_info.pool); | ||
5060 | llinfos << "Blocks " << pool_count << llendl; | ||
5061 | |||
5062 | U32 pool_size = MemPoolSize( pool_info.pool ); | ||
5063 | if( pool_size == MEM_ERROR_RET ) | ||
5064 | { | ||
5065 | llinfos << "MemPoolSize() failed (" << pool_num << ")" << llendl; | ||
5066 | } | ||
5067 | else | ||
5068 | { | ||
5069 | llinfos << "MemPool Size " << pool_size / 1024 << "K" << llendl; | ||
5070 | } | ||
5071 | |||
5072 | total_pool_size += pool_size; | ||
5073 | |||
5074 | if( !MemPoolLock( pool_info.pool ) ) | ||
5075 | { | ||
5076 | llinfos << "MemPoolLock failed (" << pool_num << ") " << llendl; | ||
5077 | continue; | ||
5078 | } | ||
5079 | |||
5080 | U32 used_size = 0; | ||
5081 | MEM_POOL_ENTRY entry; | ||
5082 | entry.entry = NULL; | ||
5083 | while( MemPoolWalk( pool_info.pool, &entry ) == MEM_POOL_OK ) | ||
5084 | { | ||
5085 | if( entry.isInUse ) | ||
5086 | { | ||
5087 | used_size += entry.size; | ||
5088 | } | ||
5089 | } | ||
5090 | |||
5091 | MemPoolUnlock( pool_info.pool ); | ||
5092 | |||
5093 | llinfos << "MemPool Used " << used_size/1024 << "K" << llendl; | ||
5094 | total_used_size += used_size; | ||
5095 | pool_num++; | ||
5096 | } | ||
5097 | |||
5098 | llinfos << "Total Pool Size " << total_pool_size/1024 << "K" << llendl; | ||
5099 | llinfos << "Total Used Size " << total_used_size/1024 << "K" << llendl; | ||
5100 | |||
5101 | } | ||
5102 | #endif | ||
5103 | |||
5104 | llinfos << "--------------------------------" << llendl; | ||
5105 | llinfos << "Avatar Memory (partly overlaps with above stats):" << llendl; | ||
5106 | gTexStaticImageList.dumpByteCount(); | ||
5107 | LLVOAvatar::dumpScratchTextureByteCount(); | ||
5108 | LLTexLayerSetBuffer::dumpTotalByteCount(); | ||
5109 | LLVOAvatar::dumpTotalLocalTextureByteCount(); | ||
5110 | LLTexLayerParamAlpha::dumpCacheByteCount(); | ||
5111 | LLVOAvatar::dumpBakedStatus(); | ||
5112 | |||
5113 | llinfos << llendl; | ||
5114 | |||
5115 | llinfos << "Object counts:" << llendl; | ||
5116 | S32 i; | ||
5117 | S32 obj_counts[256]; | ||
5118 | // S32 app_angles[256]; | ||
5119 | for (i = 0; i < 256; i++) | ||
5120 | { | ||
5121 | obj_counts[i] = 0; | ||
5122 | } | ||
5123 | for (i = 0; i < gObjectList.getNumObjects(); i++) | ||
5124 | { | ||
5125 | LLViewerObject *objectp = gObjectList.getObject(i); | ||
5126 | if (objectp) | ||
5127 | { | ||
5128 | obj_counts[objectp->getPCode()]++; | ||
5129 | } | ||
5130 | } | ||
5131 | for (i = 0; i < 256; i++) | ||
5132 | { | ||
5133 | if (obj_counts[i]) | ||
5134 | { | ||
5135 | llinfos << LLPrimitive::pCodeToString(i) << ":" << obj_counts[i] << llendl; | ||
5136 | } | ||
5137 | } | ||
5138 | |||
5139 | /* | ||
5140 | llinfos << "Object size distribution" << llendl; | ||
5141 | llinfos << "------------------------" << llendl; | ||
5142 | for (i = 0; i < 256; i++) | ||
5143 | { | ||
5144 | obj_counts[i] = 0; | ||
5145 | //app_angles[i] = 0; | ||
5146 | } | ||
5147 | for (i = 0; i < gObjectList.getNumObjects(); i++) | ||
5148 | { | ||
5149 | LLViewerObject *objectp = gObjectList.getObject(i); | ||
5150 | S32 size = llmin(255, (S32)objectp->getRadius()/2); | ||
5151 | obj_counts[size]++; | ||
5152 | } | ||
5153 | for (i = 0; i < 256; i++) | ||
5154 | { | ||
5155 | if (obj_counts[i]) | ||
5156 | { | ||
5157 | llinfos << i*2 << ":" << (i+1)*2 << " - " << obj_counts[i] << llendl; | ||
5158 | } | ||
5159 | } | ||
5160 | */ | ||
5161 | |||
5162 | /* | ||
5163 | |||
5164 | llinfos << llendl; | ||
5165 | llinfos << "Lighting statistics" << llendl; | ||
5166 | llinfos << "-------------------" << llendl; | ||
5167 | S32 light_bins[256]; | ||
5168 | S32 light_counts[256]; | ||
5169 | for (i = 0; i < 256; i++) | ||
5170 | { | ||
5171 | light_bins[i] = 0; | ||
5172 | light_counts[i] = 0; | ||
5173 | } | ||
5174 | for (i = 0; i < gPipeline.mLightSet.count(); i++) | ||
5175 | { | ||
5176 | LLDrawable *drawablep = gPipeline.mLightSet[i]; | ||
5177 | F32 light_range = drawablep->getMetric() * LIGHT_RANGE_FACTOR; | ||
5178 | S32 light_bin = light_range / 4; | ||
5179 | S32 count_bin = llmin(drawablep->mLightSet.getLength() / 25, 255); | ||
5180 | |||
5181 | if (count_bin > 20) | ||
5182 | { | ||
5183 | llinfos << drawablep->getVObj()->getPCodeString() << ":" << count_bin*25 << llendl; | ||
5184 | drawablep->getVObj()->dump(); | ||
5185 | } | ||
5186 | //llinfos << i << ": " << light_range << llendl; | ||
5187 | light_bins[light_bin]++; | ||
5188 | light_counts[count_bin]++; | ||
5189 | } | ||
5190 | for (i = 0; i < 256; i++) | ||
5191 | { | ||
5192 | if (light_bins[i]) | ||
5193 | { | ||
5194 | llinfos << i*4 << ":" << (i+1)*4 << " - " << light_bins[i] << llendl; | ||
5195 | } | ||
5196 | } | ||
5197 | llinfos << llendl; | ||
5198 | llinfos << "LightSet counts" << llendl; | ||
5199 | for (i = 0; i < 256; i++) | ||
5200 | { | ||
5201 | if (light_counts[i]) | ||
5202 | { | ||
5203 | llinfos << i*25 << ":" << (i+1)*25 << " - " << light_counts[i] << llendl; | ||
5204 | } | ||
5205 | } | ||
5206 | */ | ||
5207 | } | ||
5208 | |||
5209 | class ViewerStatsResponder : public LLHTTPClient::Responder | ||
5210 | { | ||
5211 | public: | ||
5212 | ViewerStatsResponder() { } | ||
5213 | |||
5214 | void error(U32 statusNum, const std::string& reason) | ||
5215 | { | ||
5216 | llinfos << "ViewerStatsResponder::error " << statusNum << " " | ||
5217 | << reason << llendl; | ||
5218 | } | ||
5219 | |||
5220 | void result(const LLSD& content) | ||
5221 | { | ||
5222 | llinfos << "ViewerStatsResponder::result" << llendl; | ||
5223 | } | ||
5224 | }; | ||
5225 | |||
5226 | /* | ||
5227 | * The sim-side LLSD is in newsim/llagentinfo.cpp:forwardViewerStats. | ||
5228 | * | ||
5229 | * There's also a compatibility shim for the old fixed-format sim | ||
5230 | * stats in newsim/llagentinfo.cpp:processViewerStats. | ||
5231 | * | ||
5232 | * If you move stats around here, make the corresponding changes in | ||
5233 | * those locations, too. | ||
5234 | */ | ||
5235 | void send_stats() | ||
5236 | { | ||
5237 | // IW 9/23/02 I elected not to move this into LLViewerStats | ||
5238 | // because it depends on too many viewer.cpp globals. | ||
5239 | // Someday we may want to merge all our stats into a central place | ||
5240 | // but that day is not today. | ||
5241 | |||
5242 | // Only send stats if the agent is connected to a region. | ||
5243 | if (!gAgent.getRegion() || gNoRender) | ||
5244 | { | ||
5245 | return; | ||
5246 | } | ||
5247 | |||
5248 | LLSD body; | ||
5249 | std::string url = gAgent.getRegion()->getCapability("ViewerStats"); | ||
5250 | |||
5251 | if (url.empty()) { | ||
5252 | llwarns << "Could not get ViewerStats capability" << llendl; | ||
5253 | return; | ||
5254 | } | ||
5255 | |||
5256 | body["session_id"] = gAgentSessionID; | ||
5257 | |||
5258 | LLSD &agent = body["agent"]; | ||
5259 | |||
5260 | time_t ltime; | ||
5261 | time(<ime); | ||
5262 | F32 run_time = F32(LLFrameTimer::getElapsedSeconds()); | ||
5263 | |||
5264 | agent["start_time"] = ltime - run_time; | ||
5265 | agent["run_time"] = run_time; | ||
5266 | // send fps only for time app spends in foreground | ||
5267 | agent["fps"] = (F32)gForegroundFrameCount / gForegroundTime.getElapsedTimeF32(); | ||
5268 | agent["version"] = gCurrentVersion; | ||
5269 | agent["language"] = gSavedSettings.getString("Language"); | ||
5270 | |||
5271 | agent["sim_fps"] = ((F32) gFrameCount - gSimFrames) / | ||
5272 | (F32) (gRenderStartTime.getElapsedTimeF32() - gSimLastTime); | ||
5273 | |||
5274 | gSimLastTime = gRenderStartTime.getElapsedTimeF32(); | ||
5275 | gSimFrames = (F32) gFrameCount; | ||
5276 | |||
5277 | agent["agents_in_view"] = LLVOAvatar::sNumVisibleAvatars; | ||
5278 | agent["ping"] = gAvgSimPing; | ||
5279 | agent["meters_traveled"] = gAgent.getDistanceTraveled(); | ||
5280 | agent["regions_visited"] = gAgent.getRegionsVisited(); | ||
5281 | agent["mem_use"] = getCurrentRSS() / 1024.0; | ||
5282 | |||
5283 | LLSD &system = body["system"]; | ||
5284 | |||
5285 | system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB(); | ||
5286 | system["os"] = gSysOS.getOSString(); | ||
5287 | system["cpu"] = gSysCPU.getCPUString(); | ||
5288 | |||
5289 | std::string gpu_desc = llformat( | ||
5290 | "%-6s Class %d ", | ||
5291 | gGLManager.mGLVendorShort.substr(0,6).c_str(), | ||
5292 | gFeatureManagerp->getGPUClass()) | ||
5293 | + gFeatureManagerp->getGPUString(); | ||
5294 | |||
5295 | system["gpu"] = gpu_desc; | ||
5296 | system["gpu_class"] = gFeatureManagerp->getGPUClass(); | ||
5297 | system["gpu_vendor"] = gGLManager.mGLVendorShort; | ||
5298 | system["gpu_version"] = gGLManager.mDriverVersionVendorString; | ||
5299 | |||
5300 | LLSD &download = body["downloads"]; | ||
5301 | |||
5302 | download["world_kbytes"] = gTotalWorldBytes / 1024.0; | ||
5303 | download["object_kbytes"] = gTotalObjectBytes / 1024.0; | ||
5304 | download["texture_kbytes"] = gTotalTextureBytes / 1024.0; | ||
5305 | |||
5306 | LLSD &in = body["stats"]["net"]["in"]; | ||
5307 | |||
5308 | in["kbytes"] = gMessageSystem->mTotalBytesIn / 1024.0; | ||
5309 | in["packets"] = (S32) gMessageSystem->mPacketsIn; | ||
5310 | in["compressed_packets"] = (S32) gMessageSystem->mCompressedPacketsIn; | ||
5311 | in["savings"] = (gMessageSystem->mUncompressedBytesIn - | ||
5312 | gMessageSystem->mCompressedBytesIn) / 1024.0; | ||
5313 | |||
5314 | LLSD &out = body["stats"]["net"]["out"]; | ||
5315 | |||
5316 | out["kbytes"] = gMessageSystem->mTotalBytesOut / 1024.0; | ||
5317 | out["packets"] = (S32) gMessageSystem->mPacketsOut; | ||
5318 | out["compressed_packets"] = (S32) gMessageSystem->mCompressedPacketsOut; | ||
5319 | out["savings"] = (gMessageSystem->mUncompressedBytesOut - | ||
5320 | gMessageSystem->mCompressedBytesOut) / 1024.0; | ||
5321 | |||
5322 | LLSD &fail = body["stats"]["failures"]; | ||
5323 | |||
5324 | fail["send_packet"] = (S32) gMessageSystem->mSendPacketFailureCount; | ||
5325 | fail["dropped"] = (S32) gMessageSystem->mDroppedPackets; | ||
5326 | fail["resent"] = (S32) gMessageSystem->mResentPackets; | ||
5327 | fail["failed_resends"] = (S32) gMessageSystem->mFailedResendPackets; | ||
5328 | fail["off_circuit"] = (S32) gMessageSystem->mOffCircuitPackets; | ||
5329 | fail["invalid"] = (S32) gMessageSystem->mInvalidOnCircuitPackets; | ||
5330 | |||
5331 | gViewerStats->addToMessage(body); | ||
5332 | |||
5333 | LLHTTPClient::post(url, body, new ViewerStatsResponder()); | ||
5334 | } | ||
5335 | |||
5336 | #if !LL_WINDOWS | ||
5337 | // catch the first signal and send logout messages logout | ||
5338 | void signal_handlers(S32 s) | ||
5339 | { | ||
5340 | release_signals(); | ||
5341 | |||
5342 | // Check for graceful exit conditions | ||
5343 | if(SIGTERM == s) | ||
5344 | { | ||
5345 | // Raise the flag telling the system to shut down | ||
5346 | app_force_quit(NULL); | ||
5347 | return; | ||
5348 | } | ||
5349 | |||
5350 | # if LL_LINUX || LL_SOLARIS | ||
5351 | // Really useful to know what KIND of crash we got. | ||
5352 | // Might want this on OSX too! | ||
5353 | llwarns << "*** Caught signal " << s << llendl; | ||
5354 | # endif | ||
5355 | |||
5356 | if (gCrashCallback) | ||
5357 | { | ||
5358 | gCrashCallback(); | ||
5359 | } | ||
5360 | } | ||
5361 | #endif | ||
5362 | |||
5363 | // Assign signal handler to be called in case we crash. | ||
5364 | void catch_signals() | ||
5365 | { | ||
5366 | #if LL_WINDOWS | ||
5367 | // Win32 signal handling uses a Microsoft API instead of signal handlers | ||
5368 | LLWinDebug::setupExceptionHandler(); | ||
5369 | return; | ||
5370 | #else | ||
5371 | // This happens before log file output is properly set up, so this would go to the system log. | ||
5372 | // llinfos << "Assigning signal handlers!" << llendl; | ||
5373 | |||
5374 | // Handle the signals that default to causing a core image to be created, as per the man page on signal(2). | ||
5375 | signal(SIGILL, signal_handlers); | ||
5376 | signal(SIGTRAP, signal_handlers); | ||
5377 | if (being_debugged()) | ||
5378 | { | ||
5379 | // If we're being run under the control of a debugger, give | ||
5380 | // ourselves a way to bail into the debugger. | ||
5381 | signal(SIGABRT, SIG_DFL); | ||
5382 | } else { | ||
5383 | signal(SIGABRT, signal_handlers); | ||
5384 | } | ||
5385 | signal(SIGFPE, signal_handlers); | ||
5386 | signal(SIGBUS, signal_handlers); | ||
5387 | signal(SIGSEGV, signal_handlers); | ||
5388 | signal(SIGSYS, signal_handlers); | ||
5389 | |||
5390 | // SIGEMT is an 'emulator trap' which is not defined on linux. | ||
5391 | #if !LL_LINUX && !LL_SOLARIS | ||
5392 | signal(SIGEMT, signal_handlers); | ||
5393 | #endif | ||
5394 | |||
5395 | // This one is treated specially in the signal handler. | ||
5396 | signal(SIGTERM, signal_handlers); | ||
5397 | |||
5398 | #endif // LL_WINDOWS | ||
5399 | } | ||
5400 | |||
5401 | #if !LL_WINDOWS | ||
5402 | void release_signals() | ||
5403 | { | ||
5404 | signal(SIGTERM, SIG_DFL); | ||
5405 | signal(SIGABRT, SIG_DFL); | ||
5406 | signal(SIGILL, SIG_DFL); | ||
5407 | signal(SIGFPE, SIG_DFL); | ||
5408 | signal(SIGSEGV, SIG_DFL); | ||
5409 | |||
5410 | #ifdef SIGBUS | ||
5411 | signal(SIGBUS, SIG_DFL); | ||
5412 | #endif | ||
5413 | |||
5414 | #ifdef SIGSYS | ||
5415 | signal(SIGSYS, SIG_DFL); | ||
5416 | #endif | ||
5417 | } | ||
5418 | #endif // !LL_WINDOWS | ||
5419 | |||
5420 | void purge_cache() | ||
5421 | { | ||
5422 | llinfos << "Purging Texture Cache..." << llendl; | ||
5423 | gTextureCache->purgeCache(LL_PATH_CACHE); | ||
5424 | llinfos << "Purging Cache..." << llendl; | ||
5425 | std::string mask = gDirUtilp->getDirDelimiter() + "*.*"; | ||
5426 | gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"").c_str(),mask); | ||
5427 | } | ||
5428 | |||
5429 | int parse_args(int argc, char **argv) | ||
5430 | { | ||
5431 | // Sometimes IP addresses passed in on the command line have leading | ||
5432 | // or trailing white space. Use LLString to clean that up. | ||
5433 | LLString ip_string; | ||
5434 | S32 j; | ||
5435 | |||
5436 | for (j = 1; j < argc; j++) | ||
5437 | { | ||
5438 | gArgs += argv[j]; | ||
5439 | gArgs += " "; | ||
5440 | |||
5441 | if ((!strcmp(argv[j], "-port")) && (++j < argc)) | ||
5442 | { | ||
5443 | sscanf(argv[j], "%u", &(gAgent.mViewerPort)); | ||
5444 | } | ||
5445 | else if ((!strcmp(argv[j], "-drop")) && (++j < argc)) | ||
5446 | { | ||
5447 | sscanf(argv[j], "%f", &gPacketDropPercentage); | ||
5448 | } | ||
5449 | else if ((!strcmp(argv[j], "-inbw")) && (++j < argc)) | ||
5450 | { | ||
5451 | sscanf(argv[j], "%f", &gInBandwidth); | ||
5452 | } | ||
5453 | else if ((!strcmp(argv[j], "-outbw")) && (++j < argc)) | ||
5454 | { | ||
5455 | sscanf(argv[j], "%f", &gOutBandwidth); | ||
5456 | } | ||
5457 | else if (!strcmp(argv[j], "--aditi")) | ||
5458 | { | ||
5459 | gUserServerChoice = USERSERVER_ADITI; | ||
5460 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */ | ||
5461 | } | ||
5462 | else if (!strcmp(argv[j], "--agni")) | ||
5463 | { | ||
5464 | gUserServerChoice = USERSERVER_AGNI; | ||
5465 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */ | ||
5466 | } | ||
5467 | else if (!strcmp(argv[j], "--dmz")) | ||
5468 | { | ||
5469 | gUserServerChoice = USERSERVER_DMZ; | ||
5470 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */ | ||
5471 | } | ||
5472 | else if (!strcmp(argv[j], "--siva")) | ||
5473 | { | ||
5474 | gUserServerChoice = USERSERVER_SIVA; | ||
5475 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */ | ||
5476 | } | ||
5477 | else if (!strcmp(argv[j], "--shakti")) | ||
5478 | { | ||
5479 | gUserServerChoice = USERSERVER_SHAKTI; | ||
5480 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */ | ||
5481 | } | ||
5482 | else if (!strcmp(argv[j], "--durga")) | ||
5483 | { | ||
5484 | gUserServerChoice = USERSERVER_DURGA; | ||
5485 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */ | ||
5486 | } | ||
5487 | else if (!strcmp(argv[j], "--soma")) | ||
5488 | { | ||
5489 | gUserServerChoice = USERSERVER_SOMA; | ||
5490 | snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */ | ||
5491 | } | ||
5492 | else if (!strcmp(argv[j], "--ganga")) | ||
5493 | { | ||
5494 | gUserServerChoice = USERSERVER_GANGA; | ||
5495 | sprintf(gUserServerName,"%s", gUserServerDomainName[gUserServerChoice].mName); | ||
5496 | } | ||
5497 | else if (!strcmp(argv[j], "--vaak")) | ||
5498 | { | ||
5499 | gUserServerChoice = USERSERVER_VAAK; | ||
5500 | sprintf(gUserServerName,"%s", gUserServerDomainName[gUserServerChoice].mName); | ||
5501 | } | ||
5502 | else if (!strcmp(argv[j], "--uma")) | ||
5503 | { | ||
5504 | gUserServerChoice = USERSERVER_UMA; | ||
5505 | sprintf(gUserServerName,"%s", gUserServerDomainName[gUserServerChoice].mName); | ||
5506 | } | ||
5507 | else if (!strcmp(argv[j], "-user") && (++j < argc)) | ||
5508 | { | ||
5509 | if (!strcmp(argv[j], "-")) | ||
5510 | { | ||
5511 | gUserServerChoice = USERSERVER_LOCAL; | ||
5512 | snprintf(gUserServerName, MAX_STRING, "%s", LOOPBACK_ADDRESS_STRING); /* Flawfinder: ignore */ | ||
5513 | } | ||
5514 | else | ||
5515 | { | ||
5516 | gUserServerChoice = USERSERVER_OTHER; | ||
5517 | ip_string.assign( argv[j] ); | ||
5518 | LLString::trim(ip_string); | ||
5519 | snprintf(gUserServerName, MAX_STRING, "%s", ip_string.c_str()); /* Flawfinder: ignore */ | ||
5520 | } | ||
5521 | } | ||
5522 | else if (!strcmp(argv[j], "-loginuri") && (++j < argc)) | ||
5523 | { | ||
5524 | gLoginURIs.push_back(utf8str_trim(argv[j])); | ||
5525 | } | ||
5526 | else if (!strcmp(argv[j], "-helperuri") && (++j < argc)) | ||
5527 | { | ||
5528 | gHelperURI = argv[j]; | ||
5529 | gHelperURI = utf8str_trim(gHelperURI); | ||
5530 | } | ||
5531 | else if (!strcmp(argv[j], "-debugviews")) | ||
5532 | { | ||
5533 | LLView::sDebugRects = TRUE; | ||
5534 | } | ||
5535 | else if (!strcmp(argv[j], "-skin") && (++j < argc)) | ||
5536 | { | ||
5537 | std::string folder(argv[j]); | ||
5538 | gDirUtilp->setSkinFolder(folder); | ||
5539 | } | ||
5540 | else if (!strcmp(argv[j], "-autologin") || !strcmp(argv[j], "--autologin")) // keep --autologin for compatibility | ||
5541 | { | ||
5542 | gAutoLogin = TRUE; | ||
5543 | } | ||
5544 | else if (!strcmp(argv[j], "-quitafter") && (++j < argc)) | ||
5545 | { | ||
5546 | gQuitAfterSeconds = (F32)atof(argv[j]); | ||
5547 | } | ||
5548 | else if (!strcmp(argv[j], "-rotate")) | ||
5549 | { | ||
5550 | gRotateRight = TRUE; | ||
5551 | } | ||
5552 | // else if (!strcmp(argv[j], "-noenv")) | ||
5553 | // { | ||
5554 | //turn OFF environmental effects for slow machines/video cards | ||
5555 | // gRequestParaboloidMap = FALSE; | ||
5556 | // } | ||
5557 | else if (!strcmp(argv[j], "-noaudio")) | ||
5558 | { | ||
5559 | gUseAudio = FALSE; | ||
5560 | } | ||
5561 | else if (!strcmp(argv[j], "-nosound")) // tends to be popular cmdline on Linux. | ||
5562 | { | ||
5563 | gUseAudio = FALSE; | ||
5564 | } | ||
5565 | else if (!strcmp(argv[j], "-nofmod")) | ||
5566 | { | ||
5567 | gUseFMOD = FALSE; | ||
5568 | } | ||
5569 | else if (!strcmp(argv[j], "-noprobe")) | ||
5570 | { | ||
5571 | gProbeHardware = FALSE; | ||
5572 | } | ||
5573 | else if (!strcmp(argv[j], "-noquicktime")) | ||
5574 | { | ||
5575 | // Developers can log in faster if they don't load all the | ||
5576 | // quicktime dlls. | ||
5577 | gUseQuickTime = false; | ||
5578 | } | ||
5579 | else if (!strcmp(argv[j], "-nopreload")) | ||
5580 | { | ||
5581 | // Developers can log in faster if they don't decode sounds | ||
5582 | // or images on startup, ~5 seconds faster. | ||
5583 | gPreloadSounds = false; | ||
5584 | gPreloadImages = false; | ||
5585 | } | ||
5586 | else if (!strcmp(argv[j], "-purge")) | ||
5587 | { | ||
5588 | purge_cache(); | ||
5589 | } | ||
5590 | else if(!strcmp(argv[j], "-noinvlib")) | ||
5591 | { | ||
5592 | gRequestInventoryLibrary = FALSE; | ||
5593 | } | ||
5594 | else if (!strcmp(argv[j], "-log")) | ||
5595 | { | ||
5596 | gLogMessages = TRUE; | ||
5597 | continue; | ||
5598 | } | ||
5599 | else if (!strcmp(argv[j], "-logfile") && (++j < argc)) | ||
5600 | { | ||
5601 | // *NOTE: This buffer size is hard coded into scanf() below. | ||
5602 | char logfile[256]; /* Flawfinder: ignore */ | ||
5603 | sscanf(argv[j], "%255s", logfile); /* Flawfinder: ignore */ | ||
5604 | llinfos << "Setting log file to " << logfile << llendl; | ||
5605 | LLFile::remove(logfile); | ||
5606 | LLError::logToFile(logfile); | ||
5607 | } | ||
5608 | else if (!strcmp(argv[j], "-settings") && (++j < argc)) | ||
5609 | { | ||
5610 | gSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, argv[j]); | ||
5611 | } | ||
5612 | else if (!strcmp(argv[j], "-setdefault") && (j + 2 < argc)) | ||
5613 | { | ||
5614 | std::string control_name; | ||
5615 | std::string control_value; | ||
5616 | |||
5617 | j++; | ||
5618 | if (argv[j]) control_name = std::string(argv[j]); | ||
5619 | |||
5620 | j++; | ||
5621 | if (argv[j]) control_value = std::string(argv[j]); | ||
5622 | |||
5623 | // grab control name and value | ||
5624 | if (!control_name.empty()) | ||
5625 | { | ||
5626 | gCommandLineSettings[control_name] = control_value; | ||
5627 | } | ||
5628 | } | ||
5629 | else if (!strcmp(argv[j], "-set") && (j + 2 < argc)) | ||
5630 | { | ||
5631 | std::string control_name; | ||
5632 | std::string control_value; | ||
5633 | |||
5634 | j++; | ||
5635 | if (argv[j]) control_name = std::string(argv[j]); | ||
5636 | |||
5637 | j++; | ||
5638 | if (argv[j]) control_value = std::string(argv[j]); | ||
5639 | |||
5640 | // grab control name and value | ||
5641 | if (!control_name.empty()) | ||
5642 | { | ||
5643 | gCommandLineForcedSettings[control_name] = control_value; | ||
5644 | } | ||
5645 | } | ||
5646 | else if (!strcmp(argv[j], "-login")) | ||
5647 | { | ||
5648 | if (j + 3 < argc) | ||
5649 | { | ||
5650 | j++; | ||
5651 | gCmdLineFirstName = argv[j]; | ||
5652 | j++; | ||
5653 | gCmdLineLastName = argv[j]; | ||
5654 | j++; | ||
5655 | gCmdLinePassword = argv[j]; | ||
5656 | } | ||
5657 | else | ||
5658 | { | ||
5659 | // only works if -login is last parameter on command line | ||
5660 | llerrs << "Not enough parameters to -login. Did you mean -loginuri?" << llendl; | ||
5661 | } | ||
5662 | } | ||
5663 | else if (!strcmp(argv[j], "-god")) | ||
5664 | { | ||
5665 | gGodConnect = TRUE; | ||
5666 | } | ||
5667 | else if (!strcmp(argv[j], "-noconsole")) | ||
5668 | { | ||
5669 | gUseConsole = FALSE; | ||
5670 | } | ||
5671 | else if (!strcmp(argv[j], "-safe")) | ||
5672 | { | ||
5673 | llinfos << "Setting viewer feature table to run in safe mode, resetting prefs" << llendl; | ||
5674 | gFeatureManagerp->setSafe(TRUE); | ||
5675 | } | ||
5676 | else if (!strcmp(argv[j], "-multiple")) | ||
5677 | { | ||
5678 | gMultipleViewersOK = TRUE; | ||
5679 | } | ||
5680 | else if (!strcmp(argv[j], "-nomultiple")) | ||
5681 | { | ||
5682 | gMultipleViewersOK = FALSE; | ||
5683 | } | ||
5684 | else if (!strcmp(argv[j], "-novoice")) | ||
5685 | { | ||
5686 | gDisableVoice = TRUE; | ||
5687 | } | ||
5688 | else if (!strcmp(argv[j], "-nothread")) | ||
5689 | { | ||
5690 | LLVFile::ALLOW_ASYNC = FALSE; | ||
5691 | llinfos << "Running VFS in nothread mode" << llendl; | ||
5692 | } | ||
5693 | // some programs don't respect the command line options in protocol handlers (I'm looking at you, Opera) | ||
5694 | // so this allows us to parse the URL straight off the command line without a "-url" paramater | ||
5695 | else if (LLURLDispatcher::isSLURL(argv[j]) | ||
5696 | || !strcmp(argv[j], "-url") && (++j < argc)) | ||
5697 | { | ||
5698 | std::string slurl = argv[j]; | ||
5699 | if (LLURLDispatcher::isSLURLCommand(slurl)) | ||
5700 | { | ||
5701 | LLStartUp::sSLURLCommand = slurl; | ||
5702 | } | ||
5703 | else | ||
5704 | { | ||
5705 | LLURLSimString::setString(slurl); | ||
5706 | } | ||
5707 | // *NOTE: After setting the url, bail. What can happen is | ||
5708 | // that someone can use IE (or potentially other browsers) | ||
5709 | // and do the rough equivalent of command injection and | ||
5710 | // steal passwords. Phoenix. SL-55321 | ||
5711 | gArgs += argv[j]; | ||
5712 | return 0; | ||
5713 | } | ||
5714 | else if (!strcmp(argv[j], "-ignorepixeldepth")) | ||
5715 | { | ||
5716 | gIgnorePixelDepth = TRUE; | ||
5717 | } | ||
5718 | else if (!strcmp(argv[j], "-cooperative")) | ||
5719 | { | ||
5720 | S32 ms_to_yield = 0; | ||
5721 | if(++j < argc) | ||
5722 | { | ||
5723 | S32 rv = sscanf(argv[j], "%d", &ms_to_yield); | ||
5724 | if(0 == rv) | ||
5725 | { | ||
5726 | --j; | ||
5727 | } | ||
5728 | } | ||
5729 | else | ||
5730 | { | ||
5731 | --j; | ||
5732 | } | ||
5733 | gYieldMS = ms_to_yield; | ||
5734 | gYieldTime = TRUE; | ||
5735 | } | ||
5736 | else if (!strncmp(argv[j], "-lang", 5)) | ||
5737 | { | ||
5738 | j++; | ||
5739 | if (argv[j]) | ||
5740 | gSavedSettings.setString("Language", std::string(argv[j])); | ||
5741 | } | ||
5742 | else if (!strcmp(argv[j], "-no-verify-ssl-cert")) | ||
5743 | { | ||
5744 | gVerifySSLCert = false; | ||
5745 | } | ||
5746 | else if ( (!strcmp(argv[j], "--channel") || !strcmp(argv[j], "-channel")) && (++j < argc)) | ||
5747 | { | ||
5748 | gChannelName = argv[j]; | ||
5749 | } | ||
5750 | #if LL_DARWIN | ||
5751 | else if (!strncmp(argv[j], "-psn_", 5)) | ||
5752 | { | ||
5753 | // this is the Finder passing the process session number | ||
5754 | // we ignore this | ||
5755 | } | ||
5756 | #endif | ||
5757 | else | ||
5758 | { | ||
5759 | |||
5760 | // DBC - Mac OS X passes some stuff by default on the command line (e.g. psn). | ||
5761 | // Second Life URLs are passed this way as well? | ||
5762 | llwarns << "Possible unknown keyword " << argv[j] << llendl; | ||
5763 | |||
5764 | // print usage information | ||
5765 | llinfos << USAGE << llendl; | ||
5766 | // return 1; | ||
5767 | } | ||
5768 | } | ||
5769 | return 0; | ||
5770 | } | ||
5771 | |||
5772 | //============================================================================ | ||
5773 | |||
5774 | void load_name_cache() | ||
5775 | { | ||
5776 | if (!gCacheName) return; | ||
5777 | |||
5778 | std::string name_cache; | ||
5779 | name_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "name.cache"); | ||
5780 | FILE* name_cache_fp = LLFile::fopen(name_cache.c_str(), "r"); /* Flawfinder: ignore*/ | ||
5781 | if (name_cache_fp) | ||
5782 | { | ||
5783 | gCacheName->importFile(name_cache_fp); | ||
5784 | fclose(name_cache_fp); | ||
5785 | } | ||
5786 | } | ||
5787 | |||
5788 | void save_name_cache() | ||
5789 | { | ||
5790 | if (!gCacheName) return; | ||
5791 | |||
5792 | std::string name_cache; | ||
5793 | name_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "name.cache"); | ||
5794 | FILE* name_cache_fp = LLFile::fopen(name_cache.c_str(), "w"); /* Flawfinder: ignore*/ | ||
5795 | if (name_cache_fp) | ||
5796 | { | ||
5797 | gCacheName->exportFile(name_cache_fp); | ||
5798 | fclose(name_cache_fp); | ||
5799 | } | ||
5800 | } | ||
5801 | |||
5802 | |||
5803 | void login_alert_done(S32 option, void* user_data) | ||
5804 | { | ||
5805 | LLPanelLogin::giveFocus(); | ||
5806 | } | ||
5807 | |||
5808 | void disconnect_viewer(void *) | ||
5809 | { | ||
5810 | if (gDisconnected) | ||
5811 | { | ||
5812 | return; | ||
5813 | } | ||
5814 | // | ||
5815 | // Cleanup after quitting. | ||
5816 | // | ||
5817 | // Save snapshot for next time, if we made it through initialization | ||
5818 | |||
5819 | llinfos << "Disconnecting viewer!" << llendl; | ||
5820 | |||
5821 | // Dump our frame statistics | ||
5822 | gFrameStats.dump(); | ||
5823 | |||
5824 | |||
5825 | // Signal handlers may need resources that we're destroying here, so don't use them. | ||
5826 | #if !LL_WINDOWS | ||
5827 | release_signals(); | ||
5828 | #endif | ||
5829 | |||
5830 | // Remember if we were flying | ||
5831 | gSavedSettings.setBOOL("FlyingAtExit", gAgent.getFlying() ); | ||
5832 | |||
5833 | // Un-minimize all windows so they don't get saved minimized | ||
5834 | if (!gNoRender) | ||
5835 | { | ||
5836 | if (gFloaterView) | ||
5837 | { | ||
5838 | gFloaterView->restoreAll(); | ||
5839 | } | ||
5840 | } | ||
5841 | |||
5842 | if (gSelectMgr) | ||
5843 | { | ||
5844 | gSelectMgr->deselectAll(); | ||
5845 | } | ||
5846 | |||
5847 | if (!gNoRender) | ||
5848 | { | ||
5849 | // save inventory if appropriate | ||
5850 | gInventory.cache(gAgent.getInventoryRootID(), gAgent.getID()); | ||
5851 | if(gInventoryLibraryRoot.notNull() && gInventoryLibraryOwner.notNull()) | ||
5852 | { | ||
5853 | gInventory.cache(gInventoryLibraryRoot, gInventoryLibraryOwner); | ||
5854 | } | ||
5855 | } | ||
5856 | |||
5857 | save_name_cache(); | ||
5858 | |||
5859 | // close inventory interface, close all windows | ||
5860 | LLInventoryView::cleanup(); | ||
5861 | |||
5862 | // Log out of userserver | ||
5863 | user_logout(); | ||
5864 | |||
5865 | // Delete stuff that would result in net connections | ||
5866 | |||
5867 | // Also writes cached agent settings to gSavedSettings | ||
5868 | gAgent.cleanup(); | ||
5869 | |||
5870 | gObjectList.destroy(); | ||
5871 | delete gWorldp; | ||
5872 | gWorldp = NULL; | ||
5873 | |||
5874 | cleanup_xfer_manager(); | ||
5875 | gDisconnected = TRUE; | ||
5876 | } | ||
5877 | |||
5878 | // helper function for cleanup_app | ||
5879 | void remove_cache_files(const char* file_mask) | ||
5880 | { | ||
5881 | char mask[LL_MAX_PATH]; /* Flawfinder: ignore */ | ||
5882 | snprintf(mask, LL_MAX_PATH, "%s%s", gDirUtilp->getDirDelimiter().c_str(), file_mask); /* Flawfinder: ignore */ | ||
5883 | gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "").c_str(), mask); | ||
5884 | } | ||
5885 | |||
5886 | |||
5887 | |||
5888 | |||
5889 | void finish_early_exit(S32 option, void* userdata) | ||
5890 | { | ||
5891 | app_force_quit(NULL); | ||
5892 | } | ||
5893 | |||
5894 | void app_early_exit(const LLString& mesg) | ||
5895 | { | ||
5896 | llwarns << "app_early_exit: " << mesg << llendl; | ||
5897 | gDoDisconnect = TRUE; | ||
5898 | // LLStringBase<char>::format_map_t args; | ||
5899 | // args["[MESSAGE]"] = mesg; | ||
5900 | // gViewerWindow->alertXml("AppEarlyExit", args, finish_early_exit); | ||
5901 | LLAlertDialog::showCritical(mesg, finish_early_exit, NULL); | ||
5902 | } | ||
5903 | |||
5904 | // Used for drones, etc | ||
5905 | void app_force_exit(S32 arg) | ||
5906 | { | ||
5907 | remove_marker_file(); | ||
5908 | exit(arg); | ||
5909 | } | ||
5910 | |||
5911 | // Callback from a dialog indicating user was logged out. | ||
5912 | void finish_disconnect(S32 option, void* userdata) | ||
5913 | { | ||
5914 | if (1 == option) | ||
5915 | { | ||
5916 | app_force_quit(NULL); | ||
5917 | } | ||
5918 | } | ||
5919 | |||
5920 | // Callback from an early disconnect dialog, force an exit | ||
5921 | void finish_forced_disconnect(S32 /* option */, void* /* userdata */) | ||
5922 | { | ||
5923 | app_force_quit(NULL); | ||
5924 | } | ||
5925 | |||
5926 | void send_logout_request() | ||
5927 | { | ||
5928 | if(!gLogoutRequestSent) | ||
5929 | { | ||
5930 | LLMessageSystem* msg = gMessageSystem; | ||
5931 | msg->newMessageFast(_PREHASH_LogoutRequest); | ||
5932 | msg->nextBlockFast(_PREHASH_AgentData); | ||
5933 | msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); | ||
5934 | msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); | ||
5935 | gAgent.sendReliableMessage(); | ||
5936 | |||
5937 | gLogoutTimer.reset(); | ||
5938 | gLogoutMaxTime = LOGOUT_REQUEST_TIME; | ||
5939 | gLogoutRequestSent = TRUE; | ||
5940 | |||
5941 | gVoiceClient->leaveChannel(); | ||
5942 | } | ||
5943 | } | ||
5944 | |||
5945 | void do_disconnect(const LLString& mesg) | ||
5946 | { | ||
5947 | if (gDoDisconnect) | ||
5948 | { | ||
5949 | // Already popped up one of these dialogs, don't | ||
5950 | // do this again. | ||
5951 | return; | ||
5952 | } | ||
5953 | |||
5954 | // Translate the message if possible | ||
5955 | LLString big_reason = LLAgent::sTeleportErrorMessages[mesg]; | ||
5956 | if ( big_reason.size() == 0 ) | ||
5957 | { | ||
5958 | big_reason = mesg; | ||
5959 | } | ||
5960 | |||
5961 | LLStringBase<char>::format_map_t args; | ||
5962 | gDoDisconnect = TRUE; | ||
5963 | |||
5964 | if (LLStartUp::getStartupState() < STATE_STARTED) | ||
5965 | { | ||
5966 | // Tell users what happened | ||
5967 | args["[ERROR_MESSAGE]"] = big_reason; | ||
5968 | gViewerWindow->alertXml("ErrorMessage", args, finish_forced_disconnect); | ||
5969 | } | ||
5970 | else | ||
5971 | { | ||
5972 | args["[MESSAGE]"] = big_reason; | ||
5973 | gViewerWindow->alertXml("YouHaveBeenLoggedOut", args, finish_disconnect ); | ||
5974 | } | ||
5975 | } | ||
5976 | |||
5977 | const LLUUID& agent_get_id() | ||
5978 | { | ||
5979 | return gAgent.getID(); | ||
5980 | } | ||
5981 | |||
5982 | const LLUUID& agent_get_session_id() | ||
5983 | { | ||
5984 | return gAgent.getSessionID(); | ||
5985 | } | ||
5986 | |||
5987 | void agent_send_reliable_message() | ||
5988 | { | ||
5989 | gAgent.sendReliableMessage(); | ||
5990 | } | ||
5991 | |||
5992 | void bad_network_handler() | ||
5993 | { | ||
5994 | // Dump the packet | ||
5995 | gMessageSystem->dumpPacketToLog(); | ||
5996 | |||
5997 | // Flush all of our caches on exit in the case of disconnect due to | ||
5998 | // invalid packets. | ||
5999 | |||
6000 | gPurgeOnExit = TRUE; | ||
6001 | |||
6002 | #if LL_WINDOWS | ||
6003 | LLWinDebug::handleException(NULL); | ||
6004 | #else | ||
6005 | // Call the crash callback | ||
6006 | if (gCrashCallback) | ||
6007 | { | ||
6008 | gCrashCallback(); | ||
6009 | } | ||
6010 | #endif | ||
6011 | |||
6012 | std::ostringstream message; | ||
6013 | message << | ||
6014 | "The viewer has detected mangled network data indicative\n" | ||
6015 | "of a bad upstream network connection or an incomplete\n" | ||
6016 | "local installation of " << gSecondLife << ". \n" | ||
6017 | " \n" | ||
6018 | "Try uninstalling and reinstalling to see if this resolves \n" | ||
6019 | "the issue. \n" | ||
6020 | " \n" | ||
6021 | "If the problem continues, see the Tech Support FAQ at: \n" | ||
6022 | "www.secondlife.com/support"; | ||
6023 | do_disconnect(message.str()); | ||
6024 | } | ||
6025 | |||
6026 | |||
6027 | // dump current avatar to .cal file | ||
6028 | void save_avatar(void*) | ||
6029 | { | ||
6030 | LLFloaterSaveAvatar::show(); | ||
6031 | } | ||
6032 | |||
6033 | void cleanup_app() | ||
6034 | { | ||
6035 | //flag all elements as needing to be destroyed immediately | ||
6036 | // to ensure shutdown order | ||
6037 | LLMortician::setZealous(TRUE); | ||
6038 | |||
6039 | LLVoiceClient::terminate(); | ||
6040 | |||
6041 | disconnect_viewer(NULL); | ||
6042 | |||
6043 | llinfos << "Viewer disconnected" << llendflush; | ||
6044 | |||
6045 | gDisconnectedImagep = NULL; | ||
6046 | release_start_screen(); // just in case | ||
6047 | |||
6048 | LLError::logToFixedBuffer(NULL); | ||
6049 | |||
6050 | llinfos << "Cleaning Up" << llendflush; | ||
6051 | |||
6052 | LLKeyframeDataCache::clear(); | ||
6053 | |||
6054 | // Must clean up texture references before viewer window is destroyed. | ||
6055 | LLHUDObject::cleanupHUDObjects(); | ||
6056 | llinfos << "HUD Objects cleaned up" << llendflush; | ||
6057 | |||
6058 | // End TransferManager before deleting systems it depends on (Audio, VFS, AssetStorage) | ||
6059 | #if 0 // this seems to get us stuck in an infinite loop... | ||
6060 | gTransferManager.cleanup(); | ||
6061 | #endif | ||
6062 | |||
6063 | // Clean up map data storage | ||
6064 | delete gWorldMap; | ||
6065 | gWorldMap = NULL; | ||
6066 | |||
6067 | delete gHUDManager; | ||
6068 | gHUDManager = NULL; | ||
6069 | |||
6070 | delete gToolMgr; | ||
6071 | gToolMgr = NULL; | ||
6072 | |||
6073 | delete gAssetStorage; | ||
6074 | gAssetStorage = NULL; | ||
6075 | |||
6076 | LLPolyMesh::freeAllMeshes(); | ||
6077 | |||
6078 | delete gCacheName; | ||
6079 | gCacheName = NULL; | ||
6080 | |||
6081 | delete gGlobalEconomy; | ||
6082 | gGlobalEconomy = NULL; | ||
6083 | |||
6084 | delete gLocalSpeakerMgr; | ||
6085 | gLocalSpeakerMgr = NULL; | ||
6086 | |||
6087 | LLNotifyBox::cleanup(); | ||
6088 | |||
6089 | llinfos << "Global stuff deleted" << llendflush; | ||
6090 | |||
6091 | #if !LL_RELEASE_FOR_DOWNLOAD | ||
6092 | if (gAudiop) | ||
6093 | { | ||
6094 | gAudiop->shutdown(); | ||
6095 | } | ||
6096 | #else | ||
6097 | // This hack exists because fmod likes to occasionally hang forever | ||
6098 | // when shutting down for no apparent reason. | ||
6099 | llwarns << "Hack, skipping audio engine cleanup" << llendflush; | ||
6100 | #endif | ||
6101 | |||
6102 | |||
6103 | // moved to main application shutdown for now because it's non-trivial and only needs to be done once | ||
6104 | // (even though it goes against the media framework design) | ||
6105 | |||
6106 | LLMediaEngine::cleanupClass(); | ||
6107 | |||
6108 | #if LL_QUICKTIME_ENABLED | ||
6109 | if (gQuickTimeInitialized) | ||
6110 | { | ||
6111 | // clean up media stuff | ||
6112 | llinfos << "Cleaning up QuickTime" << llendl; | ||
6113 | ExitMovies (); | ||
6114 | #if LL_WINDOWS | ||
6115 | // Only necessary/available on Windows. | ||
6116 | TerminateQTML (); | ||
6117 | #endif | ||
6118 | } | ||
6119 | llinfos << "Quicktime cleaned up" << llendflush; | ||
6120 | #endif | ||
6121 | |||
6122 | #if LL_GSTREAMER_ENABLED | ||
6123 | llinfos << "Cleaning up GStreamer" << llendl; | ||
6124 | UnloadGStreamer(); | ||
6125 | llinfos << "GStreamer cleaned up" << llendflush; | ||
6126 | #endif | ||
6127 | |||
6128 | llinfos << "Cleaning up feature manager" << llendflush; | ||
6129 | delete gFeatureManagerp; | ||
6130 | gFeatureManagerp = NULL; | ||
6131 | |||
6132 | // Patch up settings for next time | ||
6133 | // Must do this before we delete the viewer window, | ||
6134 | // such that we can suck rectangle information out of | ||
6135 | // it. | ||
6136 | cleanup_saved_settings(); | ||
6137 | llinfos << "Settings patched up" << llendflush; | ||
6138 | |||
6139 | delete gAudiop; | ||
6140 | gAudiop = NULL; | ||
6141 | |||
6142 | // delete some of the files left around in the cache. | ||
6143 | remove_cache_files("*.wav"); | ||
6144 | remove_cache_files("*.tmp"); | ||
6145 | remove_cache_files("*.lso"); | ||
6146 | remove_cache_files("*.out"); | ||
6147 | remove_cache_files("*.dsf"); | ||
6148 | remove_cache_files("*.bodypart"); | ||
6149 | remove_cache_files("*.clothing"); | ||
6150 | |||
6151 | llinfos << "Cache files removed" << llendflush; | ||
6152 | |||
6153 | |||
6154 | cleanup_menus(); | ||
6155 | |||
6156 | // Wait for any pending VFS IO | ||
6157 | while (1) | ||
6158 | { | ||
6159 | S32 pending = LLVFSThread::updateClass(0); | ||
6160 | pending += LLLFSThread::updateClass(0); | ||
6161 | if (!pending) | ||
6162 | { | ||
6163 | break; | ||
6164 | } | ||
6165 | llinfos << "Waiting for pending IO to finish: " << pending << llendflush; | ||
6166 | ms_sleep(100); | ||
6167 | } | ||
6168 | llinfos << "Shutting down." << llendflush; | ||
6169 | |||
6170 | // Destroy Windows(R) window, and make sure we're not fullscreen | ||
6171 | // This may generate window reshape and activation events. | ||
6172 | // Therefore must do this before destroying the message system. | ||
6173 | delete gViewerWindow; | ||
6174 | gViewerWindow = NULL; | ||
6175 | llinfos << "ViewerWindow deleted" << llendflush; | ||
6176 | |||
6177 | // viewer UI relies on keyboard so keep it aound until viewer UI isa gone | ||
6178 | delete gKeyboard; | ||
6179 | gKeyboard = NULL; | ||
6180 | |||
6181 | // Clean up selection managers after UI is destroyed, as UI | ||
6182 | // may be observing them. | ||
6183 | LLSelectMgr::cleanupGlobals(); | ||
6184 | |||
6185 | LLViewerObject::cleanupVOClasses(); | ||
6186 | |||
6187 | LLTracker::cleanupInstance(); | ||
6188 | |||
6189 | #if LL_LIBXUL_ENABLED | ||
6190 | // this must be done after floater cleanup (delete gViewerWindow) since | ||
6191 | // floaters potentially need the manager to destroy their contents. | ||
6192 | LLMozLib::getInstance()->reset(); | ||
6193 | #endif | ||
6194 | |||
6195 | #if LL_WINDOWS | ||
6196 | gDXHardware.cleanup(); | ||
6197 | #endif // LL_WINDOWS | ||
6198 | |||
6199 | #if LL_WINDOWS && LL_LCD_COMPILE | ||
6200 | // shut down the LCD window on a logitech keyboard, if there is one | ||
6201 | delete gLcdScreen; | ||
6202 | #endif | ||
6203 | |||
6204 | if (!gVolumeMgr->cleanup()) | ||
6205 | { | ||
6206 | llwarns << "Remaining references in the volume manager!" << llendflush; | ||
6207 | } | ||
6208 | |||
6209 | LLViewerParcelMgr::cleanupGlobals(); | ||
6210 | |||
6211 | delete gViewerStats; | ||
6212 | gViewerStats = NULL; | ||
6213 | |||
6214 | end_messaging_system(); | ||
6215 | |||
6216 | LLFollowCamMgr::cleanupClass(); | ||
6217 | LLVolumeMgr::cleanupClass(); | ||
6218 | LLWorldMapView::cleanupClass(); | ||
6219 | LLUI::cleanupClass(); | ||
6220 | |||
6221 | // | ||
6222 | // Shut down the VFS's AFTER the decode manager cleans up (since it cleans up vfiles). | ||
6223 | // Also after viewerwindow is deleted, since it may have image pointers (which have vfiles) | ||
6224 | // Also after shutting down the messaging system since it has VFS dependencies | ||
6225 | // | ||
6226 | LLVFile::cleanupClass(); | ||
6227 | llinfos << "VFS cleaned up" << llendflush; | ||
6228 | |||
6229 | // Store the time of our current logoff | ||
6230 | gSavedPerAccountSettings.setU32("LastLogoff", time_corrected()); | ||
6231 | |||
6232 | // Must do this after all panels have been deleted because panels that have persistent rects | ||
6233 | // save their rects on delete. | ||
6234 | gSavedSettings.saveToFile(gSettingsFileName, TRUE); | ||
6235 | if (!gPerAccountSettingsFileName.empty()) | ||
6236 | { | ||
6237 | gSavedPerAccountSettings.saveToFile(gPerAccountSettingsFileName, TRUE); | ||
6238 | } | ||
6239 | llinfos << "Saved settings" << llendflush; | ||
6240 | |||
6241 | std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); | ||
6242 | // save all settings, even if equals defaults | ||
6243 | gCrashSettings.saveToFile(crash_settings_filename.c_str(), FALSE); | ||
6244 | |||
6245 | delete gUICtrlFactory; | ||
6246 | gUICtrlFactory = NULL; | ||
6247 | |||
6248 | gSavedSettings.cleanup(); | ||
6249 | gViewerArt.cleanup(); | ||
6250 | gColors.cleanup(); | ||
6251 | gCrashSettings.cleanup(); | ||
6252 | |||
6253 | if (gMuteListp) | ||
6254 | { | ||
6255 | // save mute list | ||
6256 | gMuteListp->cache(gAgent.getID()); | ||
6257 | |||
6258 | delete gMuteListp; | ||
6259 | gMuteListp = NULL; | ||
6260 | } | ||
6261 | |||
6262 | if (gPurgeOnExit) | ||
6263 | { | ||
6264 | llinfos << "Purging all cache files on exit" << llendflush; | ||
6265 | char mask[LL_MAX_PATH]; /* Flawfinder: ignore */ | ||
6266 | snprintf(mask, LL_MAX_PATH, "%s*.*", gDirUtilp->getDirDelimiter().c_str()); /* Flawfinder: ignore */ | ||
6267 | gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"").c_str(),mask); | ||
6268 | } | ||
6269 | |||
6270 | remove_marker_file(); // Any crashes from here on we'll just have to ignore | ||
6271 | |||
6272 | close_debug(); | ||
6273 | |||
6274 | // Let threads finish | ||
6275 | LLTimer idleTimer; | ||
6276 | idleTimer.reset(); | ||
6277 | const F64 max_idle_time = 5.f; // 5 seconds | ||
6278 | while(1) | ||
6279 | { | ||
6280 | S32 pending = 0; | ||
6281 | pending += gTextureCache->update(1); // unpauses the worker thread | ||
6282 | pending += gImageDecodeThread->update(1); // unpauses the image thread | ||
6283 | pending += gTextureFetch->update(1); // unpauses the texture fetch thread | ||
6284 | pending += LLVFSThread::updateClass(0); | ||
6285 | pending += LLLFSThread::updateClass(0); | ||
6286 | F64 idle_time = idleTimer.getElapsedTimeF64(); | ||
6287 | if (!pending || idle_time >= max_idle_time) | ||
6288 | { | ||
6289 | llwarns << "Quitting with pending background tasks." << llendl; | ||
6290 | break; | ||
6291 | } | ||
6292 | } | ||
6293 | |||
6294 | // Delete workers first | ||
6295 | // shotdown all worker threads before deleting them in case of co-dependencies | ||
6296 | gTextureCache->shutdown(); | ||
6297 | gTextureFetch->shutdown(); | ||
6298 | gImageDecodeThread->shutdown(); | ||
6299 | delete gTextureCache; | ||
6300 | delete gTextureFetch; | ||
6301 | delete gImageDecodeThread; | ||
6302 | |||
6303 | gImageList.shutdown(); // shutdown again in case a callback added something | ||
6304 | |||
6305 | // This should eventually be done in LLAppViewer | ||
6306 | LLImageJ2C::closeDSO(); | ||
6307 | LLImageFormatted::cleanupClass(); | ||
6308 | LLVFSThread::cleanupClass(); | ||
6309 | LLLFSThread::cleanupClass(); | ||
6310 | |||
6311 | llinfos << "VFS Thread finished" << llendflush; | ||
6312 | |||
6313 | #ifndef LL_RELEASE_FOR_DOWNLOAD | ||
6314 | llinfos << "Auditing VFS" << llendl; | ||
6315 | gVFS->audit(); | ||
6316 | #endif | ||
6317 | |||
6318 | // For safety, the LLVFS has to be deleted *after* LLVFSThread. This should be cleaned up. | ||
6319 | // (LLVFS doesn't know about LLVFSThread so can't kill pending requests) -Steve | ||
6320 | delete gStaticVFS; | ||
6321 | gStaticVFS = NULL; | ||
6322 | delete gVFS; | ||
6323 | gVFS = NULL; | ||
6324 | |||
6325 | LLCurl::cleanup(); | ||
6326 | |||
6327 | // This will eventually be done in LLApp | ||
6328 | LLCommon::cleanupClass(); | ||
6329 | |||
6330 | end_messaging_system(); | ||
6331 | } | ||
6332 | |||
6333 | // Clear URIs when picking a new server | ||
6334 | void resetURIs() | ||
6335 | { | ||
6336 | gLoginURIs.clear(); | ||
6337 | gHelperURI.clear(); | ||
6338 | } | ||
6339 | |||
6340 | const std::vector<std::string>& getLoginURIs() | ||
6341 | { | ||
6342 | if (gLoginURIs.empty()) | ||
6343 | { | ||
6344 | // not specified on the command line, use value from table | ||
6345 | gLoginURIs = LLSRV::rewriteURI(gUserServerDomainName[gUserServerChoice].mLoginURI); | ||
6346 | } | ||
6347 | return gLoginURIs; | ||
6348 | } | ||
6349 | |||
6350 | const std::string& getHelperURI() | ||
6351 | { | ||
6352 | if (gHelperURI.empty()) | ||
6353 | { | ||
6354 | // not specified on the command line, use value from table | ||
6355 | gHelperURI = gUserServerDomainName[gUserServerChoice].mHelperURI; | ||
6356 | } | ||
6357 | return gHelperURI; | ||
6358 | } | ||
6359 | |||
6360 | void errorCallback(const std::string &error_string) | ||
6361 | { | ||
6362 | #ifndef LL_RELEASE_FOR_DOWNLOAD | ||
6363 | OSMessageBox(error_string.c_str(), "Fatal Error", OSMB_OK); | ||
6364 | #endif | ||
6365 | LLError::crashAndLoop(error_string); | ||
6366 | } | ||
6367 | // JC - Please don't put code here. Find the right file, perhaps | ||
6368 | // llviewermessage.cpp, and put it there. Thanks! | ||
diff --git a/linden/indra/newview/viewer.h b/linden/indra/newview/viewer.h deleted file mode 100644 index afd62a7..0000000 --- a/linden/indra/newview/viewer.h +++ /dev/null | |||
@@ -1,325 +0,0 @@ | |||
1 | /** | ||
2 | * @file viewer.h | ||
3 | * @brief Main file for viewer. | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2000&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2000-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #ifndef LL_VIEWER_H | ||
33 | #define LL_VIEWER_H | ||
34 | |||
35 | // DO NOT ADD DEPENDENCIES HERE | ||
36 | // Almost every file in the viewer depends on this file. | ||
37 | // If you need to add a shared class, put it in its own | ||
38 | // little file. JC | ||
39 | |||
40 | // *TODO: remove this, viewer.h doesn't need it, but there | ||
41 | // are lots of .cpp files that depend on this recursive | ||
42 | // dependency. | ||
43 | #include "llviewercontrol.h" | ||
44 | |||
45 | // Enabled this definition to compile a 'hacked' viewer that | ||
46 | // allows a hacked godmode to be toggled on and off. | ||
47 | #define TOGGLE_HACKED_GODLIKE_VIEWER | ||
48 | #ifdef TOGGLE_HACKED_GODLIKE_VIEWER | ||
49 | extern BOOL gHackGodmode; | ||
50 | #endif | ||
51 | |||
52 | |||
53 | // | ||
54 | // Forward Declarations | ||
55 | // | ||
56 | class LLAudioEngine; | ||
57 | class LLFrameTimer; | ||
58 | class LLMessageSystem; | ||
59 | class LLHost; | ||
60 | class LLPieMenu; | ||
61 | class LLWorkerThread; | ||
62 | class LLTextureFetch; | ||
63 | class LLTextureCache; | ||
64 | class LLPumpIO; | ||
65 | class LLHTTPNode; | ||
66 | class LLTimer; | ||
67 | class LLUUID; | ||
68 | class LLVector3; | ||
69 | class LLVector3d; | ||
70 | class LLViewerObject; | ||
71 | class LLViewerRegion; | ||
72 | class LLVFS; | ||
73 | |||
74 | // | ||
75 | // Global Variables | ||
76 | // | ||
77 | |||
78 | extern LLString gSecondLife; | ||
79 | |||
80 | extern S32 gNumSessions; | ||
81 | extern BOOL gNoRender; | ||
82 | extern LLMemoryInfo gSysMemory; | ||
83 | extern BOOL gLogMessages; | ||
84 | extern BOOL gUseAudio; | ||
85 | extern bool gPreloadImages; | ||
86 | extern BOOL gGodConnect; | ||
87 | extern LLString gCmdLineFirstName; | ||
88 | extern LLString gCmdLineLastName; | ||
89 | extern LLString gCmdLinePassword; | ||
90 | extern BOOL gAutoLogin; | ||
91 | extern U32 gFrameCount; | ||
92 | extern U32 gForegroundFrameCount; | ||
93 | extern BOOL gRequestInventoryLibrary; | ||
94 | extern BOOL gAcceptTOS; | ||
95 | extern BOOL gAcceptCriticalMessage; | ||
96 | extern std::string gChannelName; | ||
97 | extern LLUUID gInventoryLibraryOwner; | ||
98 | extern LLUUID gInventoryLibraryRoot; | ||
99 | extern BOOL gLastExecFroze; | ||
100 | extern F32 gLogoutMaxTime; | ||
101 | extern LLTimer gRenderStartTime; | ||
102 | extern LLFrameTimer gForegroundTime; | ||
103 | extern LLTimer gLogoutTimer; | ||
104 | extern BOOL gInProductionGrid; | ||
105 | extern S32 gCrashBehavior; | ||
106 | extern bool gVerifySSLCert; | ||
107 | extern const char* DEFAULT_SETTINGS_FILE; | ||
108 | |||
109 | // TODO: Eliminate most of these, move into a globals structure. | ||
110 | extern const U32 PATCH_SIZE; | ||
111 | extern const LLVector3 DEFAULT_OBJECT_SCALE; | ||
112 | extern BOOL gDisconnected; | ||
113 | extern BOOL gDisableVoice; | ||
114 | extern BOOL gQuit; // We're done, quit after processing this message. | ||
115 | extern BOOL gQuitRequested; // User wants to quit, may have modified documents open. | ||
116 | extern BOOL gLogoutRequestSent; // Disconnect message sent to simulator, no longer safe to send messages to the sim. | ||
117 | extern BOOL gInitializationComplete; // OK to call display() and idle() | ||
118 | extern BOOL gUseWireframe; | ||
119 | extern BOOL gPurgeCache; // Cache was purged on startup | ||
120 | extern U32 gSecondsPerDay; | ||
121 | extern U32 gSecondsPerYear; | ||
122 | // Is the Pacific time zone (aka server time zone) | ||
123 | // currently in daylight savings time? | ||
124 | extern BOOL gPacificDaylightTime; | ||
125 | |||
126 | extern LLString gLastVersionChannel; | ||
127 | |||
128 | extern LLVector3 gWindVec; | ||
129 | extern LLVector3 gRelativeWindVec; | ||
130 | |||
131 | extern U64 gFrameTime; // The timestamp of the most-recently-processed frame | ||
132 | extern F32 gFrameTimeSeconds; // Loses msec precision after ~4.5 hours... | ||
133 | extern F32 gFrameIntervalSeconds; // Elapsed time between current and previous gFrameTimeSeconds | ||
134 | extern F32 gFPSClamped; // Frames per second, smoothed, weighted toward last frame | ||
135 | extern F32 gFrameDTClamped; | ||
136 | extern U64 gStartTime; | ||
137 | |||
138 | extern LLFrameTimer gRestoreGLTimer; | ||
139 | extern BOOL gRestoreGL; | ||
140 | |||
141 | extern BOOL gDisplayCameraPos; | ||
142 | extern BOOL gDisplayWindInfo; | ||
143 | extern BOOL gDisplayNearestWater; | ||
144 | extern BOOL gDisplayFOV; | ||
145 | extern BOOL gForceRenderLandFence; | ||
146 | |||
147 | extern BOOL gAllowIdleAFK; | ||
148 | extern F32 gAFKTimeout; | ||
149 | extern BOOL gShowObjectUpdates; | ||
150 | |||
151 | extern BOOL gTeleportDisplay; | ||
152 | extern LLFrameTimer gTeleportDisplayTimer; | ||
153 | |||
154 | extern std::map<S32,LLFrameTimer> gDebugTimers; | ||
155 | |||
156 | // VFS globals - gVFS is for general use | ||
157 | // gStaticVFS is read-only and is shipped w/ the viewer | ||
158 | // it has pre-cache data like the UI .TGAs | ||
159 | extern LLVFS *gStaticVFS; | ||
160 | |||
161 | extern LLUUID gViewerDigest; // MD5 digest of the viewer's executable file. | ||
162 | |||
163 | extern LLWorkerThread* gImageDecodeThread; | ||
164 | extern LLTextureFetch* gTextureFetch; | ||
165 | extern LLTextureCache* gTextureCache; | ||
166 | |||
167 | extern LLPumpIO* gServicePump; | ||
168 | |||
169 | extern LLUUID gSunTextureID; | ||
170 | extern LLUUID gMoonTextureID; | ||
171 | |||
172 | extern BOOL gHandleKeysAsync; | ||
173 | |||
174 | // Map scale in pixels per region | ||
175 | extern F32 gMapScale; | ||
176 | extern F32 gMiniMapScale; | ||
177 | |||
178 | extern F32 gMouseSensitivity; | ||
179 | extern BOOL gInvertMouse; | ||
180 | |||
181 | // | ||
182 | // Defines and constants | ||
183 | // | ||
184 | |||
185 | const S32 AGENT_UPDATES_PER_SECOND = 10; | ||
186 | |||
187 | // Global because multiple functions need to identify the window | ||
188 | // by its name. | ||
189 | extern LLString gWindowTitle; | ||
190 | extern LLString gDisabledMessage; | ||
191 | extern BOOL gHideLinks; | ||
192 | |||
193 | #define REGIONS_PER_LANDSCAPE_EDGE 3 | ||
194 | #define NUMBER_OF_REGIONS (REGIONS_PER_LANDSCAPE_EDGE \ | ||
195 | * REGIONS_PER_LANDSCAPE_EDGE) | ||
196 | #define CENTER_REGION ((REGIONS_PER_LANDSCAPE_EDGE / 2) \ | ||
197 | * REGIONS_PER_LANDSCAPE_EDGE \ | ||
198 | + REGIONS_PER_LANDSCAPE_EDGE / 2) | ||
199 | |||
200 | |||
201 | // translates constant EAST, NORTH, WEST, etc. to x,y offsets | ||
202 | // eg, EAST = +1, 0 | ||
203 | // eg, SOUTHWEST = -1, -1 | ||
204 | const S32 MAP_REGION_TO_X[NUMBER_OF_REGIONS - 1] = | ||
205 | { | ||
206 | 1, // east | ||
207 | 0, // north | ||
208 | -1, // west | ||
209 | 0, // south | ||
210 | 1, // northeast | ||
211 | -1, // northwest | ||
212 | -1, // southwest | ||
213 | 1 // southeast | ||
214 | }; | ||
215 | const S32 MAP_REGION_TO_Y[NUMBER_OF_REGIONS - 1] = | ||
216 | { | ||
217 | 0, // east | ||
218 | 1, // north | ||
219 | 0, // west | ||
220 | -1, // south | ||
221 | 1, // northeast | ||
222 | 1, // northwest | ||
223 | -1, // southwest | ||
224 | -1 // southeast | ||
225 | }; | ||
226 | |||
227 | const BOOL FOR_SELECTION = TRUE; | ||
228 | const BOOL NOT_FOR_SELECTION = FALSE; | ||
229 | |||
230 | const U8 YES_PHYSICS = 1; | ||
231 | const U8 NO_PHYSICS = 0; | ||
232 | |||
233 | // | ||
234 | // Prototypes | ||
235 | // | ||
236 | void display(BOOL rebuild = TRUE, F32 zoom_factor = 1.f, int subfield = 0); | ||
237 | void draw_axes(); | ||
238 | |||
239 | void fire_shot(const U8 shot_type, const U8 use_physics ); | ||
240 | void add_object(LLPCode pcode, | ||
241 | U8 use_physics, | ||
242 | const LLVector3d &object_pos_global, | ||
243 | const LLQuaternion &rotation, | ||
244 | const LLVector3 &scale, | ||
245 | const LLVector3 &velocity, | ||
246 | const LLVector3 &angular_velocity); | ||
247 | |||
248 | BOOL add_object(LLPCode pcode, S32 screen_x, S32 screen_y, U8 use_physics); | ||
249 | |||
250 | void idle(); | ||
251 | void idle_network(); | ||
252 | void init_audio(); | ||
253 | void init_textures(); | ||
254 | void init_landscape(); | ||
255 | void keyboard(char key); | ||
256 | void keyboard_windows(char key); | ||
257 | void kill_all_trees(); | ||
258 | void move_sun(); | ||
259 | BOOL raycast_for_new_obj_pos( S32 x, S32 y, LLViewerObject** hit_obj, S32* hit_face, BOOL* b_hit_land, LLVector3* ray_start_region, LLVector3* ray_end_region, LLViewerRegion** region ); | ||
260 | |||
261 | void audio_update_volume(bool force_update = true); | ||
262 | void audio_update_listener(); | ||
263 | void audio_update_wind(bool force_update = true); | ||
264 | |||
265 | // Saves the final snapshot, but only once. | ||
266 | void save_final_snapshot(void*); | ||
267 | |||
268 | // Call when user is requesting application to quit, ask for confirmation. | ||
269 | void app_user_quit(); | ||
270 | |||
271 | // Call when user is requesting application to quit. | ||
272 | void app_request_quit(); | ||
273 | |||
274 | // Call when user aborts the quit, for example, canceling a required save of | ||
275 | // dirty document. | ||
276 | void app_abort_quit(); | ||
277 | |||
278 | // Call if you need to quit immediately. You can optionally | ||
279 | // spawn a web page or open another application. | ||
280 | void app_force_quit(const char* launch_file_on_quit = NULL); | ||
281 | |||
282 | // Display an error dialog and forcibly quit. | ||
283 | void app_early_exit(const LLString& message); | ||
284 | |||
285 | // exit() immediately (after some cleanup) | ||
286 | void app_force_exit(S32 arg); | ||
287 | |||
288 | void do_disconnect(const LLString& message); | ||
289 | void send_logout_request(); | ||
290 | void save_avatar(void*); | ||
291 | |||
292 | void set_view(S32 which); | ||
293 | |||
294 | void user_logout(); | ||
295 | |||
296 | F32 mouse_x_from_center(S32 x); | ||
297 | F32 mouse_y_from_center(S32 x); | ||
298 | |||
299 | void print_agent_nvpairs(void*); | ||
300 | void reload_viewer(void); | ||
301 | void reset_statistics(); | ||
302 | void output_statistics(void*); | ||
303 | void write_debug(const char *str); | ||
304 | void write_debug(const std::string& str); | ||
305 | void login_alert_done(S32 option, void* user_data); | ||
306 | void callback_cache_name(const LLUUID& id, const char* firstname, const char* lastname, BOOL is_group, void* data); | ||
307 | void load_name_cache(); | ||
308 | void remove_marker_file(); | ||
309 | |||
310 | // Avoid including llagent.h everywhere. This returns gAgent.getID(). | ||
311 | const LLUUID& agent_get_id(); | ||
312 | const LLUUID& agent_get_session_id(); | ||
313 | void agent_send_reliable_message(); | ||
314 | |||
315 | // Helpers for URIs | ||
316 | const std::vector<std::string>& getLoginURIs(); | ||
317 | const std::string& getHelperURI(); | ||
318 | void resetURIs(); | ||
319 | |||
320 | #if LL_WINDOWS | ||
321 | class llLCD; | ||
322 | extern llLCD *gLcdScreen; | ||
323 | #endif | ||
324 | |||
325 | #endif | ||
diff --git a/linden/indra/newview/viewer_manifest.py b/linden/indra/newview/viewer_manifest.py index 83e28b7..6ec2e1f 100755 --- a/linden/indra/newview/viewer_manifest.py +++ b/linden/indra/newview/viewer_manifest.py | |||
@@ -450,6 +450,8 @@ class LinuxManifest(ViewerManifest): | |||
450 | if self.prefix("linux_tools", ""): | 450 | if self.prefix("linux_tools", ""): |
451 | self.path("client-readme.txt","README-linux.txt") | 451 | self.path("client-readme.txt","README-linux.txt") |
452 | self.path("wrapper.sh","secondlife") | 452 | self.path("wrapper.sh","secondlife") |
453 | self.path("handle_secondlifeprotocol.sh") | ||
454 | self.path("register_secondlifeprotocol.sh") | ||
453 | self.path("unicode.ttf","unicode.ttf") | 455 | self.path("unicode.ttf","unicode.ttf") |
454 | self.end_prefix("linux_tools") | 456 | self.end_prefix("linux_tools") |
455 | 457 | ||
diff --git a/linden/indra/test/lluri_tut.cpp b/linden/indra/test/lluri_tut.cpp index 8ff1921..c23825b 100644 --- a/linden/indra/test/lluri_tut.cpp +++ b/linden/indra/test/lluri_tut.cpp | |||
@@ -264,5 +264,44 @@ namespace tut | |||
264 | "datasever:12345", "/agent/11111111-2222-3333-4444-5566778899aa/logininfo"); | 264 | "datasever:12345", "/agent/11111111-2222-3333-4444-5566778899aa/logininfo"); |
265 | } | 265 | } |
266 | #endif // LL_ENABLE_JANKY_DEPRECATED_WEB_SERVICE_CALLS | 266 | #endif // LL_ENABLE_JANKY_DEPRECATED_WEB_SERVICE_CALLS |
267 | |||
268 | |||
269 | template<> template<> | ||
270 | void URITestObject::test<15>() | ||
271 | { | ||
272 | LLURI u("secondlife:///app/login?first_name=Testert4&last_name=Tester&web_login_key=test"); | ||
273 | // if secondlife is the scheme, LLURI should parse /app/login as path, with no authority | ||
274 | ensure_equals("scheme", u.scheme(), "secondlife"); | ||
275 | ensure_equals("authority", u.authority(), ""); | ||
276 | ensure_equals("path", u.path(), "/app/login"); | ||
277 | ensure_equals("pathmap", u.pathArray()[0].asString(), "app"); | ||
278 | ensure_equals("pathmap", u.pathArray()[1].asString(), "login"); | ||
279 | ensure_equals("query", u.query(), "first_name=Testert4&last_name=Tester&web_login_key=test"); | ||
280 | ensure_equals("query map element", u.queryMap()["last_name"].asString(), "Tester"); | ||
281 | |||
282 | u = LLURI("secondlife://Da Boom/128/128/128"); | ||
283 | // if secondlife is the scheme, LLURI should parse /128/128/128 as path, with Da Boom as authority | ||
284 | ensure_equals("scheme", u.scheme(), "secondlife"); | ||
285 | ensure_equals("authority", u.authority(), "Da Boom"); | ||
286 | ensure_equals("path", u.path(), "/128/128/128"); | ||
287 | ensure_equals("pathmap", u.pathArray()[0].asString(), "128"); | ||
288 | ensure_equals("pathmap", u.pathArray()[1].asString(), "128"); | ||
289 | ensure_equals("pathmap", u.pathArray()[2].asString(), "128"); | ||
290 | ensure_equals("query", u.query(), ""); | ||
291 | } | ||
292 | |||
293 | template<> template<> | ||
294 | void URITestObject::test<16>() | ||
295 | { | ||
296 | // Parse about: schemes | ||
297 | LLURI u("about:blank?redirect-http-hack=secondlife%3A%2F%2F%2Fapp%2Flogin%3Ffirst_name%3DCallum%26last_name%3DLinden%26location%3Dspecify%26grid%3Dvaak%26region%3D%2FMorris%2F128%2F128%26web_login_key%3Defaa4795-c2aa-4c58-8966-763c27931e78"); | ||
298 | ensure_equals("scheme", u.scheme(), "about"); | ||
299 | ensure_equals("authority", u.authority(), ""); | ||
300 | ensure_equals("path", u.path(), "blank"); | ||
301 | ensure_equals("pathmap", u.pathArray()[0].asString(), "blank"); | ||
302 | ensure_equals("query", u.query(), "redirect-http-hack=secondlife:///app/login?first_name=Callum&last_name=Linden&location=specify&grid=vaak®ion=/Morris/128/128&web_login_key=efaa4795-c2aa-4c58-8966-763c27931e78"); | ||
303 | ensure_equals("query map element", u.queryMap()["redirect-http-hack"].asString(), "secondlife:///app/login?first_name=Callum&last_name=Linden&location=specify&grid=vaak®ion=/Morris/128/128&web_login_key=efaa4795-c2aa-4c58-8966-763c27931e78"); | ||
304 | } | ||
267 | } | 305 | } |
268 | 306 | ||
307 | |||
diff --git a/linden/indra/test/test.vcproj b/linden/indra/test/test.vcproj index 7e84533..6e74417 100644 --- a/linden/indra/test/test.vcproj +++ b/linden/indra/test/test.vcproj | |||
@@ -194,6 +194,12 @@ | |||
194 | RelativePath=".\io.cpp"> | 194 | RelativePath=".\io.cpp"> |
195 | </File> | 195 | </File> |
196 | <File | 196 | <File |
197 | RelativePath=".\llapp_tut.cpp"> | ||
198 | </File> | ||
199 | <File | ||
200 | RelativePath=".\llbase64_tut.cpp"> | ||
201 | </File> | ||
202 | <File | ||
197 | RelativePath=".\llbuffer_tut.cpp"> | 203 | RelativePath=".\llbuffer_tut.cpp"> |
198 | </File> | 204 | </File> |
199 | 205 | ||
diff --git a/linden/indra/test/test_vc8.vcproj b/linden/indra/test/test_vc8.vcproj index b491eea..cb023b3 100644 --- a/linden/indra/test/test_vc8.vcproj +++ b/linden/indra/test/test_vc8.vcproj | |||
@@ -321,10 +321,6 @@ | |||
321 | > | 321 | > |
322 | </File> | 322 | </File> |
323 | <File | 323 | <File |
324 | RelativePath=".\lldatapacker_tut.cpp" | ||
325 | > | ||
326 | </File> | ||
327 | <File | ||
328 | RelativePath=".\llerror_tut.cpp" | 324 | RelativePath=".\llerror_tut.cpp" |
329 | > | 325 | > |
330 | </File> | 326 | </File> |
@@ -353,10 +349,6 @@ | |||
353 | > | 349 | > |
354 | </File> | 350 | </File> |
355 | <File | 351 | <File |
356 | RelativePath=".\llpartdata_tut.cpp" | ||
357 | > | ||
358 | </File> | ||
359 | <File | ||
360 | RelativePath=".\llpipeutil.cpp" | 352 | RelativePath=".\llpipeutil.cpp" |
361 | > | 353 | > |
362 | </File> | 354 | </File> |
@@ -385,10 +377,6 @@ | |||
385 | > | 377 | > |
386 | </File> | 378 | </File> |
387 | <File | 379 | <File |
388 | RelativePath=".\llstring_tut.cpp" | ||
389 | > | ||
390 | </File> | ||
391 | <File | ||
392 | RelativePath=".\lltiming_tut.cpp" | 380 | RelativePath=".\lltiming_tut.cpp" |
393 | > | 381 | > |
394 | </File> | 382 | </File> |
@@ -409,10 +397,6 @@ | |||
409 | > | 397 | > |
410 | </File> | 398 | </File> |
411 | <File | 399 | <File |
412 | RelativePath=".\m3math_tut.cpp" | ||
413 | > | ||
414 | </File> | ||
415 | <File | ||
416 | RelativePath=".\math.cpp" | 400 | RelativePath=".\math.cpp" |
417 | > | 401 | > |
418 | </File> | 402 | </File> |
diff --git a/linden/indra/win_crash_logger/StdAfx.h b/linden/indra/win_crash_logger/StdAfx.h index 6f046f9..3d43115 100644 --- a/linden/indra/win_crash_logger/StdAfx.h +++ b/linden/indra/win_crash_logger/StdAfx.h | |||
@@ -51,7 +51,6 @@ | |||
51 | #include <stdlib.h> | 51 | #include <stdlib.h> |
52 | #include <malloc.h> | 52 | #include <malloc.h> |
53 | #include <memory.h> | 53 | #include <memory.h> |
54 | #include <tchar.h> | ||
55 | 54 | ||
56 | // Local Header Files | 55 | // Local Header Files |
57 | 56 | ||
diff --git a/linden/indra/win_crash_logger/llcrashloggerwindows.cpp b/linden/indra/win_crash_logger/llcrashloggerwindows.cpp new file mode 100644 index 0000000..5a25c17 --- /dev/null +++ b/linden/indra/win_crash_logger/llcrashloggerwindows.cpp | |||
@@ -0,0 +1,378 @@ | |||
1 | /** | ||
2 | * @file llcrashloggerwindows.cpp | ||
3 | * @brief Windows crash logger implementation | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2003&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2003-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #include "stdafx.h" | ||
33 | #include "resource.h" | ||
34 | #include "llcrashloggerwindows.h" | ||
35 | |||
36 | #include <sstream> | ||
37 | |||
38 | #include "boost/tokenizer.hpp" | ||
39 | |||
40 | #include "dbghelp.h" | ||
41 | #include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME | ||
42 | #include "llerror.h" | ||
43 | #include "llfile.h" | ||
44 | #include "lltimer.h" | ||
45 | #include "llstring.h" | ||
46 | #include "lldxhardware.h" | ||
47 | #include "lldir.h" | ||
48 | #include "llsdserialize.h" | ||
49 | |||
50 | #define MAX_LOADSTRING 100 | ||
51 | #define MAX_STRING 2048 | ||
52 | const char* const SETTINGS_FILE_HEADER = "version"; | ||
53 | const S32 SETTINGS_FILE_VERSION = 101; | ||
54 | |||
55 | // Windows Message Handlers | ||
56 | |||
57 | // Global Variables: | ||
58 | HINSTANCE hInst= NULL; // current instance | ||
59 | TCHAR szTitle[MAX_LOADSTRING]; /* Flawfinder: ignore */ // The title bar text | ||
60 | TCHAR szWindowClass[MAX_LOADSTRING]; /* Flawfinder: ignore */ // The title bar text | ||
61 | |||
62 | LLString gProductName; | ||
63 | HWND gHwndReport = NULL; // Send/Don't Send dialog | ||
64 | HWND gHwndProgress = NULL; // Progress window | ||
65 | HCURSOR gCursorArrow = NULL; | ||
66 | HCURSOR gCursorWait = NULL; | ||
67 | BOOL gFirstDialog = TRUE; // Are we currently handling the Send/Don't Send dialog? | ||
68 | std::stringstream gDXInfo; | ||
69 | bool gSendLogs = false; | ||
70 | |||
71 | |||
72 | //Conversion from char* to wchar* | ||
73 | //Replacement for ATL macros, doesn't allocate memory | ||
74 | //For more info see: http://www.codeguru.com/forum/showthread.php?t=337247 | ||
75 | void ConvertLPCSTRToLPWSTR (const char* pCstring, WCHAR* outStr) | ||
76 | { | ||
77 | if (pCstring != NULL) | ||
78 | { | ||
79 | int nInputStrLen = strlen (pCstring); | ||
80 | // Double NULL Termination | ||
81 | int nOutputStrLen = MultiByteToWideChar(CP_ACP, 0, pCstring, nInputStrLen, NULL, 0) + 2; | ||
82 | if (outStr) | ||
83 | { | ||
84 | memset (outStr, 0x00, sizeof (WCHAR)*nOutputStrLen); | ||
85 | MultiByteToWideChar (CP_ACP, 0, pCstring, nInputStrLen, outStr, nInputStrLen); | ||
86 | } | ||
87 | } | ||
88 | } | ||
89 | |||
90 | void write_debug(const char *str) | ||
91 | { | ||
92 | gDXInfo << str; /* Flawfinder: ignore */ | ||
93 | } | ||
94 | |||
95 | void write_debug(std::string& str) | ||
96 | { | ||
97 | write_debug(str.c_str()); | ||
98 | } | ||
99 | |||
100 | void show_progress(const char* message) | ||
101 | { | ||
102 | std::wstring msg = wstring_to_utf16str(utf8str_to_wstring(message)); | ||
103 | if (gHwndProgress) | ||
104 | { | ||
105 | SendDlgItemMessage(gHwndProgress, // handle to destination window | ||
106 | IDC_LOG, | ||
107 | WM_SETTEXT, // message to send | ||
108 | FALSE, // undo option | ||
109 | (LPARAM)msg.c_str()); | ||
110 | } | ||
111 | } | ||
112 | |||
113 | void update_messages() | ||
114 | { | ||
115 | MSG msg; | ||
116 | while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) | ||
117 | { | ||
118 | if (msg.message == WM_QUIT) | ||
119 | { | ||
120 | exit(0); | ||
121 | } | ||
122 | TranslateMessage(&msg); | ||
123 | DispatchMessage(&msg); | ||
124 | } | ||
125 | } | ||
126 | |||
127 | void sleep_and_pump_messages( U32 seconds ) | ||
128 | { | ||
129 | const U32 CYCLES_PER_SECOND = 10; | ||
130 | U32 cycles = seconds * CYCLES_PER_SECOND; | ||
131 | while( cycles-- ) | ||
132 | { | ||
133 | update_messages(); | ||
134 | ms_sleep(1000 / CYCLES_PER_SECOND); | ||
135 | } | ||
136 | } | ||
137 | |||
138 | // Include product name in the window caption. | ||
139 | void LLCrashLoggerWindows::ProcessCaption(HWND hWnd) | ||
140 | { | ||
141 | TCHAR templateText[MAX_STRING]; /* Flawfinder: ignore */ | ||
142 | TCHAR header[MAX_STRING]; | ||
143 | std::string final; | ||
144 | GetWindowText(hWnd, templateText, sizeof(templateText)); | ||
145 | final = llformat(ll_convert_wide_to_string(templateText).c_str(), gProductName.c_str()); | ||
146 | ConvertLPCSTRToLPWSTR(final.c_str(), header); | ||
147 | SetWindowText(hWnd, header); | ||
148 | } | ||
149 | |||
150 | |||
151 | // Include product name in the diaog item text. | ||
152 | void LLCrashLoggerWindows::ProcessDlgItemText(HWND hWnd, int nIDDlgItem) | ||
153 | { | ||
154 | TCHAR templateText[MAX_STRING]; /* Flawfinder: ignore */ | ||
155 | TCHAR header[MAX_STRING]; | ||
156 | std::string final; | ||
157 | GetDlgItemText(hWnd, nIDDlgItem, templateText, sizeof(templateText)); | ||
158 | final = llformat(ll_convert_wide_to_string(templateText).c_str(), gProductName.c_str()); | ||
159 | ConvertLPCSTRToLPWSTR(final.c_str(), header); | ||
160 | SetDlgItemText(hWnd, nIDDlgItem, header); | ||
161 | } | ||
162 | |||
163 | bool handle_button_click(WORD button_id) | ||
164 | { | ||
165 | // Is this something other than Send or Don't Send? | ||
166 | if (button_id != IDOK | ||
167 | && button_id != IDCANCEL) | ||
168 | { | ||
169 | return false; | ||
170 | } | ||
171 | |||
172 | // See if "do this next time" is checked and save state | ||
173 | S32 crash_behavior = CRASH_BEHAVIOR_ASK; | ||
174 | LRESULT result = SendDlgItemMessage(gHwndReport, IDC_CHECK_AUTO, BM_GETCHECK, 0, 0); | ||
175 | if (result == BST_CHECKED) | ||
176 | { | ||
177 | if (button_id == IDOK) | ||
178 | { | ||
179 | crash_behavior = CRASH_BEHAVIOR_ALWAYS_SEND; | ||
180 | } | ||
181 | else if (button_id == IDCANCEL) | ||
182 | { | ||
183 | crash_behavior = CRASH_BEHAVIOR_NEVER_SEND; | ||
184 | } | ||
185 | ((LLCrashLoggerWindows*)LLCrashLogger::instance())->saveCrashBehaviorSetting(crash_behavior); | ||
186 | } | ||
187 | |||
188 | // We're done with this dialog. | ||
189 | gFirstDialog = FALSE; | ||
190 | |||
191 | // Send the crash report if requested | ||
192 | if (button_id == IDOK) | ||
193 | { | ||
194 | gSendLogs = TRUE; | ||
195 | WCHAR wbuffer[20000]; | ||
196 | GetDlgItemText(gHwndReport, // handle to dialog box | ||
197 | IDC_EDIT1, // control identifier | ||
198 | wbuffer, // pointer to buffer for text | ||
199 | 20000 // maximum size of string | ||
200 | ); | ||
201 | LLString user_text(ll_convert_wide_to_string(wbuffer)); | ||
202 | // Activate and show the window. | ||
203 | ShowWindow(gHwndProgress, SW_SHOW); | ||
204 | // Try doing this second to make the progress window go frontmost. | ||
205 | ShowWindow(gHwndReport, SW_HIDE); | ||
206 | ((LLCrashLoggerWindows*)LLCrashLogger::instance())->setUserText(user_text); | ||
207 | ((LLCrashLoggerWindows*)LLCrashLogger::instance())->sendCrashLogs(); | ||
208 | } | ||
209 | // Quit the app | ||
210 | LLApp::setQuitting(); | ||
211 | return true; | ||
212 | } | ||
213 | |||
214 | |||
215 | LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) | ||
216 | { | ||
217 | switch( message ) | ||
218 | { | ||
219 | case WM_CREATE: | ||
220 | return 0; | ||
221 | |||
222 | case WM_COMMAND: | ||
223 | if( gFirstDialog ) | ||
224 | { | ||
225 | WORD button_id = LOWORD(wParam); | ||
226 | bool handled = handle_button_click(button_id); | ||
227 | if (handled) | ||
228 | { | ||
229 | return 0; | ||
230 | } | ||
231 | } | ||
232 | break; | ||
233 | |||
234 | case WM_DESTROY: | ||
235 | // Closing the window cancels | ||
236 | LLApp::setQuitting(); | ||
237 | PostQuitMessage(0); | ||
238 | return 0; | ||
239 | } | ||
240 | |||
241 | return DefWindowProc(hwnd, message, wParam, lParam); | ||
242 | } | ||
243 | |||
244 | |||
245 | LLCrashLoggerWindows::LLCrashLoggerWindows(void) | ||
246 | { | ||
247 | } | ||
248 | |||
249 | LLCrashLoggerWindows::~LLCrashLoggerWindows(void) | ||
250 | { | ||
251 | } | ||
252 | |||
253 | bool LLCrashLoggerWindows::init(void) | ||
254 | { | ||
255 | bool ok = LLCrashLogger::init(); | ||
256 | if(!ok) return false; | ||
257 | |||
258 | /* | ||
259 | mbstowcs(gProductName, mProductName.c_str(), sizeof(gProductName)/sizeof(gProductName[0])); | ||
260 | gProductName[ sizeof(gProductName)/sizeof(gProductName[0]) - 1 ] = 0; | ||
261 | swprintf(gProductName, L"Second Life"); | ||
262 | */ | ||
263 | |||
264 | llinfos << "Loading dialogs" << llendl; | ||
265 | |||
266 | // Initialize global strings | ||
267 | LoadString(mhInst, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); | ||
268 | LoadString(mhInst, IDC_WIN_CRASH_LOGGER, szWindowClass, MAX_LOADSTRING); | ||
269 | |||
270 | gCursorArrow = LoadCursor(NULL, IDC_ARROW); | ||
271 | gCursorWait = LoadCursor(NULL, IDC_WAIT); | ||
272 | |||
273 | // Register a window class that will be used by our dialogs | ||
274 | WNDCLASS wndclass; | ||
275 | wndclass.style = CS_HREDRAW | CS_VREDRAW; | ||
276 | wndclass.lpfnWndProc = WndProc; | ||
277 | wndclass.cbClsExtra = 0; | ||
278 | wndclass.cbWndExtra = DLGWINDOWEXTRA; // Required, since this is used for dialogs! | ||
279 | wndclass.hInstance = mhInst; | ||
280 | wndclass.hIcon = LoadIcon(hInst, MAKEINTRESOURCE( IDI_WIN_CRASH_LOGGER ) ); | ||
281 | wndclass.hCursor = gCursorArrow; | ||
282 | wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); | ||
283 | wndclass.lpszMenuName = NULL; | ||
284 | wndclass.lpszClassName = szWindowClass; | ||
285 | RegisterClass( &wndclass ); | ||
286 | |||
287 | return true; | ||
288 | } | ||
289 | |||
290 | void LLCrashLoggerWindows::gatherPlatformSpecificFiles() | ||
291 | { | ||
292 | updateApplication("Gathering hardware information. App may appear frozen."); | ||
293 | // DX hardware probe blocks, so we can't cancel during it | ||
294 | //Generate our dx_info.log file | ||
295 | SetCursor(gCursorWait); | ||
296 | // At this point we're responsive enough the user could click the close button | ||
297 | SetCursor(gCursorArrow); | ||
298 | mDebugLog["DisplayDeviceInfo"] = gDXHardware.getDisplayInfo(); | ||
299 | mFileMap["CrashLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLifeException.log"); | ||
300 | } | ||
301 | |||
302 | bool LLCrashLoggerWindows::mainLoop() | ||
303 | { | ||
304 | |||
305 | // Note: parent hwnd is 0 (the desktop). No dlg proc. See Petzold (5th ed) HexCalc example, Chapter 11, p529 | ||
306 | // win_crash_logger.rc has been edited by hand. | ||
307 | // Dialogs defined with CLASS "WIN_CRASH_LOGGER" (must be same as szWindowClass) | ||
308 | gProductName = mProductName; | ||
309 | |||
310 | gHwndProgress = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PROGRESS), 0, NULL); | ||
311 | ProcessCaption(gHwndProgress); | ||
312 | ShowWindow(gHwndProgress, SW_HIDE ); | ||
313 | |||
314 | if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND) | ||
315 | { | ||
316 | ShowWindow(gHwndProgress, SW_SHOW ); | ||
317 | sendCrashLogs(); | ||
318 | } | ||
319 | else if (mCrashBehavior == CRASH_BEHAVIOR_ASK) | ||
320 | { | ||
321 | gHwndReport = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PREVREPORTBOX), 0, NULL); | ||
322 | |||
323 | // Include the product name in the caption and various dialog items. | ||
324 | ProcessCaption(gHwndReport); | ||
325 | ProcessDlgItemText(gHwndReport, IDC_STATIC_MSG); | ||
326 | |||
327 | // Update the header to include whether or not we crashed on the last run. | ||
328 | std::string headerStr; | ||
329 | TCHAR header[MAX_STRING]; | ||
330 | if (mCrashInPreviousExec) | ||
331 | { | ||
332 | headerStr = llformat("%s appears to have crashed or frozen the last time it ran.", mProductName.c_str()); | ||
333 | } | ||
334 | else | ||
335 | { | ||
336 | headerStr = llformat("%s appears to have crashed.", mProductName.c_str()); | ||
337 | } | ||
338 | ConvertLPCSTRToLPWSTR(headerStr.c_str(), header); | ||
339 | SetDlgItemText(gHwndReport, IDC_STATIC_HEADER, header); | ||
340 | ShowWindow(gHwndReport, SW_SHOW ); | ||
341 | |||
342 | MSG msg; | ||
343 | while (!LLApp::isQuitting() && GetMessage(&msg, NULL, 0, 0)) | ||
344 | { | ||
345 | TranslateMessage(&msg); | ||
346 | DispatchMessage(&msg); | ||
347 | } | ||
348 | return msg.wParam; | ||
349 | } | ||
350 | else | ||
351 | { | ||
352 | llwarns << "Unknown crash behavior " << mCrashBehavior << llendl; | ||
353 | return 1; | ||
354 | } | ||
355 | return 0; | ||
356 | } | ||
357 | |||
358 | void LLCrashLoggerWindows::updateApplication(LLString message) | ||
359 | { | ||
360 | LLCrashLogger::updateApplication(); | ||
361 | if(message != "") show_progress(message.c_str()); | ||
362 | update_messages(); | ||
363 | } | ||
364 | |||
365 | bool LLCrashLoggerWindows::cleanup() | ||
366 | { | ||
367 | if(gSendLogs) | ||
368 | { | ||
369 | if(mSentCrashLogs) show_progress("Done"); | ||
370 | else show_progress("Could not connect to servers, logs not sent"); | ||
371 | sleep_and_pump_messages(3); | ||
372 | } | ||
373 | PostQuitMessage(0); | ||
374 | return true; | ||
375 | } | ||
376 | |||
377 | |||
378 | |||
diff --git a/linden/indra/win_crash_logger/llcrashloggerwindows.h b/linden/indra/win_crash_logger/llcrashloggerwindows.h new file mode 100644 index 0000000..1f5a216 --- /dev/null +++ b/linden/indra/win_crash_logger/llcrashloggerwindows.h | |||
@@ -0,0 +1,59 @@ | |||
1 | /** | ||
2 | * @file llcrashloggerwindows.h | ||
3 | * @brief Windows crash logger definition | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2003&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2003-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
32 | #ifndef LLCRASHLOGGERWINDOWS_H | ||
33 | #define LLCRASHLOGGERWINDOWS_H | ||
34 | |||
35 | #include "linden_common.h" | ||
36 | #include "llcrashlogger.h" | ||
37 | #include "windows.h" | ||
38 | #include "llstring.h" | ||
39 | |||
40 | class LLCrashLoggerWindows : public LLCrashLogger | ||
41 | { | ||
42 | public: | ||
43 | LLCrashLoggerWindows(void); | ||
44 | ~LLCrashLoggerWindows(void); | ||
45 | virtual bool init(); | ||
46 | virtual bool mainLoop(); | ||
47 | virtual void updateApplication(LLString message = ""); | ||
48 | virtual bool cleanup(); | ||
49 | virtual void gatherPlatformSpecificFiles(); | ||
50 | //void annotateCallStack(); | ||
51 | void setHandle(HINSTANCE hInst) { mhInst = hInst; } | ||
52 | private: | ||
53 | void ProcessDlgItemText(HWND hWnd, int nIDDlgItem); | ||
54 | void ProcessCaption(HWND hWnd); | ||
55 | HINSTANCE mhInst; | ||
56 | |||
57 | }; | ||
58 | |||
59 | #endif | ||
diff --git a/linden/indra/win_crash_logger/resource.h b/linden/indra/win_crash_logger/resource.h index ee6bf3d..f1ef850 100644 --- a/linden/indra/win_crash_logger/resource.h +++ b/linden/indra/win_crash_logger/resource.h | |||
@@ -1,3 +1,34 @@ | |||
1 | /** | ||
2 | * @file resource.h | ||
3 | * @brief Windows crash logger windows resources | ||
4 | * | ||
5 | * $LicenseInfo:firstyear=2003&license=viewergpl$ | ||
6 | * | ||
7 | * Copyright (c) 2003-2007, Linden Research, Inc. | ||
8 | * | ||
9 | * Second Life Viewer Source Code | ||
10 | * The source code in this file ("Source Code") is provided by Linden Lab | ||
11 | * to you under the terms of the GNU General Public License, version 2.0 | ||
12 | * ("GPL"), unless you have obtained a separate licensing agreement | ||
13 | * ("Other License"), formally executed by you and Linden Lab. Terms of | ||
14 | * the GPL can be found in doc/GPL-license.txt in this distribution, or | ||
15 | * online at http://secondlife.com/developers/opensource/gplv2 | ||
16 | * | ||
17 | * There are special exceptions to the terms and conditions of the GPL as | ||
18 | * it is applied to this Source Code. View the full text of the exception | ||
19 | * in the file doc/FLOSS-exception.txt in this software distribution, or | ||
20 | * online at http://secondlife.com/developers/opensource/flossexception | ||
21 | * | ||
22 | * By copying, modifying or distributing this software, you acknowledge | ||
23 | * that you have read and understood your obligations described above, | ||
24 | * and agree to abide by those obligations. | ||
25 | * | ||
26 | * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO | ||
27 | * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, | ||
28 | * COMPLETENESS OR PERFORMANCE. | ||
29 | * $/LicenseInfo$ | ||
30 | */ | ||
31 | |||
1 | //{{NO_DEPENDENCIES}} | 32 | //{{NO_DEPENDENCIES}} |
2 | // Microsoft Visual C++ generated include file. | 33 | // Microsoft Visual C++ generated include file. |
3 | // Used by win_crash_logger.rc | 34 | // Used by win_crash_logger.rc |
@@ -22,6 +53,7 @@ | |||
22 | #define IDC_STATIC_HEADER 1007 | 53 | #define IDC_STATIC_HEADER 1007 |
23 | #define IDC_STATIC_WHATINFO 1008 | 54 | #define IDC_STATIC_WHATINFO 1008 |
24 | #define IDC_STATIC_MOTIVATION 1009 | 55 | #define IDC_STATIC_MOTIVATION 1009 |
56 | #define IDC_STATIC_MSG 1010 | ||
25 | #define IDC_STATIC -1 | 57 | #define IDC_STATIC -1 |
26 | 58 | ||
27 | // Next default values for new objects | 59 | // Next default values for new objects |
@@ -30,7 +62,7 @@ | |||
30 | #ifndef APSTUDIO_READONLY_SYMBOLS | 62 | #ifndef APSTUDIO_READONLY_SYMBOLS |
31 | #define _APS_NEXT_RESOURCE_VALUE 131 | 63 | #define _APS_NEXT_RESOURCE_VALUE 131 |
32 | #define _APS_NEXT_COMMAND_VALUE 32771 | 64 | #define _APS_NEXT_COMMAND_VALUE 32771 |
33 | #define _APS_NEXT_CONTROL_VALUE 1010 | 65 | #define _APS_NEXT_CONTROL_VALUE 1011 |
34 | #define _APS_NEXT_SYMED_VALUE 110 | 66 | #define _APS_NEXT_SYMED_VALUE 110 |
35 | #endif | 67 | #endif |
36 | #endif | 68 | #endif |
diff --git a/linden/indra/win_crash_logger/win_crash_logger.cpp b/linden/indra/win_crash_logger/win_crash_logger.cpp index 2669407..c6b4ff1 100644 --- a/linden/indra/win_crash_logger/win_crash_logger.cpp +++ b/linden/indra/win_crash_logger/win_crash_logger.cpp | |||
@@ -35,98 +35,22 @@ | |||
35 | // Must be first include, precompiled headers. | 35 | // Must be first include, precompiled headers. |
36 | #include "stdafx.h" | 36 | #include "stdafx.h" |
37 | 37 | ||
38 | #include "linden_common.h" | 38 | #include <stdlib.h> |
39 | #include "llcontrol.h" | ||
40 | #include "resource.h" | ||
41 | 39 | ||
42 | #include <direct.h> | 40 | #include "llcrashloggerwindows.h" |
43 | #include <sys/types.h> | ||
44 | #include <sys/stat.h> | ||
45 | #include <wininet.h> | ||
46 | 41 | ||
47 | #include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME | ||
48 | #include "llerror.h" | ||
49 | #include "lltimer.h" | ||
50 | #include "lldir.h" | ||
51 | 42 | ||
52 | #include "llstring.h" | ||
53 | #include "lldxhardware.h" | ||
54 | |||
55 | LLControlGroup gCrashSettings; // saved at end of session | ||
56 | |||
57 | // Constants | ||
58 | #define MAX_LOADSTRING 100 | ||
59 | const char* const SETTINGS_FILE_HEADER = "version"; | ||
60 | const S32 SETTINGS_FILE_VERSION = 101; | ||
61 | |||
62 | // Functions | ||
63 | LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); | ||
64 | bool handle_button_click(WORD button_id); | ||
65 | S32 load_crash_behavior_setting(); | ||
66 | bool save_crash_behavior_setting(S32 crash_behavior); | ||
67 | void send_crash_report(); | ||
68 | void write_debug(const char *str); | ||
69 | void write_debug(std::string& str); | ||
70 | |||
71 | // Global Variables: | ||
72 | HINSTANCE hInst= NULL; // current instance | ||
73 | TCHAR szTitle[MAX_LOADSTRING]; /* Flawfinder: ignore */ // The title bar text | ||
74 | TCHAR szWindowClass[MAX_LOADSTRING]; /* Flawfinder: ignore */ // The title bar text | ||
75 | |||
76 | LLString gUserText; // User's description of the problem | ||
77 | time_t gStartTime = 0; | ||
78 | HWND gHwndReport = NULL; // Send/Don't Send dialog | ||
79 | HWND gHwndProgress = NULL; // Progress window | ||
80 | HCURSOR gCursorArrow = NULL; | ||
81 | HCURSOR gCursorWait = NULL; | ||
82 | BOOL gFirstDialog = TRUE; // Are we currently handling the Send/Don't Send dialog? | ||
83 | BOOL gCrashInPreviousExec = FALSE; | ||
84 | FILE *gDebugFile = NULL; | ||
85 | LLString gUserserver; | ||
86 | WCHAR gProductName[512]; | ||
87 | 43 | ||
88 | // | 44 | // |
89 | // Implementation | 45 | // Implementation |
90 | // | 46 | // |
91 | 47 | ||
92 | // Include product name in the window caption. | ||
93 | void ProcessCaption(HWND hWnd) | ||
94 | { | ||
95 | TCHAR templateText[1024]; /* Flawfinder: ignore */ | ||
96 | TCHAR finalText[2048]; /* Flawfinder: ignore */ | ||
97 | GetWindowText(hWnd, templateText, sizeof(templateText)); | ||
98 | swprintf(finalText, templateText, gProductName); /* Flawfinder: ignore */ | ||
99 | SetWindowText(hWnd, finalText); | ||
100 | } | ||
101 | |||
102 | |||
103 | // Include product name in the diaog item text. | ||
104 | void ProcessDlgItemText(HWND hWnd, int nIDDlgItem) | ||
105 | { | ||
106 | TCHAR templateText[1024]; /* Flawfinder: ignore */ | ||
107 | TCHAR finalText[2048]; /* Flawfinder: ignore */ | ||
108 | GetDlgItemText(hWnd, nIDDlgItem, templateText, sizeof(templateText)); | ||
109 | swprintf(finalText, templateText, gProductName); /* Flawfinder: ignore */ | ||
110 | SetDlgItemText(hWnd, nIDDlgItem, finalText); | ||
111 | } | ||
112 | |||
113 | int APIENTRY WinMain(HINSTANCE hInstance, | 48 | int APIENTRY WinMain(HINSTANCE hInstance, |
114 | HINSTANCE hPrevInstance, | 49 | HINSTANCE hPrevInstance, |
115 | LPSTR lpCmdLine, | 50 | LPSTR lpCmdLine, |
116 | int nCmdShow) | 51 | int nCmdShow) |
117 | { | 52 | { |
118 | llinfos << "Starting crash reporter" << llendl; | 53 | llinfos << "Starting crash reporter" << llendl; |
119 | // We assume that all the logs we're looking for reside on the current drive | ||
120 | gDirUtilp->initAppDirs("SecondLife"); | ||
121 | |||
122 | // Default to the product name "Second Life" (this is overridden by the -name argument) | ||
123 | swprintf(gProductName, L"Second Life"); /* Flawfinder: ignore */ | ||
124 | |||
125 | gCrashSettings.declareS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ASK, "Controls behavior when viewer crashes " | ||
126 | "(0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)"); | ||
127 | |||
128 | llinfos << "Loading crash behavior setting" << llendl; | ||
129 | S32 crash_behavior = load_crash_behavior_setting(); | ||
130 | 54 | ||
131 | // In Win32, we need to generate argc and argv ourselves... | 55 | // In Win32, we need to generate argc and argv ourselves... |
132 | // Note: GetCommandLine() returns a potentially return a LPTSTR | 56 | // Note: GetCommandLine() returns a potentially return a LPTSTR |
@@ -139,7 +63,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, | |||
139 | 63 | ||
140 | const S32 MAX_ARGS = 100; | 64 | const S32 MAX_ARGS = 100; |
141 | int argc = 0; | 65 | int argc = 0; |
142 | char *argv[MAX_ARGS]; /* Flawfinder: ignore */ | 66 | char *argv[MAX_ARGS]; |
143 | 67 | ||
144 | char *token = NULL; | 68 | char *token = NULL; |
145 | if( cmd_line_including_exe_name[0] == '\"' ) | 69 | if( cmd_line_including_exe_name[0] == '\"' ) |
@@ -159,7 +83,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, | |||
159 | { | 83 | { |
160 | argv[argc++] = token; | 84 | argv[argc++] = token; |
161 | /* Get next token: */ | 85 | /* Get next token: */ |
162 | if (*(token + strlen(token) + 1) == '\"') /* Flawfinder: ignore */ | 86 | if (*(token + strlen(token) + 1) == '\"') |
163 | { | 87 | { |
164 | token = strtok( NULL, "\""); | 88 | token = strtok( NULL, "\""); |
165 | } | 89 | } |
@@ -169,784 +93,32 @@ int APIENTRY WinMain(HINSTANCE hInstance, | |||
169 | } | 93 | } |
170 | } | 94 | } |
171 | 95 | ||
172 | S32 i; | 96 | LLCrashLoggerWindows app; |
173 | for (i=0; i<argc; i++) | 97 | bool ok = app.parseCommandOptions(argc, argv); |
174 | { | 98 | if(!ok) |
175 | if(!strcmp(argv[i], "-previous")) | ||
176 | { | ||
177 | llinfos << "Previous execution did not remove SecondLife.exec_marker" << llendl; | ||
178 | gCrashInPreviousExec = TRUE; | ||
179 | } | ||
180 | |||
181 | if(!strcmp(argv[i], "-dialog")) | ||
182 | { | ||
183 | llinfos << "Show the user dialog" << llendl; | ||
184 | crash_behavior = CRASH_BEHAVIOR_ASK; | ||
185 | } | ||
186 | |||
187 | if(!strcmp(argv[i], "-user")) | ||
188 | { | ||
189 | if ((i + 1) < argc) | ||
190 | { | ||
191 | i++; | ||
192 | gUserserver = argv[i]; | ||
193 | llinfos << "Got userserver " << gUserserver << llendl; | ||
194 | } | ||
195 | } | ||
196 | |||
197 | if(!strcmp(argv[i], "-name")) | ||
198 | { | ||
199 | if ((i + 1) < argc) | ||
200 | { | ||
201 | i++; | ||
202 | |||
203 | mbstowcs(gProductName, argv[i], sizeof(gProductName)/sizeof(gProductName[0])); | ||
204 | gProductName[ sizeof(gProductName)/sizeof(gProductName[0]) - 1 ] = 0; | ||
205 | llinfos << "Got product name " << argv[i] << llendl; | ||
206 | } | ||
207 | } | ||
208 | } | ||
209 | |||
210 | // If user doesn't want to send, bail out | ||
211 | if (crash_behavior == CRASH_BEHAVIOR_NEVER_SEND) | ||
212 | { | ||
213 | llinfos << "Crash behavior is never_send, quitting" << llendl; | ||
214 | return 0; | ||
215 | } | ||
216 | |||
217 | // Get the current time | ||
218 | time(&gStartTime); | ||
219 | |||
220 | llinfos << "Loading dialogs" << llendl; | ||
221 | |||
222 | // Store instance handle in our global variable | ||
223 | hInst = hInstance; | ||
224 | |||
225 | // Initialize global strings | ||
226 | LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); | ||
227 | LoadString(hInstance, IDC_WIN_CRASH_LOGGER, szWindowClass, MAX_LOADSTRING); | ||
228 | |||
229 | gCursorArrow = LoadCursor(NULL, IDC_ARROW); | ||
230 | gCursorWait = LoadCursor(NULL, IDC_WAIT); | ||
231 | |||
232 | // Register a window class that will be used by our dialogs | ||
233 | WNDCLASS wndclass; | ||
234 | wndclass.style = CS_HREDRAW | CS_VREDRAW; | ||
235 | wndclass.lpfnWndProc = WndProc; | ||
236 | wndclass.cbClsExtra = 0; | ||
237 | wndclass.cbWndExtra = DLGWINDOWEXTRA; // Required, since this is used for dialogs! | ||
238 | wndclass.hInstance = hInst; | ||
239 | wndclass.hIcon = LoadIcon(hInst, MAKEINTRESOURCE( IDI_WIN_CRASH_LOGGER ) ); | ||
240 | wndclass.hCursor = gCursorArrow; | ||
241 | wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); | ||
242 | wndclass.lpszMenuName = NULL; | ||
243 | wndclass.lpszClassName = szWindowClass; | ||
244 | RegisterClass( &wndclass ); | ||
245 | |||
246 | // Note: parent hwnd is 0 (the desktop). No dlg proc. See Petzold (5th ed) HexCalc example, Chapter 11, p529 | ||
247 | // win_crash_logger.rc has been edited by hand. | ||
248 | // Dialogs defined with CLASS "WIN_CRASH_LOGGER" (must be same as szWindowClass) | ||
249 | |||
250 | gHwndProgress = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PROGRESS), 0, NULL); | ||
251 | ProcessCaption(gHwndProgress); | ||
252 | ShowWindow(gHwndProgress, SW_HIDE ); | ||
253 | |||
254 | if (crash_behavior == CRASH_BEHAVIOR_ALWAYS_SEND) | ||
255 | { | ||
256 | ShowWindow(gHwndProgress, SW_SHOW ); | ||
257 | send_crash_report(); | ||
258 | return 0; | ||
259 | } | ||
260 | |||
261 | if (crash_behavior == CRASH_BEHAVIOR_ASK) | ||
262 | { | ||
263 | gHwndReport = CreateDialog(hInst, MAKEINTRESOURCE(IDD_REPORT), 0, NULL); | ||
264 | |||
265 | // Include the product name in the caption and various dialog items. | ||
266 | ProcessCaption(gHwndReport); | ||
267 | ProcessDlgItemText(gHwndReport, IDC_STATIC_WHATINFO); | ||
268 | ProcessDlgItemText(gHwndReport, IDC_STATIC_MOTIVATION); | ||
269 | |||
270 | // Update the header to include whether or not we crashed on the last run. | ||
271 | WCHAR header[2048]; | ||
272 | if (gCrashInPreviousExec) | ||
273 | { | ||
274 | swprintf(header, L"%s appears to have crashed or frozen the last time it ran.", gProductName); /* Flawfinder: ignore */ | ||
275 | } | ||
276 | else | ||
277 | { | ||
278 | swprintf(header, L"%s appears to have crashed.", gProductName); /* Flawfinder: ignore */ | ||
279 | } | ||
280 | SetDlgItemText(gHwndReport, IDC_STATIC_HEADER, header); | ||
281 | ShowWindow(gHwndReport, SW_SHOW ); | ||
282 | |||
283 | MSG msg; | ||
284 | while (GetMessage(&msg, NULL, 0, 0)) | ||
285 | { | ||
286 | TranslateMessage(&msg); | ||
287 | DispatchMessage(&msg); | ||
288 | } | ||
289 | return msg.wParam; | ||
290 | } | ||
291 | else | ||
292 | { | ||
293 | llwarns << "Unknown crash behavior " << crash_behavior << llendl; | ||
294 | return 1; | ||
295 | } | ||
296 | } | ||
297 | |||
298 | |||
299 | LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) | ||
300 | { | ||
301 | switch( message ) | ||
302 | { | ||
303 | case WM_CREATE: | ||
304 | return 0; | ||
305 | |||
306 | case WM_COMMAND: | ||
307 | if( gFirstDialog ) | ||
308 | { | ||
309 | WORD button_id = LOWORD(wParam); | ||
310 | bool handled = handle_button_click(button_id); | ||
311 | if (handled) | ||
312 | { | ||
313 | return 0; | ||
314 | } | ||
315 | } | ||
316 | break; | ||
317 | |||
318 | case WM_DESTROY: | ||
319 | // Closing the window cancels | ||
320 | PostQuitMessage(0); | ||
321 | return 0; | ||
322 | } | ||
323 | |||
324 | return DefWindowProc(hwnd, message, wParam, lParam); | ||
325 | } | ||
326 | |||
327 | |||
328 | bool handle_button_click(WORD button_id) | ||
329 | { | ||
330 | // Is this something other than Send or Don't Send? | ||
331 | if (button_id != IDOK | ||
332 | && button_id != IDCANCEL) | ||
333 | { | ||
334 | return false; | ||
335 | } | ||
336 | |||
337 | // See if "do this next time" is checked and save state | ||
338 | S32 crash_behavior = CRASH_BEHAVIOR_ASK; | ||
339 | LRESULT result = SendDlgItemMessage(gHwndReport, IDC_CHECK_AUTO, BM_GETCHECK, 0, 0); | ||
340 | if (result == BST_CHECKED) | ||
341 | { | ||
342 | if (button_id == IDOK) | ||
343 | { | ||
344 | crash_behavior = CRASH_BEHAVIOR_ALWAYS_SEND; | ||
345 | } | ||
346 | else if (button_id == IDCANCEL) | ||
347 | { | ||
348 | crash_behavior = CRASH_BEHAVIOR_NEVER_SEND; | ||
349 | } | ||
350 | } | ||
351 | bool success = save_crash_behavior_setting(crash_behavior); | ||
352 | if (!success) | ||
353 | { | ||
354 | llwarns << "Failed to save crash settings" << llendl; | ||
355 | } | ||
356 | |||
357 | // We're done with this dialog. | ||
358 | gFirstDialog = FALSE; | ||
359 | |||
360 | // Send the crash report if requested | ||
361 | if (button_id == IDOK) | ||
362 | { | ||
363 | // Don't let users type anything. They believe the reports | ||
364 | // get read by humans, and get angry when we don't respond. JC | ||
365 | //WCHAR wbuffer[20000]; | ||
366 | //GetDlgItemText(gHwndReport, // handle to dialog box | ||
367 | // IDC_EDIT1, // control identifier | ||
368 | // wbuffer, // pointer to buffer for text | ||
369 | // 20000 // maximum size of string | ||
370 | // ); | ||
371 | //gUserText = wstring_to_utf8str(utf16str_to_wstring(wbuffer)).c_str(); | ||
372 | //llinfos << gUserText << llendl; | ||
373 | |||
374 | // Activate and show the window. | ||
375 | ShowWindow(gHwndProgress, SW_SHOW); | ||
376 | // Try doing this second to make the progress window go frontmost. | ||
377 | ShowWindow(gHwndReport, SW_HIDE); | ||
378 | |||
379 | send_crash_report(); | ||
380 | } | ||
381 | |||
382 | // Quit the app | ||
383 | PostQuitMessage(0); | ||
384 | |||
385 | return true; | ||
386 | } | ||
387 | |||
388 | |||
389 | class LLFileEncoder | ||
390 | { | ||
391 | public: | ||
392 | LLFileEncoder(const char *formname, const char *filename); | ||
393 | ~LLFileEncoder(); | ||
394 | |||
395 | BOOL isValid() const { return mIsValid; } | ||
396 | LLString encodeURL(const S32 max_length = 0); | ||
397 | public: | ||
398 | BOOL mIsValid; | ||
399 | LLString mFilename; | ||
400 | LLString mFormname; | ||
401 | S32 mBufLength; | ||
402 | U8 *mBuf; | ||
403 | }; | ||
404 | |||
405 | LLString encode_string(const char *formname, const LLString &str); | ||
406 | |||
407 | void update_messages() | ||
408 | { | ||
409 | MSG msg; | ||
410 | while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) | ||
411 | { | ||
412 | if (msg.message == WM_QUIT) | ||
413 | { | ||
414 | exit(0); | ||
415 | } | ||
416 | TranslateMessage(&msg); | ||
417 | DispatchMessage(&msg); | ||
418 | } | ||
419 | } | ||
420 | |||
421 | void sleep_and_pump_messages( U32 seconds ) | ||
422 | { | ||
423 | const U32 CYCLES_PER_SECOND = 10; | ||
424 | U32 cycles = seconds * CYCLES_PER_SECOND; | ||
425 | while( cycles-- ) | ||
426 | { | 99 | { |
427 | update_messages(); | 100 | llwarns << "Unable to parse command line." << llendl; |
428 | ms_sleep(1000 / CYCLES_PER_SECOND); | ||
429 | } | ||
430 | } | ||
431 | |||
432 | |||
433 | void show_progress(const char* message) | ||
434 | { | ||
435 | std::wstring msg = wstring_to_utf16str(utf8str_to_wstring(message)); | ||
436 | if (gHwndProgress) | ||
437 | { | ||
438 | SendDlgItemMessage(gHwndProgress, // handle to destination window | ||
439 | IDC_LOG, | ||
440 | WM_SETTEXT, // message to send | ||
441 | FALSE, // undo option | ||
442 | (LPARAM)msg.c_str()); | ||
443 | } | ||
444 | } | ||
445 | |||
446 | |||
447 | void send_crash_report() | ||
448 | { | ||
449 | update_messages(); | ||
450 | show_progress("Starting up..."); | ||
451 | update_messages(); | ||
452 | |||
453 | const S32 SL_MAX_SIZE = 100000; // Maximum size of the Second Life log file. | ||
454 | |||
455 | update_messages(); | ||
456 | |||
457 | // Lots of silly variable, replicated for each log file. | ||
458 | std::string db_file_name; // debug.log | ||
459 | std::string sl_file_name; // SecondLife.log | ||
460 | std::string md_file_name; // minidump (SecondLife.dmp) file name | ||
461 | std::string st_file_name; // stats.log file | ||
462 | std::string si_file_name; // settings.ini file | ||
463 | std::string ml_file_name; // message.log file | ||
464 | |||
465 | LLFileEncoder *db_filep = NULL; | ||
466 | LLFileEncoder *sl_filep = NULL; | ||
467 | LLFileEncoder *st_filep = NULL; | ||
468 | LLFileEncoder *md_filep = NULL; | ||
469 | LLFileEncoder *si_filep = NULL; | ||
470 | LLFileEncoder *ml_filep = NULL; | ||
471 | |||
472 | // DX hardware probe blocks, so we can't cancel during it | ||
473 | SetCursor(gCursorWait); | ||
474 | |||
475 | // Need to do hardware detection before we grab the files, otherwise we don't send the debug log updates | ||
476 | // to the server (including the list of hardware). | ||
477 | update_messages(); | ||
478 | show_progress("Detecting hardware, please wait..."); | ||
479 | update_messages(); | ||
480 | gDXHardware.setWriteDebugFunc(write_debug); | ||
481 | gDXHardware.getInfo(FALSE); | ||
482 | update_messages(); | ||
483 | gDXHardware.dumpDevices(); | ||
484 | update_messages(); | ||
485 | fclose(gDebugFile); | ||
486 | gDebugFile = NULL; | ||
487 | |||
488 | // At this point we're responsive enough the user could click the close button | ||
489 | SetCursor(gCursorArrow); | ||
490 | |||
491 | /////////////////////////////////// | ||
492 | // | ||
493 | // We do the parsing for the debug_info file first, as that will | ||
494 | // give us the location of the SecondLife.log file. | ||
495 | // | ||
496 | |||
497 | // Figure out the filename of the debug log | ||
498 | db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log"); | ||
499 | db_filep = new LLFileEncoder("DB", db_file_name.c_str()); | ||
500 | |||
501 | // Get the filename of the SecondLife.log file | ||
502 | // *NOTE: This buffer size is hard coded into scanf() below. | ||
503 | char tmp_sl_name[256]; /* Flawfinder: ignore */ | ||
504 | tmp_sl_name[0] = '\0'; | ||
505 | |||
506 | update_messages(); | ||
507 | show_progress("Looking for files..."); | ||
508 | update_messages(); | ||
509 | |||
510 | // Look for it in the debug_info.log file | ||
511 | if (db_filep->isValid()) | ||
512 | { | ||
513 | sscanf( | ||
514 | (const char*)db_filep->mBuf, | ||
515 | "SL Log: %255[^\r\n]", | ||
516 | tmp_sl_name); | ||
517 | } | ||
518 | else | ||
519 | { | ||
520 | delete db_filep; | ||
521 | db_filep = NULL; | ||
522 | } | ||
523 | |||
524 | if (gCrashInPreviousExec) | ||
525 | { | ||
526 | // If we froze, the crash log this time around isn't useful. Use the | ||
527 | // old one. | ||
528 | sl_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.old"); | ||
529 | } | ||
530 | else if (tmp_sl_name[0]) | ||
531 | { | ||
532 | // If debug_info.log gives us a valid log filename, use that. | ||
533 | sl_file_name = tmp_sl_name; | ||
534 | llinfos << "Using log file from debug log " << sl_file_name << llendl; | ||
535 | } | ||
536 | else | ||
537 | { | ||
538 | // Figure out the filename of the default second life log | ||
539 | sl_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.log"); | ||
540 | } | ||
541 | |||
542 | // Now we get the SecondLife.log file if it's there | ||
543 | sl_filep = new LLFileEncoder("SL", sl_file_name.c_str()); | ||
544 | if (!sl_filep->isValid()) | ||
545 | { | ||
546 | delete sl_filep; | ||
547 | sl_filep = NULL; | ||
548 | } | ||
549 | |||
550 | update_messages(); | ||
551 | show_progress("Looking for stats file..."); | ||
552 | update_messages(); | ||
553 | |||
554 | st_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stats.log"); | ||
555 | st_filep = new LLFileEncoder("ST", st_file_name.c_str()); | ||
556 | if (!st_filep->isValid()) | ||
557 | { | ||
558 | delete st_filep; | ||
559 | st_filep = NULL; | ||
560 | } | ||
561 | |||
562 | si_file_name = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.ini"); | ||
563 | si_filep = new LLFileEncoder("SI", si_file_name.c_str()); | ||
564 | if (!si_filep->isValid()) | ||
565 | { | ||
566 | delete si_filep; | ||
567 | si_filep = NULL; | ||
568 | } | ||
569 | |||
570 | // Now we get the minidump | ||
571 | md_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.dmp"); | ||
572 | md_filep = new LLFileEncoder("MD", md_file_name.c_str()); | ||
573 | if (!md_filep->isValid()) | ||
574 | { | ||
575 | delete md_filep; | ||
576 | md_filep = NULL; | ||
577 | } | ||
578 | |||
579 | // Now we get the message log | ||
580 | ml_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"message.log"); | ||
581 | ml_filep = new LLFileEncoder("ML", ml_file_name.c_str()); | ||
582 | if (!ml_filep->isValid()) | ||
583 | { | ||
584 | delete ml_filep; | ||
585 | ml_filep = NULL; | ||
586 | } | ||
587 | |||
588 | LLString post_data; | ||
589 | LLString tmp_url_buf; | ||
590 | |||
591 | // Append the userserver | ||
592 | tmp_url_buf = encode_string("USER", gUserserver); | ||
593 | post_data += tmp_url_buf; | ||
594 | llinfos << "PostData:" << post_data << llendl; | ||
595 | |||
596 | if (gCrashInPreviousExec) | ||
597 | { | ||
598 | post_data.append(1, '&'); | ||
599 | tmp_url_buf = encode_string("EF", "Y"); | ||
600 | post_data += tmp_url_buf; | ||
601 | } | ||
602 | |||
603 | update_messages(); | ||
604 | show_progress("Encoding data"); | ||
605 | update_messages(); | ||
606 | if (db_filep) | ||
607 | { | ||
608 | post_data.append(1, '&'); | ||
609 | tmp_url_buf = db_filep->encodeURL(); | ||
610 | post_data += tmp_url_buf; | ||
611 | llinfos << "Sending DB log file" << llendl; | ||
612 | } | ||
613 | else | ||
614 | { | ||
615 | llinfos << "Not sending DB log file" << llendl; | ||
616 | } | ||
617 | show_progress("Encoding data."); | ||
618 | update_messages(); | ||
619 | |||
620 | if (sl_filep) | ||
621 | { | ||
622 | post_data.append(1, '&'); | ||
623 | tmp_url_buf = sl_filep->encodeURL(SL_MAX_SIZE); | ||
624 | post_data += tmp_url_buf; | ||
625 | llinfos << "Sending SL log file" << llendl; | ||
626 | } | ||
627 | else | ||
628 | { | ||
629 | llinfos << "Not sending SL log file" << llendl; | ||
630 | } | ||
631 | show_progress("Encoding data.."); | ||
632 | update_messages(); | ||
633 | |||
634 | if (st_filep) | ||
635 | { | ||
636 | post_data.append(1, '&'); | ||
637 | tmp_url_buf = st_filep->encodeURL(SL_MAX_SIZE); | ||
638 | post_data += tmp_url_buf; | ||
639 | llinfos << "Sending stats log file" << llendl; | ||
640 | } | ||
641 | else | ||
642 | { | ||
643 | llinfos << "Not sending stats log file" << llendl; | ||
644 | } | ||
645 | show_progress("Encoding data..."); | ||
646 | update_messages(); | ||
647 | |||
648 | if (md_filep) | ||
649 | { | ||
650 | post_data.append(1, '&'); | ||
651 | tmp_url_buf = md_filep->encodeURL(); | ||
652 | post_data += tmp_url_buf; | ||
653 | llinfos << "Sending minidump log file" << llendl; | ||
654 | } | ||
655 | else | ||
656 | { | ||
657 | llinfos << "Not sending minidump log file" << llendl; | ||
658 | } | ||
659 | show_progress("Encoding data...."); | ||
660 | update_messages(); | ||
661 | |||
662 | if (si_filep) | ||
663 | { | ||
664 | post_data.append(1, '&'); | ||
665 | tmp_url_buf = si_filep->encodeURL(); | ||
666 | post_data += tmp_url_buf; | ||
667 | llinfos << "Sending settings log file" << llendl; | ||
668 | } | ||
669 | else | ||
670 | { | ||
671 | llinfos << "Not sending settings.ini file" << llendl; | ||
672 | } | ||
673 | show_progress("Encoding data...."); | ||
674 | update_messages(); | ||
675 | |||
676 | if (ml_filep) | ||
677 | { | ||
678 | post_data.append(1, '&'); | ||
679 | tmp_url_buf = ml_filep->encodeURL(SL_MAX_SIZE); | ||
680 | post_data += tmp_url_buf; | ||
681 | llinfos << "Sending message log file" << llendl; | ||
682 | } | ||
683 | else | ||
684 | { | ||
685 | llinfos << "Not sending message.log file" << llendl; | ||
686 | } | ||
687 | show_progress("Encoding data...."); | ||
688 | update_messages(); | ||
689 | |||
690 | if (gUserText.size()) | ||
691 | { | ||
692 | post_data.append(1, '&'); | ||
693 | tmp_url_buf = encode_string("UN", gUserText); | ||
694 | post_data += tmp_url_buf; | ||
695 | } | ||
696 | |||
697 | delete db_filep; | ||
698 | db_filep = NULL; | ||
699 | delete sl_filep; | ||
700 | sl_filep = NULL; | ||
701 | delete md_filep; | ||
702 | md_filep = NULL; | ||
703 | |||
704 | // Post data to web server | ||
705 | const S32 BUFSIZE = 65536; | ||
706 | HINTERNET hinet, hsession, hrequest; | ||
707 | char data[BUFSIZE]; /* Flawfinder: ignore */ | ||
708 | unsigned long bytes_read; | ||
709 | |||
710 | llinfos << "Connecting to crash report server" << llendl; | ||
711 | update_messages(); | ||
712 | show_progress("Connecting to server..."); | ||
713 | update_messages(); | ||
714 | |||
715 | // Init wininet subsystem | ||
716 | hinet = InternetOpen(L"LindenCrashReporter", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); | ||
717 | if (hinet == NULL) | ||
718 | { | ||
719 | llinfos << "Couldn't open connection" << llendl; | ||
720 | sleep_and_pump_messages( 5 ); | ||
721 | // return FALSE; | ||
722 | } | ||
723 | |||
724 | hsession = InternetConnect(hinet, | ||
725 | L"secondlife.com", | ||
726 | INTERNET_DEFAULT_HTTP_PORT, | ||
727 | NULL, | ||
728 | NULL, | ||
729 | INTERNET_SERVICE_HTTP, | ||
730 | NULL, | ||
731 | NULL); | ||
732 | |||
733 | if (!hsession) | ||
734 | { | ||
735 | llinfos << "Couldn't talk to crash report server" << llendl; | ||
736 | } | ||
737 | |||
738 | hrequest = HttpOpenRequest(hsession, L"POST", L"/cgi-bin/viewer_crash_reporter2", NULL, L"", NULL, 0, 0); | ||
739 | if (!hrequest) | ||
740 | { | ||
741 | llinfos << "Couldn't open crash report URL!" << llendl; | ||
742 | } | 101 | } |
743 | 102 | ||
744 | llinfos << "Transmitting data" << llendl; | 103 | app.setHandle(hInstance); |
745 | llinfos << "Bytes: " << (post_data.size()) << llendl; | 104 | ok = app.init(); |
746 | 105 | if(!ok) | |
747 | update_messages(); | ||
748 | show_progress("Transmitting data..."); | ||
749 | update_messages(); | ||
750 | |||
751 | BOOL ok = HttpSendRequest(hrequest, NULL, 0, (void *)(post_data.c_str()), post_data.size()); | ||
752 | if (!ok) | ||
753 | { | ||
754 | llinfos << "Error posting data!" << llendl; | ||
755 | sleep_and_pump_messages( 5 ); | ||
756 | } | ||
757 | |||
758 | llinfos << "Response from crash report server:" << llendl; | ||
759 | do | ||
760 | { | ||
761 | if (InternetReadFile(hrequest, data, BUFSIZE, &bytes_read)) | ||
762 | { | ||
763 | if (bytes_read == 0) | ||
764 | { | ||
765 | // If InternetFileRead returns TRUE AND bytes_read == 0 | ||
766 | // we've successfully downloaded the entire file | ||
767 | break; | ||
768 | } | ||
769 | else | ||
770 | { | ||
771 | data[bytes_read] = 0; | ||
772 | llinfos << data << llendl; | ||
773 | } | ||
774 | } | ||
775 | else | ||
776 | { | ||
777 | llinfos << "Couldn't read file!" << llendl; | ||
778 | sleep_and_pump_messages( 5 ); | ||
779 | // return FALSE; | ||
780 | } | ||
781 | } while(TRUE); | ||
782 | |||
783 | InternetCloseHandle(hrequest); | ||
784 | InternetCloseHandle(hsession); | ||
785 | InternetCloseHandle(hinet); | ||
786 | update_messages(); | ||
787 | show_progress("Done."); | ||
788 | sleep_and_pump_messages( 3 ); | ||
789 | // return TRUE; | ||
790 | } | ||
791 | |||
792 | LLFileEncoder::LLFileEncoder(const char *form_name, const char *filename) | ||
793 | { | ||
794 | mFormname = form_name; | ||
795 | mFilename = filename; | ||
796 | mIsValid = FALSE; | ||
797 | mBuf = NULL; | ||
798 | |||
799 | int res; | ||
800 | |||
801 | llstat stat_data; | ||
802 | res = LLFile::stat(mFilename.c_str(), &stat_data); | ||
803 | if (res) | ||
804 | { | ||
805 | llwarns << "File " << mFilename << " is missing!" << llendl; | ||
806 | return; | ||
807 | } | ||
808 | |||
809 | FILE *fp = NULL; | ||
810 | S32 buf_size = 0; | ||
811 | S32 count = 0; | ||
812 | while (count < 5) | ||
813 | { | ||
814 | buf_size = stat_data.st_size; | ||
815 | fp = LLFile::fopen(mFilename.c_str(), "rb"); /* Flawfinder: ignore */ | ||
816 | if (!fp) | ||
817 | { | ||
818 | llwarns << "Can't open file " << mFilename << ", wait for a second" << llendl; | ||
819 | // Couldn't open the file, wait a bit and try again | ||
820 | count++; | ||
821 | ms_sleep(1000); | ||
822 | } | ||
823 | else | ||
824 | { | ||
825 | break; | ||
826 | } | ||
827 | } | ||
828 | if (!fp) | ||
829 | { | ||
830 | return; | ||
831 | } | ||
832 | U8 *buf = new U8[buf_size + 1]; | ||
833 | fread(buf, 1, buf_size, fp); | ||
834 | fclose(fp); | ||
835 | |||
836 | mBuf = buf; | ||
837 | mBufLength = buf_size; | ||
838 | |||
839 | mIsValid = TRUE; | ||
840 | } | ||
841 | |||
842 | LLFileEncoder::~LLFileEncoder() | ||
843 | { | ||
844 | if (mBuf) | ||
845 | { | ||
846 | delete mBuf; | ||
847 | mBuf = NULL; | ||
848 | } | ||
849 | } | ||
850 | |||
851 | LLString LLFileEncoder::encodeURL(const S32 max_length) | ||
852 | { | ||
853 | LLString result = mFormname; | ||
854 | result.append(1, '='); | ||
855 | |||
856 | S32 i = 0; | ||
857 | |||
858 | if (max_length) | ||
859 | { | ||
860 | if (mBufLength > max_length) | ||
861 | { | ||
862 | i = mBufLength - max_length; | ||
863 | } | ||
864 | } | ||
865 | |||
866 | S32 url_buf_size = 3*mBufLength + 1; | ||
867 | char *url_buf = new char[url_buf_size]; | ||
868 | |||
869 | S32 cur_pos = 0; | ||
870 | for (; i < mBufLength; i++) | ||
871 | { | 106 | { |
872 | S32 byte_val = mBuf[i]; | 107 | llwarns << "Unable to initialize application." << llendl; |
873 | sprintf(url_buf + cur_pos, "%%%02x", byte_val); | 108 | return -1; |
874 | cur_pos += 3; | ||
875 | } | 109 | } |
876 | url_buf[i*3] = 0; | ||
877 | 110 | ||
878 | result.append(url_buf); | 111 | // Run the application main loop |
879 | delete[] url_buf; | 112 | if(!LLApp::isQuitting()) app.mainLoop(); |
880 | return result; | ||
881 | } | ||
882 | |||
883 | LLString encode_string(const char *formname, const LLString &str) | ||
884 | { | ||
885 | LLString result = formname; | ||
886 | result.append(1, '='); | ||
887 | // Not using LLString because of bad performance issues | ||
888 | S32 buf_size = str.size(); | ||
889 | S32 url_buf_size = 3*str.size() + 1; | ||
890 | char *url_buf = new char[url_buf_size]; | ||
891 | 113 | ||
892 | S32 cur_pos = 0; | 114 | if (!app.isError()) |
893 | S32 i; | ||
894 | for (i = 0; i < buf_size; i++) | ||
895 | { | 115 | { |
896 | sprintf(url_buf + cur_pos, "%%%02x", str[i]); | 116 | // |
897 | cur_pos += 3; | 117 | // We don't want to do cleanup here if the error handler got called - |
118 | // the assumption is that the error handler is responsible for doing | ||
119 | // app cleanup if there was a problem. | ||
120 | // | ||
121 | app.cleanup(); | ||
898 | } | 122 | } |
899 | url_buf[i*3] = 0; | 123 | return 0; |
900 | |||
901 | result.append(url_buf); | ||
902 | delete[] url_buf; | ||
903 | return result; | ||
904 | } | ||
905 | |||
906 | void write_debug(const char *str) | ||
907 | { | ||
908 | if (!gDebugFile) | ||
909 | { | ||
910 | std::string debug_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log"); | ||
911 | llinfos << "Opening debug file " << debug_filename << llendl; | ||
912 | gDebugFile = LLFile::fopen(debug_filename.c_str(), "a+"); /* Flawfinder: ignore */ | ||
913 | if (!gDebugFile) | ||
914 | { | ||
915 | fprintf(stderr, "Couldn't open %s: debug log to stderr instead.\n", debug_filename.c_str()); | ||
916 | gDebugFile = stderr; | ||
917 | } | ||
918 | } | ||
919 | fprintf(gDebugFile, str); /* Flawfinder: ignore */ | ||
920 | fflush(gDebugFile); | ||
921 | } | ||
922 | |||
923 | void write_debug(std::string& str) | ||
924 | { | ||
925 | write_debug(str.c_str()); | ||
926 | } | ||
927 | |||
928 | S32 load_crash_behavior_setting() | ||
929 | { | ||
930 | std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); | ||
931 | |||
932 | gCrashSettings.loadFromFile(filename); | ||
933 | |||
934 | S32 value = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); | ||
935 | |||
936 | if (value < CRASH_BEHAVIOR_ASK || CRASH_BEHAVIOR_NEVER_SEND < value) return CRASH_BEHAVIOR_ASK; | ||
937 | |||
938 | return value; | ||
939 | } | ||
940 | |||
941 | bool save_crash_behavior_setting(S32 crash_behavior) | ||
942 | { | ||
943 | if (crash_behavior < CRASH_BEHAVIOR_ASK) return false; | ||
944 | if (crash_behavior > CRASH_BEHAVIOR_NEVER_SEND) return false; | ||
945 | |||
946 | gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, crash_behavior); | ||
947 | std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); | ||
948 | |||
949 | gCrashSettings.saveToFile(filename, FALSE); | ||
950 | |||
951 | return true; | ||
952 | } | 124 | } |
diff --git a/linden/indra/win_crash_logger/win_crash_logger.rc b/linden/indra/win_crash_logger/win_crash_logger.rc index 2c46859..2819722 100644 --- a/linden/indra/win_crash_logger/win_crash_logger.rc +++ b/linden/indra/win_crash_logger/win_crash_logger.rc | |||
@@ -56,13 +56,13 @@ END | |||
56 | // Dialog | 56 | // Dialog |
57 | // | 57 | // |
58 | 58 | ||
59 | IDD_PROGRESS DIALOG 100, 100, 186, 33 | 59 | IDD_PROGRESS DIALOGEX 100, 100, 234, 33 |
60 | STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU | 60 | STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU |
61 | CAPTION "%s Crash Logger" | 61 | CAPTION "%s Crash Logger" |
62 | CLASS "WIN_CRASH_LOGGER" | 62 | CLASS "WIN_CRASH_LOGGER" |
63 | FONT 8, "MS Sans Serif" | 63 | FONT 8, "MS Sans Serif", 0, 0, 0x0 |
64 | BEGIN | 64 | BEGIN |
65 | LTEXT "Static",IDC_LOG,7,7,172,8 | 65 | LTEXT "Static",IDC_LOG,7,7,220,8 |
66 | END | 66 | END |
67 | 67 | ||
68 | IDD_REPORT DIALOGEX 100, 100, 297, 125 | 68 | IDD_REPORT DIALOGEX 100, 100, 297, 125 |
@@ -73,48 +73,33 @@ FONT 8, "MS Sans Serif", 0, 0, 0x0 | |||
73 | BEGIN | 73 | BEGIN |
74 | DEFPUSHBUTTON "Send",IDOK,198,104,45,15,WS_GROUP | 74 | DEFPUSHBUTTON "Send",IDOK,198,104,45,15,WS_GROUP |
75 | PUSHBUTTON "Don't Send",IDCANCEL,247,104,45,15,WS_GROUP | 75 | PUSHBUTTON "Don't Send",IDCANCEL,247,104,45,15,WS_GROUP |
76 | LTEXT "%s appears to have crashed.",IDC_STATIC_HEADER,4,4,288, | 76 | LTEXT "%s appears to have crashed.",IDC_STATIC_HEADER,4,4,288,14 |
77 | 14 | 77 | LTEXT "This crash reporter collects information about your computer's hardware, operating system, and some %s logs, which are used for debugging purposes only.",IDC_STATIC_WHATINFO,4,23,288,19,NOT WS_GROUP |
78 | LTEXT "This crash reporter collects information about your computer's hardware, operating system, and some %s logs, which are used for debugging purposes only.", | 78 | CONTROL "Remember this choice",IDC_CHECK_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,106,89,13 |
79 | IDC_STATIC_WHATINFO,4,23,288,19,NOT WS_GROUP | 79 | LTEXT "Sending crash reports is the best way to help us improve the quality of %s.",IDC_STATIC_MOTIVATION,4,43,288,8 |
80 | CONTROL "Remember this choice",IDC_CHECK_AUTO,"Button", | 80 | LTEXT "If you continue to experience this problem, please try:",IDC_STATIC,4,57,251,8 |
81 | BS_AUTOCHECKBOX | WS_TABSTOP,4,106,89,13 | 81 | LTEXT "- Contacting support by visiting http://www.secondlife.com/support",IDC_STATIC,4,67,231,8 |
82 | LTEXT "Sending crash reports is the best way to help us improve the quality of %s.", | ||
83 | IDC_STATIC_MOTIVATION,4,38,288,8 | ||
84 | LTEXT "If you continue to experience this problem, please try:", | ||
85 | IDC_STATIC,4,57,251,8 | ||
86 | LTEXT "- Contacting support by visiting http://www.secondlife.com/support", | ||
87 | IDC_STATIC,4,67,231,8 | ||
88 | END | 82 | END |
89 | 83 | ||
90 | IDD_PREVREPORTBOX DIALOG 100, 100, 232, 213 | 84 | IDD_PREVREPORTBOX DIALOGEX 100, 100, 232, 213 |
91 | STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU | 85 | STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU |
92 | CAPTION "%s Crash Logger" | 86 | CAPTION "%s Crash Logger" |
93 | CLASS "WIN_CRASH_LOGGER" | 87 | CLASS "WIN_CRASH_LOGGER" |
94 | FONT 8, "MS Sans Serif" | 88 | FONT 8, "MS Sans Serif", 0, 0, 0x0 |
95 | BEGIN | 89 | BEGIN |
96 | DEFPUSHBUTTON "OK",IDOK,131,193,45,15,WS_GROUP | 90 | DEFPUSHBUTTON "Send Report",IDOK,131,193,45,15,WS_GROUP |
97 | EDITTEXT IDC_EDIT1,4,102,223,89,ES_MULTILINE | ES_WANTRETURN | | 91 | EDITTEXT IDC_EDIT1,3,100,223,89,ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL |
98 | WS_VSCROLL | 92 | PUSHBUTTON "Don't Send",IDCANCEL,181,193,45,15,WS_GROUP |
99 | PUSHBUTTON "Cancel",IDCANCEL,181,193,45,15,WS_GROUP | 93 | LTEXT "%s appears to have crashed or frozen the last time it ran.",IDC_STATIC_HEADER,4,4,214,8 |
100 | LTEXT "%s appears to have crashed or frozen the last time it ran.", | 94 | LTEXT "This crash reporter collects information about your computer's",IDC_STATIC,4,17,201,8 |
101 | IDC_STATIC,4,4,214,8 | 95 | LTEXT "hardware configuration, operating system, and some %s",IDC_STATIC_MSG,4,25,212,8 |
102 | LTEXT "This crash reporter collects information about your computer's", | 96 | LTEXT "logs, all of which are used for debugging purposes only.",IDC_STATIC,4,33,210,8 |
103 | IDC_STATIC,4,17,201,8 | 97 | LTEXT "In the space below, please briefly describe what you were doing",IDC_STATIC,3,48,208,8 |
104 | LTEXT "hardware configuration, operating system, and some %s", | 98 | LTEXT "or trying to do just prior to the crash.",IDC_STATIC,3,56,204,8 |
105 | IDC_STATIC,4,25,212,8 | 99 | LTEXT "If you don't wish to send Linden Lab a crash report, press Don't Send.",IDC_STATIC,3,90,223,8 |
106 | LTEXT "logs, all of which are used for debugging purposes only.", | 100 | LTEXT "This report is NOT read by customer support. If you have billing or",IDC_STATIC,3,68,208,8 |
107 | IDC_STATIC,4,33,210,8 | 101 | LTEXT "other questions, please go to: www.secondlife.com/support",IDC_STATIC,3,76,206,8 |
108 | LTEXT "In the space below, please briefly describe what you were doing", | 102 | CONTROL "Remember this choice",IDC_CHECK_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,193,89,13 |
109 | IDC_STATIC,3,48,208,8 | ||
110 | LTEXT "or trying to do just prior to the crash.",IDC_STATIC,3, | ||
111 | 56,204,8 | ||
112 | LTEXT "If you don't wish to send Linden Lab a crash report, press Cancel.", | ||
113 | IDC_STATIC,3,90,214,8 | ||
114 | LTEXT "This report is NOT read by customer support. If you have billing or", | ||
115 | IDC_STATIC,3,68,208,8 | ||
116 | LTEXT "other questions, please go to: www.secondlife.com/support", | ||
117 | IDC_STATIC,3,76,206,8 | ||
118 | END | 103 | END |
119 | 104 | ||
120 | 105 | ||
@@ -158,7 +143,7 @@ BEGIN | |||
158 | IDD_PROGRESS, DIALOG | 143 | IDD_PROGRESS, DIALOG |
159 | BEGIN | 144 | BEGIN |
160 | LEFTMARGIN, 7 | 145 | LEFTMARGIN, 7 |
161 | RIGHTMARGIN, 179 | 146 | RIGHTMARGIN, 227 |
162 | TOPMARGIN, 7 | 147 | TOPMARGIN, 7 |
163 | BOTTOMMARGIN, 26 | 148 | BOTTOMMARGIN, 26 |
164 | END | 149 | END |
diff --git a/linden/indra/win_crash_logger/win_crash_logger.vcproj b/linden/indra/win_crash_logger/win_crash_logger.vcproj index f250427..f077b05 100644 --- a/linden/indra/win_crash_logger/win_crash_logger.vcproj +++ b/linden/indra/win_crash_logger/win_crash_logger.vcproj | |||
@@ -72,7 +72,7 @@ | |||
72 | CharacterSet="1"> | 72 | CharacterSet="1"> |
73 | <Tool | 73 | <Tool |
74 | Name="VCCLCompilerTool" | 74 | Name="VCCLCompilerTool" |
75 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime"" | 75 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime";..\llcrashlogger" |
76 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;LL_RELEASE" | 76 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;LL_RELEASE" |
77 | RuntimeLibrary="0" | 77 | RuntimeLibrary="0" |
78 | StructMemberAlignment="0" | 78 | StructMemberAlignment="0" |
@@ -85,7 +85,7 @@ | |||
85 | Name="VCCustomBuildTool"/> | 85 | Name="VCCustomBuildTool"/> |
86 | <Tool | 86 | <Tool |
87 | Name="VCLinkerTool" | 87 | Name="VCLinkerTool" |
88 | AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib" | 88 | AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib netapi32.lib ole32.lib oleaut32.lib shell32.lib user32.lib wininet.lib winspool.lib libcurl.lib ssleay32.lib libeay32.lib zlib.lib winmm.lib psapi.lib" |
89 | OutputFile="win_crash_logger.exe" | 89 | OutputFile="win_crash_logger.exe" |
90 | LinkIncremental="1" | 90 | LinkIncremental="1" |
91 | AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release" | 91 | AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release" |
@@ -123,7 +123,7 @@ | |||
123 | CharacterSet="1"> | 123 | CharacterSet="1"> |
124 | <Tool | 124 | <Tool |
125 | Name="VCCLCompilerTool" | 125 | Name="VCCLCompilerTool" |
126 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime"" | 126 | AdditionalIncludeDirectories="..\llcrashlogger;..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime"" |
127 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;LL_RELEASE" | 127 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;LL_RELEASE" |
128 | RuntimeLibrary="0" | 128 | RuntimeLibrary="0" |
129 | StructMemberAlignment="0" | 129 | StructMemberAlignment="0" |
@@ -136,10 +136,10 @@ | |||
136 | Name="VCCustomBuildTool"/> | 136 | Name="VCCustomBuildTool"/> |
137 | <Tool | 137 | <Tool |
138 | Name="VCLinkerTool" | 138 | Name="VCLinkerTool" |
139 | AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib" | 139 | AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib netapi32.lib ole32.lib oleaut32.lib shell32.lib user32.lib wininet.lib winspool.lib libcurl.lib ssleay32.lib libeay32.lib zlib.lib winmm.lib psapi.lib" |
140 | OutputFile="win_crash_logger.exe" | 140 | OutputFile="win_crash_logger.exe" |
141 | LinkIncremental="1" | 141 | LinkIncremental="1" |
142 | AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release" | 142 | AdditionalLibraryDirectories=""../lib_releasenoopt/i686-win32";"../../libraries/i686-win32/lib_release"" |
143 | GenerateDebugInformation="TRUE" | 143 | GenerateDebugInformation="TRUE" |
144 | SubSystem="2" | 144 | SubSystem="2" |
145 | OptimizeReferences="2" | 145 | OptimizeReferences="2" |
@@ -175,6 +175,12 @@ | |||
175 | Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" | 175 | Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" |
176 | UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> | 176 | UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> |
177 | <File | 177 | <File |
178 | RelativePath="..\llcrashlogger\llcrashlogger.cpp"> | ||
179 | </File> | ||
180 | <File | ||
181 | RelativePath=".\llcrashloggerwindows.cpp"> | ||
182 | </File> | ||
183 | <File | ||
178 | RelativePath=".\StdAfx.cpp"> | 184 | RelativePath=".\StdAfx.cpp"> |
179 | </File> | 185 | </File> |
180 | <File | 186 | <File |
@@ -186,6 +192,12 @@ | |||
186 | Filter="h;hpp;hxx;hm;inl;inc;xsd" | 192 | Filter="h;hpp;hxx;hm;inl;inc;xsd" |
187 | UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> | 193 | UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> |
188 | <File | 194 | <File |
195 | RelativePath="..\llcrashlogger\llcrashlogger.h"> | ||
196 | </File> | ||
197 | <File | ||
198 | RelativePath=".\llcrashloggerwindows.h"> | ||
199 | </File> | ||
200 | <File | ||
189 | RelativePath=".\resource.h"> | 201 | RelativePath=".\resource.h"> |
190 | </File> | 202 | </File> |
191 | <File | 203 | <File |
diff --git a/linden/indra/win_crash_logger/win_crash_logger_vc8.vcproj b/linden/indra/win_crash_logger/win_crash_logger_vc8.vcproj index da8ce22..66ec157 100644 --- a/linden/indra/win_crash_logger/win_crash_logger_vc8.vcproj +++ b/linden/indra/win_crash_logger/win_crash_logger_vc8.vcproj | |||
@@ -41,7 +41,7 @@ | |||
41 | <Tool | 41 | <Tool |
42 | Name="VCCLCompilerTool" | 42 | Name="VCCLCompilerTool" |
43 | Optimization="0" | 43 | Optimization="0" |
44 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime"" | 44 | AdditionalIncludeDirectories="..\llcrashlogger;..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime"" |
45 | PreprocessorDefinitions="WIN32;_DEBUG;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_DEBUG" | 45 | PreprocessorDefinitions="WIN32;_DEBUG;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_DEBUG" |
46 | MinimalRebuild="true" | 46 | MinimalRebuild="true" |
47 | BasicRuntimeChecks="3" | 47 | BasicRuntimeChecks="3" |
@@ -65,7 +65,7 @@ | |||
65 | /> | 65 | /> |
66 | <Tool | 66 | <Tool |
67 | Name="VCLinkerTool" | 67 | Name="VCLinkerTool" |
68 | AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib" | 68 | AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib winmm.lib ssleay32.lib zlib.lib libcurl.lib libeay32.lib oldnames.lib" |
69 | OutputFile="win_crash_logger.exe" | 69 | OutputFile="win_crash_logger.exe" |
70 | LinkIncremental="1" | 70 | LinkIncremental="1" |
71 | AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_debug" | 71 | AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_debug" |
@@ -124,7 +124,7 @@ | |||
124 | /> | 124 | /> |
125 | <Tool | 125 | <Tool |
126 | Name="VCCLCompilerTool" | 126 | Name="VCCLCompilerTool" |
127 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime"" | 127 | AdditionalIncludeDirectories="..\llcrashlogger;..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime"" |
128 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE" | 128 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE" |
129 | RuntimeLibrary="0" | 129 | RuntimeLibrary="0" |
130 | StructMemberAlignment="0" | 130 | StructMemberAlignment="0" |
@@ -146,7 +146,7 @@ | |||
146 | /> | 146 | /> |
147 | <Tool | 147 | <Tool |
148 | Name="VCLinkerTool" | 148 | Name="VCLinkerTool" |
149 | AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib" | 149 | AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib winmm.lib ssleay32.lib zlib.lib libcurl.lib libeay32.lib oldnames.lib" |
150 | OutputFile="win_crash_logger.exe" | 150 | OutputFile="win_crash_logger.exe" |
151 | LinkIncremental="1" | 151 | LinkIncremental="1" |
152 | AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release" | 152 | AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release" |
@@ -206,7 +206,8 @@ | |||
206 | /> | 206 | /> |
207 | <Tool | 207 | <Tool |
208 | Name="VCCLCompilerTool" | 208 | Name="VCCLCompilerTool" |
209 | AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime"" | 209 | Optimization="0" |
210 | AdditionalIncludeDirectories="..\llcrashlogger;..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;"..\..\libraries\i686-win32\include";..\..\libraries\include\;"..\..\libraries\i686-win32\include\quicktime"" | ||
210 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE" | 211 | PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE" |
211 | RuntimeLibrary="0" | 212 | RuntimeLibrary="0" |
212 | StructMemberAlignment="0" | 213 | StructMemberAlignment="0" |
@@ -228,7 +229,7 @@ | |||
228 | /> | 229 | /> |
229 | <Tool | 230 | <Tool |
230 | Name="VCLinkerTool" | 231 | Name="VCLinkerTool" |
231 | AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib" | 232 | AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib winmm.lib ssleay32.lib zlib.lib libcurl.lib libeay32.lib oldnames.lib" |
232 | OutputFile="win_crash_logger.exe" | 233 | OutputFile="win_crash_logger.exe" |
233 | LinkIncremental="1" | 234 | LinkIncremental="1" |
234 | AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release" | 235 | AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release" |
@@ -273,6 +274,14 @@ | |||
273 | UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" | 274 | UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" |
274 | > | 275 | > |
275 | <File | 276 | <File |
277 | RelativePath="..\llcrashlogger\llcrashlogger.cpp" | ||
278 | > | ||
279 | </File> | ||
280 | <File | ||
281 | RelativePath=".\llcrashloggerwindows.cpp" | ||
282 | > | ||
283 | </File> | ||
284 | <File | ||
276 | RelativePath=".\StdAfx.cpp" | 285 | RelativePath=".\StdAfx.cpp" |
277 | > | 286 | > |
278 | </File> | 287 | </File> |
@@ -287,6 +296,14 @@ | |||
287 | UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" | 296 | UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" |
288 | > | 297 | > |
289 | <File | 298 | <File |
299 | RelativePath="..\llcrashlogger\llcrashlogger.h" | ||
300 | > | ||
301 | </File> | ||
302 | <File | ||
303 | RelativePath=".\llcrashloggerwindows.h" | ||
304 | > | ||
305 | </File> | ||
306 | <File | ||
290 | RelativePath=".\resource.h" | 307 | RelativePath=".\resource.h" |
291 | > | 308 | > |
292 | </File> | 309 | </File> |
diff --git a/linden/scripts/messages/message_template.msg b/linden/scripts/messages/message_template.msg index 7aabb78..938a30a 100644 --- a/linden/scripts/messages/message_template.msg +++ b/linden/scripts/messages/message_template.msg | |||
@@ -3038,7 +3038,7 @@ version 2.0 | |||
3038 | // and where someone you are tracking is located. They are -1 if not | 3038 | // and where someone you are tracking is located. They are -1 if not |
3039 | // applicable. | 3039 | // applicable. |
3040 | { | 3040 | { |
3041 | CoarseLocationUpdate Medium 6 Trusted Unencoded UDPDeprecated | 3041 | CoarseLocationUpdate Medium 6 Trusted Unencoded |
3042 | { | 3042 | { |
3043 | Location Variable | 3043 | Location Variable |
3044 | { X U8 } | 3044 | { X U8 } |
@@ -3050,6 +3050,10 @@ version 2.0 | |||
3050 | { You S16 } | 3050 | { You S16 } |
3051 | { Prey S16 } | 3051 | { Prey S16 } |
3052 | } | 3052 | } |
3053 | { | ||
3054 | AgentData Variable | ||
3055 | { AgentID LLUUID } | ||
3056 | } | ||
3053 | } | 3057 | } |
3054 | 3058 | ||
3055 | // ImageData - sent to viewer to transmit information about an image | 3059 | // ImageData - sent to viewer to transmit information about an image |
@@ -4349,6 +4353,10 @@ version 2.0 | |||
4349 | { RegionDenyIdentified BOOL } | 4353 | { RegionDenyIdentified BOOL } |
4350 | { RegionDenyTransacted BOOL } | 4354 | { RegionDenyTransacted BOOL } |
4351 | } | 4355 | } |
4356 | { | ||
4357 | AgeVerificationBlock Single | ||
4358 | { RegionDenyAgeUnverified BOOL } | ||
4359 | } | ||
4352 | } | 4360 | } |
4353 | 4361 | ||
4354 | // ParcelPropertiesUpdate | 4362 | // ParcelPropertiesUpdate |
@@ -5271,7 +5279,7 @@ version 2.0 | |||
5271 | 5279 | ||
5272 | // ScriptRunningReply - response from simulator to message above | 5280 | // ScriptRunningReply - response from simulator to message above |
5273 | { | 5281 | { |
5274 | ScriptRunningReply Low 244 NotTrusted Unencoded | 5282 | ScriptRunningReply Low 244 NotTrusted Unencoded UDPDeprecated |
5275 | { | 5283 | { |
5276 | Script Single | 5284 | Script Single |
5277 | { ObjectID LLUUID } | 5285 | { ObjectID LLUUID } |