Login

Subversion Repositories NedoOS

Rev

Rev 1995 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

    module Gopher
; HL - gopher row
extractRequest:
    ld hl, historyBlock.locator
    ld de, requestbuffer
.loop
    ld a, (hl)
    ld (de), a
    inc hl
    inc de
    cp 0
    jr z, .search
    jr .loop
.search
    dec de
    ld a, (historyBlock.mediaType)
    cp MIME_INPUT
    jr nz, .exit
    ld hl, historyBlock.search
    ld a, TAB
    ld (de), a
    inc de
.searchCopy
    ld a, (hl)
    and a : jr z, .exit
    ld (de), a
    inc hl : inc de
    jr .searchCopy
.exit
    ld a, CR : ld (de), a : inc de
    ld a, LF : ld (de), a : inc de
    xor a
    ld (de), a
    ret


makeRequest:
    call TcpIP.closeAll
    call extractRequest
    ld de, historyBlock.port
    call atohl
    ld (.port + 1), hl

    ld hl, historyBlock.host
    call TcpIP.resolveIp
    jp nc, .error
.port  
    ld bc, #beaf
    call TcpIP.openTcp
    jp nz, .error

    ld a, b
    ld (socket), a

    ld de, requestbuffer
    push de
    call strlen
    pop de
    ld a, (socket)
    call TcpIP.sendTCP
    or a
    ret
.error
    scf
    ret

loadBuffer:
    ld hl, outputBuffer
    ld (.pointer), hl
.loop
    ld a, (socket)
    call TcpIP.stateTcp
    and a : ret nz ; If there some error
    ld a, h : or l : jr nz, .getPacket ; if there some data
    ld a, b : cp 4 : ret nz ; If there no established status
    jr .loop
.getPacket
    ld hl, TCP_BUF_SIZE
    ld a, (socket)
    call TcpIP.recvTCP
    push bc
        ld hl, (.pointer)
        add hl, bc : ld a, h : cp #c0 : jp nc, .skiploop
        ld de, (.pointer), hl, TcpIP.tcpBuff
        ldir
    pop bc
    ld hl, (.pointer)
    add hl, bc
    ld (.pointer), hl
    jp .loop
.skiploop
    pop bc
    call TcpIP.closeAll
    jp .loop
.pointer dw outputBuffer

download:
    ld de, historyBlock.locator
    ld hl, de
.findFileName
    ld a, (de) : inc de
    cp '/' : jr nz, .skip
    ld hl, de
.skip
    and a : jr nz, .findFileName
.copy
    ;; HL - filename pointer
    ld de, DialogBox.inputBuffer
.copyFileName
    ld a, (hl) : and a : jr z, .finishCopy

    ld (de), a : inc hl, de
    jr .copyFileName
.finishCopy
    ld (de), a
    call DialogBox.inputBox.noclear
    ld a, (DialogBox.inputBuffer) : and a : jp z, History.back
   
    call makeRequest : jp c, Fetcher.fetchFromNet.error

    ld a, FMODE_NO_READ, b, ATTR_NOTHING, de, DialogBox.inputBuffer
    call Dos.fcreate
    and a : jr nz, .error
    ld a, b : ld (.fp), a
    ld hl, .progress : call DialogBox.msgNoWait
.loop
    ld a, (socket)
    call TcpIP.stateTcp
    and a : jp nz, .exit ; If there some error
    ld a, h : or l : jr nz, .getPacket ; if there some data
    ld a, b : cp 4 : jp nz, .exit ; If there no established status
    jr .loop
.getPacket
    call pulsing
    ld hl, 512
    ld a, (socket)
    call TcpIP.recvTCP
    ld hl, bc, a, (.fp), b, a, de, TcpIP.tcpBuff
    call Dos.fwrite
    jp .loop
.exit
    ld a, (.fp), b, a
    call Dos.fclose
    call TcpIP.closeAll
    jp History.back
.error
    ld a, (.fp), b, a
    call Dos.fclose
    call TcpIP.closeAll
    ld hl, .err
    call DialogBox.msgBox
    jp History.back
.err db "Operation failed! Sorry! Check filename or disk space!",0
.progress db "Downloading in progress! Wait a bit!", 0
.fp db 0

socket db 0
pulsator db " "
pulsing
    push de
    ld de, #0B01 : call TextMode.gotoXY
    ld a, (pulsator)
    cp '*'
    jp z, printasterix
    ld a, '*'
    ld (pulsator),a
    ld a,' '
    call TextMode.putC
    pop de
    ret
printasterix
    ld a, ' '
    ld (pulsator),a
    ld a,'*'
    call TextMode.putC
    pop de
    ret

requestbuffer ds #1ff
    endmodule