# ========================== # NSISdl.nsh # Simple download macros # by Afrow UK # # Uses NSISdl - # (see Contrib\NSISdl\) # ========================== # You can enter multiple urls; if the 1st url is down, then next url is tried and so on. # Creates save-to dir before hand (else NSISdl fails) # Success/error/cancelled messages (saves a bit of code). # Error description 'Download failed ("$R0")', where $R0 is error message generated by NSISdl. # Exch's success to stack for success, cancel for cancel (like NSISdl itself). # Timeout/silent # instermacro chunk "" = don't use (e.g. "" success message = don't display success message) # instermacro error msg "" = use default / "none" = don't display error msg # NSISdl base macro ; !insertmacro manage_NSISdl [timeout] [silent] [dest_dir] [dest_file] [success_msg] [cancel_msg] [error_msg] # NSISdl jump-to macro ; !insertmacro jumpto_NSISdl [timeout] [silent] [dest_dir] [dest_file] [success_jump-to] [cancel_jump-to] [error_jump-to] # NSISdl macro ; !insertmacro NSISdl [timeout] [silent] [dest_dir] [dest_file] # > Usage 1: #; !define success_msg "Download of downloaded.zip was successful!" # ; Section MyDownloadFunc # ; !insertmacro URLS_START ; Push "http://www.ja.co.uk/myzip.zip" ;url1 ; Push "http://www.lo.co.uk/backup.zip" ;url2 ; Push "http://www.blah.co.uk/bahh.zip" ;url3 ; !insertmacro URLS_END # ; Push $R0 ; Push $R1 ; !insertmacro manage_NSISdl "" silent "$INSTDIR\downloaded" "downloaded.zip" "${success_msg}" "" "none" ; Pop $R1 ; Pop $R0 # ; SectionEnd # # > Usage 2: #; !define cancel_msg "Download cancelled, download again?" #; !define error_msg "Error!" # ; Section MyDownloadFunc # ; !insertmacro URLS_START ; Push "http://www.ja.co.uk/myzip.zip" ;url1 ; Push "http://www.lo.co.uk/backup.zip" ;url2 ; !insertmacro URLS_END # ; Push $R0 ; Push $R1 ; !insertmacro manage_NSISdl 5000 "" "$INSTDIR\downloaded" "downloaded.zip" "" "${cancel_msg}" "${error_msg}" ; Pop $R1 ; Pop $R0 # ; SectionEnd # # > Usage 3: ; Section MyDownloadFunc # ; !insertmacro URLS_START ; Push "http://www.ja.co.uk/myzip.zip" ;url1 ; Push "http://www.lo.co.uk/backup.zip" ;url2 ; !insertmacro URLS_END # ; Push $R0 ; Push $R1 ; !insertmacro jumpto_NSISdl "" "" "$INSTDIR\downloaded" "downloaded.zip" "success" "cancelled" "error" ; success: ; DetailPrint "Download successfull" ; Goto done ; cancelled: ; DetailPrint "Download cancelled, installation will abort in 15 seconds" ; Sleep 15000 ; Quit ; error: ; DetailPrint "Download error" ; done: ; Pop $R1 ; Pop $R0 # ; SectionEnd # # > Usage 4: # ; Section MyDownloadFunc # ; !insertmacro URLS_START ; Push "http://www.ja.co.uk/myzip.zip" ;url1 ; Push "http://www.lo.co.uk/backup.zip" ;url2 ; !insertmacro URLS_END # ; !insertmacro NSISdl 10000 "" "$INSTDIR\downloaded" "downloaded.zip" ; Pop $R0 ; StrCmp $R0 success +3 ; MessageBox MB_OK "$R0" ;$R0 = description of error ; Abort ; MessageBox MB_OK "Download of downloaded.zip was successful!" # ; SectionEnd # # The manage-macro # ===================== !macro manage_NSISdl DL_TIMEOUT DL_SILENT DL_DESTDIR DL_DESTFILE DL_SUCCESSMSG DL_CANCELMSG DL_ERRORMSG Push $R0 ;save top_${DL_DESTDIR}${DL_DESTFILE}: !insertmacro NSISdl "${DL_TIMEOUT}" "${DL_SILENT}" "${DL_DESTDIR}" "${DL_DESTFILE}" Pop $R0 StrCmp $R0 success +9 StrCmp $R0 cancel +6 StrCmp "${DL_ERRORMSG}" none +9 StrCmp "${DL_ERRORMSG}" "" +2 StrCpy $R0 "${DL_ERRORMSG}" MessageBox MB_RETRYCANCEL|MB_ICONSTOP "$R0" IDRETRY top_${DL_DESTDIR}${DL_DESTFILE} ;$R0 = description of error Abort StrCmp ${DL_CANCELMSG} "" +2 MessageBox MB_YESNO|MB_ICONINFORMATION "${DL_CANCELMSG}" IDYES top_${DL_DESTDIR}${DL_DESTFILE} IDNO +3 StrCmp ${DL_SUCCESSMSG} "" +2 MessageBox MB_OK|MB_ICONINFORMATION "${DL_SUCCESSMSG}" Pop $R0 ;restore !macroend # ===================== # end # The jumpto-macro (uses $R0) # ===================== !macro jumpto_NSISdl DL_TIMEOUT DL_SILENT DL_DESTDIR DL_DESTFILE DL_SUCCESSLABEL DL_CANCELLABEL DL_ERRORLABEL !insertmacro NSISdl "${DL_TIMEOUT}" "${DL_SILENT}" "${DL_DESTDIR}" "${DL_DESTFILE}" Pop $R0 StrCmp $R0 success "${DL_SUCCESSLABEL}" StrCmp $R0 cancel "${DL_CANCELLABEL}" Goto "${DL_ERRORLABEL}" !macroend # ===================== # end # The main macro # ===================== !macro NSISdl DL_TIMEOUT DL_SILENT DL_DESTDIR DL_DESTFILE IfFileExists "${DL_DESTDIR}\*.*" +2 CreateDirectory "${DL_DESTDIR}" pop_${DL_DESTDIR}${DL_DESTFILE}: Pop $R0 StrCmp $R0 "" pop_${DL_DESTDIR}${DL_DESTFILE} loop_${DL_DESTDIR}${DL_DESTFILE}: Pop $R0 StrCmp $R0 "urls_start" error_${DL_DESTDIR}${DL_DESTFILE} StrCmp "${DL_SILENT}${DL_TIMEOUT}" "silent" quiet_${DL_DESTDIR}${DL_DESTFILE} StrCmp "${DL_SILENT}${DL_TIMEOUT}" "" 0 quiet_timeout_${DL_DESTDIR}${DL_DESTFILE} NSISdl::download $R0 "${DL_DESTDIR}\${DL_DESTFILE}" Pop $R1 StrCmp $R1 success exit_${DL_DESTDIR}${DL_DESTFILE} StrCmp $R1 cancel cancel_${DL_DESTDIR}${DL_DESTFILE} Goto loop_${DL_DESTDIR}${DL_DESTFILE} quiet_${DL_DESTDIR}${DL_DESTFILE}: NSISdl::download_quiet $R0 "${DL_DESTDIR}\${DL_DESTFILE}" Pop $R1 StrCmp $R1 success exit_${DL_DESTDIR}${DL_DESTFILE} StrCmp $R1 cancel cancel_${DL_DESTDIR}${DL_DESTFILE} Goto loop_${DL_DESTDIR}${DL_DESTFILE} quiet_timeout_${DL_DESTDIR}${DL_DESTFILE}: NSISdl::download_quiet /TIMEOUT=${DL_TIMEOUT} $R0 "${DL_DESTDIR}${DL_DESTFILE}" Pop $R1 StrCmp $R1 success exit_${DL_DESTDIR}${DL_DESTFILE} StrCmp $R1 cancel cancel_${DL_DESTDIR}${DL_DESTFILE} Goto loop_${DL_DESTDIR}${DL_DESTFILE} cancel_${DL_DESTDIR}${DL_DESTFILE}: StrCpy $R1 cancel Goto exit_${DL_DESTDIR}${DL_DESTFILE} error_${DL_DESTDIR}${DL_DESTFILE}: StrCpy $R1 'Failed ("$R1")' exit_${DL_DESTDIR}${DL_DESTFILE}: StrCpy $R0 $R1 Push $R0 Exch $R0 !macroend # ===================== # end # Start URLS list # ===================== !macro URLS_START Push "urls_start" !macroend # ===================== # end # End URLS list # ===================== !macro URLS_END Push "urls_end" !macroend # ===================== # end ;eof