Rebol Programming/read-thru

From Wikibooks, open books for an open world
Jump to navigation Jump to search

USAGE:[edit | edit source]

READ-THRU url /progress callback /update /expand /check info /to local-file 

DESCRIPTION:[edit | edit source]

Read a net file from thru the disk cache. Returns binary, else none on error.

READ-THRU is a function value.

ARGUMENTS[edit | edit source]

  • url -- (Type: url file)

REFINEMENTS[edit | edit source]

  • /progress
    • callback -- Call func [total bytes] during transfer. Return true. (Type: any)
  • /update -- Force update from source site
  • /expand -- Auto-decompress after transfer.
  • /check -- Update only if version, checksum/secure, or date/size do not match.
    • info -- (Type: any)
  • /to -- Specify a file target, not cache.
    • local-file -- (Type: file none)

SOURCE CODE[edit | edit source]

read-thru: func [
    {Read a net file from thru the disk cache. Returns binary, else none on error.} 
    url [url! file!] 
    /progress callback {Call func [total bytes] during transfer.  Return true.} 
    /update "Force update from source site" 
    /expand "Auto-decompress after transfer." 
    /check {Update only if version, checksum/secure, or date/size do not match.} info 
    /to "Specify a file target, not cache." local-file [file! none!] 
    /local file data purl loc-path
][
    vbug ['read-thru url info update] 
    if none? file: path-thru url [return none] 
    if local-file [file: local-file] 
    if all [not update exists-thru?/check file info] [
        if error? try [data: read/binary file] [return none] 
        return data
    ] 
    if file? url [
        return attempt [read/binary url]
    ] 
    loc-path: first split-path file 
    if data: read-net/progress url :callback [
        if not exists? loc-path [
            if error? try [make-dir/deep loc-path] [return none]
        ] 
        if all [expand find/match data "rebpress"] [
            if error? try [data: decompress skip data 8] [return none]
        ] 
        write/binary file data 
        if all [check block? info info/2] [
            error? try [set-modes file [modification-date: info/2]]
        ]
    ] 
    vbug ['read-thru-ok? found? data] 
    data
]