Subversion Repositories Kolibri OS

Rev

Rev 5540 | Rev 6773 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5540 Rev 5543
Line 48... Line 48...
48
        mcall   68, 11                  ; init heap so we can allocate memory dynamically
48
        mcall   68, 11                  ; init heap so we can allocate memory dynamically
Line 49... Line 49...
49
 
49
 
50
; load libraries
50
; load libraries
51
        stdcall dll.Load, @IMPORT
51
        stdcall dll.Load, @IMPORT
52
        test    eax, eax
52
        test    eax, eax
Line 53... Line 53...
53
        jnz     exit
53
        jnz     mainloop.exit
54
 
54
 
Line 55... Line 55...
55
; wanted events
55
; wanted events
Line 96... Line 96...
96
        jmp     mainloop
96
        jmp     mainloop
Line 97... Line 97...
97
 
97
 
98
  .button:
98
  .button:
99
        mcall   17      ; get id
99
        mcall   17      ; get id
100
        cmp     ah, 1   ; button id=1 ?
100
        cmp     ah, 1   ; button id=1 ?
Line 101... Line 101...
101
        je      exit
101
        je      .exit
102
 
102
 
Line 103... Line 103...
103
        cmp     [btn_text], sz_download
103
        cmp     [btn_text], sz_download
104
        je      download
104
        je      download
Line -... Line 105...
-
 
105
 
-
 
106
        cmp     [btn_text], sz_open
-
 
107
        je      open_file
105
 
108
 
106
        cmp     [btn_text], sz_open
109
  .exit:
107
        je      open_file
110
        mcall   -1      ; exit
Line -... Line 111...
-
 
111
 
108
 
112
  .mouse:
109
  .mouse:
113
        invoke  edit_box_mouse, edit1
110
        invoke  edit_box_mouse, edit1
114
        jmp     mainloop
Line 111... Line -...
111
        jmp     mainloop
-
 
112
 
-
 
113
open_file:
-
 
Line 114... Line 115...
114
;        mcall   70, ...
115
 
115
        jmp     mainloop
-
 
116
 
116
 
117
exit:
117
open_file:
118
error:
118
        mcall   70, fileopen
119
        mcall   -1      ; exit
119
        jmp     mainloop
120
 
120
 
Line 147... Line 147...
147
; invoke OpenDialog
147
; invoke OpenDialog
148
        invoke  OpenDialog_Start, OpenDialog_data
148
        invoke  OpenDialog_Start, OpenDialog_data
149
        mcall   40, EVM_REDRAW + EVM_BUTTON + EVM_STACK
149
        mcall   40, EVM_REDRAW + EVM_BUTTON + EVM_STACK
150
        call    draw_window
150
        call    draw_window
Line 151... Line 151...
151
 
151
 
152
; Create the file
152
; Create the local file
153
        mov     [fileinfo], 2           ; create/write to file
153
        mov     [fileinfo], 2           ; create/write to file
154
        xor     eax, eax
154
        xor     eax, eax
155
        mov     [fileinfo.offset], eax
155
        mov     [fileinfo.offset], eax
156
        mov     [fileinfo.offset+4], eax
156
        mov     [fileinfo.offset+4], eax
157
        mov     [fileinfo.size], eax
157
        mov     [fileinfo.size], eax
158
        mcall   70, fileinfo
158
        mcall   70, fileinfo
159
        test    eax, eax
159
        test    eax, eax
Line 160... Line 160...
160
        jnz     error                   ; TODO: print error message
160
        jnz     create_error
161
 
161
 
162
; And start the download
162
; Start the download
163
        invoke  HTTP_get, url, 0, FLAG_STREAM or FLAG_REUSE_BUFFER, 0
163
        invoke  HTTP_get, url, 0, FLAG_STREAM or FLAG_REUSE_BUFFER, 0
-
 
164
        test    eax, eax
164
        test    eax, eax
165
        jz      get_error
165
        jz      error                   ; TODO: print error message
166
 
166
        mov     [identifier], eax
167
        mov     [identifier], eax
167
        mov     [offset], 0
-
 
-
 
168
        mov     [offset], 0
168
        mov     [btn_text], sz_cancel
169
        mov     [btn_text], sz_cancel
-
 
170
        mov     [status], sz_downloading
-
 
171
        or      [edit1.flags], ed_figure_only
-
 
172
        and     [edit1.flags], not ed_focus
169
 
173
        push    [sc.work]
Line -... Line 174...
-
 
174
        pop     [edit1.color]
-
 
175
        call    draw_window
-
 
176
 
-
 
177
        jmp     download_loop
-
 
178
 
-
 
179
get_error:
-
 
180
        mov     [btn_text], sz_exit
-
 
181
        mov     [status], sz_err_http
-
 
182
        jmp     redraw
-
 
183
 
-
 
184
create_error:
-
 
185
        mov     [btn_text], sz_exit
170
        or      [edit1.flags], ed_figure_only
186
        mov     [status], sz_err_create
171
        call    draw_window
187
        jmp     redraw
172
 
188
 
173
download_loop:
189
download_loop:
174
        mcall   10
190
        mcall   10
175
        cmp     eax, EV_REDRAW
191
        cmp     eax, EV_REDRAW
Line 176... Line 192...
176
        je      .redraw
192
        je      .redraw
177
        cmp     eax, EV_BUTTON
193
        cmp     eax, EV_BUTTON
178
        je      .button
194
        je      .button
179
 
-
 
180
        invoke  HTTP_receive, [identifier]
-
 
181
        test    eax, eax
-
 
182
        jz      save_chunk
-
 
183
 
-
 
184
        mov     eax, [identifier]
-
 
185
        push    [eax + http_msg.content_length]
-
 
186
        pop     [pb.max]
-
 
187
        push    [eax + http_msg.content_received]
195
 
Line 188... Line 196...
188
        pop     [pb.value]
196
        invoke  HTTP_receive, [identifier]
189
 
197
        test    eax, eax
190
        invoke  progressbar_draw, pb
198
        jz      got_data
Line 191... Line 199...
191
        jmp     download_loop
199
        jmp     download_loop
192
 
200
 
Line 193... Line 201...
193
  .redraw:
201
  .redraw:
194
        call    draw_window
202
        call    draw_window
195
        jmp     download_loop
203
        jmp     download_loop
196
 
204
 
-
 
205
  .button:
-
 
206
        jmp     http_free
-
 
207
 
-
 
208
got_data:
-
 
209
        mov     ebp, [identifier]
-
 
210
        test    [ebp + http_msg.flags], 0xffff0000      ; error?
Line 197... Line -...
197
  .button:
-
 
198
        jmp     http_free
-
 
199
 
-
 
200
save_chunk:
-
 
201
        mov     ebp, [identifier]
211
        jnz     http_error
-
 
212
 
-
 
213
        cmp     [fileinfo], 3                           ; Did we write before?
-
 
214
        je      .write
-
 
215
 
202
        test    [ebp + http_msg.flags], 0xffff0000      ; error?
216
        test    [ebp + http_msg.flags], FLAG_CONTENT_LENGTH
203
        jnz     http_free
217
        jz      .first_write
-
 
218
 
-
 
219
        mov     eax, [ebp + http_msg.content_length]
Line -... Line 220...
-
 
220
        mov     [pb.max], eax
-
 
221
 
204
 
222
        DEBUGF  1, "new file size=%u\n", eax
205
        cmp     [fileinfo], 3
223
        mov     [fileinfo], 4                           ; set end of file
206
        je      @f
224
        mov     [fileinfo.offset], eax                  ; new file size
207
        DEBUGF  1, "new file size=%u\n", [ebp + http_msg.content_length]
225
        mcall   70, fileinfo
-
 
226
        test    eax, eax
208
        mov     [fileinfo], 4                           ; set end of file
227
        jnz     write_error
209
        mov     eax, [ebp + http_msg.content_length]
228
 
210
        mov     [fileinfo.offset], eax                  ; new file size
229
 
211
        mcall   70, fileinfo
230
  .first_write:
212
 
231
        mov     [fileinfo], 3                           ; write to existing file
213
        mov     [fileinfo], 3                           ; write to existing file
232
  .write:
214
  @@:
233
        mov     ecx, [ebp + http_msg.content_received]
-
 
234
        sub     ecx, [offset]
-
 
235
        jz      download_loop                           ; more then 0 data bytes?
-
 
236
        mov     [fileinfo.size], ecx
-
 
237
        mov     eax, [ebp + http_msg.content_ptr]
Line 215... Line 238...
215
        mov     ecx, [ebp + http_msg.content_received]
238
        mov     [fileinfo.buffer], eax
216
        sub     ecx, [offset]
239
        mov     ebx, [offset]
-
 
240
        mov     [fileinfo.offset], ebx
-
 
241
        DEBUGF  1, "Writing to disk: size=%u offset=%u\n", ecx, ebx
-
 
242
        mcall   70, fileinfo
Line 217... Line 243...
217
        mov     [fileinfo.size], ecx
243
        test    eax, eax                                ; check error code
218
        mov     eax, [ebp + http_msg.content_ptr]
244
        jnz     write_error
Line -... Line 245...
-
 
245
        cmp     ebx, ecx                                ; check if all bytes were written to disk
-
 
246
        jne     write_error
219
        mov     [fileinfo.buffer], eax
247
 
-
 
248
        mov     eax, [ebp + http_msg.content_received]
-
 
249
        mov     [offset], eax
-
 
250
        mov     [pb.value], eax
-
 
251
 
-
 
252
        invoke  progressbar_draw, pb
-
 
253
 
-
 
254
        test    [ebp + http_msg.flags], FLAG_GOT_ALL_DATA
-
 
255
        jz      download_loop
-
 
256
 
-
 
257
; Download completed successfully
-
 
258
        mov     [status], sz_complete
-
 
259
        mov     [pb.progress_color], 0x0000c800         ; green
-
 
260
        mov     [btn_text], sz_open
-
 
261
        jmp     http_free
Line 220... Line 262...
220
        mov     ebx, [offset]
262
 
221
        mov     [fileinfo.offset], ebx
263
write_error:
222
        DEBUGF  1, "Writing to disk: size=%u offset=%u\n", ecx, ebx
264
        mov     [status], sz_err_full
223
        mcall   70, fileinfo
265
        mov     [pb.progress_color], 0x00c80000         ; red
Line 238... Line 280...
238
        mov     ecx, [ebp + http_msg.content_ptr]
280
        mov     ecx, [ebp + http_msg.content_ptr]
239
        test    ecx, ecx
281
        test    ecx, ecx
240
        jz      @f
282
        jz      @f
241
        mcall   68, 13                                  ; free the buffer
283
        mcall   68, 13                                  ; free the buffer
242
  @@:
284
  @@:
243
 
-
 
244
        invoke  HTTP_free, [identifier]                 ; free headers and connection
285
        invoke  HTTP_free, [identifier]                 ; free headers and connection
245
 
-
 
246
        mov     [btn_text], sz_open
-
 
247
        call    draw_window
-
 
248
        jmp     mainloop
286
        jmp     redraw
249
 
-
 
250
 
-
 
Line 251... Line 287...
251
 
287
 
252
draw_window:
288
draw_window:
Line 253... Line 289...
253
        mcall   12, 1   ; start window draw
289
        mcall   12, 1   ; start window draw
Line 259... Line 295...
259
        mov     edx, [sc.work]
295
        mov     edx, [sc.work]
260
        or      edx, 0x34000000
296
        or      edx, 0x34000000
261
        mcall   0, <50, 320>, <350, 110>, , 0, title
297
        mcall   0, <50, 320>, <350, 110>, , 0, title
Line 262... Line 298...
262
 
298
 
263
; draw button
299
; draw button
Line 264... Line 300...
264
        mcall   8, <229,75>, <60,16>, 22, [sc.work_button]      ; download
300
        mcall   8, <229,75>, <60,16>, 22, [sc.work_button]
265
 
301
 
266
; draw button text
302
; draw button text
267
        mov     ecx, [sc.work_button_text]
303
        mov     ecx, [sc.work_button_text]
Line -... Line 304...
-
 
304
        or      ecx, 80000000h
-
 
305
        mcall   4, <240,65>, , [btn_text]
-
 
306
 
-
 
307
; draw status text
-
 
308
        mov     ecx, [sc.work_text]
268
        or      ecx, 80000000h
309
        or      ecx, 80000000h
269
        mcall   4, <240,65>, , [btn_text]
310
        mcall   4, <10,65>, , [status]
270
 
311
 
Line 271... Line 312...
271
; draw editbox
312
; draw editbox
272
        edit_boxes_set_sys_color edit1, editboxes_end, sc
313
        edit_boxes_set_sys_color edit1, editboxes_end, sc
273
        invoke  edit_box_draw, edit1
314
        invoke  edit_box_draw, edit1
274
 
315
 
275
        cmp     [identifier], 0
316
        cmp     [identifier], 0
276
        je     @f
317
        je     @f
277
; draw progressbar
-
 
278
        invoke  progressbar_draw, pb
-
 
Line 279... Line 318...
279
  @@:
318
; draw progressbar
280
        mcall   12, 2   ; end window draw
-
 
281
        ret
319
        invoke  progressbar_draw, pb
Line 282... Line 320...
282
 
320
  @@:
283
 
321
        mcall   12, 2   ; end window draw
284
dont_draw:
322
 
Line 317... Line 355...
317
  .size         dd 0
355
  .size         dd 0
318
  .buffer       dd 0
356
  .buffer       dd 0
319
                db 0
357
                db 0
320
                dd fname_buf
358
                dd fname_buf
Line -... Line 359...
-
 
359
 
-
 
360
fileopen        dd 7
-
 
361
                dd 0                    ; flags
-
 
362
                dd fname_buf            ; parameters
-
 
363
                dd 0                    ; reserved
-
 
364
                dd 0                    ; reserved
-
 
365
                db "/sys/@open", 0      ; path
321
 
366
 
322
edit1           edit_box 299, 5, 10, 0xffffff, 0x0000ff, 0x0080ff, 0x000000, 0x8000, URLMAXLEN, url, mouse_dd, ed_focus+ed_always_focus, 0, 0
367
edit1           edit_box 299, 5, 10, 0xffffff, 0x0000ff, 0x0080ff, 0x000000, 0x8000, URLMAXLEN, url, mouse_dd, ed_focus+ed_always_focus, 0, 0
Line 323... Line 368...
323
editboxes_end:
368
editboxes_end:
324
 
369
 
-
 
370
identifier      dd 0
325
identifier      dd 0
371
btn_text        dd sz_download
326
btn_text        dd sz_download
372
status          dd sz_null
327
sz_download     db 'Download', 0
373
sz_download     db 'Download', 0
-
 
374
sz_cancel       db ' Cancel ', 0
-
 
375
sz_open         db '  Open  ', 0
-
 
376
sz_exit         db '  Exit  ', 0
-
 
377
 
-
 
378
sz_null         db 0
-
 
379
sz_downloading  db 'Downloading..', 0
-
 
380
sz_complete     db 'Download completed', 0
-
 
381
sz_err_create   db 'Could not create the local file!', 0
328
sz_cancel       db ' Cancel ', 0
382
sz_err_full     db 'Disk full!', 0
Line 329... Line 383...
329
sz_open         db '  Open  ', 0
383
sz_err_http     db 'HTTP error!', 0
330
title           db 'HTTP Downloader', 0
384
title           db 'HTTP Downloader', 0
331
 
385