emailler/ip65/download.s
Oliver Schmidt 41de6a76bd Allow URLs and URL selectors > 255 chars.
Note: The URL selector is stored in the output_buffer - which is currently 520 bytes. Beside all of the URL (apart from a potential "http://") the 'get' and the 'http_preamble' have to fit into that buffer. Therefore URLs mustn't exceed 450 chars. However, we omit a check to avoid further code size increase as most of the time URLs are known to be much shorter anyhow. If the URLs might become large we just leave it up to the user to check their length.
2018-10-30 22:02:47 +01:00

197 lines
4.8 KiB
ArmAsm

; routine for downloading a URL
.include "zeropage.inc"
.include "../inc/common.inc"
TIMEOUT_SECONDS = 15
.importzp copy_src
.importzp copy_dest
.import copymem
.import timer_read
.import ip65_process
.import tcp_connect
.import tcp_send_string
.import tcp_send_data_len
.import tcp_callback
.import tcp_close
.import tcp_connect_ip
.import tcp_inbound_data_length
.import tcp_inbound_data_ptr
.import url_ip
.import url_port
.import url_selector
.import url_parse
.export url_download
.export url_download_buffer
.export url_download_buffer_length
.export resource_download
.export resource_buffer
.bss
src_ptr: .res 1
dest_ptr: .res 1
timeout_counter: .res 1
url_download_buffer: .res 2 ; points to a buffer that url will be downloaded into
url_download_buffer_length: .res 2 ; length of buffer that url will be downloaded into
resource_buffer: .res 2
resource_buffer_length: .res 2
download_flag: .res 1
.code
; download a resource specified by an URL
; caution - the selector built from the URL must fit into the output_buffer !!!
; inputs:
; AX = address of URL string
; url_download_buffer - points to a buffer that url will be downloaded into
; url_download_buffer_length - length of buffer
; outputs:
; sec if an error occured, else buffer pointed at by url_download_buffer is filled with contents
; of specified resource (with an extra 2 null bytes at the end),
; AX = length of resource downloaded.
url_download:
jsr url_parse
bcc resource_download
rts
; download a resource specified by ip,port & selector
; inputs:
; url_ip = ip address of host to connect to
; url_port = port number of to connect to
; url_selector= address of selector to send to host after connecting
; url_download_buffer - points to a buffer that url will be downloaded into
; url_download_buffer_length - length of buffer
; outputs:
; sec if an error occured, else buffer pointed at by url_download_buffer is filled with contents
; of specified resource (with an extra 2 null bytes at the end).
resource_download:
ldax url_download_buffer
stax resource_buffer
ldax url_download_buffer_length
stax resource_buffer_length
jsr put_zero_at_end_of_dl_buffer
ldx #3 ; save IP address just retrieved
: lda url_ip,x
sta tcp_connect_ip,x
dex
bpl :-
ldax #url_download_callback
stax tcp_callback
ldax url_port
jsr tcp_connect
bcs @error
; connected, now send the selector
ldx #0
stx download_flag
ldax url_selector
jsr tcp_send_string
jsr timer_read
txa
adc #TIMEOUT_SECONDS*4 ; what value should trigger the timeout?
sta timeout_counter
; now loop until we're done
@download_loop:
jsr ip65_process
jsr timer_read
cpx timeout_counter
beq @timeout
lda download_flag
beq @download_loop
@timeout:
jsr tcp_close
clc
@error:
rts
url_download_callback:
lda tcp_inbound_data_length+1
cmp #$ff
bne not_end_of_file
@end_of_file:
lda #1
sta download_flag
put_zero_at_end_of_dl_buffer:
; put a zero byte at the end of the file
ldax resource_buffer
stax ptr2
lda #0
tay
sta (ptr2),y
rts
not_end_of_file:
; copy this chunk to our input buffer
ldax resource_buffer
stax copy_dest
ldax tcp_inbound_data_ptr
stax copy_src
sec
lda resource_buffer_length
sbc tcp_inbound_data_length
pha
lda resource_buffer_length+1
sbc tcp_inbound_data_length+1
bcc @would_overflow_buffer
sta resource_buffer_length+1
pla
sta resource_buffer_length
ldax tcp_inbound_data_length
jsr copymem
; increment the pointer into the input buffer
clc
lda resource_buffer
adc tcp_inbound_data_length
sta resource_buffer
lda resource_buffer+1
adc tcp_inbound_data_length+1
sta resource_buffer+1
jmp put_zero_at_end_of_dl_buffer
@would_overflow_buffer:
pla ; clean up the stack
ldax resource_buffer_length
jsr copymem
lda resource_buffer
adc resource_buffer_length
sta resource_buffer
lda resource_buffer+1
adc resource_buffer_length+1
sta resource_buffer+1
lda #0
sta resource_buffer_length
sta resource_buffer_length+1
jmp put_zero_at_end_of_dl_buffer
; -- LICENSE FOR download.s --
; The contents of this file are subject to the Mozilla Public License
; Version 1.1 (the "License"); you may not use this file except in
; compliance with the License. You may obtain a copy of the License at
; http://www.mozilla.org/MPL/
;
; Software distributed under the License is distributed on an "AS IS"
; basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
; License for the specific language governing rights and limitations
; under the License.
;
; The Original Code is ip65.
;
; The Initial Developer of the Original Code is Jonno Downes,
; jonno@jamtronix.com.
; Portions created by the Initial Developer are Copyright (C) 2009
; Jonno Downes. All Rights Reserved.
; -- LICENSE END --