Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

[REBOL] ANN: Non-blocking downloader - beta

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 ]