New program: pasta.
Upload contents from clipboard or file to paste.kolibrios.org git-svn-id: svn://kolibrios.org@4832 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
66ebe18f55
commit
c324c5f479
267
programs/network/pasta/pasta.asm
Normal file
267
programs/network/pasta/pasta.asm
Normal file
@ -0,0 +1,267 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2014. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;; pasta.asm - Paste text to paste.kolibrios.org from a file or ;;
|
||||
;; from clipboard. ;;
|
||||
;; ;;
|
||||
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||
;; Version 2, June 1991 ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
format binary as ""
|
||||
use32
|
||||
org 0x0
|
||||
|
||||
db 'MENUET01' ; header
|
||||
dd 0x01 ; header version
|
||||
dd START ; entry point
|
||||
dd IM_END ; image size
|
||||
dd I_END+0x1000 ; required memory
|
||||
dd I_END+0x1000 ; esp
|
||||
dd param
|
||||
dd 0 ; I_Path
|
||||
|
||||
|
||||
include '../../macros.inc'
|
||||
include '../../proc32.inc'
|
||||
include '../../dll.inc'
|
||||
include '../../develop/libraries/http/http.inc'
|
||||
|
||||
virtual at 0
|
||||
http_msg http_msg
|
||||
end virtual
|
||||
|
||||
|
||||
START:
|
||||
mcall 68, 11 ; init heap so we can allocate memory dynamically
|
||||
|
||||
; load libraries
|
||||
stdcall dll.Load, @IMPORT
|
||||
test eax, eax
|
||||
jnz error
|
||||
|
||||
; Got parameters?
|
||||
cmp byte[param], 0
|
||||
je clipboard
|
||||
|
||||
; Yep, try to read the file.
|
||||
mcall 68, 12, 32768
|
||||
test eax, eax
|
||||
jz error
|
||||
mov [file_struct.buf], eax
|
||||
mov [clipboard_data], eax
|
||||
mcall 70, file_struct
|
||||
cmp eax, 6
|
||||
jne error
|
||||
mov [clipboard_data_length], ebx
|
||||
mov eax, [clipboard_data]
|
||||
|
||||
jmp escape
|
||||
|
||||
clipboard:
|
||||
|
||||
; Get number of slots on the clipboard
|
||||
mcall 54, 0
|
||||
cmp eax, -1
|
||||
je error
|
||||
|
||||
; Get last item on clipboard
|
||||
mov ecx, eax
|
||||
dec ecx
|
||||
inc ebx
|
||||
mcall 54
|
||||
cmp eax, -1
|
||||
je error
|
||||
|
||||
; Verify if we can work with it
|
||||
cmp dword[eax + 4], 0 ; text ?
|
||||
jne error
|
||||
mov [clipboard_data], eax
|
||||
mov ecx, dword[eax]
|
||||
sub ecx, 8
|
||||
mov [clipboard_data_length], ecx
|
||||
|
||||
mov eax, [clipboard_data]
|
||||
add eax, 12
|
||||
|
||||
escape:
|
||||
; Escape all characters that need escaping
|
||||
invoke HTTP_escape, eax
|
||||
test eax, eax
|
||||
jz error
|
||||
mov [clipboard_data_length], ebx
|
||||
|
||||
push eax
|
||||
mcall 68, 13, [clipboard_data]
|
||||
pop [clipboard_data]
|
||||
|
||||
; Connect to the server
|
||||
invoke HTTP_get, sz_url, 0
|
||||
test eax, eax
|
||||
jz error
|
||||
mov [identifier], eax
|
||||
|
||||
.again:
|
||||
invoke HTTP_process, [identifier]
|
||||
test eax, eax
|
||||
jnz .again
|
||||
|
||||
invoke HTTP_find_header_field, [identifier], sz_set_cookie
|
||||
mov edi, cookie
|
||||
test eax, eax
|
||||
jz .no_cookie
|
||||
|
||||
mov esi, eax
|
||||
.cookie_loop:
|
||||
lodsb
|
||||
stosb
|
||||
cmp al, 13
|
||||
je .cookie_end
|
||||
cmp al, 10
|
||||
je .cookie_end
|
||||
cmp al, 0
|
||||
je .cookie_end
|
||||
jmp .cookie_loop
|
||||
.cookie_end:
|
||||
dec edi
|
||||
.no_cookie:
|
||||
mov ax, 0x0a0d
|
||||
stosw
|
||||
xor al, al
|
||||
stosb
|
||||
|
||||
invoke HTTP_free, [identifier]
|
||||
|
||||
mov ecx, [clipboard_data_length]
|
||||
add ecx, sz_paste_head.length + sz_paste_tail.length
|
||||
invoke HTTP_post, sz_url, sz_cookie, sz_ctype, ecx
|
||||
test eax, eax
|
||||
jz error
|
||||
mov [identifier], eax
|
||||
|
||||
mov ecx, [eax + http_msg.socket]
|
||||
mcall 75, 6, , sz_paste_head, sz_paste_head.length, 0
|
||||
mcall 75, 6, , [clipboard_data], [clipboard_data_length], 0
|
||||
mcall 75, 6, , sz_paste_tail, sz_paste_tail.length, 0
|
||||
|
||||
.again2:
|
||||
invoke HTTP_process, [identifier]
|
||||
test eax, eax
|
||||
jnz .again2
|
||||
|
||||
mov ebp, [identifier]
|
||||
cmp [ebp + http_msg.status], 302 ; found
|
||||
jne error
|
||||
|
||||
invoke HTTP_find_header_field, [identifier], sz_location
|
||||
test eax, eax
|
||||
jz error
|
||||
|
||||
push eax
|
||||
mov esi, sz_failed
|
||||
mov edi, paste_url
|
||||
mov ecx, 2
|
||||
rep movsd
|
||||
pop esi
|
||||
.url_loop:
|
||||
lodsb
|
||||
stosb
|
||||
cmp al, 13
|
||||
je .url_end
|
||||
cmp al, 10
|
||||
je .url_end
|
||||
cmp al, 0
|
||||
je .url_end
|
||||
jmp .url_loop
|
||||
.url_end:
|
||||
dec edi
|
||||
lea ecx, [edi - paste_url + 4]
|
||||
mov eax, '" -t'
|
||||
stosd
|
||||
mov ax, 'O'
|
||||
stosw
|
||||
mov [notify_struct.msg], paste_url
|
||||
mcall 70, notify_struct
|
||||
|
||||
mcall 54, 3 ; Delete last slot in the clipboard
|
||||
|
||||
mov dword[paste_url-4], ecx
|
||||
mov dword[paste_url+0], 0 ; Text
|
||||
mov dword[paste_url+4], 1 ; cp0866
|
||||
mcall 54, 2, , paste_url-4 ; Write URL to the clipboard
|
||||
|
||||
invoke HTTP_free, [identifier]
|
||||
mcall -1
|
||||
|
||||
error:
|
||||
mov [notify_struct.msg], sz_failed
|
||||
mcall 70, notify_struct
|
||||
|
||||
mcall -1
|
||||
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
; Data area
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
@IMPORT:
|
||||
|
||||
library lib_http, 'http.obj'
|
||||
|
||||
import lib_http, \
|
||||
HTTP_get, 'get', \
|
||||
HTTP_process, 'process', \
|
||||
HTTP_free, 'free', \
|
||||
HTTP_stop, 'stop', \
|
||||
HTTP_post, 'post', \
|
||||
HTTP_find_header_field, 'find_header_field', \
|
||||
HTTP_escape, 'escape'
|
||||
|
||||
IM_END:
|
||||
|
||||
file_struct:
|
||||
dd 0 ; read file
|
||||
dd 0 ; offset
|
||||
dd 0 ; reserved
|
||||
dd 32768 ; max file size
|
||||
.buf dd 0 ; buffer ptr
|
||||
db 0
|
||||
dd param
|
||||
|
||||
notify_struct:
|
||||
dd 7 ; run application
|
||||
dd 0
|
||||
.msg dd paste_url
|
||||
dd 0
|
||||
dd 0
|
||||
db '/sys/@notify', 0
|
||||
|
||||
sz_url db 'http://paste.kolibrios.org/', 0
|
||||
sz_set_cookie db 'set-cookie', 0
|
||||
sz_location db 'location', 0
|
||||
sz_ctype db 'application/x-www-form-urlencoded', 0
|
||||
sz_failed db '"Pasta',13,10,'Paste failed!" -E', 0
|
||||
|
||||
sz_paste_head db 'code='
|
||||
.length = $ - sz_paste_head
|
||||
sz_paste_tail db '%0D%0A&language=text&webpage='
|
||||
.length = $ - sz_paste_tail
|
||||
|
||||
sz_cookie db 'Cookie: '
|
||||
cookie db 0
|
||||
rb 1024
|
||||
|
||||
paste_url rb 1024
|
||||
param rb 1024
|
||||
|
||||
identifier dd 0
|
||||
clipboard_data dd 0
|
||||
clipboard_data_length dd 0
|
||||
|
||||
I_END:
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user