ANN: Non-blocking downloader - beta
[1/1] from: rebol-list2::seznam::cz at: 20-Dec-2002 20:08
Hello rebol-list,
maybe someone will be interested in this non-finished script:)
(requires the beta version of the View!)
all comments/improvements what it should be able to do are welcome
=( Oliva David )=======================( [oliva--david--seznam--cz] )==
=( Earth/Europe/Czech_Republic/Brno )=============================
=( coords: [lat: 49.22 long: 16.67] )=============================
-- Attached file included as plaintext by Listar --
-- File: nb-downloader.r
rebol [
title: "Non-blocking downloader"
author: "Oldes"
email: [oliva--david--seznam--cz]
purpose: {To have possibility to download more files at once without blocking}
note: {This is just a test}
version: 0.0.1
needs: [View 1.2.8]
]
view/new center-face lay: layout [
style d-progress progress 200x14 150.165.145 edge [size: 1x1 color: black] with [
colors: [248.172.3 217.51.51]
color: 0.0.0
feel: make object! [
redraw: func [face act pos][
face/data: max 0 min 1 face/data
if face/data <> face/state [
either face/size/x > face/size/y [
face/pane/1/size/x: max 1 face/data * face/size/x
] [
face/pane/1/size/y: max 1 face/data * face/size/y
face/pane/1/offset: face/size - face/pane/1/size
]
face/state: face/data
show face/pane
]
]
detect: none
over: none
engage: none
]
init: [
pane: reduce [
make bar []
make face [
font: make face/font [ size: 9 ]
edge: none
color: none
]
]
pane/1/size: pane/2/size: size
either size/x > size/y [pane/1/size/x: 1] [pane/1/size/y: 1]
if colors [color: first colors pane/1/color: second colors]
]
]
prog1: d-progress
prog2: d-progress
prog3: d-progress
button "test" [
print now
]
]
onViewClose: func [f e][if e/type = 'close [close-all-ports] e]
if none? find system/view/screen-face/feel/event-funcs :onViewClose [
insert-event-func :onViewClose
]
download-handler: func[port /local bytes ud][
clear port/state/inBuffer
bytes: read-io port/sub-port port/state/inBuffer 10000
ud: port/user-data
ud/bytes-loaded: ud/bytes-loaded + bytes
ud/txtout/pane/2/text: reform [ud/bytes-loaded " / " ud/bytes-total ]
ud/txtout/data: either "?" = ud/bytes-total [0][
ud/bytes-loaded / (max 1 ud/bytes-total)
]
either bytes = 0 [
print "loaded"
close-port port
error? try [set-modes ud/target [modification-date: port/date]]
ud/txtout/pane/1/color: 0.255.0
ud/txtout/data: 1
][
insert ud/target port/state/inBuffer
]
show lay
]
newdownload: func[src targ txttest /local src-port][
if error? try [
src-port: open/direct/binary/no-wait src
][
return false
]
;set-modes src-port [async-modes: [read]]
src-port/state/inBuffer: make binary! 10000
src-port/user-data: make object! [
type: 'download
target: open/direct/new/binary targ
txtout: :txttest
bytes-loaded: 0
bytes-total: either none? src-port/locals/headers/content-length ["?"][load src-port/locals/headers/content-length]
]
append waitlist src-port
append port-handlers src-port
repend/only port-handlers [:download-handler now 0:0:10]
src-port
]
check-for-timeouts: func[][
foreach [port port-h] port-handlers [
if (port-h/2 + port-h/3) < now [
print "timeout"
close-port port
]
]
]
close-port: func[port][
remove find waitlist port
remove/part find port-handlers port 2
error? try [close port/user-data/target]
close port
]
close-all-ports: func[][
foreach [port port-h] port-handlers [
close-port port
]
]
waitlist: make block! [0:0:01]
port-handlers: make block! []
;place your files here:
newdownload http://127.0.0.1:81/noviny/noviny-04-2002.pdf %/d/test/noviny-04-2002a.pdf
prog1
newdownload http://127.0.0.1:90/cebus/noviny/noviny-04-2002.pdf %/d/test/noviny-04-2002b.pdf
prog2
newdownload http://127.0.0.1/cgi-bin/probecgi.r %/d/test/pokus.txt prog3
if error? err: try [
forever [
either none? ready-ports: wait/all waitlist [
prin #"#"
][
foreach port ready-ports [
either not none? port-h: select port-handlers port [
port-h/1 port
port-h/2: now
][ prin #"X"]
]
]
check-for-timeouts
]
][
probe disarm err
close-all-ports
]