From b406972af1ce404b19639cdbe955f07d2f8fb61f Mon Sep 17 00:00:00 2001 From: James Cook 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 07fa71ce38..72e16ea70c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -3595,6 +3595,17 @@ Value 0 + ForceMandatoryUpdate + + Comment + For QA: On next startup, forces the auto-updater to run + Persist + 1 + Type + Boolean + Value + 0 + ForwardBtnRect Comment @@ -4178,7 +4189,7 @@ Type String Value - https://wiki.secondlife.com/wiki/[LSL_STRING] + http://wiki.secondlife.com/wiki/[LSL_STRING] LagMeterShrunk 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 0000000000..185c0180fb --- /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 c79550774c..01bd98f87c 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 +;;; 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 + +!include "FileFunc.nsh" ; For GetParameters, GetOptions +!insertmacro GetParameters +!insertmacro GetOptions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; 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 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; 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 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; 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\\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 + 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 - ; read the language from registry (ok if not there) and set langauge menu +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"' + '"$INSTDIR\uninst.exe"' '' -!ifdef MUSEUM -CreateShortCut "$DESKTOP\$INSTSHORTCUT Museum.lnk" "$INSTDIR\$INSTEXE" "$INSTFLAGS -simple" - -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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 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_E`=0-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}B84)G z2TWpR^7xrJnmOsb?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#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% z6MO8AcoB*H;>sR8beY;!-$;!^%N@5<7Wv+h-$~xmM&1OZ+Fp-b+{{xFc zmFP~z<+ZrBS|shIy9BBsSB@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#bRLSomI zV<~{aY_xEq#A28Iq6(TvpP-H$LMMF*3florA1x)d{;Mted zF@v06Gs8*?CAStu11tS4=Ae7?>d!8lV_nG{ly)d7jGw638ofba7!IcMba{QVxEzik zMZqc8u(4+NGaq%6YpX0ncaTCR^(J2NN`-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(-yO1RmNZ=>S$-W9*2`2ZKCxb*`?(meTr^yzj`2u+`38NFk| z7cI#?(i3@Mi^>5uE7i$p7rKw07!E6c=oMWnkms-~XdS^2BWg^gP@|igmZ(#v-1@c)MIKyetl8N-(DSI)TZ!n7UJ87-`~uUk(r_g=Oh zBCM@6QYJd9O045BRB%6{OBN@x%(?O7KBt$@%Sgw%N9NaISMm1yq`fRSijmd5bW&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 zcmeI1U2hvj6o$_=68~WpRZ1$M2yqD)RY*dJNSctOr5BYd$1$nFvBNs)2Z-O+-@+x= zz2gFSpE;h+?5@{YHz`5_S+>{SnKS3(J?}X)``4deSYcn;&`O)ym9B^SF6_((_PzD& z+D7{KWBbVVY@*+1`tI4-&UL4!&q0_w(syAicF%sXhjwhcdT;6T$bPk_wyBw8Nhu}! zRKM#I3avEMIs>izR5LHb3h43N)-`ja`zt{Q^g!RHgsEmDp|5p@VLfaZO43Nb&Sw_5 z=EpN#u%eKb<6t=>kx(|IpGeMCxL0UAHtyMm?A)dY$>Q-FI7> zU!Aq7Oq=LMG?Ev)c&;uB%_2&2y?fGeXm4f7itfL!Zp+4%IC%avaSf_-FXWmtuP;l+ zLJ@2;RJMR5n5ope(7TD3m@$_c1LrW(vxXU?Fzm&4=oUL%vE^*;&s_^KNHQvb~NYP2h&9li1Xj~ag^ zpOv#rItU%<4VCgl_2WqK-mz6hyATpey~t%S2LFQ5oRuPynh1;;=J|(j;6E@7hxa7E zT1E2+fzHG$@OED>_c8L8sid%Rnmx5|10v`yB5&R7<2Ru$Qzclr9X)snoa6BaHT&?~ zh3=7ag}z6!qX=H7S{LDe&qXr59Xm&voP!`G_BfAqCrRjn9eSY)@dzLwr)U4-_#p9vHn{U)Xk*at5edQi#0|?UROug?(n9hF1})_P(&t z*QkSl%qNQTJ@vxl+2^sM;*9DU&5H9F);qQ)-#9;4eM}^eqyf5-=TtX30D5$4W?_-Z zT`G6TVRDMq-6M>h%tkVY4kY?&sIjHI1&ZMi7={(9wt1!_8J6>0cMmg~>~Ox1*AK*$ zO3@ZN}y_gb3dJA}0`GOj(c`wLhgA#S5}ja|t{+U+yNt-cH% z#GdKQ52*uj#>hE5^;pZ~&&}3!%_6VRNshztUsj_DO)U>G9E zZ!oj+4li38cN%14bzU1lT;uKxla=Xvz~Q8^M1(?y<%pUF3ROwYOYt|#%`u9$PPGOJqz zR#f@m^Ex9Ohku&8E4sq=y%4npz5r>?Csn+W)%D5(W55l}-p#!oAr}QR_`JE zp}sl4V25iBNBNHMwl#${k)Hb`?l+gs<84Xuiji10*6>_@zN2MrIM{17vFehqU9|3s zkv7f7@=WR_s1f8uGivMw(cVuOd-6fV$nW9Gcc!sdORSXlS0|cZ&iV${z`nfy0dYus zF5I}UV&5M7o#rXShDHt)59%11yQbdm8+90Y)nNp=xOj)d8jd`6P-A7HkI%b3->anz zz^hH2HZ_wDhB%L*l4vM#0YUJcDy`-}$6xC+)TTD4Pif_)MPq zz!B5V`;~2t_wJnDJ#wIDAvLuOl82$z!o$wkQCAq0Js$f#n|G|srx|3J0xI;t>>}2l>`{t*!`Lm~X|7~Rw4lDDM54&dS zhW!z2rIx_#O|Q8xID_+(H}9Z)7n`3_S1qBVaewD*m}-4Qv)4VI0;Rov^ep}X`NX2B zSL`LwoQi~A9zjmmsKcDKan{JMo=&V|jg4oW{!B3b%lXC|VK4P)#3|vc)GxHG_hii~ zk)9y6#}HP{JI0Zobof)JeXYThz?)AcsSi1dV%2re*LOf=*!9kjhOf4$+x1vF3Xtq8 JlRNPo_irnal^inrFbCM4UhEY zrOd{XiWU>;bFPnH`5+q<*6v>E?$$<0MSVMorJHrHqw$d>&Sj(9|C98c+GVge_vR>g zCezujuJhkB;HEalh)$)!vtWPpG#SH61I3hVAi|mMII$n~KhxQ+{2HU}`B@gM_5@llmm zjtS63WG^J)mDY_ut@dG4D;A$>2%8uB;EUXwn?2Z8W{vgCB&_dJ(P~R8q&Q41%hsTG zy=K>oZl^Ts!Gp8gq(XNxhdB1+kCAMFp9bPA&X0ADNWrS9eRv?EX%y~xq5BI$Vz^r@Xo2OcX??+;tZAtpjo`lam9e=tuAJ=>AI{Emv{sN^`7`*y}yo254 z{;Be6v@o&<*@*wYmw#qL1=$6r_QNrp%X;wcR3EQenfT^HTvDC&b)@dv7m~cGCbYCR znZW8)K+h*CEa;;)%oj0_xmH#&wzN)5G4BX*`^tqqMSm+qpGtv!W!watdu^qn4z%W6 zXIPnME_Dth&vmrDRAq}9n$e2TS#_&atodl`Jy*ZnU;T#NFm?aq<% zZ9ziO>ZY=Gb8I(TPTm$ZBLlI&xO%2@)%KTnSM@BZhx)3V1lwpvrI_n`uwX&>$@4Sn zeWn;sRO`!Zdm?XsRATcdc0YWuo?PFRjGn&tgpo`&Vp}Y7tabeVLC6j7ejFq4C)tLF z*H>nEfXspcmOX!0{B&REsrB=q2U+aQ173+2&-G+qS4U^zmunoa#XiCB^azuiWcy`! zzGzEJ=V6h&lh1-@!3n-Tw>SF3s%8A=7yxnXao|!SgFNrE=$6>05V5>3rt%hf@?Ncq z@}P2!XvJ-!#XafuA@3^k-h`bV{R(!$#on7#_hdIi)@Ix5;j0z;25Q;)qNWll_G%t? zBK<=7LIgR62dTrJ?c}cC`>U?8&%i%3WmaatU7=)OcUAXq

9rtn0`iZ^06MWH+3r z>viNW>x3rd*$0Yv3eBqc`)zX9`6tEAP4o9q_;`16m|D?SOv(Dx%Cw?Jwk@lYo2o>0 zE~kEY7xTHyE9-ixe>ba#0mES9m2eCeyoScf6dZpVx_`PRpX}tdyd`#P6rQ@>h&a-_ z(#>&>Z=V|zf@0ReE#;iyebKr-URt#~fnDehU@X@BIAI*$JM^Rj+yiT%2}p+pS9hC5 z9aChi)=8#mFfM;_zYBNzZuh3uF-lK;6!+3CX-+k+R~H}ZZn$(7{Nw$9>=Kz?QOWTQ z{Qx!3D}?tL>FW7jKJA^WSfP&o^)jzq2cky|^R8+vTj-zJUM`Xj^uEywaSJrx?2O&F21 zXJ3aqW8KZ;L?&1H#XCpONV?aNRwBMp@9J3vlibI4sCf$Wm2_f*{mAjDu=}s*-5e{c zRXOGY9;%0w>(=79Lh6%Gj5rWs}Tg7#hDCT<$JXJ zJyG>EqMbb1xOx)K0?E^w6@)1jT!|h&xAQj=)Cd^NCo^Y~3eRxH-}U6Wat03JTAcXB z8KBqYrm893Ox*c%r!!eTxqQ7~_UTgJj~+<%-Ar*_n7&V|_ER&FurC|(H&nT=>fz3J zV!TVBveHk(cwUdz`73%S-KCXJ*;9^7YjTP$*CJN3)p@JWn$x{m-mx)mD9Qd?YzYZjyw`se|QQn1anqxO~e>IlTmH3y(YEy@cZ|Nb@T$rk(rssPdJP~W` 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 zcmeI1-)>t)5XR>ki3dO`(kiM*E1{_3vRqWbfhxjjLYxLJB2|uKQVYipb`oe&-<3-) zxZ(kT@3-U4?y-IBQ&J>A$g;IXqT^rfCo^Wd5JJj=y$OC-9?;?e%Rzsnu)q}VnGC*Uff9Ep^ob%3% z7o-To2?Qdjx!6q2u(rI`dB>9H>!u>u;wx|i_|TXpS5 z68I=~3vu4xA#t+zRNi(PEt~9sNBO>Rir(PyO20qqH;DhPI8MIc{=3Zj*eX-##C@{8 zpNqzsC_%T0<%5+gR#|QJzS#6iyj(WiHP5fc$-GA;eYnSALE;5lzACg=udN+vtGcRX zFSULg^`G_DL|2Qnn#4g^5y^`bOYTa`G~us|0X!|mX;uEjGZyGc4t_%u+Qlu$OeI2)wrybkp!cVYtU&!)8G`T(%#%$RG`zC%K+T)ejuv#P8Yu>Fs z#!;e0JafcYuBjwPig+xCM!%B=$On^IJRHP(kdrKRp*d51JQD?B#8~lP@4ro`?%8Le zydLGBMQaCf21ZV!^+WU$G95aAYpm%QxeWI=wa>1s+EErckhS+^-%Z&!Xv8xjd9#Wt zj=U_0+!7e<)>4S+BEgY2`+Ik0leRgZD4@hbMDV zp~;J=RWv%5^u$@JHRfZe-UAK`I{T4IqH(MzISQM2K(1@xhdKkDQipgwgvIgUejLS; zWcg~e5A35*wO{Yn^Mn1M6(Gu3cldjCZM~G)&%drvsLHq_pS!D^%kk?hN?P4J$+^6W zX~uE0*xan~sURJK!I#n}cmnU!=u23x%54z79@xiA#y_z~@e^d%V0)s{({*2avSv#W zeIlFr?~&$U_k;vwf%%-At32m#k(2vEhDV})DeixZSI3vJc21N}qyG_~FQe|=0^}4T zl-NO9IQBY@=dJ;t>3L}|$A7h+OnZ^%F2u{ozKJ2HbV35+C7p4clY(Axs-D}+E>@@O?`en|IIxg&B4{RbVv>v zsE>H9F~ss}9kKz==o{x^j?^yG^Y9$kp8<3g~XH{;Rug7{Z z-%PcVZ|Z!&5bt~LitJQVP%g2eJ){1%QOJA{?W0~aBAk=z@m-acBPie?h_5V-;_R*@@}p?w&wCab<1Rywb7Q>v*TIqkWZ#k z_CsIPR8&)5WzY|$6C|pmFQYtAEp?lGua1AXci$qHjbsncA<3(&J$fsi!L`&kxAoaB zb|m|;n#w$7q1FCA-&Oq;e}CH?w91c4rOsvWt5}pI r)T1p&;B@{oiPawVqc$jc@S4x}UR6m_)$rbicMPeLL=rzINSN>^So`Ug 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 zcmcgw-D@0G6u${5MJV_mIF?}SL&Aypq)*9i4QV#J$!@+DgPZI}lI?D0!|tX{DX}ex z*u;RW*oQt;T5Ci^qDWEOLKP{Eh@fETi$Xy~YASuGPe!f3b7v@tjDDyeNnwzNc|DL{g;0w3reLB8#W{#Ummha=1_8IwedogI}ib znUZU>xEkVsXcH$yP((x@{{8q2izP83d{}8hN*=P~xc5phuu~fQq_FdZI1IV-au2>w ziB7D|;*A4R3)X}+u9U&=vWx_FO3NMDiZmo;aW_-8!O}fa)`smcprVMl(Xu^m z;iQ_61B!%*+{f|i2xKH7iRJ3~*AN%!3%W%&;o%KfVbqCl{k_@uMd&lHz4KMI&LLgD`ODH9_g4fc{1$qD2!DM-Il4;k0ij<4otJ2n zO7x9<{tKQlx<`TIu*~BSP#y!?`PvI?cZy8ea?A5$^dd#6wV?>uRy68)uMItPgkrGk zBWV2{{R|7PQ>MZ)Clj}5FWLs-dkgbA`Tuyvi;T3wGK_UMOXVS*nJWk690wBZ46BU{ zKh~?Od}0>sbCNZk+|tV@x0kk&Rd3NCGay7g>9^AFFH2wZhWZW)O}dVL_*?*&49f3QVh-^&@X0(= zDD#H_*3JQ)wb7y@bwKn$vJSd$(QottxZ^hMA8yBrK3VmLp<@_K(JR_TfL6{Vsh^g? z56{!=~qWV+B@2UegCcDN<^f|qQsg9Bhs$5>y-fK$o5!YhW*~ZEJJ|)xoK3)hy~nMeE$j!Rp5W3SA0MPEY9?;!FYqpq6tX5{v02Gw?j?nVAO)jk=Z9+}x(`Q5Tg zbZ%)#?#;Nbjg_=KTO^SKj2J#~@aceSBG*4Y4=muhyOV!XzRB-dUHU;SuImOGtMAcQ zuEzSPa@%QwsZPT$2agP%_2x)ph}vDlW^q*+nDP&C&ePsf9 zm6!K?9@k;yKIEcLS=Fpv_0JWkf=aaZnJ3A@=IYSe3+_19tE&mrK&$^Pz~%(Lb3Niy z*EH_;&MUTb?h|e4e7a=mjU!a8110KNdO2v-Sv?NX(WcpGnRIM*Gu#o(C{fALA491b zyQ8b#`>+*UgWNGI5qCt44d*B%`o;G+t=&i6x~9w{TFEDPvf{%DG=NHVEgq#= zbRY4Ib9Pg?%JzbO#2aNOdxvUKcW1nQE%`4a@78GV(f4vuBM9)W{dZBIvYykU@j1PS z4wO5IOnLTb%6zpudmY}}U5b9Rzn1f&d+5&A(KEcAIJZ=yD~qek9YHnE?fUCJ9q@e3 zVsvLlT3dhjdBC@`lBc`YbX8wx1M}OQtQUOJtEY)o+;T9 z29@=W_04C4`y9`exCK4#B<5z8eK_l8M(9;n-`$2ew&^+-TeEQMX$HMB&#eM95qdPv zl46j!eS9-Kf|GL0CAFt&zdbuNO^3tDv-Rp=CBx}Vl$bfx&TSZ8<(bz2V$73rofEOj 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@PkX 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 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+0{ZZv75qaXs#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~~ec9IkuoYe8Oix9IZW24ayMdgs8R2LA zi+}_wCyJU%VF6l?AlXn6tV1?z_XIJUonsqp7N%N)F=qn6e{TRqHb7OgY@Lsm)>!3B zuh`0U4Br5G%gn)|<9uYe6N+Mfo_3B!N`LF7S9V&6m-i}3i dqOIlQuy>Dz6NWk}rB0A>aS^ zd7nSO=l4AC`|m&Rh?0*bDw8rL7OtZ>D;bedIVnSOMq+sSn!GB#GJ*RMoQGswPT|cE zj-$@l7|u#|OHjU*!!jTT@ekqHFXtp8Js3F-DU*9ykkx%jUB(6D2 z7ydE4-R)>VEvW70@l*Jo2ctd=L5*aE_v6Eq?H&CBil=bWF^@JKl%5z(Y+lnH`n~h>f>L!@2??q7z?9Q z`x+gFS2b>1qVLo$X4DIA&qQ`Njy;LQnOt8u*jNIfJU`eLMj3ZgQx zk`6+ve&p`~=~PNON|E%&jq3{`@W6X3OGPEOZ(S(e%$gjYv45L)vzz%;$?jQqzwnEA z)`?;Kv-nbH4XDk@Gp!rxw>QO?;1zX4I4aCtKhv8>< zRPr^n9EbiBxFQN^lRI-`-Cgv3?vdctJOnhg*8XLCd44YM>VNd%S$MzJhOVa7!k;ew za-kLpta(PaFf4f!wwU|3q}%!N*~X2;BDMVkHL=e@Kv>9BOU1RksV(lvAo8nQOzq)! z4lmxPFWXXTaiAx!bb2|Kg+bmds3X)vilPNUp?o=7sb-oE2Sqj?k(+l%PVLLB&R z6ww!tX01m4B8rGSXH01eJNb5FYOEx`a)s$KvW{vDxyTji2ztL^WaOlC&o!+dMm~rv z?(vNB=Z9ME(`>A{yK#R{X0q&!+nRv_DXv9L-C<@{l4bCfMt(WljGwq}W}nLcFs@mX zxaK*D`xj>=Bb_~;k;!vn;y=p{N#==%?M1ilHex0}TD2cJ zL3Zhwu$EAhX+-I6f)$pLpw_x-P;b_ge9rCYbS7N3b2+lwC%3NLV`U2{GH<8ivu(*g z7dEpS{SbjXu5%#2_(MtO#g03d7EHHjW`BI|VkTS)rdjam}}JkYt(N;7|0@y4zhTF7qy2edTDNMh9Ii)Makwhr4jk7wM4*Kqdx%rcnp~F z9&-(`JcPHq1Vrjk+pebVlk5*rC~Vl)?<;Rf-LdlzVfBQ(k1X7{G9HhP#%_&_#)cRB zNItg(UJ~HE$TqUOeGrxn^%ob~Ev*>sb2t#>mXqlF0Ko82Wv29Tua1}DoL zEfWZmCh~@=-DB1B12p8F49=>mF0#^f7^TRA^>=Qq`YPXExxn)-7zc3m;B%g}j3U~F zOts=P3Wf5k0Gwdu@!L|w=Jfob)wAEM5i z*T3w52+UL@8jDYijgJnSOW@eKt<1~Z1F{a4`}PUs&zyrIahrwgS>;v>VX2Ew?P=?@ zvvzut=P@v>At$Rd{=lMG;<$UNf0YzgqNWGPJVx#_!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;rilt}2j`QUg&j={x+fvQ`q{x~hm>p^i?oyLt9913 zmQyR!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?yj7I@I1}|AFOo;=sl-605dB z8rBFbsXfywd#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 zcmeI1TTdHD6vyYeQoq9rMNJ|V6!kHEh*F>g1p?)gR25QW%;Gp08`&60s(#`=^c%GO z|K@m@o%LP}v{fG>%a`4qIrsBF=ZydQ^Lv-MA6?&#-Naq$cVFL`J8`)?bsaZ#1Ks`F zedV^?NY^L&?zo}r=}AYQx!*g`cjlJdBloL&SeOP)V6AnW|@iFUHPt9^aX3;Fw!Z=kE*OnQ@ge7-XkDhe9e3e(u+rkE$^%;og?-N_+Wb&7PDIJ%Z?=9WZ^YG2)^6sBFD@m=g|ukn z7}uuu>U)b|Q{oEwi*bqNiPe#O@Tp+6dMmAIf4XZ``7zQ9yGMJqNu0)($(6fhpDii< zCCPPPd5V5$lL!lj+|Biyi~)NxAqZ9?dQNnO&rWrxO4dxP&b7v(1kZ(-Ax4L?f5+1$ z7eG1k!sL4E)`d~v)sAxdy}0nbp?qF(Pu$P`_0&C|WkYrDHv1+<$o(w=mZjdw-1V(i zQ|VG|E3h03T@?+gU*Q=v@k40nCSE2(+y(h13=pM0v@7Z;eXfI=UA@dscdbcaVcb1&Kj|7u5lfow zR2LIN(II0lJT3DsR(Mg;i-W&3NHZ>#sUV+YzrxIwqO(?Ya{TIoS z%LB+-%<7T!F~o=xd`M@^-!sUM%5^^m~8F&^|%&G42jL>AnjCsAd>=?m|s%OG9l=$`&O&U_rG(` z{41OJb6a$7v~EZI*|nk!J`xA}-1W9NzO_Zb`ZV`~r7XJVc|H;nJQMXZ@gjz>ZQsWZ zSJY$lA;YN5(5AoTnSFA_n|Pt)vACfJA}>>k4@85QtHazE!XxlDU~Y_0>KuJGr~_Uh z57=f>(JN#5Vz2weuVkJ1;^{&t{IZtErq}LL{cU?B*JUNr8d`xOrVAbSmF{ERvRy(i zvS^gIOTS30A4(1?M#m$2tf~|5yT1D z)WFkA^Db1qa{ty9Et?M~;vXg{(2P0i;dLZXFZP*XO1n!Qzw;RRL7p}grE*Y*i*)1s z7p&ir7TA@(ob`)j@FEgFByK`q5vPo6$!1tg7f~Mv)ht>-pT*ZII`Se>%Th?60sX`hC%hOVJo z>xnlS1gW83=FZvL8=d5A`N@1;zk@8$s_Pm82dFdO#ICtKt=%Up?po`b;;dLB7U{44 zAK6iq`rpiu`O3`9Nmu(NH!^?jT%8-1iS5x}oas5CwW%YXzSq~<;uODnyOaM7$hFBr zvqIblG8u}2S4G4qcV(Q#fGy!vkZzrm*)<^)eFCRYbP2=<`V%kU%B5b^$)291Cjsz7 zX0us}v&DZR>TR)BpkR|}IDLxtSR_lFbU$84J&t@az@$9|&9dgzL+!2N2} zUamMPn?G3$*lZn%Nf;&wn>?suaVDygg%w@jzx}RX)IY;*keu3MS$-iZ)B}8nf5SQL z^V`WkoZ#6%NyYPkv{S;PpY;xu%P~~$jOOv&>IeT^)O#HaOgpaw@np}oG+?%EK975) j-B^Q&Mb^+8H1#@dooL7n^ZP`-Gq!|2^JNv9hI;rnW!vD| 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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 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_5 ze43V3dtF8-ht}K7(zJ648TC2uanErs<<8Xn#^kV%4TQXe5aW{LGUpeDCglFz)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*bgetChildByName("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 d1359daad4..b1262c3e5e 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 34df1e06ae..150bf276a1 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 ccf63b3285..3ad26b703a 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 7a8497aa2e..924b27a24c 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 c6c0fb21a8..2717c44415 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& 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("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 ca1c527cb2..c0af06f480 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -65,7 +65,7 @@ public: const std::string& name, const LLRect& rect, const std::string& sample, - const std::string& help, + const std::string& help_url, const LLHandle& floater_handle, void (*load_callback)(void* userdata), void (*save_callback)(void* userdata, BOOL close_after_save), @@ -132,7 +132,7 @@ protected: 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 4f98c3b524..1f1e56fce8 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 7c78a26367..7f9ba3206c 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 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 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 d8a8bba08c..288c501b59 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 978d70c646..875b3ccbf7 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -51,7 +51,6 @@ class ViewerManifest(LLManifest): 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 @@ class ViewerManifest(LLManifest): 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 @@ class WindowsManifest(ViewerManifest): "%%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 @@ class DarwinManifest(ViewerManifest): 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 f849e4e9ad..4bd07ead96 100644 --- a/indra/win_updater/updater.cpp +++ b/indra/win_updater/updater.cpp @@ -30,7 +30,7 @@ */ // -// Usage: updater -url [-name ] [-program ] [-silent] +// Usage: updater -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; }