diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2017-01-22 17:57:43 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-01-22 17:57:43 +0100 |
commit | 7652d15ed2097ac4db47e30cfe5ea0f547923641 (patch) | |
tree | 65a6edd71f7c0b20cef8c95a43cadbc4f09cb787 /tools | |
parent | 9952d16674445c0b92bf5df10799ca9bd6ae9199 (diff) | |
download | Nim-7652d15ed2097ac4db47e30cfe5ea0f547923641.tar.gz |
work in progress: new downloader tool for the Windows installer
Diffstat (limited to 'tools')
-rw-r--r-- | tools/downloader.nim | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/tools/downloader.nim b/tools/downloader.nim new file mode 100644 index 000000000..f0d4266f1 --- /dev/null +++ b/tools/downloader.nim @@ -0,0 +1,105 @@ + +# Test & show the new high level wrapper + +import + "../ui", asyncdispatch, httpclient, zip/zipfiles, os + +type + Actions = object + addToPath, startMenu, mingw, aporia: bool + Controls = object + apply: Button + bar: ProgressBar + lab: Label + +const arch = $(sizeof(int)*8) + +proc download(pkg: string; c: Controls) {.async.} = + c.bar.value = 0 + var client = newAsyncHttpClient() + proc onProgressChanged(total, progress, speed: BiggestInt) {.async.} = + c.lab.text = "Downloading " & pkg & " " & $(speed div 1000) & "kb/s" + c.bar.value = clamp(int(progress*100 div total), 0, 100) + + client.onProgressChanged = onProgressChanged + # XXX give a destination filename instead + let contents = await client.getContent("http://nim-lang.org/download/" & pkg & ".zip") + let z = "dist" / pkg & ".zip" + # XXX make this async somehow: + writeFile(z, contents) + c.bar.value = 100 + when false: + var a: ZipArchive + if open(a, z, fmRead): + extractAll(a, "dist") + close(a) + else: + c.lab.text = "Error: cannot open: " & z + +proc apply(a: Actions; c: Controls) {.async.} = + if a.mingw: + await download("mingw" & arch, c) + if a.aporia: + await download("aporia-0.4.0", c) + if a.startMenu: + discard "add start menu entry" + + c.apply.text = "Quit" + +proc main() = + var mainwin = newWindow("Nim installer", 640, 480, true) + mainwin.margined = true + mainwin.onClosing = (proc (): bool = return true) + + let box = newVerticalBox(true) + mainwin.setChild(box) + + var groupA = newGroup("Actions", true) + box.add(groupA, false) + var innerA = newVerticalBox(true) + groupA.child = innerA + + let cbAddToPath = newCheckbox("Add Nim to PATH") + innerA.add cbAddToPath + let cbStartMenu = newCheckbox("Create start menu entry") + innerA.add cbStartMenu + + var groupB = newGroup("Optional Components", true) + box.add(groupB, false) + var innerB = newVerticalBox(true) + groupB.child = innerB + + let cbMingw = newCheckbox("Download Mingw") + innerB.add cbMingw + + let cbAporia = newCheckbox("Download Aporia") + innerB.add cbAporia + + var c = Controls( + apply: newButton("Apply"), + bar: newProgressBar(), + lab: newLabel("")) + + innerB.add c.apply + innerB.add c.bar + innerB.add c.lab + + proc apply() = + c.apply.text = "Abort" + asyncCheck apply(Actions(addToPath: cbAddToPath.checked, + startMenu: cbStartMenu.checked, + mingw: cbMingw.checked, + aporia: cbAporia.checked), c) + + c.apply.onclick = proc () = + ui.quit() + system.quit() + + c.apply.onclick = apply + + show(mainwin) + pollingMainLoop((proc (timeout: int) = + if hasPendingOperations(): asyncdispatch.poll(timeout)), 10) + +init() +main() |