From b406972af1ce404b19639cdbe955f07d2f8fb61f Mon Sep 17 00:00:00 2001 From: James Cook <james@lindenlab.com> Date: Tue, 28 Oct 2008 23:56:20 +0000 Subject: [PATCH] svn merge -r100302:100467 installer-james-combo-merge for QAR-972, incorporating: QAR-892 Windows installer that pings secondlife.com on launch QAR-837 Six New Languages in the Installer QAR-908 downloader-support-1 merge --- indra/newview/app_settings/settings.xml | 13 +- .../windows/FILES_ARE_UNICODE_UTF-16LE.txt | 6 + .../installers/windows/installer_template.nsi | 473 +++++------------- indra/newview/installers/windows/lang_de.nsi | Bin 3762 -> 8262 bytes .../newview/installers/windows/lang_en-us.nsi | Bin 3211 -> 7162 bytes indra/newview/installers/windows/lang_es.nsi | Bin 0 -> 7612 bytes indra/newview/installers/windows/lang_fr.nsi | Bin 0 -> 7858 bytes indra/newview/installers/windows/lang_it.nsi | Bin 0 -> 7196 bytes indra/newview/installers/windows/lang_ja.nsi | Bin 3579 -> 6302 bytes indra/newview/installers/windows/lang_ko.nsi | Bin 3448 -> 6200 bytes indra/newview/installers/windows/lang_nl.nsi | Bin 0 -> 7160 bytes .../newview/installers/windows/lang_pt-br.nsi | Bin 0 -> 7590 bytes indra/newview/installers/windows/lang_zh.nsi | Bin 0 -> 5354 bytes .../installers/windows/language_menu.nsi | Bin 0 -> 1292 bytes indra/newview/llappviewer.cpp | 20 - indra/newview/llappviewer.h | 2 - indra/newview/llfloaterbuycurrency.cpp | 14 - indra/newview/llmutelist.cpp | 25 +- indra/newview/llpanellogin.cpp | 12 +- indra/newview/llpreviewscript.cpp | 15 +- indra/newview/llpreviewscript.h | 4 +- indra/newview/llstartup.cpp | 56 +-- indra/newview/llviewermenu.cpp | 59 --- indra/newview/llviewermenu.h | 1 - indra/newview/viewer_manifest.py | 52 +- indra/win_updater/updater.cpp | 103 +--- 26 files changed, 240 insertions(+), 615 deletions(-) create mode 100644 indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt create mode 100644 indra/newview/installers/windows/lang_es.nsi create mode 100644 indra/newview/installers/windows/lang_fr.nsi create mode 100644 indra/newview/installers/windows/lang_it.nsi create mode 100644 indra/newview/installers/windows/lang_nl.nsi create mode 100644 indra/newview/installers/windows/lang_pt-br.nsi create mode 100644 indra/newview/installers/windows/lang_zh.nsi create mode 100644 indra/newview/installers/windows/language_menu.nsi diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 07fa71ce389..72e16ea70ca 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3595,6 +3595,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>ForceMandatoryUpdate</key> + <map> + <key>Comment</key> + <string>For QA: On next startup, forces the auto-updater to run</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>ForwardBtnRect</key> <map> <key>Comment</key> @@ -4178,7 +4189,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>https://wiki.secondlife.com/wiki/[LSL_STRING]</string> + <string>http://wiki.secondlife.com/wiki/[LSL_STRING]</string> </map> <key>LagMeterShrunk</key> <map> diff --git a/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt b/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt new file mode 100644 index 00000000000..185c0180fbb --- /dev/null +++ b/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt @@ -0,0 +1,6 @@ +The language files in this directory are Unicode (Little-Endian) format, also known as UTF-16 LE. + +This is the format required for NSIS Unicode. See http://www.scratchpaper.com/ for details. + +James Cook +September 2008 diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index c79550774c4..01bd98f87c9 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -1,30 +1,22 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; secondlife setup.nsi -;; Copyright 2004-2007, Linden Research, Inc. -;; For info, see http://www.nullsoft.com/free/nsis/ +;; Copyright 2004-2008, Linden Research, Inc. +;; +;; NSIS Unicode 2.38.1 or higher required +;; http://www.scratchpaper.com/ ;; -;; NSIS 2.22 or higher required ;; Author: James Cook, Don Kjer, Callum Prentice ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Detect NSIS compiler version -!define "NSIS${NSIS_VERSION}" -!ifdef "NSISv2.02" | "NSISv2.03" | "NSISv2.04" | "NSISv2.05" | "NSISv2.06" - ;; before 2.07 defaulted lzma to solid (whole file) - SetCompressor lzma -!else - ;; after 2.07 required /solid for whole file compression - SetCompressor /solid lzma -!endif - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Compiler flags ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SetOverwrite on ; overwrite files SetCompress auto ; compress iff saves space +SetCompressor /solid lzma ; compress whole installer as one block SetDatablockOptimize off ; only saves us 0.1%, not worth it XPStyle on ; add an XP manifest to the installer +RequestExecutionLevel admin ; on Vista we must be admin because we write to Program Files ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Project flags @@ -41,9 +33,22 @@ XPStyle on ; add an XP manifest to the installer !include "%%SOURCE%%\installers\windows\lang_en-us.nsi" !include "%%SOURCE%%\installers\windows\lang_ja.nsi" !include "%%SOURCE%%\installers\windows\lang_ko.nsi" +!include "%%SOURCE%%\installers\windows\lang_pt-br.nsi" +!include "%%SOURCE%%\installers\windows\lang_fr.nsi" +!include "%%SOURCE%%\installers\windows\lang_es.nsi" +!include "%%SOURCE%%\installers\windows\lang_it.nsi" +!include "%%SOURCE%%\installers\windows\lang_nl.nsi" +!include "%%SOURCE%%\installers\windows\lang_zh.nsi" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Tweak for different servers/builds (this placeholder is replaced by viewer_manifest.py) +;; For example: +;; !define INSTFLAGS "%(flags)s" +;; !define INSTNAME "SecondLife%(grid_caps)s" +;; !define SHORTCUT "Second Life (%(grid_caps)s)" +;; !define URLNAME "secondlife%(grid)s" +;; !define UNINSTALL_SETTINGS 1 + %%GRID_VARS%% Name ${INSTNAME} @@ -63,11 +68,7 @@ AutoCloseWindow true ; after all files install, close window InstallDir "$PROGRAMFILES\${INSTNAME}" InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "" -!ifdef UPDATE -DirText $(DirectoryChooseTitle) $(DirectoryChooseUpdate) -!else DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup) -!endif ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -76,145 +77,41 @@ DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup) Var INSTPROG Var INSTEXE Var INSTFLAGS -Var LANGFLAGS Var INSTSHORTCUT +Var COMMANDLINE ; command line passed to this installer, set in .onInit -;;; Function definitions should go before file includes, because the NSIS package -;;; is a single stream of bytecodes + file data. So if your function definitions are at -;;; the end of the file it has to decompress the whole thing before it can call a function. JC - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; PostInstallExe -; This just runs any post installation scripts. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function PostInstallExe -push $0 - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "PostInstallExe" - ;MessageBox MB_OK '$0' - ExecWait '$0' -pop $0 -FunctionEnd +;;; Function definitions should go before file includes, because calls to +;;; DLLs like LangDLL trigger an implicit file include, so if that call is at +;;; the end of this script NSIS has to decompress the whole installer before +;;; it can call the DLL function. JC -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; CheckStartupParameters -; Sets INSTFLAGS, INSTPROG, and INSTEXE. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function CheckStartupParams -push $0 -push $R0 - - ; Look for a registry entry with info about where to update. - Call GetProgramName - pop $R0 - StrCpy $INSTPROG "$R0" - StrCpy $INSTEXE "$R0.exe" - - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" - ; If key doesn't exist, skip install - IfErrors ABORT - StrCpy $INSTDIR "$0" - - ; We now have a directory to install to. Get the startup parameters and shortcut as well. - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags" - IfErrors +2 - StrCpy $INSTFLAGS "$0" - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" - IfErrors +2 - StrCpy $INSTSHORTCUT "$0" - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" - IfErrors +2 - StrCpy $INSTEXE "$0" - Goto FINISHED - -ABORT: - MessageBox MB_OK $(CheckStartupParamsMB) - Quit - -FINISHED: - ;MessageBox MB_OK "INSTPROG: $INSTPROG, INSTEXE: $INSTEXE, INSTFLAGS: $INSTFLAGS" -pop $R0 -pop $0 -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function un.CheckStartupParams -push $0 -push $R0 - - ; Look for a registry entry with info about where to update. - Call un.GetProgramName - pop $R0 - StrCpy $INSTPROG "$R0" - StrCpy $INSTEXE "$R0.exe" - - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" - ; If key doesn't exist, skip install - IfErrors ABORT - StrCpy $INSTDIR "$0" - - ; We now have a directory to install to. Get the startup parameters and shortcut as well. - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags" - IfErrors +2 - StrCpy $INSTFLAGS "$0" - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" - IfErrors +2 - StrCpy $INSTSHORTCUT "$0" - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" - IfErrors +2 - StrCpy $INSTEXE "$0" - Goto FINISHED - -ABORT: - MessageBox MB_OK $(CheckStartupParamsMB) - Quit - -FINISHED: - ;MessageBox MB_OK "INSTPROG: $INSTPROG, INSTEXE: $INSTEXE, INSTFLAGS: $INSTFLAGS" -pop $R0 -pop $0 -FunctionEnd +!include "FileFunc.nsh" ; For GetParameters, GetOptions +!insertmacro GetParameters +!insertmacro GetOptions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; After install completes, offer readme file +;;; After install completes, launch app ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function .onInstSuccess - MessageBox MB_YESNO \ - $(InstSuccesssQuestion) /SD IDYES IDNO NoReadme - ; Assumes SetOutPath $INSTDIR - Exec '"$INSTDIR\$INSTEXE" $INSTFLAGS' - NoReadme: + Push $R0 # Option value, unused + ${GetOptions} $COMMANDLINE "/AUTOSTART" $R0 + # If parameter was there (no error) just launch + # Otherwise ask + IfErrors label_ask_launch label_launch + +label_ask_launch: + # Don't launch by default when silent + IfSilent label_no_launch + MessageBox MB_YESNO $(InstSuccesssQuestion) \ + IDYES label_launch IDNO label_no_launch + +label_launch: + # Assumes SetOutPath $INSTDIR + Exec '"$INSTDIR\$INSTEXE" $INSTFLAGS' +label_no_launch: + Pop $R0 FunctionEnd -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Remove old NSIS version. Modifies no variables. -; Does NOT delete the LindenWorld directory, or any -; user files in that directory. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function RemoveNSIS - Push $0 - ; Grab the installation directory of the old version - DetailPrint $(RemoveOldNSISVersion) - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" - - ; If key doesn't exist, skip uninstall - IfErrors NO_NSIS - - ; Clean up legacy beta shortcuts - Delete "$SMPROGRAMS\Second Life Beta.lnk" - Delete "$DESKTOP\Second Life Beta.lnk" - Delete "$SMPROGRAMS\Second Life.lnk" - - ; Clean up old newview.exe file - Delete "$INSTDIR\newview.exe" - - ; Intentionally don't delete the stuff in - ; Documents and Settings, so we keep the user's settings - - NO_NSIS: - Pop $0 -FunctionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Make sure we're not on Windows 98 / ME @@ -242,28 +139,28 @@ FunctionEnd ; Make sure the user can install/uninstall ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function CheckIfAdministrator - DetailPrint $(CheckAdministratorInstDP) - UserInfo::GetAccountType - Pop $R0 - StrCmp $R0 "Admin" is_admin - MessageBox MB_OK $(CheckAdministratorInstMB) - Quit -is_admin: - Return + DetailPrint $(CheckAdministratorInstDP) + UserInfo::GetAccountType + Pop $R0 + StrCmp $R0 "Admin" lbl_is_admin + MessageBox MB_OK $(CheckAdministratorInstMB) + Quit +lbl_is_admin: + Return FunctionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function un.CheckIfAdministrator - DetailPrint $(CheckAdministratorUnInstDP) - UserInfo::GetAccountType - Pop $R0 - StrCmp $R0 "Admin" is_admin - MessageBox MB_OK $(CheckAdministratorUnInstMB) - Quit -is_admin: - Return + DetailPrint $(CheckAdministratorUnInstDP) + UserInfo::GetAccountType + Pop $R0 + StrCmp $R0 "Admin" lbl_is_admin + MessageBox MB_OK $(CheckAdministratorUnInstMB) + Quit +lbl_is_admin: + Return FunctionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -310,6 +207,33 @@ Function CloseSecondLife Return FunctionEnd +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Test our connection to secondlife.com +; Also allows us to count attempted installs by examining web logs. +; *TODO: Return current SL version info and have installer check +; if it is up to date. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function CheckNetworkConnection + Push $0 + Push $1 + DetailPrint $(CheckNetworkConnectionDP) + GetTempFileName $0 + !define HTTP_TIMEOUT 5000 ; milliseconds + ; Don't show secondary progress bar, this will be quick. + NSISdl::download_quiet \ + /TIMEOUT=${HTTP_TIMEOUT} \ + "http://join.secondlife.com/installer-check/?v=${VERSION_LONG}" \ + $0 + Pop $1 ; Return value, either "success", "cancel" or an error message + ; MessageBox MB_OK "Download result: $1" + ; Result ignored for now + ; StrCmp $1 "success" +2 + ; DetailPrint "Connection failed: $1" + Delete $0 ; temporary file + Pop $1 + Pop $0 + Return +FunctionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Delete files in Documents and Settings\<user>\SecondLife\cache @@ -577,7 +501,6 @@ StrCpy $INSTFLAGS "" StrCpy $INSTPROG "${INSTNAME}" StrCpy $INSTEXE "${INSTEXE}" StrCpy $INSTSHORTCUT "${SHORTCUT}" -Call un.CheckStartupParams ; Figure out where, what and how to uninstall. Call un.CheckIfAdministrator ; Make sure the user can install/uninstall ; uninstall for all users (if you change this, change it in the install as well) @@ -586,10 +509,9 @@ SetShellVarContext all ; Make sure we're not running Call un.CloseSecondLife -; Clean up registry keys (these should all be !defines somewhere) +; Clean up registry keys and subkeys (these should all be !defines somewhere) DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" -DeleteRegKey HKEY_LOCAL_MACHINE "Software\Linden Research, Inc.\Installer Language" ; Clean up shortcuts Delete "$SMPROGRAMS\$INSTSHORTCUT\*.*" @@ -613,123 +535,6 @@ Call un.ProgramFiles SectionEnd ; end of uninstall section -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; (From the NSIS wiki, DK) -; GetParameterValue -; -; Usage: -; !insertmacro GetParameterValue "/L=" "1033" -; pop $R0 -; -; Returns on top of stack -; -; Example command lines: -; foo.exe /S /L=1033 /D=C:\Program Files\Foo -; or: -; foo.exe /S "/L=1033" /D="C:\Program Files\Foo" -; gpv "/L=" "1033" -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - - !macro GetParameterValue SWITCH DEFAULT - Push $0 - Push $1 - Push $2 - Push $3 - Push $4 - - ;$CMDLINE='"My Setup\Setup.exe" /L=1033 /S' - Push "$CMDLINE" - Push '${SWITCH}"' - !insertmacro StrStr - Pop $0 - StrCmp "$0" "" gpv_notquoted - ;$0='/L="1033" /S' - StrLen $2 "$0" - Strlen $1 "${SWITCH}" - IntOp $1 $1 + 1 - StrCpy $0 "$0" $2 $1 - ;$0='1033" /S' - Push "$0" - Push '"' - !insertmacro StrStr - Pop $1 - StrLen $2 "$0" - StrLen $3 "$1" - IntOp $4 $2 - $3 - StrCpy $0 $0 $4 0 - Goto gpv_done - - gpv_notquoted: - Push "$CMDLINE" - Push "${SWITCH}" - !insertmacro StrStr - Pop $0 - StrCmp "$0" "" gpv_done - ;$0='/L="1033" /S' - StrLen $2 "$0" - Strlen $1 "${SWITCH}" - StrCpy $0 "$0" $2 $1 - ;$0=1033 /S' - Push "$0" - Push ' ' - !insertmacro StrStr - Pop $1 - StrLen $2 "$0" - StrLen $3 "$1" - IntOp $4 $2 - $3 - StrCpy $0 $0 $4 0 - Goto gpv_done - - gpv_done: - StrCmp "$0" "" 0 +2 - StrCpy $0 "${DEFAULT}" - - Pop $4 - Pop $3 - Pop $2 - Pop $1 - Exch $0 - !macroend - -; And I had to modify StrStr a tiny bit. -; Possible upgrade switch the goto's to use ${__LINE__} - -!macro STRSTR - Exch $R1 ; st=haystack,old$R1, $R1=needle - Exch ; st=old$R1,haystack - Exch $R2 ; st=old$R1,old$R2, $R2=haystack - Push $R3 - Push $R4 - Push $R5 - StrLen $R3 $R1 - StrCpy $R4 0 - ; $R1=needle - ; $R2=haystack - ; $R3=len(needle) - ; $R4=cnt - ; $R5=tmp - ; loop; - StrCpy $R5 $R2 $R3 $R4 - StrCmp $R5 $R1 +4 - StrCmp $R5 "" +3 - IntOp $R4 $R4 + 1 - Goto -4 - ; done; - StrCpy $R1 $R2 "" $R4 - Pop $R5 - Pop $R4 - Pop $R3 - Pop $R2 - Exch $R1 -!macroend - -Function GetProgramName - !insertmacro GetParameterValue "/P=" "SecondLife" -FunctionEnd - -Function un.GetProgramName - !insertmacro GetParameterValue "/P=" "SecondLife" -FunctionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; (From the NSIS documentation, JC) @@ -827,42 +632,59 @@ FunctionEnd ;; entry to the language ID selector below ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function .onInit - - ; read the language from registry (ok if not there) and set langauge menu + Push $0 + ${GetParameters} $COMMANDLINE ; get our command line + ${GetOptions} $COMMANDLINE "/LANGID=" $0 ; /LANGID=1033 implies US English + ; If no language (error), then proceed + IfErrors lbl_check_silent + ; No error means we got a language, so use it + StrCpy $LANGUAGE $0 + Goto lbl_return + +lbl_check_silent: + ; For silent installs, no language prompt, use default + IfSilent lbl_return + + ; If we currently have a version of SL installed, default to the language of that install + ; Otherwise don't change $LANGUAGE and it will default to the OS UI language. ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" + IfErrors lbl_build_menu StrCpy $LANGUAGE $0 +lbl_build_menu: Push "" - Push ${LANG_ENGLISH} - Push English - Push ${LANG_GERMAN} - Push German - Push ${LANG_JAPANESE} - Push Japanese - Push ${LANG_KOREAN} - Push Korean + # Use separate file so labels can be UTF-16 but we can still merge changes + # into this ASCII file. JC + !include "%%SOURCE%%\installers\windows\language_menu.nsi" + Push A ; A means auto count languages for the auto count to work the first empty push (Push "") must remain - LangDLL::LangDialog "Installer Language" "Please select the language of the installer" - Pop $LANGUAGE - StrCmp $LANGUAGE "cancel" 0 +2 + LangDLL::LangDialog $(InstallerLanguageTitle) $(SelectInstallerLanguage) + Pop $0 + StrCmp $0 "cancel" 0 +2 Abort + StrCpy $LANGUAGE $0 ; save language in registry WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" $LANGUAGE +lbl_return: + Pop $0 + Return FunctionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function un.onInit - - ; read language from registry and set for ininstaller + ; read language from registry and set for uninstaller + ; Key will be removed on successful uninstall ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" + IfErrors lbl_end StrCpy $LANGUAGE $0 - +lbl_end: + Return FunctionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Sections +;;; MAIN SECTION ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Section "" ; (default section) @@ -874,15 +696,11 @@ StrCpy $INSTPROG "${INSTNAME}" StrCpy $INSTEXE "${INSTEXE}" StrCpy $INSTSHORTCUT "${SHORTCUT}" -IfSilent +2 -Goto NOT_SILENT - Call CheckStartupParams ; Figure out where, what and how to install. -NOT_SILENT: Call CheckWindowsVersion ; warn if on Windows 98/ME Call CheckIfAdministrator ; Make sure the user can install/uninstall Call CheckIfAlreadyCurrent ; Make sure that we haven't already installed this version Call CloseSecondLife ; Make sure we're not running -Call RemoveNSIS ; Check for old NSIS install to remove +Call CheckNetworkConnection ; ping secondlife.com ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers. @@ -907,9 +725,6 @@ Call RemoveOldReleaseNotes ;; This placeholder is replaced by the complete list of all the files in the installer, by viewer_manifest.py %%INSTALL_FILES%% -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; If this is a silent update, we don't need to re-create these shortcuts or registry entries. -IfSilent POST_INSTALL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Shortcuts in start menu @@ -918,25 +733,18 @@ SetOutPath "$INSTDIR" CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT.lnk" \ "$INSTDIR\$INSTEXE" "$INSTFLAGS" -!ifdef MUSEUM -CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT Museum.lnk" \ - "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple" -CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT Museum Spanish.lnk" \ - - "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple -spanish" -!endif - -WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Create Trial Account.url" \ +WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Create Account.url" \ "InternetShortcut" "URL" \ "http://www.secondlife.com/registration/" WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Your Account.url" \ "InternetShortcut" "URL" \ "http://www.secondlife.com/account/" -CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\SL Scripting Language Help.lnk" \ - "$INSTDIR\lsl_guide.html" +WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Scripting Language Help.url" \ + "InternetShortcut" "URL" \ + "http://wiki.secondlife.com/wiki/LSL_Portal" CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\Uninstall $INSTSHORTCUT.lnk" \ - '"$INSTDIR\uninst.exe"' '/P="$INSTPROG"' + '"$INSTDIR\uninst.exe"' '' ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Other shortcuts @@ -944,18 +752,8 @@ SetOutPath "$INSTDIR" CreateShortCut "$DESKTOP\$INSTSHORTCUT.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS" CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS" CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \ - '"$INSTDIR\uninst.exe"' '/P="$INSTPROG"' - -!ifdef MUSEUM -CreateShortCut "$DESKTOP\$INSTSHORTCUT Museum.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple" + '"$INSTDIR\uninst.exe"' '' -CreateShortCut "$DESKTOP\$INSTSHORTCUT Museum Spanish.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple -spanish" - -CreateShortCut "$INSTDIR\$INSTSHORTCUT Museum.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple" - -CreateShortCut "$INSTDIR\$INSTSHORTCUT Museum Spanish.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple -spanish" - -!endif ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Write registry @@ -965,22 +763,17 @@ WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" "$INSTSHORTCUT" WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" "$INSTEXE" WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTPROG (remove only)" -WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe" /P="$INSTPROG"' +WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe"' ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Write URL registry info WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "(default)" "URL:Second Life" WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "URL Protocol" "" WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" '"$INSTDIR\$INSTEXE"' +;; URL param must be last item passed to viewer, it ignores subsequent params +;; to avoid parameter injection attacks. WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"' -Goto WRITE_UNINST - -POST_INSTALL: -; Run a post-executable script if necessary. -Call PostInstallExe - -WRITE_UNINST: ; write out uninstaller WriteUninstaller "$INSTDIR\uninst.exe" diff --git a/indra/newview/installers/windows/lang_de.nsi b/indra/newview/installers/windows/lang_de.nsi index c41012861fbeca26dedea9e65fcc8d201536ee66..911ed743488f773143e3e74860ce1dde775043b8 100644 GIT binary patch literal 8262 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 literal 3762 zcmd5<O-~z15WVv&N){5k60y)8lS4#of~*+Z%RtBhDe9T2v0EPZSp5MBQU2*3^BXw% zu&=wvc+A)=ht+B&kfoXGs_IwuUe&y#k5U^;(ooKYaHTyMRw5q?HFaXjA7#nZIs7q7 z21$Q#`SZ3{DXV3AyEdQ#7UuSx^+KqwDvQp+!8<Z8wbJ5frKpq{E5l^@o25)Ft;ECM z3|qG(#rJf_+W1G6Cb!ImWy+k^tSk=mfsd0QqMFh$I!au6<$YgA<HH}r)6x0Y^Rvr~ z)6q}rP<-Bb;banGw+@EKA^n_9re(~uaf2lQ+2OVi>pjWzB^x$05p%Y5FLh42FqE=p zX$?tbtSC##8kbHut5l9l7EB9i>2nRs;g8Q}m&sr}`Z^qs&VP0Z&)Gh(>h8Lt&t>=Z z+Nm@n3Rlozrg=fVYO!>dbtAhMVvT%JpCfsL+p!Kv)>jmv=(*IK*-C#8z0gFmzkbu3 zRh8jT-<I1!ge&+mZ^k-TK1icMo_X0*lbc_&k`*PA(ee0g;2wQavC@>s%0(Y<UkbAu z?nxnXK!^~Ftq_}<BlbOOpMt5%5+T5w-i)((Vuc1dCPIsap#>X*zN57I*1T)m^5R1a zu}_s!XswB^rtr0(qr<@{xtd&#&yPsSY-Yh;g$%lsSXqL{HF>DuSvf^3%}Rv!orc`D zN@-k{Au+%t%4*t7%vULiZ_S^MO{o0y4rzi84xs<l`w#>jSlvN3%ACC9ti_=j;4+wu z%iJ4mShB4Ge}Q95y#kj+2?W+=-EO=~=5YogRbJhjT|ol8H}QRaxIby(yN=?ZPB|!3 zAJ`7pXwV&A+f_Sig5yv>$n(lRSW<2i;mhRsDcT<=Cnw~f9Ty^_aYA3ZhqnrUePrZw zciD_kT2JwHf`^wU^x)Pdg#fWSruk#&7Cd+AuF^9vG_zFT9i67gK|^#xoIXTa-LWnm z21l`iY^XZqm9FfAZ~11Mzd!Qr6Cjsh#X>4+tQHUgDxAvVJg5)+-mG+h>$G{mH`gob z;LRYcwNiY*_0a2biZbB_p$DE9r4?mYU7#2#8|lRtIKbBm|2flk01t&1m&M8$7&1hl zvvunZ89Y2D_kuE@2)-Nu_BG%+^*Z>j)hhu!Q?_8Oa7puK`*yE@FGl(A0mRDSlLqD+ z^tRzEHH-Xvy<W6BZBX>$;?YjMbE+VQs2b{xRmpBi`m+hWYrNO=xLF0g_uT<PPJOZ% z=ZYQnuh_DIict!)5|hw`=~Viq;2*f+t)p`I6=F}FZ-UeYDZqe3<KjMn7j%a`rzt!w zmbCrvfT`(WE|jXL%;s`f>by|K9R@2=7=Xw4g)Ja~YKP6J{N)N;gBFrRQGpr^u|9eD zfSmyItc!{?$C5dZHZ=a!q89og^;eBL^{HXpJ011ThT(t*#KX204if2uOTBcgC*b~y z>>=PbW_#K9uT^Cq^E!L#QZwfNRfiVraVN+G3K2dwn#7IEK+nJPpDJd@a2P&<x_&~V zuxPztOMZk&Gz`SKU(MYDNN|{KXTDdtEQ7wsWg+L1@pc)vsQAIt%%LCN*GpE&Vh1zM z4DmN8M<6)*-EYV<AAOTZ+`l&*-t290FRl6D7kM&RO=$5rMJr=Y!yP`bYFEd8cZC5a zP?gI<KKSp8NV}Bpd1`4UQdV#MlHk`teAdN%;o=cfvL+E+z$3%10BnXz58`@Bd+PSq o9)G<aL|6DOxG>Y!#uSndA41KRe6FBgjA}H#qZ$i(l6F+&Z(tuc%>V!Z diff --git a/indra/newview/installers/windows/lang_en-us.nsi b/indra/newview/installers/windows/lang_en-us.nsi index 218f1c60fc64e393f23e88818eda07d63a9c6b51..a01541377dfd717d76d318989593d302add98d94 100644 GIT binary patch literal 7162 zcmeI1ZA)WE6vyXvq2J*m3+_UZr7yQH78~2GR9CC+x&>j0Nz`B-B#E_B`qkV1e{(X< z%)PlfS}CQJkb86I&YU?9|MN8Y^N(*_<-T`AH*<5h(C?w{mFv5KJ9Axk?M52?(tY7} z+*Hqf-Men$&h@6N>%gxa>0Y@t_rm?=-n&D$t?!nu2kv)w;yPM65tW%}pX#|zq0&x6 z?K9BMC+<5>edPJLa2t9W>HV7L0Y2cjNnx(lQ0Qr&q2CV~hT?Igr}L!*#`)or7o@1f z<-|+QOeoA6)Q?1G;onu7kBmERQ*yp@pT#Zr9WU_@k`^sADK<Gad4e1{M~8_lO<G}1 z(0>_E`=0-<B*jvxwkpYX;YUX`%U06dnP!Lg!-l4EtIUOoQ_YUr!tRxJ9?C8Qzna|_ z`u(e}l}5Yn%CBIip=_0nb}|ZwexGQS52Dc*CFqver*i3v`z&$)zSwCYUaksvjq`K8 z<$6Vq6u~p?0;;D%=53<Ac5Q8GeZHzA3s3dI?on?gy2|mF^48pCP24?|tJESTe4)$W z?-8Ml_9W*-c);g|!Y`O0666|T%~Wr&Uc`=#{h~EQ!(atG{-Zqoz(=+{dHiS5=Kf9| zzu{iGPyX}Dy;;Vo;G?-;H#L^pC8Fc$^0&*GW2}-St2M>EAVr9_aLMdTty;*>X1b!c zegC`b#?n=#EAe}-F|tCXNHCR`x8tFN>aP1%lpc<_WEe6PR-foMv4xysI0*6UN}Q7m zX5w+I8SA3FEh`?%C-!CCJ=t?z_C!0DkH}hejF1)WZC`UsJ(<|p)5mo5*xW?Ki>v4E zCp|+cMv8}Z6m8dTeROx@-qxhTbH;juUyu__&mqrOemwe1yTuO@I(wc<pz%>}B84)G z2TWpR^7xrJn<f0^Uc4b&)veXL!*wO84K2tIn)B7|GDQ?0XB2XYwuG;zNtIKr^OZ`q zI_8w|SLSEytx<!BJM!5HoL}jKEf!vrbqPL67hg#m_3^LWYyaULH2}W6t6x3c_q21R z7`q{lJ<&V6ZfXZ|{#g6r35ElU;XL6VR@H%8Dv|o0FXZ*FHBKGEdytL<)Vx%}jP*21 z-2~o1M&Qk|Mpq+Lm_)vuyX_hWth*Juy1KqqoB>mOsb?b+$yij`W4}AKICV35*U)_? z?k1WaJ^!Vj8D)J{6mvIQ_XvDH9kam`ue?_y3EBzSbd`M`gX4!eFGcgu(&@FgD2N?M z%ft`k?^Mr3e)u+AVd*v5dgyHf?)rKL4@71tku3rS0`0M<0h)}W;cV?58$)xIj@qL3 z#<OAxDUkU2@bp2{{uxX)d4C>Ur4syCu+`MnQ}H$OQInW;D?hl_6HydjD9M`Jig%rC zRhfqAvhgbV$Kbm}XKFp7Wt%jXh1;w7aQ;EwKn|13azXS7d_Q=)<)ULB0jx5*UB(q+ z#ifrUtNoci841qy#pmjES8thF$UCuGhpKfoe>WFc-Wp_CJ@ibE_1I%CL(IY<2ekDW zrV+C0wbw#lI=hh$N<6lN?@|=C@n;pmy64RzcODf%09E6KtU(_NLa?Ttp4HJalav#E zpmAP94rgz?K^I2R@M|bq_b8-am@Zcv#__QFInJK@QDdgrh@Ey%2$hU=%w{|Kihyi% z6MO8A<IJn0K6oeD1sZfUBaP)6LJG_I&AK~SupHOTcy)iB6Lv`L8?c?m^U^Bk--7Ry z_vgoWQ_KJ3oKqr;28Q!Gnq!CcUVgApOrTP~T%LMQG#0D%l8pE;l~T+`&MfY5Hj;9P zT=Ydbk7)!B{Rx>coB*H;>sR8beY;!-$;!^%N@5<7Wv+h-$~xmM&1OZ+Fp-b+{{xFc zmFP~z<+ZrBS|sh<hzWF#rWM|ht;pS+LgXhpjM=`#`1%P_i3TF)1Ie16Kt(N-dh(HS z1U$kE-3oWA60}JKj{F2YSQeqLSrrMJ5;ac{LpHEF$2cHvM-J%rt;0JN7o1V2e1vL< zKAL*UIwv}ExC*Euo07TS+;#ZjWX}FaO8b6nTWKHb-sq_9oX#>Iy9BBsSB@LCRWs5t z*Z!AiM>Ekk&vHl0HM`OPr%(@{!=XW|5^nD7wu+n7Ug=r({io6B9*l9m8Erq;Z*YQU HLj3v*)lJdI literal 3211 zcmd5;ZEG7j5dNNDF)RkRP)xXw?T3=Hlbkun&Sjk@2Z18*%3e{eWF&1}6Y}3XBkgYF z>^d!_90v~Ak@U>WGtazyfD2))17RWOYgS2jGSe)dF}11KhF=KDAsIZ*(`h=H-aI{w zwQ@$R9-0fV#vAtGTy3PV#Yo9@a&qzkY_)R2;ajahii|7E!SQbnGPZR>s}p*kB9hv` zES#s+YDrISw>fhh29L9|`Q_*H`Q>by{`CY2goEUjrzv;Uw&$h)zxPWh>zI^`e1KdS zo;hvy-nAHa(wvM7tu6O{b#bRLSo<V_SCEbcmvV`&fGaqpJku&iR@OZBP(u}naT>mI zV<~{a<EQhRbh?;-o-O8=Pop>Y_xEq#A28Iq6(TvpP-H$LMMF*3florA1x)d{;Mted zF@v06Gs8*?CAStu11tS4=Ae7?>d!8lV_nG{ly)d7jGw638ofba7!IcMba{QVxEzik zMZqc8u(4+NGaq%6YpX0ncaTCR^(J<Q(w2r(`%lHK*Fr~bKC*+rmEL{yb__4|SClro zOLfttBerqluPkIv7e2M=dLd~~43)rI8xL0}b~FkBWkfOTkPf}GeP%qsT{y3;Os;#V zB^<I-Uu~egov0Ff;CeDOj1{Vt++($Gx7s+{;@@AtYrp?-dV2Z}7^d`!Ww1!$el&Pc z_&IZqm)H%^FVu7+HI#MZ<>2NN`-K9-E%qh60hwX8;MSvImtY{ZwKZH_jd-@-vHiy( zY19)a)+{fD64n`p)eh@QWj^O`YMXE4%y|yZ;s*r$Dyx*eEjOjGzAB%C>E*YB-AD1i zx&pS{a%PB|6^F_aPYe<%O5u2(0LwC6DM!)M?Xtoyju(-y<RIQ8W;aUR=w}$J)X#Br ztA2r{7W~IN1^oYlsn)5u_7Ay|hO>O1RmNZ=>S$-W9*2`2Z<DF3(`vE7F&Eo-+0AJr zvtX(z4s3Lxbnbkw++*6M_=1!5xqJi~*f60&r^>KCxb*`?(meTr^yzj`2u+`38NFk| z7cI#?(i3@Mi^>5uE7i$p7rKw07!E6c=oMWnkms-~XdS^2BWg^gP@|igm<y`&0xu%B zNYBvV4As8F6kLG~Q+Dw;`Rchj2!MJN&Rz_z;)GXE#qrsEd_MC}n98_pvf-DAx=|nH zxs}sllR2d0c=h}Su8)>Z(#v-1@c)MIKyetl8N-(DSI)TZ!n7UJ87-`~uUk(r_g=Oh zBCM@6QYJd9O045BRB%6{OBN@x%(?O7KBt$@%Sgw%N9NaISMm1yq`fRSijm<TE*w%m zJAg86>d5bW&C=5@Vzsmp0GDV2*y7L=E1bLD71B8lMvhB!4p@@3o8bDS-&3ogy$SdB z&^0F7-`z1>pRfSxH3k>0GIWbJ^__kAwiyFU+~Ke6rn_P+3#`c<1@?>*>+8j;3TvZF O^2UJOTigRM$=?BEPG8CZ diff --git a/indra/newview/installers/windows/lang_es.nsi b/indra/newview/installers/windows/lang_es.nsi new file mode 100644 index 0000000000000000000000000000000000000000..3340a1230fa76a70f4f82b07e5bc5fd40b7ae347 GIT binary patch literal 7612 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 JlRNPo_irn<HDCY$ literal 0 HcmV?d00001 diff --git a/indra/newview/installers/windows/lang_fr.nsi b/indra/newview/installers/windows/lang_fr.nsi new file mode 100644 index 0000000000000000000000000000000000000000..5c17ad077f6e9a8a8e5968671e5f8126ab344221 GIT binary patch literal 7858 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 E-!7bbB>(^b literal 0 HcmV?d00001 diff --git a/indra/newview/installers/windows/lang_it.nsi b/indra/newview/installers/windows/lang_it.nsi new file mode 100644 index 0000000000000000000000000000000000000000..9f18013691c41e1dbf1f883dcf47d5014b475584 GIT binary patch literal 7196 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 literal 0 HcmV?d00001 diff --git a/indra/newview/installers/windows/lang_ja.nsi b/indra/newview/installers/windows/lang_ja.nsi index 5e0496ee6fe2735dd75bc732ec3cfbff123ef24b..f564291f7dcfdd4f71973d17de4801f1f43f3ebe 100644 GIT binary patch literal 6302 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 QZS|{u36lV|OH*0?AB_l?KmY&$ literal 3579 zcmb_f&2Jk;6u;-M7)6l^mnh;$FZe5|Q^z*mBn>4>*zAs-6`NgaXPu@BL3l=O^Wl#s zZkr3JRc;ATR6&(SY6_I{5y=)3M+8FRL@Pk<g)?tv?PPboP7UhK^1ONP&F}r*@4Y>X zhBb@WNFzwaS-GIweF;-m6S9#j$T>W$=@|77EGMP76pd$ArX!|dTiV=o+W=+3f=rLf zdD*}O4;p&5zpw8sB853yv*EI7AYD_iK`^rMl8qEOZ)>K}#~n!E%E+OFb1oI;#`%?r zyeium4J;=@$&uO7P&$;1NwF2wk64J!u|<|GzRhy|=oA+cwhQ?{4;R5h&hY~tAW;<) z#nMDh?p*Wm_<#UWu<n{4y+`XT4*}AU;04-X7uhJQv3a(}BFv^uX7c~pHC7u~o{VLr zcq%!YNF_&B2I-OeY4kq*h3*%_fluTabbFpZ0eXl2Ko23Q45UHW6$n2Aq5Nq@;B<=R z;B@1Kp_9CZou#SVcF@!eV#~TN^AaOfv#?^D)@4z7H=5D*No3wM2^M7!@CvXUXI6}{ zEDN&|OG5qDz0mmFbuEww<bC?oheX{Sfi^een@zyu3H_8lqMy^9V)*q_!*;8RFG|z> zD$28Py(=&(FrPCuGLMyaC0n+D+iBU77YJIwgaA>|oVnzNx6^Vg90czoE3*`^^MhLt z&kV$q(s(+P8aYGvO1tzi-KBp34G-w^VwjCX&LyZt4yxelL3&hqaDxcW+^2_vu#l&R z1EioRkR)(H*3Fzd$v99&a!$#c1xy5GI+?Zgkbc?8+4a$i;c%7i7SFW+vhaer2#TYt zi0c(v#1`>MO-7icbd?)SI_Ck%l)j-mC*4~8`{r}#-gnqA^mcOVD*YC^Q*nx-@S>ng znxUGPNKiykiwn+qD_}Go5R%1!-CQhU>@DcnW2p!VJ~%k&Wnw^(;EH=&ztPGIO{I&W z_V3q*hK7ovF<C(=2~E*D{T1Fm&fWug$cc8?anz}8Kad#$16QYVPFHTxMlmFmdWP1k zUsoQ`-=TBY0KiFhh1N@7to}ofK%JhhJ-#u0{bRZZTE+PWvgh&D+`LCW<NxzIyCB!H zvbvxd8nG=IBnD**h9VgBN{fE4y16Fs3ArzD_666${gOJU=Wmehozho+0tDBfBStS} z=s*vUX{>+0{ZZv75qa<C`RzqPy0Dn7f^*#gC>Xs#Fky5DAp}%>c|bUkdV|6r8OU@B z96}h|c<2_E)yqo3vakVb%*lcw${){0oRc2%@Xcogv)qM7`A6spt^williHH|q(hPv z9mX5MifO32mc=ikDYuq{bpourm&e=2&1!u6z>%d+R(87V;r+C}k*wVXmq(u0HLB+J zYI`UI3o}oJtAyuXQ^++`vihuijW$x}*)p49HQHReEfnQ=z(zvJNGu`#->2VgU9G(D zAPS>}Pr&YIcHzAD@uv~~e<RvEw@)zjbNs*H>c9IkuoYe8Oix9IZW24ayMdgs8R2LA zi+}_wCyJU%VF6l?AlXn6tV1?z_XIJUonsqp7N%N)F=qn6e{TRqHb7OgY@Lsm)>!3B zuh`0U4Br5G%gn)|<9uYe6N+Mfo_3B!N<FdKvuc6J7DK@1N5{$RRTNnCp25o3nsEcu zhS-bX(+7Tn4mk_;Uir`KpNPAMw6Xeg?JnFppob@Zz%F30ZA$b>`LF7S9V&6m-i}3i dqOIlQuy>D<T+rg+p{`H40AD|0+8-Bv{{meu*Vh05 diff --git a/indra/newview/installers/windows/lang_ko.nsi b/indra/newview/installers/windows/lang_ko.nsi index b570315f03e135c810a8cfd5c68d400c4cccd2e3..5162b7ddad1f7ebdceda14a6d70cad38050ae704 100644 GIT binary patch literal 6200 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 literal 3448 zcmcgv-A~(A6o2QhI6`^Yqza)ut`8G~7Dc6j5$O7WR2ka=YsN;l(+?s37^`cmPHIR- zOakQNdLi*10x4a)^6|hnb)yv<np6!?)rXyX9S6s8X!o+WB=_F)@jK`DJ13Xns-)=# zNID2&f=kLq&xpziBb+jm<YvUHk}N`RWFZ!h#)qQgi&KNDVrbIzly?CVctfAMrfMRm z^eJ+px2NYa=*ekAGVrOYfGqK%qKjaNcMagVc|%f_9{N0vhLjl?anIw)=?VH|a$evJ z5h4pC1F_*-*G9*$48#_pw{&VfAoW_R_kyQ!(MZmByoAE?hUqjizp=;!QRg*@1>p~F z9&-(`JcPHq1Vrjk+pebVlk5*rC~Vl)?<;Rf-LdlzVfBQ(k1X7{G9HhP#%_&_#)cRB zNItg(UJ~HE$TqUOeGrxn^%<VY1ui!>ob~Ev*>sb2t#>mXqlF0Ko82Wv29Tua1}DoL zEfWZmCh~@=-DB1B12p8F49=>mF0#^f7^TRA^>=Qq`YPXExxn)-7zc3m;B%g}j3U~F zOts=P3Wf5k0G<IK;g|+ouwLn6{&R-U;H=1h6E`>wdu@!<xH%o>L|w=Jfob)wAEM5i z*T3w52+UL@8jDYijgJnSOW@eKt<1~Z1F{a4`}PUs&zyrIahrwgS>;v>VX2Ew?P=?@ zvvzut=P@v>At$Rd{=lMG;<$UNf0Yz<R_b6w1b``4$iCA^@6li~$6qjanmDK4Mvlt@ zP<?>gqNWGPJ<hI-$^yM`!#(f7fYix*MjDoN`Y#|qyE&T=ks&B2JjERDNQ$7|(Zk#@ zsK0j4n_h;-I{iGhtn#0pryo;f3o|<R*4IXu5R)P0^P_}9KwJ+u$1ZsvKkM)BzXX|= z`4oD}*I+abH?e8$lk%A-0?kK}@%|=%@w`~EET@rw17$+?t#bMuQ2DEF!rIfKgE~MO zrQ_u#D4evg>Vx#_!cR@HYt_kzpOoN)IZ2UpL*tOrkVq;#tNbTT%75zb5tjad{{iiq z5KtM%Gmf*3#iNjdeL$YGhV2XRG2CPbsLlyFL|znLWS^T$>DTtRXnOsyd~|L)sJNcQ z19{}^6f*d@d|bB3o|!>ZTJN2m(t#(v=Y7>3m!$G>$V@6-u(2Pes}PD!yYhD;<C+Y? z2L3xZGzvQZJ|3L*u90!H3-|b>rilt}2j`QUg&j={x+fvQ`q{x~hm>p^i?oyLt9913 zmQy<Rb#r#NSZQ{1u@dZO8ApyT@~R@pQbPPtE7RL?c6$VGcd3;>R!Y!P?pK^MD~}*^ zj5?e>Lj3FlCP;n+I!%87hP3HsOj%9)xdG`vP?Kl_qgO^@bc?($oq4*?Do*xGr$~eR zPUQfF#7t4DnM?Rf_DK$PpnU;h!EXbd>0qBZzp(1B?yj7<gQV%Ka#VQcG;%hojG3Ze z%q0vV`#67}4bxs=(%Tj4F6?MWq$@STA`XGu%(RPgnDr3E+W_eTIi<z_5BUXvyR37E zD$nt=B3rHfgmb6qAU>xgH|NFr@OyIV7qMoFV`&Jq9k>I@I1}|AFOo;=sl-605dB z8rB<Z9~?w)SywPY6hv9X<$GRJXK=G|cYA*TL+pIaJ!T<<fbTDDYoTdvY&hdeHT%?y zpbpF5muf!V(<RppZjFgP*~9wf^VT7xH!<RRy1M*bWJ+O66aFKiAEy-Dtx4S~JKNsd zM*C<yH;NfEIczD4+vcri?pSmuy&*7xYx8w|remw{ryG>FbsXfywd#J^EIe@?d#m}s Dv^JXd diff --git a/indra/newview/installers/windows/lang_nl.nsi b/indra/newview/installers/windows/lang_nl.nsi new file mode 100644 index 0000000000000000000000000000000000000000..42453baa2859d7acd9104d55b8fc089ffd760411 GIT binary patch literal 7160 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 literal 0 HcmV?d00001 diff --git a/indra/newview/installers/windows/lang_pt-br.nsi b/indra/newview/installers/windows/lang_pt-br.nsi new file mode 100644 index 0000000000000000000000000000000000000000..6524cc7c0102fac8ee0efb787a2d5403b4a53910 GIT binary patch literal 7590 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 F`X|V%F(Uu~ literal 0 HcmV?d00001 diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi new file mode 100644 index 0000000000000000000000000000000000000000..e644e6389b8fac7c3f06b66c7e89edda50da3c03 GIT binary patch literal 5354 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 literal 0 HcmV?d00001 diff --git a/indra/newview/installers/windows/language_menu.nsi b/indra/newview/installers/windows/language_menu.nsi new file mode 100644 index 0000000000000000000000000000000000000000..473f9e0784743088c2815f2ee429494ed097c5ab GIT binary patch literal 1292 zcmah}NlwE+5Uev2e;5TME(D1S_W({XBq4&p2?-hEgh<&GCoDpIfJg8HZhV0!@C1a! zjR&w)^@uH-WqCZF>8Y-&Zu|3N0S+xh=%9fipAEz~Mw?@Y?<*V=G%=4kD6)b+cY2J| z)1i(oXX6Ntr()v9IK_bHyToxns16rg8{mv<9bzfs-0()3_<gZSemI1N74fWccrL>5 ze43V3dtF8-ht}K7(zJ648TC2uanErs<<8Xn#^kV%4TQXe5aW{LGUpeDCgl<FJ$myG zvpR95`4{)Z-VRVj9$Bnn4MhZ|<lE6*=B_bHF4o9dN;_CGb`e?jxFWZeO^U>Fz)L5@ zsZ6dRZ?Cw|oo{Adx38na39c9;*L`K`tgSdySmnejv50H3%Mr1_4hZa7H0&+hjKpTR zua0REQKvH_`~R^DjNU`Zu*Z=$sby%qPE(Qg$yW@ecrvTRI^vC9wNhB+$w?|VCL-nO zuX^K!qcqM|7_!1Sx))B-7*bzkZV9uSg0=~D%w%3=y5;-De=D_AZWZiOX_c4--T|Ep zu+Ek7N>s>99W=Cm!7Gt{PddiS4gCqyT-~MvzD7RNc$VjQxp8+p+s_^2987WZ=&61G Y@HiVmUqy*b<YLGwPh*oUzaM&}FM-(8ivR!s literal 0 HcmV?d00001 diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index aed88497ee2..f47f9b1f43d 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -216,10 +216,6 @@ const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user fl F32 gSimLastTime; // Used in LLAppViewer::init and send_stats() F32 gSimFrames; -std::string gDisabledMessage; // Set in LLAppViewer::initConfiguration used in idle_startup - -BOOL gHideLinks = FALSE; // Set in LLAppViewer::initConfiguration, used externally - BOOL gAllowIdleAFK = TRUE; BOOL gAllowTapTapHoldRun = TRUE; BOOL gShowObjectUpdates = FALSE; @@ -1869,22 +1865,6 @@ bool LLAppViewer::initConfiguration() // llerrs << "Failed to parse skin definition." << llendl; // } - // LLXmlTreeNode* rootp = skin_def_tree.getRoot(); - // LLXmlTreeNode* disabled_message_node = rootp->getChildByName("disabled_message"); - // if (disabled_message_node) - // { - // gDisabledMessage = disabled_message_node->getContents(); - // } - - // static LLStdStringHandle hide_links_string = LLXmlTree::addAttributeString("hide_links"); - // rootp->getFastAttributeBOOL(hide_links_string, gHideLinks); - - // // Legacy string. This flag really meant we didn't want to expose references to "Second Life". - // // Just set gHideLinks instead. - // static LLStdStringHandle silent_string = LLXmlTree::addAttributeString("silent_update"); - // BOOL silent_update; - // rootp->getFastAttributeBOOL(silent_string, silent_update); - // gHideLinks = (gHideLinks || silent_update); //} #if LL_DARWIN diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index d1359daad44..b1262c3e5e4 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -225,8 +225,6 @@ const S32 AGENT_UPDATES_PER_SECOND = 10; // "// llstartup" indicates that llstartup is the only client for this global. extern BOOL gHandleKeysAsync; // gSavedSettings used by llviewerdisplay.cpp & llviewermenu.cpp -extern std::string gDisabledMessage; // llstartup -extern BOOL gHideLinks; // used by llpanellogin, lllfloaterbuycurrency, llstartup extern LLSD gDebugInfo; extern BOOL gAllowIdleAFK; diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp index 34df1e06aee..150bf276a14 100644 --- a/indra/newview/llfloaterbuycurrency.cpp +++ b/indra/newview/llfloaterbuycurrency.cpp @@ -358,11 +358,6 @@ void LLFloaterBuyCurrencyUI::onClickErrorWeb(void* data) // static void LLFloaterBuyCurrency::buyCurrency() { - if (gHideLinks) - { - return; - } - LLFloaterBuyCurrencyUI* ui = LLFloaterBuyCurrencyUI::soleInstance(true); ui->noTarget(); ui->updateUI(); @@ -371,15 +366,6 @@ void LLFloaterBuyCurrency::buyCurrency() void LLFloaterBuyCurrency::buyCurrency(const std::string& name, S32 price) { - if (gHideLinks) - { - LLStringUtil::format_map_t args; - args["[NAME]"] = name; - args["[PRICE]"] = llformat("%d", price); - gViewerWindow->alertXml("NotEnoughCurrency", args); - return; - } - LLFloaterBuyCurrencyUI* ui = LLFloaterBuyCurrencyUI::soleInstance(true); ui->target(name, price); ui->updateUI(); diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index ccf63b32852..3ad26b703a1 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -236,17 +236,24 @@ void LLMuteList::loadUserVolumes() //----------------------------------------------------------------------------- LLMuteList::~LLMuteList() { - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "volume_settings.xml"); - LLSD settings_llsd; - - for(user_volume_map_t::iterator iter = mUserVolumeSettings.begin(); iter != mUserVolumeSettings.end(); ++iter) + // If we quit from the login screen we will not have an SL account + // name. Don't try to save, otherwise we'll dump a file in + // C:\Program Files\SecondLife\ JC + std::string user_dir = gDirUtilp->getLindenUserDir(); + if (!user_dir.empty()) { - settings_llsd[iter->first.asString()] = iter->second; - } + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "volume_settings.xml"); + LLSD settings_llsd; - llofstream file; - file.open(filename); - LLSDSerialize::toPrettyXML(settings_llsd, file); + for(user_volume_map_t::iterator iter = mUserVolumeSettings.begin(); iter != mUserVolumeSettings.end(); ++iter) + { + settings_llsd[iter->first.asString()] = iter->second; + } + + llofstream file; + file.open(filename); + LLSDSerialize::toPrettyXML(settings_llsd, file); + } } BOOL LLMuteList::isLinden(const std::string& name) const diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 7a8497aa2ef..924b27a24cc 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -63,7 +63,6 @@ #include "llviewernetwork.h" #include "llviewerwindow.h" // to link into child list #include "llnotify.h" -#include "llappviewer.h" // for gHideLinks #include "llurlsimstring.h" #include "lluictrlfactory.h" #include "llhttpclient.h" @@ -1066,15 +1065,8 @@ void LLPanelLogin::onClickConnect(void *) } else { - if (gHideLinks) - { - gViewerWindow->alertXml("MustHaveAccountToLogInNoLinks"); - } - else - { - gViewerWindow->alertXml("MustHaveAccountToLogIn", - LLPanelLogin::newAccountAlertCallback); - } + gViewerWindow->alertXml("MustHaveAccountToLogIn", + LLPanelLogin::newAccountAlertCallback); } } } diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index c6c0fb21a8d..2717c444154 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -101,7 +101,7 @@ const std::string HELLO_LSL = " llSay(0, \"Touched.\");\n" " }\n" "}\n"; -const std::string HELP_LSL = "lsl_guide.html"; +const std::string HELP_LSL_URL = "http://wiki.secondlife.com/wiki/LSL_Portal"; const std::string DEFAULT_SCRIPT_NAME = "New Script"; // *TODO:Translate? const std::string DEFAULT_SCRIPT_DESC = "(No Description)"; // *TODO:Translate? @@ -294,7 +294,7 @@ LLScriptEdCore::LLScriptEdCore( const std::string& name, const LLRect& rect, const std::string& sample, - const std::string& help, + const std::string& help_url, const LLHandle<LLFloater>& floater_handle, void (*load_callback)(void*), void (*save_callback)(void*, BOOL), @@ -304,7 +304,7 @@ LLScriptEdCore::LLScriptEdCore( : LLPanel( std::string("name"), rect ), mSampleText(sample), - mHelpFile ( help ), + mHelpURL(help_url), mEditor( NULL ), mLoadCallback( load_callback ), mSaveCallback( save_callback ), @@ -547,7 +547,6 @@ void LLScriptEdCore::setHelpPage(const std::string& help_string) if (!history_combo) return; LLUIString url_string = gSavedSettings.getString("LSLHelpURL"); - url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir()); url_string.setArg("[LSL_STRING]", help_string); addHelpItemToHistory(help_string); @@ -556,6 +555,7 @@ void LLScriptEdCore::setHelpPage(const std::string& help_string) } + void LLScriptEdCore::addHelpItemToHistory(const std::string& help_string) { if (help_string.empty()) return; @@ -647,7 +647,7 @@ void LLScriptEdCore::onHelpWebDialog(S32 option, void* userdata) switch(option) { case 0: - load_url_local_file(corep->mHelpFile); + LLWeb::loadURL(corep->mHelpURL); break; default: break; @@ -773,7 +773,6 @@ void LLScriptEdCore::onHelpComboCommit(LLUICtrl* ctrl, void* userdata) LLWebBrowserCtrl* web_browser = live_help_floater->getChild<LLWebBrowserCtrl>("lsl_guide_html"); LLUIString url_string = gSavedSettings.getString("LSLHelpURL"); - url_string.setArg("[APP_DIRECTORY]", gDirUtilp->getWorkingDir()); url_string.setArg("[LSL_STRING]", help_string); web_browser->navigateTo(url_string); } @@ -1072,7 +1071,7 @@ void* LLPreviewLSL::createScriptEdPanel(void* userdata) self->mScriptEd = new LLScriptEdCore("script panel", LLRect(), HELLO_LSL, - HELP_LSL, + HELP_LSL_URL, self->getHandle(), LLPreviewLSL::onLoad, LLPreviewLSL::onSave, @@ -1590,7 +1589,7 @@ void* LLLiveLSLEditor::createScriptEdPanel(void* userdata) self->mScriptEd = new LLScriptEdCore("script ed panel", LLRect(), HELLO_LSL, - HELP_LSL, + HELP_LSL_URL, self->getHandle(), &LLLiveLSLEditor::onLoad, &LLLiveLSLEditor::onSave, diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index ca1c527cb28..c0af06f4802 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -65,7 +65,7 @@ class LLScriptEdCore : public LLPanel const std::string& name, const LLRect& rect, const std::string& sample, - const std::string& help, + const std::string& help_url, const LLHandle<LLFloater>& floater_handle, void (*load_callback)(void* userdata), void (*save_callback)(void* userdata, BOOL close_after_save), @@ -132,7 +132,7 @@ class LLScriptEdCore : public LLPanel private: std::string mSampleText; - std::string mHelpFile; + std::string mHelpURL; LLTextEditor* mEditor; void (*mLoadCallback)(void* userdata); void (*mSaveCallback)(void* userdata, BOOL close_after_save); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 4f98c3b524d..1f1e56fce8d 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1101,6 +1101,7 @@ bool idle_startup() LL_DEBUGS("AppInit") << "STATE_LOGIN_PROCESS_RESPONSE" << LL_ENDL; std::ostringstream emsg; bool quit = false; + bool update = false; std::string login_response; std::string reason_response; std::string message_response; @@ -1144,11 +1145,7 @@ bool idle_startup() reason_response = LLUserAuth::getInstance()->getResponse("reason"); message_response = LLUserAuth::getInstance()->getResponse("message"); - if (gHideLinks && reason_response == "disabled") - { - emsg << gDisabledMessage; - } - else if (!message_response.empty()) + if (!message_response.empty()) { // XUI: fix translation for strings returned during login // We need a generic table for translations @@ -1206,16 +1203,7 @@ bool idle_startup() if(reason_response == "update") { auth_message = LLUserAuth::getInstance()->getResponse("message"); - if (show_connect_box) - { - update_app(TRUE, auth_message); - LLStartUp::setStartupState( STATE_UPDATE_CHECK ); - return false; - } - else - { - quit = true; - } + update = true; } if(reason_response == "optional") { @@ -1253,6 +1241,21 @@ bool idle_startup() break; } + if (update || gSavedSettings.getBOOL("ForceMandatoryUpdate")) + { + gSavedSettings.setBOOL("ForceMandatoryUpdate", FALSE); + if (show_connect_box) + { + update_app(TRUE, auth_message); + LLStartUp::setStartupState( STATE_UPDATE_CHECK ); + return false; + } + else + { + quit = true; + } + } + // Version update and we're not showing the dialog if(quit) { @@ -2840,29 +2843,6 @@ void update_dialog_callback(S32 option, void *userdata) std::ostringstream params; params << "-url \"" << update_url.asString() << "\""; - if (gHideLinks) - { - // Figure out the program name. - const std::string& data_dir = gDirUtilp->getAppRODataDir(); - // Roll back from the end, stopping at the first '\' - const char* program_name = data_dir.c_str() + data_dir.size(); /* Flawfinder: ignore */ - while ( (data_dir != --program_name) && - *(program_name) != '\\'); - - if ( *(program_name) == '\\') - { - // We found a '\'. - program_name++; - } - else - { - // Oops. - program_name = "SecondLife"; - } - - params << " -silent -name \"" << LLAppViewer::instance()->getSecondLifeTitle() << "\""; - params << " -program \"" << program_name << "\""; - } LL_DEBUGS("AppInit") << "Calling updater: " << update_exe_path << " " << params.str() << LL_ENDL; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 7c78a26367a..7f9ba3206c3 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -2752,33 +2752,6 @@ void process_grant_godlike_powers(LLMessageSystem* msg, void**) } } -void load_url_local_file(const std::string& file_name) -{ - if( gAgent.cameraMouselook() ) - { - gAgent.changeCameraToDefault(); - } - -#if LL_DARWIN || LL_LINUX || LL_SOLARIS - // MBW -- If the Mac client is in fullscreen mode, it needs to go windowed so the browser will be visible. - if(gViewerWindow->mWindow->getFullscreen()) - { - gViewerWindow->toggleFullscreen(TRUE); - } -#endif - - // JC - system() blocks until IE has launched. - // spawn() runs asynchronously, but opens a command prompt. - // ShellExecute() just opens the damn file with the default - // web browser. - std::string full_path = "file:///"; - full_path.append(gDirUtilp->getAppRODataDir()); - full_path.append(gDirUtilp->getDirDelimiter()); - full_path.append(file_name); - - LLWeb::loadURL(full_path); -} - /* class LLHaveCallingcard : public LLInventoryCollectFunctor { @@ -5415,37 +5388,6 @@ class LLPromptShowURL : public view_listener_t } }; -void callback_show_file(S32 option, void* data) -{ - std::string* filenamep = (std::string*)data; - if (0 == option) - { - load_url_local_file(*filenamep); - } - delete filenamep; -} - -class LLPromptShowFile : public view_listener_t -{ - bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) - { - std::string param = userdata.asString(); - std::string::size_type offset = param.find(","); - if (offset != param.npos) - { - std::string alert = param.substr(0, offset); - std::string file = param.substr(offset+1); - std::string* file_copy = new std::string(file); - gViewerWindow->alertXml(alert, callback_show_file, file_copy); - } - else - { - llinfos << "PromptShowFile invalid parameters! Expecting \"ALERT,FILE\"." << llendl; - } - return true; - } -}; - class LLShowAgentProfile : public view_listener_t { bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) @@ -7809,7 +7751,6 @@ void initialize_menus() // Generic actions addMenu(new LLShowFloater(), "ShowFloater"); addMenu(new LLPromptShowURL(), "PromptShowURL"); - addMenu(new LLPromptShowFile(), "PromptShowFile"); addMenu(new LLShowAgentProfile(), "ShowAgentProfile"); addMenu(new LLShowAgentGroups(), "ShowAgentGroups"); addMenu(new LLToggleControl(), "ToggleControl"); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index d8a8bba08c5..288c501b59b 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -50,7 +50,6 @@ void cleanup_menus(); void show_debug_menus(); // checks for if menus should be shown first. void show_context_menu( S32 x, S32 y, MASK mask ); void show_build_mode_context_menu(S32 x, S32 y, MASK mask); -void load_url_local_file(const std::string& file_name); BOOL enable_save_into_inventory(void*); void handle_reset_view(); void handle_cut(void*); diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 978d70c6461..875b3ccbf7d 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -51,7 +51,6 @@ def construct(self): self.path("*.pem") self.path("*.ini") self.path("*.xml") - self.path("*.vp") self.path("*.db2") # include the entire shaders directory recursively @@ -66,35 +65,35 @@ def construct(self): self.path("*.tga") self.end_prefix("character") - # Include our fonts if self.prefix(src="fonts"): self.path("*.ttf") self.path("*.txt") self.end_prefix("fonts") - # skins - if self.prefix(src="skins"): - self.path("paths.xml") - # include the entire textures directory recursively - if self.prefix(src="*/textures"): - self.path("*.tga") - self.path("*.j2c") - self.path("*.jpg") - self.path("*.png") - self.path("textures.xml") - self.end_prefix("*/textures") - self.path("*/xui/*/*.xml") - self.path("*/*.xml") - - # Local HTML files (e.g. loading screen) - if self.prefix(src="*/html"): - self.path("*.png") - self.path("*/*/*.html") - self.path("*/*/*.gif") - self.end_prefix("*/html") - self.end_prefix("skins") - self.path("lsl_guide.html") + # skins + if self.prefix(src="skins"): + self.path("paths.xml") + # include the entire textures directory recursively + if self.prefix(src="*/textures"): + self.path("*.tga") + self.path("*.j2c") + self.path("*.jpg") + self.path("*.png") + self.path("textures.xml") + self.end_prefix("*/textures") + self.path("*/xui/*/*.xml") + self.path("*/*.xml") + + # Local HTML files (e.g. loading screen) + if self.prefix(src="*/html"): + self.path("*.png") + self.path("*/*/*.html") + self.path("*/*/*.gif") + self.end_prefix("*/html") + self.end_prefix("skins") + + # Files in the newview/ directory self.path("gpu_table.txt") def login_channel(self): @@ -361,7 +360,7 @@ def package_finish(self): "%%INSTALL_FILES%%":self.nsi_file_commands(True), "%%DELETE_FILES%%":self.nsi_file_commands(False)}) - NSIS_path = 'C:\\Program Files\\NSIS\\makensis.exe' + NSIS_path = 'C:\\Program Files\\NSIS\\Unicode\\makensis.exe' self.run_command('"' + proper_windows_path(NSIS_path) + '" ' + self.dst_path_of(tempfile)) # self.remove(self.dst_path_of(tempfile)) self.created_path(self.dst_path_of(installer_file)) @@ -505,9 +504,6 @@ def package_finish(self): if not os.path.exists (self.src_path_of(dmg_template)): dmg_template = os.path.join ('installers', 'darwin', 'release-dmg') - # To reinstate the linden scripting guide, add this to the list below: - # "lsl_guide.html":"Linden Scripting Language Guide.html", - for s,d in {self.get_dst_prefix():app_name + ".app", os.path.join(dmg_template, "_VolumeIcon.icns"): ".VolumeIcon.icns", os.path.join(dmg_template, "background.jpg"): "background.jpg", diff --git a/indra/win_updater/updater.cpp b/indra/win_updater/updater.cpp index f849e4e9ada..4bd07ead960 100644 --- a/indra/win_updater/updater.cpp +++ b/indra/win_updater/updater.cpp @@ -30,7 +30,7 @@ */ // -// Usage: updater -url <url> [-name <window_title>] [-program <program_name>] [-silent] +// Usage: updater -url <url> // #include "linden_common.h" @@ -45,9 +45,6 @@ DWORD gTotalBytes = -1; HWND gWindow = NULL; WCHAR gProgress[256]; char* gUpdateURL; -char* gProgramName; -char* gProductName; -bool gIsSilent; #if _DEBUG FILE* logfile = 0; @@ -217,7 +214,7 @@ int WINAPI get_url_into_file(WCHAR *uri, char *path, int *cancelled) fprintf(logfile,"Calling PeekMessage\n"); fflush(logfile); #endif - if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); @@ -279,26 +276,14 @@ int parse_args(int argc, char **argv) for (j = 1; j < argc; j++) { - if ((!strcmp(argv[j], "-name")) && (++j < argc)) - { - gProductName = argv[j]; - } - else if ((!strcmp(argv[j], "-url")) && (++j < argc)) + if ((!strcmp(argv[j], "-url")) && (++j < argc)) { gUpdateURL = argv[j]; } - else if ((!strcmp(argv[j], "-program")) && (++j < argc)) - { - gProgramName = argv[j]; - } - else if (!strcmp(argv[j], "-silent")) - { - gIsSilent = true; - } } // If nothing was set, let the caller know. - if (!gProductName && !gProgramName && !gIsSilent && !gUpdateURL) + if (!gUpdateURL) { return 1; } @@ -350,9 +335,6 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho } gUpdateURL = NULL; - gProgramName = NULL; - gProductName = NULL; - gIsSilent = false; ///////////////////////////////////////// // @@ -368,21 +350,10 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho // Parse the command line arguments // int parse_args_result = parse_args(argc, argv); - WCHAR window_title[2048]; - if (gProductName) - { - mbstowcs(window_title, gProductName, 2048); - wcscat(window_title, L" Updater"); /* Flawfinder: ignore */ - } - else - { - mbstowcs(window_title, "Second Life Updater", 2048); - } WNDCLASSEX wndclassex = { 0 }; DEVMODE dev_mode = { 0 }; char update_exec_path[MAX_PATH]; /* Flawfinder: ignore */ - char *ptr; const int WINDOW_WIDTH = 250; const int WINDOW_HEIGHT = 100; @@ -403,7 +374,7 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode); gWindow = CreateWindowEx(NULL, win_class_name, - window_title, + L"Second Life Updater", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, @@ -437,24 +408,13 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho L"Error", MB_OK); return 1; } - if (0 == GetTempFileNameA(update_exec_path, NULL, 0, update_exec_path)) - { - MessageBox(gWindow, L"Problem with GetTempFileName()", - L"Error", MB_OK); - return 1; - } - // Hack hack hack - ptr = strrchr(update_exec_path, '.'); - *(ptr + 1) = 'e'; - *(ptr + 2) = 'x'; - *(ptr + 3) = 'e'; - *(ptr + 4) = 0; + strcat(update_exec_path, "Second_Life_Updater.exe"); WCHAR update_uri[4096]; mbstowcs(update_uri, gUpdateURL, 4096); - int success; - int cancelled; + int success = 0; + int cancelled = 0; // Actually do the download #if _DEBUG @@ -493,47 +453,24 @@ WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho return 1; } - // Construct some parameters. - char params[2048]; /* Flawfinder: ignore */ - if (gIsSilent && gProgramName) - { - _snprintf(params, sizeof(params), "/S /P=\"%s\"", gProgramName); /* Flawfinder: ignore */ - params[2047] = '\0'; - } - else if (gProgramName) - { - _snprintf(params, sizeof(params), "/P=\"%s\"", gProgramName); /* Flawfinder: ignore */ - params[2047] = '\0'; - } - else if (gIsSilent) - { - sprintf(params, "/S"); /* Flawfinder: ignore */ - } - else - { - params[0] = '\0'; - } + // TODO: Make updates silent (with /S to NSIS) + //char params[256]; /* Flawfinder: ignore */ + //sprintf(params, "/S"); /* Flawfinder: ignore */ + //MessageBox(gWindow, + // L"Updating Second Life.\n\nSecond Life will automatically start once the update is complete. This may take a minute...", + // L"Download Complete", + // MB_OK); - if (32 >= (int) ShellExecuteA(gWindow, "open", update_exec_path, params, + if (32 >= (int) ShellExecuteA(gWindow, "open", update_exec_path, NULL, "C:\\", SW_SHOWDEFAULT)) { - // No shit: less than or equal to 32 means failure - MessageBox(gWindow, L"ShellExecute failed. Please try again later.", NULL, MB_OK); + // Less than or equal to 32 means failure + MessageBox(gWindow, L"Update failed. Please try again later.", NULL, MB_OK); return 1; } - if (gIsSilent && gProductName) - { - WCHAR message[2048]; - WCHAR wproduct[2048]; - mbstowcs(wproduct, gProductName, 2048); - - wsprintf(message, - L"Updating %s. %s will automatically start once the update is complete. This may take a minute...", - wproduct, wproduct); - - MessageBox(gWindow, message, L"Download Complete", MB_OK); - } + // Give installer some time to open a window + Sleep(1000); return 0; } -- GitLab