Download Using Mirrors

From NSIS Wiki
Jump to navigationJump to search
Author: deguix (talk, contrib)


Description

Requires: NSISdl Plugin.

Function to download files from internet with mirrors support. Needs internet connection to be established first.

Function Call

InitPluginsDir ; Initialize $PLUGINSDIR (only if you didn't do it before)
Push "[Path\]FileName.ext" ; File to be renamed
Push $0
GetFunctionAddress $0 "CustomFunction" ; Custom function name
Exch $0
Call NSISDownload
Pop $0 ; Result (last error, "cancel", "success" or "download incompleted")

How to use Callback Function

  • You have first to push "Stop" or the mirror site and then push the timeout or nothing. You have to put StrCmp commands to assign each try to the address to download (like the first one to http://www.mysite.com/file.zip and the second one to ftp://ftp.mysite.com/file.zip) and the last try has to contain the "Stop" push to make the function return.
  • Do not push values on the stack without poping them later unless it's the return value.
  • You can use any variables, but the $R0 - $R5 contains function results.
  • See an example to "How to use callback function"

Function Code

;----------------------------------------------------------------------------
; Title             : Download using mirrors
; Short Name        : NSISDownload
; Last Changed      : 22/Feb/2005
; Code Type         : Function
; Code Sub-Type     : Callback Dependant
;----------------------------------------------------------------------------
; Description       : Downloads files from internet with mirrors support.
;                     Needs internet connection to be established first.
;----------------------------------------------------------------------------
; Function Call     : Call NSISDownload
;----------------------------------------------------------------------------
; Callback Variables: $R0 ;Mirror number.
; Callback Pushes   : Push "URL"
;                       Determines which url should NSISdl download.
;
;                     Push "(Stop|Go)"
;                       Normal callback push.
;----------------------------------------------------------------------------
; Author            : Diego Pedroso
; Author Reg. Name  : deguix
;----------------------------------------------------------------------------
 
Function NSISDownload
  # Push Variables
 
  Push $R0
  Push $R1
  Push $R2
  Push $R3
  Push $R4
  Exch 5
  Exch $R5 #Custom Function
  Exch 5
  Push $R6
  Push $R7
  Push $R8
  Push $R9
  StrCpy $R9 $R5
 
  # Detect Mirror Number
 
  ReadINIStr $R0 "$PLUGINSDIR\ars7923.ini" "MIRRORS" "NUMBER"
 
  IntOp $R0 $R0 + 1
 
  StrCmp $R0 "" 0 +2
    StrCpy $R0 1
 
  WriteINIStr "$PLUGINSDIR\ars7923.ini" "MIRRORS" "NUMBER" "$R0"
 
  # Call Custom Function
 
  StrCpy $R8 ""
  StrCpy $R7 ""
  StrCpy $R6 ""
  StrCpy $R5 ""
  StrCpy $R4 ""
  StrCpy $R3 ""
  StrCpy $R2 ""
  StrCpy $R1 ""
 
  Push $R9
 
  Call $R9
 
  Exch 3
  Pop $R9
  Exch 3
  Pop $R8
  Exch 3
  Pop $R7
  Exch 3
  Pop $R6
  Exch 3
  Pop $R4
  Exch 3
  Pop $R3
  Exch 3
  Pop $R2
  Exch 3
  Pop $R1
  Exch 3
  Pop $R0
  Exch 3
  Pop $R5
 
  Exch
  Exch 3
  Exch 2
 
  # Prepare Variables
 
  Push $R3
  Push $R2
  Exch 2
  Exch $R4 # TimeOut
  Exch 2
  Exch 5
  Exch $R5 # Function
  Exch 5
  Exch 4
  Exch $R1 # Name to Rename
  Exch 4
  Exch 3
  Exch $R0 # Link
  Exch 3
  Exch 2
  Exch
  Exch 5
  Exch 5
  Exch 2
  Exch 3
  Exch 5
 
  # Detect Stop Messages
 
  StrCmp $R0 "" +2
  StrCmp $R0 "stop" 0 NoError
    StrCpy $R0 "error"
    Goto End
  NoError:
 
  # Getting URL important part:
 
  Push $R0
  Push $R1
  Push $R2
  Push $R3
  Push $R4
 
  StrCpy $R1 0
  StrLen $R2 $R0
 
  NameLoop:
    IntOp $R1 $R1 + 1
    IntCmp $R1 $R2 NameDone 0 NameDone
    StrCpy $R3 $R0 1 -$R1
    StrCmp $R3 "\" NameDone
    StrCmp $R3 "/" NameDone
    Goto NameLoop
 
  NameDone:
    IntOp $R1 $R1 - 1
    StrCpy $R4 $R0 "" "-$R1"
 
  StrCpy $R1 $R0
  StrCpy $R2 0
  URLLoop:
    StrCpy $R3 $R1 3 $R2
    StrCmp $R3 :// URLDone
    StrCmp $R3 "" URLDone
    IntOp $R2 $R2 + 1
    Goto URLLoop
  URLDone:
  IntOp $R2 $R2 + 3
  StrCpy $R0 $R1 "" $R2
 
  StrCpy $R1 $R0
  StrCpy $R2 0
 
  URLLoop2:
    StrCpy $R3 $R1 1 $R2
    StrCmp $R3 / URLDone2
    StrCmp $R3 "" URLDone2
    IntOp $R2 $R2 + 1
    Goto URLLoop2
  URLDone2:
  StrCpy $R0 $R1 $R2
 
  Exch
  Pop $R3
  Exch
  Pop $R2
  Exch
  Pop $R1
 
  # Send "Downloading" Message
 
  ReadINIStr $R3 "$PLUGINSDIR\ars7923.ini" "MIRRORS" "NUMBER"
 
  StrCmp $R3 1 0 Mirrors
    DetailPrint "Downloading $R4 from: $R0"
    Goto Download
 
  Mirrors:
 
  IntOp $R3 $R3 - 1
  ReadINIStr $R2 "$PLUGINSDIR\ars7923.ini" "MIRRORS" "TRY"
 
  StrCmp $R2 1 0 +3
    WriteINIStr "$PLUGINSDIR\ars7923.ini" "MIRRORS" "TRY" "0"
    DetailPrint "Downloading $R4 from mirror $R3: $R0"
 
  IntOp $R3 $R3 + 1
 
  Pop $R4
  Pop $R0
 
  # Start Download
 
  Download:
 
  IntCmpU $R4 "" 0 WithTIMEOUT
    NSISdl::download "$R0" "$R1"
    Goto ExitTIMEOUT
  WithTIMEOUT:
 
  NSISdl::download /TIMEOUT=$R4 "$R0" "$R1"
  ExitTIMEOUT:
 
  Pop $R0
 
  # Verify Download Results
 
  StrCmp $R0 "success" 0 +3
    DetailPrint "Download Completed"
    Goto End
 
  StrCmp $R0 "cancel" 0 +3
    DetailPrint "Download Canceled"
    Goto End
 
  StrCmp $R0 "download incompleted" 0 +3
    DetailPrint "Download Incompleted"
    Goto End
 
  DetailPrint "Download Error: $R0"
  DetailPrint ""
 
  # Next Mirror
 
  WriteINIStr "$PLUGINSDIR\ars7923.ini" "MIRRORS" "TRY" "1"
 
  Push $R1
  Push $R5
 
  Exch 2
  Pop $R5
  Exch 2
  Pop $R4
  Exch 2
  Pop $R3
  Exch 2
  Pop $R2
  Exch 2
  Pop $R1
  Exch 2
  Pop $R0
 
  Call NSISDownload
  Pop $R0
 
  Goto AfterAll
 
  End:
 
  # Pop variables, after a stop, cancel, or completed message
 
  SetDetailsPrint None
  Delete "$PLUGINSDIR\ars7923.ini"
  SetDetailsPrint Both
 
  Exch 2
  Pop $R5
  Exch 2
  Pop $R4
  Exch 2
  Pop $R3
  Exch 2
  Pop $R2
  Exch 2
  Pop $R1
  Exch 2
  Exch $R0
 
  AfterAll:
 
FunctionEnd

Callback Function Example

 Function DownloadNSIS
   StrCmp $R0 1 0 +3
     Push "http://unc.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 2 0 +3
     Push "http://jaist.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 3 0 +3
     Push "http://heanet.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 4 0 +3
     Push "http://puzzle.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 5 0 +3
     Push "http://optusnet.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 6 0 +3
     Push "http://internap.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 7 0 +3
     Push "http://kent.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 8 0 +3
     Push "http://belnet.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 9 0 +3
     Push "http://mesh.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 10 0 +3
     Push "http://easynews.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 11 0 +3
     Push "http://ovh.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 12 0 +3
     Push "http://voxel.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 13 0 +3
     Push "http://cogent.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 14 0 +3
     Push "http://nchc.dl.sourceforge.net/sourceforge/nsis/nsis206.exe"
     Push ""
   StrCmp $R0 15 0 +3
     Push ""
     Push ""
 FunctionEnd