forked from KolibriOS/kolibrios
Stub for new IRC client.
git-svn-id: svn://kolibrios.org@3191 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
2c925a77a9
commit
5959abc989
317
kernel/branches/net/applications/ircc/encodings.inc
Normal file
317
kernel/branches/net/applications/ircc/encodings.inc
Normal file
@ -0,0 +1,317 @@
|
|||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; ;;
|
||||||
|
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;;
|
||||||
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
|
;; ;;
|
||||||
|
;; ;;
|
||||||
|
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||||
|
;; Version 2, June 1991 ;;
|
||||||
|
;; ;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
|
||||||
|
get_next_byte:
|
||||||
|
; Load next byte from the packet, translating to cp866 if necessary
|
||||||
|
; At input esi = pointer to data, edx = limit of data
|
||||||
|
; Output is either (translated) byte in al with CF set or CF cleared.
|
||||||
|
mov eax, [encoding]
|
||||||
|
jmp [get_byte_table+eax*4]
|
||||||
|
|
||||||
|
get_byte_cp866:
|
||||||
|
cmp esi, edx
|
||||||
|
jae .nothing
|
||||||
|
lodsb
|
||||||
|
.nothing:
|
||||||
|
ret
|
||||||
|
|
||||||
|
get_byte_cp1251:
|
||||||
|
cmp esi, edx
|
||||||
|
jae .nothing
|
||||||
|
lodsb
|
||||||
|
cmp al, 0x80
|
||||||
|
jb @f
|
||||||
|
and eax, 0x7F
|
||||||
|
mov al, [cp1251_table+eax]
|
||||||
|
@@:
|
||||||
|
stc
|
||||||
|
.nothing:
|
||||||
|
ret
|
||||||
|
|
||||||
|
get_byte_utf8:
|
||||||
|
; UTF8 decoding is slightly complicated.
|
||||||
|
; One character can occupy one or more bytes.
|
||||||
|
; The boundary in packets theoretically can be anywhere in data,
|
||||||
|
; so this procedure keeps internal state between calls and handles
|
||||||
|
; one byte at a time, looping until character is read or packet is over.
|
||||||
|
; Globally, there are two distinct tasks: decode byte sequence to unicode char
|
||||||
|
; and convert this unicode char to our base encoding (that is cp866).
|
||||||
|
; 1. Check that there are data.
|
||||||
|
cmp esi, edx
|
||||||
|
jae .nothing
|
||||||
|
; 2. Load byte.
|
||||||
|
lodsb
|
||||||
|
movzx ecx, al
|
||||||
|
; 3. Bytes in an UTF8 sequence can be of any of three types.
|
||||||
|
; If most significant bit is cleared, sequence is one byte and usual ASCII char.
|
||||||
|
; First byte of a sequence must be 11xxxxxx, other bytes are 10yyyyyy.
|
||||||
|
and al, 0xC0
|
||||||
|
jns .single_byte
|
||||||
|
jp .first_byte
|
||||||
|
; 4. This byte is not first in UTF8 sequence.
|
||||||
|
; 4a. Check that the sequence was started. If no, it is invalid byte
|
||||||
|
; and we simply ignore it.
|
||||||
|
cmp [utf8_bytes_rest], 0
|
||||||
|
jz get_byte_utf8
|
||||||
|
; 4b. Otherwise, it is really next byte and it gives some more bits of char.
|
||||||
|
mov eax, [utf8_char]
|
||||||
|
shl eax, 6
|
||||||
|
lea eax, [eax+ecx-0x80]
|
||||||
|
; 4c. Decrement number of bytes rest in the sequence.
|
||||||
|
; If it goes to zero, character is read, so return it.
|
||||||
|
dec [utf8_bytes_rest]
|
||||||
|
jz .got_char
|
||||||
|
mov [utf8_char], eax
|
||||||
|
jmp get_byte_utf8
|
||||||
|
; 5. If the byte is first in UTF8 sequence, calculate the number of leading 1s
|
||||||
|
; - it equals total number of bytes in the sequence; some other bits rest for
|
||||||
|
; leading bits in the character.
|
||||||
|
.first_byte:
|
||||||
|
mov eax, -1
|
||||||
|
@@:
|
||||||
|
inc eax
|
||||||
|
add cl, cl
|
||||||
|
js @b
|
||||||
|
mov [utf8_bytes_rest], eax
|
||||||
|
xchg eax, ecx
|
||||||
|
inc ecx
|
||||||
|
shr al, cl
|
||||||
|
mov [utf8_char], eax
|
||||||
|
jmp get_byte_utf8
|
||||||
|
; 6. If the byte is ASCII char, it is the character.
|
||||||
|
.single_byte:
|
||||||
|
xchg eax, ecx
|
||||||
|
.got_char:
|
||||||
|
; We got the character, now abandon a possible sequence in progress.
|
||||||
|
and [utf8_bytes_rest], 0
|
||||||
|
; Now second task. The unicode character is in eax, and now we shall convert it
|
||||||
|
; to cp866.
|
||||||
|
cmp eax, 0x80
|
||||||
|
jb .done
|
||||||
|
; 0x410-0x43F -> 0x80-0xAF, 0x440-0x44F -> 0xE0-0xEF, 0x401 -> 0xF0, 0x451 -> 0xF1
|
||||||
|
cmp eax, 0x401
|
||||||
|
jz .YO
|
||||||
|
cmp eax, 0x451
|
||||||
|
jz .yo
|
||||||
|
cmp eax, 0x410
|
||||||
|
jb .unrecognized
|
||||||
|
cmp eax, 0x440
|
||||||
|
jb .part1
|
||||||
|
cmp eax, 0x450
|
||||||
|
jae .unrecognized
|
||||||
|
sub al, (0x40-0xE0) and 0xFF
|
||||||
|
ret
|
||||||
|
.part1:
|
||||||
|
sub al, 0x10-0x80
|
||||||
|
.nothing:
|
||||||
|
.done:
|
||||||
|
ret
|
||||||
|
.unrecognized:
|
||||||
|
mov al, '?'
|
||||||
|
stc
|
||||||
|
ret
|
||||||
|
.YO:
|
||||||
|
mov al, 0xF0
|
||||||
|
stc
|
||||||
|
ret
|
||||||
|
.yo:
|
||||||
|
mov al, 0xF1
|
||||||
|
stc
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print_character:
|
||||||
|
|
||||||
|
pusha
|
||||||
|
|
||||||
|
cmp bl, 13 ; line beginning
|
||||||
|
jne nobol
|
||||||
|
|
||||||
|
mov ecx, [pos]
|
||||||
|
inc ecx
|
||||||
|
boll1:
|
||||||
|
dec ecx
|
||||||
|
mov eax, ecx
|
||||||
|
xor edx, edx
|
||||||
|
mov ebx, [textbox_width]
|
||||||
|
div ebx
|
||||||
|
test edx, edx
|
||||||
|
jnz boll1
|
||||||
|
mov [pos], ecx
|
||||||
|
jmp newdata
|
||||||
|
nobol:
|
||||||
|
|
||||||
|
cmp bl, 10 ; line down
|
||||||
|
jne nolf
|
||||||
|
|
||||||
|
addx1:
|
||||||
|
inc [pos]
|
||||||
|
mov eax, [pos]
|
||||||
|
xor edx, edx
|
||||||
|
mov ecx, [textbox_width]
|
||||||
|
div ecx
|
||||||
|
test edx, edx
|
||||||
|
jnz addx1
|
||||||
|
mov eax, [pos]
|
||||||
|
jmp cm1
|
||||||
|
nolf:
|
||||||
|
no_lf_ret:
|
||||||
|
|
||||||
|
|
||||||
|
cmp bl, 15 ; character
|
||||||
|
jbe newdata
|
||||||
|
|
||||||
|
mov eax, [irc_data]
|
||||||
|
shl eax, 8
|
||||||
|
mov al, bl
|
||||||
|
mov [irc_data], eax
|
||||||
|
|
||||||
|
mov eax, [pos]
|
||||||
|
;---- draw data
|
||||||
|
pusha
|
||||||
|
|
||||||
|
and ebx, 0xff
|
||||||
|
add eax, [text_start]
|
||||||
|
mov [eax], bl
|
||||||
|
|
||||||
|
popa
|
||||||
|
;---- draw data
|
||||||
|
|
||||||
|
mov eax, [pos]
|
||||||
|
inc eax
|
||||||
|
cm1:
|
||||||
|
mov ebx, [scroll+4]
|
||||||
|
imul ebx, [textbox_width]
|
||||||
|
cmp eax, ebx
|
||||||
|
jb noeaxz
|
||||||
|
|
||||||
|
mov esi, [text_start]
|
||||||
|
add esi, [textbox_width]
|
||||||
|
|
||||||
|
mov edi, [text_start]
|
||||||
|
mov ecx, ebx
|
||||||
|
rep movsb
|
||||||
|
|
||||||
|
mov esi, [text_start]
|
||||||
|
mov ecx, [textbox_width]
|
||||||
|
imul ecx, 61
|
||||||
|
add esi, ecx
|
||||||
|
|
||||||
|
mov edi, [text_start]
|
||||||
|
mov ecx, [textbox_width]
|
||||||
|
imul ecx, 60
|
||||||
|
add edi, ecx
|
||||||
|
mov ecx, ebx
|
||||||
|
rep movsb
|
||||||
|
|
||||||
|
mov eax, ebx
|
||||||
|
sub eax, [textbox_width]
|
||||||
|
noeaxz:
|
||||||
|
mov [pos], eax
|
||||||
|
|
||||||
|
newdata:
|
||||||
|
mov eax, [window_print]
|
||||||
|
or [eax + window.flags], FLAG_UPDATED
|
||||||
|
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
recode_to_cp866:
|
||||||
|
rep movsb
|
||||||
|
ret
|
||||||
|
|
||||||
|
recode_to_cp1251:
|
||||||
|
xor eax, eax
|
||||||
|
jecxz .nothing
|
||||||
|
.loop:
|
||||||
|
lodsb
|
||||||
|
cmp al,0x80
|
||||||
|
jb @f
|
||||||
|
mov al, [cp866_table-0x80+eax]
|
||||||
|
@@: stosb
|
||||||
|
loop .loop
|
||||||
|
.nothing:
|
||||||
|
ret
|
||||||
|
|
||||||
|
recode_to_utf8:
|
||||||
|
jecxz .nothing
|
||||||
|
.loop:
|
||||||
|
lodsb
|
||||||
|
cmp al, 0x80
|
||||||
|
jb .single_byte
|
||||||
|
and eax, 0x7F
|
||||||
|
mov ax, [utf8_table+eax*2]
|
||||||
|
stosw
|
||||||
|
loop .loop
|
||||||
|
ret
|
||||||
|
.single_byte:
|
||||||
|
stosb
|
||||||
|
loop .loop
|
||||||
|
.nothing:
|
||||||
|
ret
|
||||||
|
|
||||||
|
recode:
|
||||||
|
mov eax, [encoding]
|
||||||
|
jmp [recode_proc+eax*4]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
encoding dd UTF8
|
||||||
|
recode_proc dd recode_to_cp866, recode_to_cp1251, recode_to_utf8
|
||||||
|
get_byte_table dd get_byte_cp866, get_byte_cp1251, get_byte_utf8
|
||||||
|
|
||||||
|
|
||||||
|
cp1251_table:
|
||||||
|
db '?','?','?','?','?','?','?','?' , '?','?','?','?','?','?','?','?' ; 8
|
||||||
|
db '?','?','?','?','?',$F9,'?','?' , '?','?','?','?','?','?','?','?' ; 9
|
||||||
|
db '?',$F6,$F7,'?',$FD,'?','?','?' , $F0,'?',$F2,'?','?','?','?',$F4 ; A
|
||||||
|
db $F8,'?','?','?','?','?','?',$FA , $F1,$FC,$F3,'?','?','?','?',$F5 ; B
|
||||||
|
db $80,$81,$82,$83,$84,$85,$86,$87 , $88,$89,$8A,$8B,$8C,$8D,$8E,$8F ; C
|
||||||
|
db $90,$91,$92,$93,$94,$95,$96,$97 , $98,$99,$9A,$9B,$9C,$9D,$9E,$9F ; D
|
||||||
|
db $A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7 , $A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF ; E
|
||||||
|
db $E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7 , $E8,$E9,$EA,$EB,$EC,$ED,$EE,$EF ; F
|
||||||
|
|
||||||
|
; 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
||||||
|
|
||||||
|
utf8_table:
|
||||||
|
times 80h dw 0x98C3 ; default placeholder
|
||||||
|
|
||||||
|
; 0x80-0xAF -> 0x90D0-0xBFD0
|
||||||
|
repeat 0x30
|
||||||
|
store byte 0xD0 at utf8_table+2*(%-1)
|
||||||
|
store byte 0x90+%-1 at utf8_table+2*%-1
|
||||||
|
end repeat
|
||||||
|
|
||||||
|
; 0xE0-0xEF -> 0x80D1-0x8FD1
|
||||||
|
repeat 0x10
|
||||||
|
store byte 0xD1 at utf8_table+2*(0xE0-0x80+%-1)
|
||||||
|
store byte 0x80+%-1 at utf8_table+2*(0xE0-0x80+%)-1
|
||||||
|
end repeat
|
||||||
|
|
||||||
|
; 0xF0 -> 0x81D0, 0xF1 -> 0x91D1
|
||||||
|
store dword 0x91D181D0 at utf8_table+2*(0xF0-0x80)
|
||||||
|
|
||||||
|
cp866_table:
|
||||||
|
db $C0,$C1,$C2,$C3,$C4,$C5,$C6,$C7 , $C8,$C9,$CA,$CB,$CC,$CD,$CE,$CF ; 8
|
||||||
|
db $D0,$D1,$D2,$D3,$D4,$D5,$D6,$D7 , $D8,$D9,$DA,$DB,$DC,$DD,$DE,$DF ; 9
|
||||||
|
db $E0,$E1,$E2,$E3,$E4,$E5,$E6,$E7 , $E8,$E9,$EA,$EB,$EC,$ED,$EE,$EF ; A
|
||||||
|
db '?','?','?','?','?','?','?','?' , '?','?','?','?','?','?','?','?' ; B
|
||||||
|
db '?','?','?','?','?','?','?','?' , '?','?','?','?','?','?','?','?' ; C
|
||||||
|
db '?','?','?','?','?','?','?','?' , '?','?','?','?','?','?','?','?' ; D
|
||||||
|
db $F0,$F1,$F2,$F3,$F4,$F5,$F6,$F7 , $F8,$F9,$FA,$FB,$FC,$FD,$FE,$FF ; E
|
||||||
|
db $A8,$B8,$AA,$BA,$AF,$BF,$A1,$A2 , $B0,$95,$B7,'?',$B9,$A4,'?','?' ; F
|
||||||
|
|
||||||
|
; 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
||||||
|
|
241
kernel/branches/net/applications/ircc/gui.inc
Normal file
241
kernel/branches/net/applications/ircc/gui.inc
Normal file
@ -0,0 +1,241 @@
|
|||||||
|
draw_window:
|
||||||
|
|
||||||
|
pusha
|
||||||
|
|
||||||
|
mcall 9, thread_info, -1 ; get current window size
|
||||||
|
mov eax, dword[thread_info+42] ; window xsize
|
||||||
|
mov ebx, dword[thread_info+46] ; ysize
|
||||||
|
mov edx, dword[thread_info+62] ; work area xsize
|
||||||
|
mov esi, dword[thread_info+66] ; ysize
|
||||||
|
sub eax, edx
|
||||||
|
sub ebx, esi
|
||||||
|
|
||||||
|
cmp edx, WIN_MIN_X
|
||||||
|
jae .x_ok
|
||||||
|
mov edx, WIN_MIN_X
|
||||||
|
.x_ok:
|
||||||
|
mov [xsize], edx
|
||||||
|
add edx, eax
|
||||||
|
|
||||||
|
cmp esi, WIN_MIN_Y
|
||||||
|
jae .y_ok
|
||||||
|
mov esi, WIN_MIN_Y
|
||||||
|
.y_ok:
|
||||||
|
mov [ysize], esi
|
||||||
|
add esi, ebx
|
||||||
|
mcall 67, -1, -1 ; set the new sizes
|
||||||
|
|
||||||
|
mcall 12, 1
|
||||||
|
xor eax, eax ; draw window
|
||||||
|
mov ebx, WIN_MIN_X
|
||||||
|
mov ecx, WIN_MIN_Y
|
||||||
|
mov edx, [colors.work]
|
||||||
|
add edx, 0x33000000
|
||||||
|
mov edi, str_programname
|
||||||
|
mcall
|
||||||
|
|
||||||
|
mov ebx, [xsize]
|
||||||
|
mov ecx, [ysize]
|
||||||
|
sub cx, 35
|
||||||
|
push cx
|
||||||
|
shl ecx, 16
|
||||||
|
pop cx
|
||||||
|
mov edx, [colors.work_graph]
|
||||||
|
mcall 38 ; draw line
|
||||||
|
|
||||||
|
mov ecx, TOP_Y SHL 16 + TOP_Y
|
||||||
|
mcall
|
||||||
|
|
||||||
|
mov edi, [window_open]
|
||||||
|
cmp [edi + window.type], WINDOWTYPE_CHANNEL
|
||||||
|
jne .not_channel
|
||||||
|
|
||||||
|
mov ebx, [xsize]
|
||||||
|
sub ebx, 100
|
||||||
|
push bx
|
||||||
|
shl ebx, 16
|
||||||
|
pop bx
|
||||||
|
mov ecx, [ysize]
|
||||||
|
add ecx, TOP_Y SHL 16 -(15+20)
|
||||||
|
mcall
|
||||||
|
|
||||||
|
call print_channel_list
|
||||||
|
|
||||||
|
.not_channel:
|
||||||
|
|
||||||
|
mov edx, [edi + window.data_ptr]
|
||||||
|
add edx, window_data.text
|
||||||
|
call draw_channel_text
|
||||||
|
|
||||||
|
; editbox
|
||||||
|
|
||||||
|
mov eax, [ysize]
|
||||||
|
sub eax, 30 ;;;;;;
|
||||||
|
mov [edit1.top], eax
|
||||||
|
|
||||||
|
mov eax, [xsize]
|
||||||
|
sub eax, 10 ;;;;;;
|
||||||
|
mov [edit1.width], eax
|
||||||
|
|
||||||
|
push dword edit1
|
||||||
|
call [edit_box_draw]
|
||||||
|
|
||||||
|
; scrollbar
|
||||||
|
|
||||||
|
mov eax, [ysize]
|
||||||
|
sub eax, TOP_Y + 35 ;;;;
|
||||||
|
mov [scroll1.y_size], ax
|
||||||
|
|
||||||
|
mov eax, [xsize]
|
||||||
|
sub eax, SCROLLBAR_WIDTH
|
||||||
|
mov [scroll1.x_pos], ax
|
||||||
|
|
||||||
|
mov [scroll1.all_redraw], 1
|
||||||
|
|
||||||
|
push dword scroll1
|
||||||
|
call [scrollbar_v_draw]
|
||||||
|
|
||||||
|
call draw_windownames
|
||||||
|
|
||||||
|
mcall 12, 2
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print_channel_list:
|
||||||
|
|
||||||
|
pusha
|
||||||
|
|
||||||
|
mov eax, 13 ; draw rectangle (clear list)
|
||||||
|
|
||||||
|
mov ebx, [xsize]
|
||||||
|
sub ebx, 95
|
||||||
|
shl ebx, 16
|
||||||
|
push ebx
|
||||||
|
mov bx, 90 ; x size ;;; FIXME
|
||||||
|
mov ecx, TEXT_Y shl 16 + 12*10 ; y size ;;; FIXME
|
||||||
|
mov edx, [colors.work]
|
||||||
|
mcall
|
||||||
|
|
||||||
|
mov eax, 4 ; draw text
|
||||||
|
pop ebx
|
||||||
|
mov bx, TEXT_Y
|
||||||
|
mov ecx, [colors.work_text]
|
||||||
|
or ecx, 0x80000000 ; ASCIIZ string
|
||||||
|
mov edx, [window_open]
|
||||||
|
mov edx, [edx + window.data_ptr]
|
||||||
|
add edx, window_data.names
|
||||||
|
mov edi, MAX_CHANNELS
|
||||||
|
.loop:
|
||||||
|
mcall
|
||||||
|
|
||||||
|
add edx, MAX_NICK_LEN ; next name
|
||||||
|
add ebx, 10 ; height distance between lines
|
||||||
|
dec edi
|
||||||
|
jnz .loop
|
||||||
|
|
||||||
|
popa
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
draw_channel_text:
|
||||||
|
|
||||||
|
pusha
|
||||||
|
|
||||||
|
mov eax, 4 ; draw text
|
||||||
|
mov ebx, TEXT_X shl 16 + TEXT_Y
|
||||||
|
mov ecx, 12 ; 12 lines max ?
|
||||||
|
mov esi, [textbox_width]
|
||||||
|
|
||||||
|
.dct:
|
||||||
|
pusha
|
||||||
|
mov cx, bx
|
||||||
|
shl ecx, 16
|
||||||
|
mov cx, 9 ; character height
|
||||||
|
mov eax, 13 ; draw rectangle
|
||||||
|
mov ebx, TEXT_X shl 16
|
||||||
|
mov bx, word[textbox_width]
|
||||||
|
imul bx, 6 ; character width
|
||||||
|
mov edx, [colors.work]
|
||||||
|
mcall
|
||||||
|
popa
|
||||||
|
|
||||||
|
push ecx
|
||||||
|
mov ecx, [colors.work_text]
|
||||||
|
cmp word[edx], '* '
|
||||||
|
jne .no_red
|
||||||
|
mov ecx, 0x00aa0000
|
||||||
|
jmp .draw
|
||||||
|
.no_red:
|
||||||
|
|
||||||
|
cmp word[edx], '**'
|
||||||
|
jne .no_light_blue
|
||||||
|
cmp byte[edx+2], '*'
|
||||||
|
jne .no_light_blue
|
||||||
|
mov ecx, 0x000000aa
|
||||||
|
jmp .draw
|
||||||
|
.no_light_blue:
|
||||||
|
|
||||||
|
cmp byte[edx], '#'
|
||||||
|
jne .no_blue
|
||||||
|
mov ecx, 0x0000aa00
|
||||||
|
; jmp .draw
|
||||||
|
.no_blue:
|
||||||
|
|
||||||
|
.draw:
|
||||||
|
mcall
|
||||||
|
add edx, [textbox_width]
|
||||||
|
add ebx, 10 ; height distance between lines
|
||||||
|
|
||||||
|
pop ecx
|
||||||
|
loop .dct
|
||||||
|
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
draw_windownames:
|
||||||
|
|
||||||
|
mov eax, 8
|
||||||
|
mov ebx, 5 shl 16 + 120
|
||||||
|
mov ecx, 12 shl 16 + 12
|
||||||
|
mov edx, WINDOW_BTN_START
|
||||||
|
mov edi, windows
|
||||||
|
.more_btn:
|
||||||
|
mov esi, [colors.work_button]
|
||||||
|
cmp [window_open], edi
|
||||||
|
jne @f
|
||||||
|
not esi
|
||||||
|
and esi, 0x00ffffff
|
||||||
|
@@:
|
||||||
|
mcall
|
||||||
|
inc edx
|
||||||
|
add ebx, 125 shl 16
|
||||||
|
add edi, sizeof.window
|
||||||
|
cmp [edi + + window.data_ptr], 0
|
||||||
|
jne .more_btn
|
||||||
|
|
||||||
|
mov eax, 4
|
||||||
|
mov ebx, 10 shl 16 + 15
|
||||||
|
mov ecx, [colors.work_button_text]
|
||||||
|
or ecx, 0x80000000 ; ASCIIZ string
|
||||||
|
lea edx, [windows + window.name]
|
||||||
|
mov esi, MAX_WINDOWS
|
||||||
|
.more:
|
||||||
|
mcall
|
||||||
|
add edx, sizeof.window
|
||||||
|
cmp byte[edx], 0
|
||||||
|
je .enough
|
||||||
|
add ebx, 125 shl 16
|
||||||
|
dec esi
|
||||||
|
jnz .more
|
||||||
|
.enough:
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
449
kernel/branches/net/applications/ircc/ircc.asm
Normal file
449
kernel/branches/net/applications/ircc/ircc.asm
Normal file
@ -0,0 +1,449 @@
|
|||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; ;;
|
||||||
|
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;;
|
||||||
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
|
;; ;;
|
||||||
|
;; IRC client for KolibriOS ;;
|
||||||
|
;; ;;
|
||||||
|
;; Written by hidnplayr@kolibrios.org, ;;
|
||||||
|
;; text encoder/decoder by Clevermouse. ;;
|
||||||
|
;; ;;
|
||||||
|
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||||
|
;; Version 2, June 1991 ;;
|
||||||
|
;; ;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
version equ '0.1'
|
||||||
|
|
||||||
|
; connection status
|
||||||
|
STATUS_DISCONNECTED = 0
|
||||||
|
STATUS_RESOLVING = 1
|
||||||
|
STATUS_CONNECTING = 2
|
||||||
|
STATUS_CONNECTED = 3
|
||||||
|
|
||||||
|
; window flags
|
||||||
|
FLAG_UPDATED = 1 shl 0
|
||||||
|
FLAG_CLOSE = 1 shl 1
|
||||||
|
|
||||||
|
; window types
|
||||||
|
WINDOWTYPE_SERVER = 0
|
||||||
|
WINDOWTYPE_CHANNEL = 1
|
||||||
|
WINDOWTYPE_CHAT = 2
|
||||||
|
WINDOWTYPE_LIST = 3
|
||||||
|
WINDOWTYPE_DCC = 4
|
||||||
|
|
||||||
|
; supported encodings
|
||||||
|
CP866 = 0
|
||||||
|
CP1251 = 1
|
||||||
|
UTF8 = 2
|
||||||
|
|
||||||
|
; settings
|
||||||
|
USERCMD_MAX_SIZE = 400
|
||||||
|
|
||||||
|
WIN_MIN_X = 600
|
||||||
|
WIN_MIN_Y = 200
|
||||||
|
|
||||||
|
TEXT_X = 5
|
||||||
|
TEXT_Y = 45
|
||||||
|
|
||||||
|
TOP_Y = 40
|
||||||
|
|
||||||
|
MAX_WINDOWS = 20
|
||||||
|
|
||||||
|
MAX_NICK_LEN = 32
|
||||||
|
MAX_REAL_LEN = 32 ; realname
|
||||||
|
MAX_SERVER_NAME = 256
|
||||||
|
|
||||||
|
MAX_CHANNEL_LEN = 40
|
||||||
|
MAX_CHANNELS = 37
|
||||||
|
|
||||||
|
MAX_COMMAND_LEN = 512
|
||||||
|
|
||||||
|
TIMESTAMP = 3 ; 3 = hh:mm:ss, 2 = hh:mm, 0 = no timestamp
|
||||||
|
|
||||||
|
MAX_WINDOWNAME_LEN = 256
|
||||||
|
|
||||||
|
WINDOW_BTN_START = 100
|
||||||
|
|
||||||
|
SCROLLBAR_WIDTH = 12
|
||||||
|
|
||||||
|
|
||||||
|
format binary as ""
|
||||||
|
|
||||||
|
use32
|
||||||
|
|
||||||
|
org 0x0
|
||||||
|
|
||||||
|
db 'MENUET01' ; 8 byte id
|
||||||
|
dd 1 ; header version
|
||||||
|
dd START ; program start
|
||||||
|
dd I_END ; program image size
|
||||||
|
dd IM_END+2048 ; required amount of memory
|
||||||
|
dd IM_END+2048
|
||||||
|
dd 0
|
||||||
|
dd path
|
||||||
|
|
||||||
|
include "../macros.inc"
|
||||||
|
include "../proc32.inc"
|
||||||
|
include "../dll.inc"
|
||||||
|
include "../network.inc"
|
||||||
|
include "../struct.inc"
|
||||||
|
include '../../../../../programs/develop/libraries/box_lib/trunk/box_lib.mac'
|
||||||
|
|
||||||
|
struct window
|
||||||
|
data_ptr dd ? ; zero if not used
|
||||||
|
flags db ?
|
||||||
|
type db ?
|
||||||
|
name rb MAX_WINDOWNAME_LEN
|
||||||
|
ends
|
||||||
|
|
||||||
|
struct window_data
|
||||||
|
text rb 120*60
|
||||||
|
title rb 256
|
||||||
|
names rb 1200
|
||||||
|
namespos dd ?
|
||||||
|
usertext rb 256
|
||||||
|
usertextlen dd ?
|
||||||
|
ends
|
||||||
|
|
||||||
|
include "encodings.inc"
|
||||||
|
include "window.inc" ; also contains text print routines
|
||||||
|
include "serverparser.inc"
|
||||||
|
include "userparser.inc"
|
||||||
|
include "socket.inc"
|
||||||
|
include "gui.inc"
|
||||||
|
|
||||||
|
|
||||||
|
START:
|
||||||
|
|
||||||
|
mcall 68, 11 ; init heap so we can allocate memory dynamically
|
||||||
|
|
||||||
|
; wanted events
|
||||||
|
mcall 40, EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_STACK + EVM_MOUSE
|
||||||
|
|
||||||
|
; load libraries
|
||||||
|
stdcall dll.Load, @IMPORT
|
||||||
|
test eax, eax
|
||||||
|
jnz exit
|
||||||
|
|
||||||
|
; find path to main settings file (ircc.ini)
|
||||||
|
mov edi, path ; Calculate the length of zero-terminated string
|
||||||
|
xor al, al
|
||||||
|
mov ecx, 1024
|
||||||
|
repne scasb
|
||||||
|
dec edi
|
||||||
|
mov eax, '.ini'
|
||||||
|
stosd
|
||||||
|
xor al, al
|
||||||
|
stosb
|
||||||
|
|
||||||
|
; Fill the window buffer with zeros
|
||||||
|
mov edi, windows
|
||||||
|
mov ecx, (sizeof.window*MAX_WINDOWS+3)/4
|
||||||
|
xor eax, eax
|
||||||
|
rep stosd
|
||||||
|
|
||||||
|
; clear command area too
|
||||||
|
mov edi, servercommand
|
||||||
|
mov ecx, 600/4
|
||||||
|
rep stosd
|
||||||
|
|
||||||
|
; allocate window data block
|
||||||
|
|
||||||
|
call window_create
|
||||||
|
mov ebx, windows
|
||||||
|
mov [ebx + window.data_ptr], eax
|
||||||
|
mov [ebx + window.flags], 0
|
||||||
|
mov [ebx + window.type], WINDOWTYPE_SERVER
|
||||||
|
add eax, window_data.text
|
||||||
|
mov [text_start], eax
|
||||||
|
|
||||||
|
call window_refresh
|
||||||
|
|
||||||
|
; get system colors
|
||||||
|
mcall 48, 3, colors, 40
|
||||||
|
|
||||||
|
; set edit box and scrollbar colors
|
||||||
|
|
||||||
|
mov eax, [colors.work]
|
||||||
|
mov [scroll1.bg_color], eax
|
||||||
|
|
||||||
|
mov eax, [colors.work_button]
|
||||||
|
mov [scroll1.front_color], eax
|
||||||
|
|
||||||
|
mov eax, [colors.work_text]
|
||||||
|
mov [scroll1.line_color], eax
|
||||||
|
|
||||||
|
; get settings from ini
|
||||||
|
invoke ini.get_str, path, str_user, str_nick, user_nick, MAX_NICK_LEN, default_nick
|
||||||
|
invoke ini.get_str, path, str_user, str_real, user_real_name, MAX_REAL_LEN, default_real
|
||||||
|
|
||||||
|
; Welcome user
|
||||||
|
mov esi, str_welcome
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
call draw_window ;;; FIXME (gui is not correctly drawn first time)
|
||||||
|
|
||||||
|
redraw:
|
||||||
|
call draw_window
|
||||||
|
|
||||||
|
still:
|
||||||
|
|
||||||
|
; wait here for event
|
||||||
|
mcall 10
|
||||||
|
|
||||||
|
dec eax
|
||||||
|
jz redraw
|
||||||
|
|
||||||
|
dec eax
|
||||||
|
jz main_window_key
|
||||||
|
|
||||||
|
dec eax
|
||||||
|
jz button
|
||||||
|
|
||||||
|
cmp al, 3
|
||||||
|
je mouse
|
||||||
|
|
||||||
|
call process_network_event
|
||||||
|
|
||||||
|
mov edx, [window_open]
|
||||||
|
test [edx + window.flags], FLAG_UPDATED
|
||||||
|
jz .no_update
|
||||||
|
and [edx + window.flags], not FLAG_UPDATED
|
||||||
|
mov edx, [edx + window.data_ptr]
|
||||||
|
add edx, window_data.text
|
||||||
|
call draw_channel_text
|
||||||
|
.no_update:
|
||||||
|
call print_channel_list
|
||||||
|
|
||||||
|
jmp still
|
||||||
|
|
||||||
|
button:
|
||||||
|
|
||||||
|
mcall 17 ; get id
|
||||||
|
shr eax, 8
|
||||||
|
|
||||||
|
cmp ax, 1 ; close program
|
||||||
|
je exit
|
||||||
|
|
||||||
|
sub ax, WINDOW_BTN_START
|
||||||
|
jb exit
|
||||||
|
|
||||||
|
cmp ax, MAX_WINDOWS
|
||||||
|
ja exit
|
||||||
|
|
||||||
|
mov dx, sizeof.window
|
||||||
|
mul dx
|
||||||
|
shl edx, 16
|
||||||
|
mov dx, ax
|
||||||
|
add edx, windows
|
||||||
|
cmp [edx + window.data_ptr], 0
|
||||||
|
je exit
|
||||||
|
mov [window_open], edx
|
||||||
|
call window_refresh
|
||||||
|
call draw_window
|
||||||
|
|
||||||
|
jmp still
|
||||||
|
exit:
|
||||||
|
mcall -1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
main_window_key:
|
||||||
|
|
||||||
|
mcall 2
|
||||||
|
|
||||||
|
push dword edit1
|
||||||
|
call [edit_box_key]
|
||||||
|
|
||||||
|
cmp ah, 13 ; enter
|
||||||
|
jne no_send2
|
||||||
|
|
||||||
|
call user_parser
|
||||||
|
|
||||||
|
mov [edit1.size], 0
|
||||||
|
mov [edit1.pos], 0
|
||||||
|
|
||||||
|
push dword edit1
|
||||||
|
call [edit_box_draw]
|
||||||
|
|
||||||
|
mov edx, [window_open]
|
||||||
|
mov edx, [edx + window.data_ptr]
|
||||||
|
add edx, window_data.text
|
||||||
|
call draw_channel_text
|
||||||
|
|
||||||
|
jmp still
|
||||||
|
no_send2:
|
||||||
|
|
||||||
|
jmp still
|
||||||
|
|
||||||
|
mouse:
|
||||||
|
push dword edit1
|
||||||
|
call [edit_box_mouse]
|
||||||
|
|
||||||
|
push dword scroll1
|
||||||
|
call [scrollbar_v_mouse]
|
||||||
|
|
||||||
|
jmp still
|
||||||
|
|
||||||
|
|
||||||
|
; DATA AREA
|
||||||
|
|
||||||
|
encoding_text:
|
||||||
|
db 'CP866 '
|
||||||
|
db 'CP1251'
|
||||||
|
db 'UTF-8 '
|
||||||
|
encoding_text_len = 6
|
||||||
|
|
||||||
|
action_header db '*** ', 0
|
||||||
|
action_header_short db '* ', 0
|
||||||
|
ctcp_header db '-> [',0
|
||||||
|
ctcp_version db '] VERSION',10,0
|
||||||
|
ctcp_ping db '] PING',10,0
|
||||||
|
ctcp_time db '] TIME',10,0
|
||||||
|
has_left_channel db ' has left ', 0
|
||||||
|
joins_channel db ' has joined ', 0
|
||||||
|
is_now_known_as db ' is now known as ', 0
|
||||||
|
has_quit_irc db ' has quit IRC', 0
|
||||||
|
sets_mode db ' sets mode ', 0
|
||||||
|
kicked db ' is kicked from ', 0
|
||||||
|
str_talking db 'Now talking in ',0
|
||||||
|
str_topic db 'Topic is ',0
|
||||||
|
str_setby db 'Set by ',0
|
||||||
|
|
||||||
|
str_version db 'VERSION '
|
||||||
|
str_programname db 'KolibriOS IRC client ', version, 0
|
||||||
|
|
||||||
|
str_user db 'user', 0
|
||||||
|
str_nick db 'nick', 0
|
||||||
|
str_real db 'realname', 0
|
||||||
|
str_email db 'email', 0
|
||||||
|
|
||||||
|
default_nick db 'kolibri_user', 0
|
||||||
|
default_real db 'Kolibri User', 0
|
||||||
|
|
||||||
|
str_welcome db 10
|
||||||
|
db '.______________________ .__ .__ __',10
|
||||||
|
db '| \______ \_ ___ \ ____ | | |__| ____ _____/ |_',10
|
||||||
|
db '| || _/ \ \/ _/ ___\| | | |/ __ \ / \ __\',10
|
||||||
|
db '| || | \ \____ \ \___| |_| \ ___/| | \ |',10
|
||||||
|
db '|___||____|_ /\______ / \___ >____/__|\___ >___| /__|',10
|
||||||
|
db ' \/ \/ \/ \/ \/',10
|
||||||
|
db 10
|
||||||
|
db 'Welcome to IRC client ',version,' for KolibriOS',10
|
||||||
|
db 10
|
||||||
|
db 'Type /help for help',10,0
|
||||||
|
|
||||||
|
str_nickchange db 10,'Nickname is now ',0
|
||||||
|
str_realchange db 10,'Real name is now ',0
|
||||||
|
str_dotnewline db '.',10, 0
|
||||||
|
str_newline db 10, 0
|
||||||
|
str_connecting db 10,'* Connecting to ',0
|
||||||
|
str_help db 10,'following commands are available:',10
|
||||||
|
db 10
|
||||||
|
db '/nick <nick> : change nickname to <nick>',10
|
||||||
|
db '/real <real name> : change real name to <real name>',10
|
||||||
|
db '/server <address> : connect to server <address>',10
|
||||||
|
db '/code <code> : change codepage to cp866, cp1251, or utf8',10,0
|
||||||
|
|
||||||
|
str_1 db ' -',0
|
||||||
|
str_2 db '- ',0
|
||||||
|
|
||||||
|
str_sockerr db 'Socket Error',10,0
|
||||||
|
str_dnserr db 'Unable to resolve hostname.',10,0
|
||||||
|
str_refused db 'Connection refused',10,0
|
||||||
|
|
||||||
|
sockaddr1:
|
||||||
|
dw AF_INET4
|
||||||
|
.port dw 0x0b1a ; 6667
|
||||||
|
.ip dd 0
|
||||||
|
rb 10
|
||||||
|
|
||||||
|
|
||||||
|
status dd STATUS_DISCONNECTED
|
||||||
|
|
||||||
|
channel_line_sun dd 0x9999ff
|
||||||
|
channel_line_shadow dd 0x666699
|
||||||
|
index_list_2 dd 0x0000ff
|
||||||
|
|
||||||
|
text_start dd ? ; pointer to current textbox data
|
||||||
|
irc_data dd 0x0 ; encoder
|
||||||
|
textbox_width dd 80 ; in characters, not pixels ;)
|
||||||
|
pos dd 66 * 11 ; encoder
|
||||||
|
|
||||||
|
window_open dd windows
|
||||||
|
window_print dd windows
|
||||||
|
|
||||||
|
scroll dd 1
|
||||||
|
dd 12
|
||||||
|
|
||||||
|
align 4
|
||||||
|
@IMPORT:
|
||||||
|
|
||||||
|
library network, 'network.obj',\
|
||||||
|
libini, 'libini.obj',\
|
||||||
|
boxlib, 'box_lib.obj'
|
||||||
|
|
||||||
|
import network,\
|
||||||
|
getaddrinfo, 'getaddrinfo',\
|
||||||
|
freeaddrinfo, 'freeaddrinfo',\
|
||||||
|
inet_ntoa, 'inet_ntoa'
|
||||||
|
|
||||||
|
import libini,\
|
||||||
|
ini.get_str, 'ini_get_str',\
|
||||||
|
ini.get_int, 'ini_get_int'
|
||||||
|
|
||||||
|
import boxlib,\
|
||||||
|
edit_box_draw ,'edit_box' ,\
|
||||||
|
edit_box_key ,'edit_box_key' ,\
|
||||||
|
edit_box_mouse ,'edit_box_mouse' ,\
|
||||||
|
scrollbar_v_draw ,'scrollbar_v_draw' ,\
|
||||||
|
scrollbar_v_mouse,'scrollbar_v_mouse'
|
||||||
|
|
||||||
|
|
||||||
|
usercommand db '/server chat.freenode.net', 0
|
||||||
|
rb MAX_COMMAND_LEN
|
||||||
|
|
||||||
|
I_END:
|
||||||
|
|
||||||
|
; width, left, top
|
||||||
|
edit1 edit_box 0, 5, 0, 0xffffff, 0x6f9480, 0, 0, 0, USERCMD_MAX_SIZE, usercommand, mouse_dd, ed_focus, 25, 25
|
||||||
|
; xsize, xpos, ysize, ypos, max, cur, pos, bgcol, frcol, linecol
|
||||||
|
scroll1 scrollbar SCROLLBAR_WIDTH, 300, 150, TOP_Y, 10, 100, 0, 0, 0, 0, 0, 5
|
||||||
|
|
||||||
|
|
||||||
|
main_PID dd ? ; identifier of main thread
|
||||||
|
utf8_bytes_rest dd ? ; bytes rest in current UTF8 sequence
|
||||||
|
utf8_char dd ? ; first bits of current UTF8 character
|
||||||
|
gai_reqdata rb 32 ; buffer for getaddrinfo_start/process
|
||||||
|
ip_list dd ? ; will be filled as pointer to addrinfo list
|
||||||
|
packetbuf rb 1024 ; buffer for packets to server
|
||||||
|
path rb 1024
|
||||||
|
|
||||||
|
socketnum dd ?
|
||||||
|
|
||||||
|
servercommand rb 600
|
||||||
|
|
||||||
|
thread_info rb 1024
|
||||||
|
xsize dd ?
|
||||||
|
ysize dd ?
|
||||||
|
|
||||||
|
colors system_colors
|
||||||
|
|
||||||
|
irc_server_name rb MAX_SERVER_NAME
|
||||||
|
|
||||||
|
user_nick rb MAX_NICK_LEN
|
||||||
|
user_real_name rb MAX_REAL_LEN
|
||||||
|
|
||||||
|
windows rb MAX_WINDOWS*sizeof.window
|
||||||
|
|
||||||
|
mouse_dd dd ?
|
||||||
|
|
||||||
|
IM_END:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
8
kernel/branches/net/applications/ircc/ircc.ini
Normal file
8
kernel/branches/net/applications/ircc/ircc.ini
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[user]
|
||||||
|
nick = kolibri_user
|
||||||
|
realname = tetten
|
||||||
|
|
||||||
|
[colors]
|
||||||
|
action1 = 0x000000aa
|
||||||
|
action2 = 0x0000aa00
|
||||||
|
action3 = 0x00aa0000
|
882
kernel/branches/net/applications/ircc/serverparser.inc
Normal file
882
kernel/branches/net/applications/ircc/serverparser.inc
Normal file
@ -0,0 +1,882 @@
|
|||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; ;;
|
||||||
|
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;;
|
||||||
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
|
;; ;;
|
||||||
|
;; ;;
|
||||||
|
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||||
|
;; Version 2, June 1991 ;;
|
||||||
|
;; ;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
|
||||||
|
server_parser:
|
||||||
|
|
||||||
|
mov esi, servercommand
|
||||||
|
|
||||||
|
cmp byte [esi], ':'
|
||||||
|
jne .parse
|
||||||
|
|
||||||
|
.spaceloop:
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jz .fail
|
||||||
|
cmp al, ' '
|
||||||
|
jne .spaceloop
|
||||||
|
|
||||||
|
.parse:
|
||||||
|
mov eax, [esi]
|
||||||
|
or eax, 0x20202020
|
||||||
|
mov edi, server_commands
|
||||||
|
mov ecx, server_commands.number
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
scasd
|
||||||
|
je .got_cmd
|
||||||
|
add edi, 4
|
||||||
|
dec ecx
|
||||||
|
jnz .loop
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
ret
|
||||||
|
|
||||||
|
.got_cmd:
|
||||||
|
jmp dword[edi+4]
|
||||||
|
|
||||||
|
|
||||||
|
server_commands:
|
||||||
|
|
||||||
|
dd '328 ', cmd_328
|
||||||
|
dd '332 ', cmd_topic
|
||||||
|
dd '333 ', cmd_333 ; nickname and time of topic
|
||||||
|
dd '353 ', cmd_353 ; name reply
|
||||||
|
dd '366 ', cmd_366 ; end of names list
|
||||||
|
dd '372 ', cmd_372 ; motd
|
||||||
|
dd '375 ', cmd_375 ; start of motd
|
||||||
|
dd '376 ', cmd_376 ; end of motd
|
||||||
|
dd '421 ', cmd_421 ; unknown command
|
||||||
|
dd 'join', cmd_join
|
||||||
|
dd 'kick', cmd_kick
|
||||||
|
dd 'mode', cmd_mode
|
||||||
|
dd 'nick', cmd_nick
|
||||||
|
dd 'part', cmd_part
|
||||||
|
dd 'ping', cmd_ping
|
||||||
|
dd 'priv', cmd_privmsg
|
||||||
|
dd 'quit', cmd_quit
|
||||||
|
dd 'noti', cmd_notice
|
||||||
|
|
||||||
|
.number = ($ - server_commands) / 8
|
||||||
|
|
||||||
|
compare_to_nick:
|
||||||
|
|
||||||
|
push esi
|
||||||
|
mov ecx, MAX_NICK_LEN
|
||||||
|
mov esi, user_nick
|
||||||
|
.loop:
|
||||||
|
lodsb
|
||||||
|
cmp al, ' '
|
||||||
|
jbe .done
|
||||||
|
cmp al, 'a'
|
||||||
|
jb .ok
|
||||||
|
cmp al, 'z'
|
||||||
|
ja .ok
|
||||||
|
sub al, 0x20
|
||||||
|
.ok:
|
||||||
|
|
||||||
|
mov bl, byte[edi]
|
||||||
|
cmp bl, 'a'
|
||||||
|
jb .ok2
|
||||||
|
cmp bl, 'z'
|
||||||
|
ja .ok2
|
||||||
|
sub bl, 0x20
|
||||||
|
.ok2:
|
||||||
|
cmp bl, al
|
||||||
|
jne .not_equal
|
||||||
|
inc edi
|
||||||
|
dec ecx
|
||||||
|
jnz .loop
|
||||||
|
|
||||||
|
.done:
|
||||||
|
xor eax, eax
|
||||||
|
pop esi
|
||||||
|
ret
|
||||||
|
|
||||||
|
.not_equal:
|
||||||
|
or eax, -1
|
||||||
|
pop esi
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
find_window:
|
||||||
|
|
||||||
|
; mov [window_print],
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_328:
|
||||||
|
cmd_421:
|
||||||
|
cmd_372:
|
||||||
|
cmd_375:
|
||||||
|
cmd_376:
|
||||||
|
add esi, 4
|
||||||
|
jmp cmd_notice.loop
|
||||||
|
|
||||||
|
cmd_notice:
|
||||||
|
|
||||||
|
cmp byte[servercommand], ':'
|
||||||
|
jne .gogogo
|
||||||
|
|
||||||
|
mov byte [esi-1], 0
|
||||||
|
push esi
|
||||||
|
mov esi, str_1
|
||||||
|
call print_text2
|
||||||
|
mov esi, servercommand+1
|
||||||
|
call print_text2
|
||||||
|
mov esi, str_2
|
||||||
|
call print_text2
|
||||||
|
pop esi
|
||||||
|
|
||||||
|
.gogogo:
|
||||||
|
add esi, 6
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
inc esi
|
||||||
|
cmp byte [esi], 0
|
||||||
|
je .fail
|
||||||
|
cmp byte [esi], 10 ; newline
|
||||||
|
je server_parser.parse
|
||||||
|
cmp byte [esi], ' '
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
.loop2:
|
||||||
|
inc esi
|
||||||
|
cmp byte [esi], 0
|
||||||
|
je .fail
|
||||||
|
cmp byte [esi], ' '
|
||||||
|
je .loop2
|
||||||
|
cmp byte [esi], ':'
|
||||||
|
je .loop2
|
||||||
|
|
||||||
|
call print_text2
|
||||||
|
mov esi, str_newline
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_ping:
|
||||||
|
|
||||||
|
; Just change PING to PONG
|
||||||
|
mov dword[esi], 'PONG'
|
||||||
|
|
||||||
|
; Find the end of the command
|
||||||
|
lea edi, [esi + 5]
|
||||||
|
xor al, al
|
||||||
|
repne scasb
|
||||||
|
|
||||||
|
; Now send it back
|
||||||
|
mov edx, esi
|
||||||
|
mov esi, edi
|
||||||
|
mov word [esi], 0x0d0a
|
||||||
|
inc esi
|
||||||
|
inc esi
|
||||||
|
sub esi, edx
|
||||||
|
mcall send, [socketnum], , , 0
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_privmsg:
|
||||||
|
|
||||||
|
; Check if it was destined for me privately
|
||||||
|
mov edi, servercommand+1
|
||||||
|
call compare_to_nick
|
||||||
|
;;; je .private
|
||||||
|
|
||||||
|
; If not, find the correct window ???
|
||||||
|
|
||||||
|
; now find the end of nick
|
||||||
|
mov edi, esi
|
||||||
|
.loop:
|
||||||
|
inc edi
|
||||||
|
cmp byte [edi], 0
|
||||||
|
je .fail
|
||||||
|
cmp byte [edi], ' '
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
.loop2:
|
||||||
|
inc edi
|
||||||
|
cmp byte [edi], 0
|
||||||
|
je .fail
|
||||||
|
cmp byte [edi], ' '
|
||||||
|
je .loop2
|
||||||
|
cmp byte [edi], ':'
|
||||||
|
je .loop2
|
||||||
|
cmp byte [edi], 1
|
||||||
|
je cmd_ctcp
|
||||||
|
|
||||||
|
; Action?
|
||||||
|
cmp dword[edi+1], 'ACTI'
|
||||||
|
je .action
|
||||||
|
|
||||||
|
; nope, just plain old privmsg
|
||||||
|
if TIMESTAMP
|
||||||
|
call print_timestamp
|
||||||
|
end if
|
||||||
|
|
||||||
|
push edi
|
||||||
|
mov bl, '<'
|
||||||
|
call print_character
|
||||||
|
|
||||||
|
mov eax, servercommand+1
|
||||||
|
mov dl, '!'
|
||||||
|
call print_text
|
||||||
|
|
||||||
|
mov bl, '>'
|
||||||
|
call print_character
|
||||||
|
|
||||||
|
mov bl, ' '
|
||||||
|
call print_character
|
||||||
|
|
||||||
|
pop esi
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov bl, 10
|
||||||
|
call print_character
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
ret
|
||||||
|
|
||||||
|
.action:
|
||||||
|
push edi
|
||||||
|
if TIMESTAMP
|
||||||
|
call print_timestamp
|
||||||
|
end if
|
||||||
|
|
||||||
|
mov esi, action_header_short
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov eax, servercommand+1
|
||||||
|
mov dl, ' '
|
||||||
|
call print_text
|
||||||
|
|
||||||
|
mov bl, ' '
|
||||||
|
call print_character
|
||||||
|
|
||||||
|
pop esi
|
||||||
|
add esi, 8
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov bl, 10
|
||||||
|
call print_character
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
cmd_ctcp:
|
||||||
|
|
||||||
|
cmp dword[edi+1], 'VERS'
|
||||||
|
je .version
|
||||||
|
|
||||||
|
cmp dword[edi+1], 'TIME'
|
||||||
|
je .time
|
||||||
|
|
||||||
|
cmp dword[edi+1], 'PING'
|
||||||
|
je .ping
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
.time:
|
||||||
|
lea esi, [edi+1]
|
||||||
|
mov byte [edi+5], ' '
|
||||||
|
add edi, 6
|
||||||
|
|
||||||
|
; TODO: add system date (fn 29) in human readable format
|
||||||
|
|
||||||
|
mcall 3 ; get system time
|
||||||
|
|
||||||
|
mov ecx, 3
|
||||||
|
.timeloop:
|
||||||
|
mov bl, al
|
||||||
|
shr al, 4
|
||||||
|
add al, '0'
|
||||||
|
stosb
|
||||||
|
|
||||||
|
mov al, bl
|
||||||
|
and al, 0x0f
|
||||||
|
add al, '0'
|
||||||
|
stosb
|
||||||
|
|
||||||
|
dec ecx
|
||||||
|
jz .timedone
|
||||||
|
|
||||||
|
mov al, ':'
|
||||||
|
stosb
|
||||||
|
shr eax, 8
|
||||||
|
jmp .timeloop
|
||||||
|
|
||||||
|
.timedone:
|
||||||
|
xor al, al
|
||||||
|
stosb
|
||||||
|
call ctcp_reply
|
||||||
|
|
||||||
|
if TIMESTAMP
|
||||||
|
call print_timestamp
|
||||||
|
end if
|
||||||
|
|
||||||
|
mov esi, ctcp_header
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov esi, servercommand+1
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov esi, ctcp_time
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
.version:
|
||||||
|
mov esi, str_version
|
||||||
|
call ctcp_reply
|
||||||
|
|
||||||
|
if TIMESTAMP
|
||||||
|
call print_timestamp
|
||||||
|
end if
|
||||||
|
|
||||||
|
mov esi, ctcp_header
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov esi, servercommand+1
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov esi, ctcp_version
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
.ping:
|
||||||
|
lea esi, [edi+1]
|
||||||
|
call ctcp_reply
|
||||||
|
|
||||||
|
if TIMESTAMP
|
||||||
|
call print_timestamp
|
||||||
|
end if
|
||||||
|
|
||||||
|
mov esi, ctcp_header
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov esi, servercommand+1
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov esi, ctcp_ping
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ctcp_reply:
|
||||||
|
|
||||||
|
push esi
|
||||||
|
|
||||||
|
mov dword [usercommand], 'NOTI'
|
||||||
|
mov dword [usercommand+4], 'CE '
|
||||||
|
|
||||||
|
mov esi, servercommand+1
|
||||||
|
mov edi, usercommand+7
|
||||||
|
.nickloop:
|
||||||
|
lodsb
|
||||||
|
cmp al, '!'
|
||||||
|
je .done
|
||||||
|
cmp al, ' '
|
||||||
|
je .done
|
||||||
|
test al, al
|
||||||
|
je .fail
|
||||||
|
stosb
|
||||||
|
jmp .nickloop
|
||||||
|
.done:
|
||||||
|
mov byte [esi-1], 0
|
||||||
|
mov ax, ' :'
|
||||||
|
stosw
|
||||||
|
mov al, 1
|
||||||
|
stosb
|
||||||
|
|
||||||
|
pop esi
|
||||||
|
.replyloop:
|
||||||
|
lodsb
|
||||||
|
cmp al, 1
|
||||||
|
jbe .done2
|
||||||
|
stosb
|
||||||
|
jmp .replyloop
|
||||||
|
.done2:
|
||||||
|
|
||||||
|
mov al, 1
|
||||||
|
stosb
|
||||||
|
mov ax, 0x0a0d
|
||||||
|
stosw
|
||||||
|
|
||||||
|
lea esi, [edi - usercommand]
|
||||||
|
mcall send, [socketnum], usercommand, , 0
|
||||||
|
.fail:
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_part:
|
||||||
|
|
||||||
|
; Is it me who parted?
|
||||||
|
mov edi, servercommand+1
|
||||||
|
call compare_to_nick
|
||||||
|
jne .dont_close
|
||||||
|
|
||||||
|
; yes, close the window
|
||||||
|
mov edi, [window_print]
|
||||||
|
mov [edi + window.flags], FLAG_UPDATED + FLAG_CLOSE
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
; somebody else parted, just print message
|
||||||
|
.dont_close:
|
||||||
|
push esi
|
||||||
|
mov esi, action_header
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov eax, servercommand+1
|
||||||
|
mov dl, '!'
|
||||||
|
mov cl, ' '
|
||||||
|
call print_text
|
||||||
|
|
||||||
|
mov esi, has_left_channel
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
pop esi
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_join:
|
||||||
|
; compare nick: did we join a channel?
|
||||||
|
mov edi, servercommand+1
|
||||||
|
call compare_to_nick
|
||||||
|
jne .no_new_window
|
||||||
|
|
||||||
|
; create channel window - search for empty slot
|
||||||
|
mov ebx, windows
|
||||||
|
mov ecx, MAX_WINDOWS
|
||||||
|
.loop:
|
||||||
|
cmp [ebx + window.data_ptr], 0
|
||||||
|
je .free_found
|
||||||
|
add ebx, sizeof.window
|
||||||
|
dec ecx
|
||||||
|
jnz .loop
|
||||||
|
; Error: no more available windows!! ;;;;; TODO
|
||||||
|
.fail:
|
||||||
|
ret
|
||||||
|
|
||||||
|
.free_found:
|
||||||
|
push ebx
|
||||||
|
call window_create
|
||||||
|
pop ebx
|
||||||
|
test eax, eax
|
||||||
|
jz .fail
|
||||||
|
mov [ebx + window.data_ptr], eax
|
||||||
|
mov [ebx + window.type], WINDOWTYPE_CHANNEL
|
||||||
|
mov [ebx + window.flags], 0
|
||||||
|
call window_set_name
|
||||||
|
|
||||||
|
mov [window_open], ebx
|
||||||
|
mov [window_print], ebx
|
||||||
|
call window_refresh
|
||||||
|
|
||||||
|
push esi
|
||||||
|
mov esi, action_header
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov esi, str_talking
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
pop eax
|
||||||
|
mov dl, ' '
|
||||||
|
call print_text
|
||||||
|
|
||||||
|
mov esi, str_dotnewline
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
call draw_window
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
.no_new_window:
|
||||||
|
push esi
|
||||||
|
call window_set_name
|
||||||
|
|
||||||
|
mov esi, action_header
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov eax, servercommand+1
|
||||||
|
mov dl, ' '
|
||||||
|
call print_text
|
||||||
|
|
||||||
|
mov esi, joins_channel
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
pop esi
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov esi, str_newline
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_nick: ; FIXME
|
||||||
|
|
||||||
|
push esi
|
||||||
|
; test for change of my nick
|
||||||
|
mov esi, servercommand+1
|
||||||
|
mov edi, user_nick
|
||||||
|
mov ecx, MAX_NICK_LEN
|
||||||
|
rep cmpsb
|
||||||
|
cmp byte[edi-1], 0
|
||||||
|
jne .notmy
|
||||||
|
cmp byte[esi-1], '!'
|
||||||
|
jne .notmy
|
||||||
|
|
||||||
|
; yes, this is my nick, set to new
|
||||||
|
pop esi
|
||||||
|
or ecx, -1
|
||||||
|
mov edi, esi
|
||||||
|
xor eax, eax
|
||||||
|
repne scasb
|
||||||
|
neg ecx
|
||||||
|
cmp ecx, MAX_NICK_LEN
|
||||||
|
jb @f
|
||||||
|
mov ecx, MAX_NICK_LEN
|
||||||
|
@@:
|
||||||
|
mov edi, user_nick
|
||||||
|
rep movsb
|
||||||
|
.notmy:
|
||||||
|
|
||||||
|
; replace nick in all lists of users
|
||||||
|
mov ebx, windows
|
||||||
|
.channels:
|
||||||
|
mov esi, [ebx + window.data_ptr]
|
||||||
|
lea esi, [esi + window_data.names]
|
||||||
|
;;;;; mov edx, [esi + window_data.nameslen]
|
||||||
|
add edx, esi
|
||||||
|
.nicks:
|
||||||
|
mov edi, servercommand+1
|
||||||
|
cmp byte[esi], '@'
|
||||||
|
jne @f
|
||||||
|
inc esi
|
||||||
|
|
||||||
|
@@:
|
||||||
|
cmp esi, edx
|
||||||
|
jae .srcdone
|
||||||
|
lodsb
|
||||||
|
cmp al, ' '
|
||||||
|
je .srcdone
|
||||||
|
scasb
|
||||||
|
je @b
|
||||||
|
|
||||||
|
@@:
|
||||||
|
cmp esi, edx
|
||||||
|
jae .nextchannel
|
||||||
|
lodsb
|
||||||
|
cmp al, ' '
|
||||||
|
jne @b
|
||||||
|
|
||||||
|
.nextnick:
|
||||||
|
cmp esi, edx
|
||||||
|
jae .nextchannel
|
||||||
|
lodsb
|
||||||
|
cmp al, ' '
|
||||||
|
jz .nextnick
|
||||||
|
dec esi
|
||||||
|
jmp .nicks
|
||||||
|
|
||||||
|
|
||||||
|
.srcdone:
|
||||||
|
cmp byte [edi], '!'
|
||||||
|
jne .nextnick
|
||||||
|
|
||||||
|
; here we have esi -> end of nick which must be replaced to [servercommand_position]+6
|
||||||
|
lea edx, [edi-servercommand-1]
|
||||||
|
sub esi, edx
|
||||||
|
or ecx, -1
|
||||||
|
xor eax, eax
|
||||||
|
; mov edi, [servercommand_position] ;;;;; FIXME
|
||||||
|
repnz scasb
|
||||||
|
not ecx
|
||||||
|
dec ecx
|
||||||
|
push ecx
|
||||||
|
cmp ecx, edx
|
||||||
|
jb .decrease
|
||||||
|
jz .copy
|
||||||
|
.increase:
|
||||||
|
|
||||||
|
; new nick is longer than the old
|
||||||
|
push esi
|
||||||
|
lea edi, [ebx+120*10] ;;;;;;
|
||||||
|
lea esi, [edi+edx]
|
||||||
|
sub esi, ecx
|
||||||
|
mov ecx, esi
|
||||||
|
sub ecx, [esp]
|
||||||
|
dec esi
|
||||||
|
dec edi
|
||||||
|
std
|
||||||
|
rep movsb
|
||||||
|
cld
|
||||||
|
pop esi
|
||||||
|
jmp .copy
|
||||||
|
.decrease:
|
||||||
|
; new nick is shorter than the old
|
||||||
|
push esi
|
||||||
|
lea edi, [esi+ecx]
|
||||||
|
add esi, edx
|
||||||
|
lea ecx, [ebx+120*10]
|
||||||
|
sub ecx, edi
|
||||||
|
rep movsb
|
||||||
|
pop esi
|
||||||
|
.copy:
|
||||||
|
; copy nick
|
||||||
|
mov edi, esi
|
||||||
|
dec edi
|
||||||
|
; mov esi, [servercommand_position] ;;;;; FIXME
|
||||||
|
pop ecx
|
||||||
|
sub edx, ecx
|
||||||
|
sub [ebx-4], edx
|
||||||
|
rep movsb
|
||||||
|
mov al, ' '
|
||||||
|
stosb
|
||||||
|
|
||||||
|
.nextchannel:
|
||||||
|
add ebx, sizeof.window
|
||||||
|
cmp ebx, windows + sizeof.window*MAX_WINDOWS
|
||||||
|
jb .channels
|
||||||
|
|
||||||
|
; mov [text_start], window_text + 120*80
|
||||||
|
new_all_channels3:
|
||||||
|
|
||||||
|
mov esi, action_header_short
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov eax, servercommand+1
|
||||||
|
mov dl,'!'
|
||||||
|
call print_text
|
||||||
|
|
||||||
|
mov esi,is_now_known_as
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
; mov esi,[servercommand_position] ;;;;; FIXME
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
;;; call notify_channel_thread
|
||||||
|
|
||||||
|
; go to next window (and check if its a channel!)
|
||||||
|
|
||||||
|
; add [text_start], 120*80
|
||||||
|
; cmp [text_start], I_END+120*80*20
|
||||||
|
; jb new_all_channels3
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_kick:
|
||||||
|
; Is it me who got kicked?
|
||||||
|
mov edi, servercommand+1
|
||||||
|
call compare_to_nick
|
||||||
|
jne .not_me
|
||||||
|
|
||||||
|
; TODO: mark channel as disconnected
|
||||||
|
|
||||||
|
.not_me:
|
||||||
|
; find the channel user has been kicked from
|
||||||
|
push esi
|
||||||
|
mov esi, action_header_short
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov eax, servercommand+1
|
||||||
|
mov dl,'!'
|
||||||
|
call print_text
|
||||||
|
|
||||||
|
mov esi, kicked
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
pop esi
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_quit:
|
||||||
|
|
||||||
|
mov esi, action_header
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov eax, servercommand+1
|
||||||
|
mov dl, '!'
|
||||||
|
call print_text
|
||||||
|
|
||||||
|
mov esi, has_quit_irc
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_mode:
|
||||||
|
|
||||||
|
push esi
|
||||||
|
mov esi, action_header_short
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov eax, servercommand+1
|
||||||
|
mov dl, ' '
|
||||||
|
call print_text
|
||||||
|
|
||||||
|
mov esi, sets_mode
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
pop esi
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov esi, str_newline
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
cmd_353: ; channel usernames reply
|
||||||
|
|
||||||
|
; TODO: mark a bit that we are receiving names
|
||||||
|
|
||||||
|
; first, find the channel name
|
||||||
|
.loop1:
|
||||||
|
lodsb
|
||||||
|
cmp al, '#'
|
||||||
|
je .got_channel
|
||||||
|
test al, al
|
||||||
|
jnz .loop1
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
.got_channel:
|
||||||
|
; call find_channel ;;;; ASSUME current channel for now
|
||||||
|
mov ebx, [window_print]
|
||||||
|
mov ebx, [ebx + window.data_ptr]
|
||||||
|
lea edi, [ebx + window_data.names]
|
||||||
|
lea edx, [edi + MAX_NICK_LEN]
|
||||||
|
|
||||||
|
; now find the semicolon separating channelname and usernames
|
||||||
|
.loop2:
|
||||||
|
lodsb
|
||||||
|
cmp al, ':'
|
||||||
|
je .namesloop
|
||||||
|
test al, al
|
||||||
|
jnz .loop2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
.namesloop:
|
||||||
|
; now the names list begins, separated with spaces
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jz .done
|
||||||
|
cmp al, ' '
|
||||||
|
jz .next
|
||||||
|
stosb
|
||||||
|
jmp .namesloop
|
||||||
|
|
||||||
|
.next:
|
||||||
|
mov edi, edx
|
||||||
|
add edx, MAX_NICK_LEN
|
||||||
|
|
||||||
|
;;; cmp edi, .. ; Check for buffer overflow
|
||||||
|
jmp .namesloop
|
||||||
|
|
||||||
|
.done:
|
||||||
|
call print_channel_list
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_366: ; channel usernames end
|
||||||
|
|
||||||
|
; TODO: clear the bit that we are receiving names
|
||||||
|
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
cmd_topic:
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
je .fail
|
||||||
|
cmp al, ':'
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
push esi
|
||||||
|
mov esi, action_header
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov esi, str_topic
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
pop esi
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov esi, str_newline
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
cmd_333:
|
||||||
|
|
||||||
|
; TODO: check channelname and change pointer accordingly
|
||||||
|
|
||||||
|
mov ecx, 3 ; number of spaces to find
|
||||||
|
.loop:
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
je .fail
|
||||||
|
cmp al, ' '
|
||||||
|
jne .loop
|
||||||
|
dec ecx
|
||||||
|
jnz .loop ; find some more spaces
|
||||||
|
|
||||||
|
push esi
|
||||||
|
mov esi, action_header
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov esi, str_setby
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
pop esi
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov esi, str_newline
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
ret
|
||||||
|
|
240
kernel/branches/net/applications/ircc/socket.inc
Normal file
240
kernel/branches/net/applications/ircc/socket.inc
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; ;;
|
||||||
|
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;;
|
||||||
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
|
;; ;;
|
||||||
|
;; ;;
|
||||||
|
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||||
|
;; Version 2, June 1991 ;;
|
||||||
|
;; ;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
|
||||||
|
socket_connect:
|
||||||
|
|
||||||
|
; cmp [status], STATUS_CONNECTED ; TODO
|
||||||
|
; je disconnect
|
||||||
|
|
||||||
|
; ignore if status is not "disconnected"
|
||||||
|
cmp [status], STATUS_DISCONNECTED
|
||||||
|
jne .nothing
|
||||||
|
|
||||||
|
mov esi, str_connecting
|
||||||
|
call print_text2
|
||||||
|
mov esi, irc_server_name
|
||||||
|
call print_text2
|
||||||
|
mov esi, str_dotnewline
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
; update status
|
||||||
|
inc [status] ; was STATUS_DISCONNECTED, now STATUS_RESOLVING
|
||||||
|
|
||||||
|
; resolve name
|
||||||
|
push esp ; reserve stack place
|
||||||
|
push esp ; fourth parameter
|
||||||
|
push 0 ; third parameter
|
||||||
|
push 0 ; second parameter
|
||||||
|
push irc_server_name
|
||||||
|
call [getaddrinfo]
|
||||||
|
pop esi
|
||||||
|
; test for error
|
||||||
|
test eax, eax
|
||||||
|
jnz .fail_dns
|
||||||
|
|
||||||
|
; fill in ip in sockstruct
|
||||||
|
mov eax, [esi + addrinfo.ai_addr]
|
||||||
|
mov eax, [eax + sockaddr_in.sin_addr]
|
||||||
|
mov [sockaddr1.ip], eax
|
||||||
|
|
||||||
|
; free allocated memory
|
||||||
|
push esi
|
||||||
|
call [freeaddrinfo]
|
||||||
|
|
||||||
|
; update status
|
||||||
|
inc [status]
|
||||||
|
|
||||||
|
; connect
|
||||||
|
mcall socket, AF_INET4, SOCK_STREAM, 0
|
||||||
|
cmp eax, -1
|
||||||
|
jz .fail
|
||||||
|
mov [socketnum], eax
|
||||||
|
|
||||||
|
mcall connect, [socketnum], sockaddr1, 18
|
||||||
|
cmp eax, -1
|
||||||
|
jz .fail_refused
|
||||||
|
|
||||||
|
.nothing:
|
||||||
|
ret
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
mov [status], STATUS_DISCONNECTED
|
||||||
|
|
||||||
|
mov esi, str_sockerr
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
.fail_dns:
|
||||||
|
mov [status], STATUS_DISCONNECTED
|
||||||
|
|
||||||
|
mov esi, str_dnserr
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
.fail_refused:
|
||||||
|
mov [status], STATUS_DISCONNECTED
|
||||||
|
|
||||||
|
mov esi, str_refused
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
socket_write_userinfo:
|
||||||
|
|
||||||
|
; create packet in packetbuf
|
||||||
|
mov edi, packetbuf
|
||||||
|
|
||||||
|
mov eax, 'NICK'
|
||||||
|
stosd
|
||||||
|
mov al, ' '
|
||||||
|
stosb
|
||||||
|
mov esi, user_nick
|
||||||
|
mov ecx, MAX_NICK_LEN
|
||||||
|
.loop:
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jz .done
|
||||||
|
stosb
|
||||||
|
dec ecx
|
||||||
|
jnz .loop
|
||||||
|
.done:
|
||||||
|
mov ax, 0x0d0a
|
||||||
|
stosw
|
||||||
|
|
||||||
|
mov eax, 'USER'
|
||||||
|
stosd
|
||||||
|
mov al, ' '
|
||||||
|
stosb
|
||||||
|
mov esi, user_nick
|
||||||
|
mov ecx, MAX_NICK_LEN
|
||||||
|
.loop2:
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jz .done2
|
||||||
|
stosb
|
||||||
|
dec ecx
|
||||||
|
jnz .loop2
|
||||||
|
.done2:
|
||||||
|
mov eax, ' 8 *'
|
||||||
|
stosd
|
||||||
|
mov ax, ' :'
|
||||||
|
stosw
|
||||||
|
mov al, ' '
|
||||||
|
stosb
|
||||||
|
mov esi, user_real_name
|
||||||
|
mov ecx, MAX_REAL_LEN
|
||||||
|
.loop3:
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jz .done3
|
||||||
|
stosb
|
||||||
|
dec ecx
|
||||||
|
jnz .loop3
|
||||||
|
.done3:
|
||||||
|
mov ax, 0x0d0a
|
||||||
|
stosw
|
||||||
|
|
||||||
|
lea esi, [edi - packetbuf]
|
||||||
|
mcall send, [socketnum], packetbuf, , 0
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
process_network_event:
|
||||||
|
; values for status: 0, 1, 2, 3
|
||||||
|
mov eax, [status]
|
||||||
|
dec eax
|
||||||
|
; 0 = STATUS_DISCONNECTED - do nothing
|
||||||
|
; (ignore network events if we are disconnected from network)
|
||||||
|
js .nothing
|
||||||
|
; 1 = STATUS_RESOLVING
|
||||||
|
jz .nothing
|
||||||
|
; 2 = STATUS_CONNECTING
|
||||||
|
dec eax
|
||||||
|
jz .connecting
|
||||||
|
; 3 = STATUS_CONNECTED
|
||||||
|
jmp .connected
|
||||||
|
|
||||||
|
.nothing:
|
||||||
|
ret
|
||||||
|
|
||||||
|
.connecting:
|
||||||
|
call socket_write_userinfo
|
||||||
|
|
||||||
|
; The connection has been established, change status from "connecting" to "connected".
|
||||||
|
inc [status]
|
||||||
|
|
||||||
|
.connected:
|
||||||
|
call read_incoming_data
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
disconnect:
|
||||||
|
|
||||||
|
cmp [status], STATUS_DISCONNECTED
|
||||||
|
je .nothing
|
||||||
|
|
||||||
|
mcall close, [socketnum]
|
||||||
|
|
||||||
|
mov [status], STATUS_DISCONNECTED
|
||||||
|
|
||||||
|
.nothing:
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
read_incoming_data:
|
||||||
|
|
||||||
|
pusha
|
||||||
|
|
||||||
|
; TODO: read more data if we receive one full packet
|
||||||
|
|
||||||
|
.nextpacket:
|
||||||
|
mcall recv, [socketnum], packetbuf, 1024 ; read a packet
|
||||||
|
inc eax ; check if we got one
|
||||||
|
jz .done
|
||||||
|
dec eax
|
||||||
|
jz .done
|
||||||
|
|
||||||
|
; ok we have data, now feed it to the recoder
|
||||||
|
|
||||||
|
lea edx, [packetbuf + eax] ; edx = end pointer
|
||||||
|
mov esi, packetbuf ; esi = start pointer
|
||||||
|
.nextcommand:
|
||||||
|
mov edi, servercommand
|
||||||
|
.byteloop:
|
||||||
|
call get_next_byte ; reads byte from [esi] to al
|
||||||
|
jnc .nextpacket ; if CF is set, we need more data
|
||||||
|
cmp al, 10
|
||||||
|
je .got_command
|
||||||
|
stosb
|
||||||
|
jmp .byteloop
|
||||||
|
|
||||||
|
; we have a command, call the serverparser
|
||||||
|
|
||||||
|
.got_command:
|
||||||
|
mov byte[edi-1], 0 ; mark the end of the command
|
||||||
|
push esi edx
|
||||||
|
call server_parser
|
||||||
|
pop edx esi
|
||||||
|
jmp .nextcommand
|
||||||
|
|
||||||
|
.done:
|
||||||
|
popa
|
||||||
|
|
||||||
|
ret
|
313
kernel/branches/net/applications/ircc/userparser.inc
Normal file
313
kernel/branches/net/applications/ircc/userparser.inc
Normal file
@ -0,0 +1,313 @@
|
|||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; ;;
|
||||||
|
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;;
|
||||||
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
|
;; ;;
|
||||||
|
;; ;;
|
||||||
|
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||||
|
;; Version 2, June 1991 ;;
|
||||||
|
;; ;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
|
||||||
|
user_parser:
|
||||||
|
|
||||||
|
mov eax, [edit1.size]
|
||||||
|
mov word [usercommand + eax], 0x0a0d ; terminate the line
|
||||||
|
|
||||||
|
cmp byte[usercommand], '/' ; is it a server command ?
|
||||||
|
je server_command
|
||||||
|
|
||||||
|
; Ignore data commands when not connected.
|
||||||
|
cmp [status], STATUS_CONNECTED
|
||||||
|
jne sdts_ret
|
||||||
|
|
||||||
|
; Ok, we said something, print it to our textbox
|
||||||
|
|
||||||
|
if TIMESTAMP
|
||||||
|
call print_timestamp
|
||||||
|
end if
|
||||||
|
|
||||||
|
mov bl, '<'
|
||||||
|
call print_character
|
||||||
|
|
||||||
|
mov esi, user_nick
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov bl,'>'
|
||||||
|
call print_character
|
||||||
|
mov bl,' '
|
||||||
|
call print_character
|
||||||
|
|
||||||
|
mov eax, [edit1.size]
|
||||||
|
mov byte[usercommand + eax],0
|
||||||
|
|
||||||
|
mov esi, usercommand
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
mov bl, 10
|
||||||
|
call print_character
|
||||||
|
|
||||||
|
; and now send it to the server
|
||||||
|
|
||||||
|
mov dword[packetbuf], 'priv'
|
||||||
|
mov dword[packetbuf+4], 'msg '
|
||||||
|
|
||||||
|
mov esi, [window_print]
|
||||||
|
add esi, window.name
|
||||||
|
mov edi, packetbuf+8
|
||||||
|
mov ecx, MAX_WINDOWNAME_LEN
|
||||||
|
.loop:
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jz .done
|
||||||
|
stosb
|
||||||
|
dec ecx
|
||||||
|
jnz .loop
|
||||||
|
.done:
|
||||||
|
|
||||||
|
mov ax, ' :'
|
||||||
|
stosw
|
||||||
|
|
||||||
|
mov esi, usercommand
|
||||||
|
mov ecx, [edit1.size]
|
||||||
|
inc ecx
|
||||||
|
call recode
|
||||||
|
|
||||||
|
mov al, 10
|
||||||
|
stosb
|
||||||
|
|
||||||
|
lea esi, [edi - packetbuf]
|
||||||
|
mcall send, [socketnum], packetbuf, , 0
|
||||||
|
|
||||||
|
sdts_ret:
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
user_commands:
|
||||||
|
dd 'nick', cmd_usr_nick
|
||||||
|
dd 'real', cmd_usr_real
|
||||||
|
dd 'serv', cmd_usr_server
|
||||||
|
dd 'help', cmd_usr_help
|
||||||
|
dd 'code', cmd_usr_code
|
||||||
|
; TODO: All other commands require a connection to the server.
|
||||||
|
dd 'quer', cmd_usr_quer
|
||||||
|
dd 'quit', cmd_usr_quit
|
||||||
|
|
||||||
|
.number = ($ - user_commands) / 8
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
server_command:
|
||||||
|
|
||||||
|
mov eax, dword[usercommand+1]
|
||||||
|
or eax, 0x20202020
|
||||||
|
|
||||||
|
mov edi, user_commands
|
||||||
|
mov ecx, user_commands.number
|
||||||
|
.loop:
|
||||||
|
scasd
|
||||||
|
je .got_cmd
|
||||||
|
add edi, 4
|
||||||
|
dec ecx
|
||||||
|
jnz .loop
|
||||||
|
jmp cmd_usr_send ; If none of the previous commands, just send to server
|
||||||
|
|
||||||
|
.got_cmd:
|
||||||
|
jmp dword[edi]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_usr_quit:
|
||||||
|
|
||||||
|
cmp [edit1.size], 5
|
||||||
|
je .ok
|
||||||
|
jb cmd_usr_send
|
||||||
|
cmp byte[usercommand+5], ' '
|
||||||
|
jne cmd_usr_send
|
||||||
|
|
||||||
|
.ok:
|
||||||
|
call cmd_usr_send
|
||||||
|
|
||||||
|
mcall close, [socketnum]
|
||||||
|
|
||||||
|
mov ecx, MAX_WINDOWS
|
||||||
|
mov edi, windows
|
||||||
|
.loop:
|
||||||
|
mov [edi+window.flags], FLAG_CLOSE
|
||||||
|
; call notify_channel_thread
|
||||||
|
add edi, sizeof.window
|
||||||
|
dec ecx
|
||||||
|
jnz .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_usr_nick:
|
||||||
|
|
||||||
|
cmp [edit1.size], 5
|
||||||
|
je .justprint
|
||||||
|
cmp byte[usercommand+5], ' '
|
||||||
|
jne cmd_usr_send
|
||||||
|
|
||||||
|
mov ecx, MAX_NICK_LEN
|
||||||
|
mov esi, usercommand+6
|
||||||
|
mov edi, user_nick
|
||||||
|
.loop:
|
||||||
|
lodsb
|
||||||
|
cmp al, 13
|
||||||
|
je .done
|
||||||
|
stosb
|
||||||
|
dec ecx
|
||||||
|
jnz .loop
|
||||||
|
.done:
|
||||||
|
xor al, al
|
||||||
|
stosb
|
||||||
|
|
||||||
|
cmp [socketnum], 0
|
||||||
|
je .justprint
|
||||||
|
|
||||||
|
lea esi, [edi - usercommand]
|
||||||
|
mcall send, [socketnum], usercommand+1, , 0
|
||||||
|
|
||||||
|
.justprint:
|
||||||
|
mov esi, str_nickchange
|
||||||
|
call print_text2
|
||||||
|
mov esi, user_nick
|
||||||
|
call print_text2
|
||||||
|
mov esi, str_dotnewline
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_usr_real:
|
||||||
|
|
||||||
|
cmp byte[usercommand+5], ' '
|
||||||
|
jne cmd_usr_send
|
||||||
|
|
||||||
|
mov ecx, MAX_REAL_LEN
|
||||||
|
mov esi, usercommand+6
|
||||||
|
mov edi, user_real_name
|
||||||
|
.loop:
|
||||||
|
lodsb
|
||||||
|
cmp al, 13
|
||||||
|
je .done
|
||||||
|
stosb
|
||||||
|
dec ecx
|
||||||
|
jnz .loop
|
||||||
|
.done:
|
||||||
|
xor al, al
|
||||||
|
stosb
|
||||||
|
|
||||||
|
mov esi, str_realchange
|
||||||
|
call print_text2
|
||||||
|
mov esi, user_real_name
|
||||||
|
call print_text2
|
||||||
|
mov esi, str_dotnewline
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_usr_server:
|
||||||
|
|
||||||
|
mov eax, dword[usercommand+5] ; check for 'er ', we only checked 'serv'
|
||||||
|
or eax, 0x00002020
|
||||||
|
and eax, 0x00ffffff
|
||||||
|
cmp eax, 'er '
|
||||||
|
jne cmd_usr_send
|
||||||
|
|
||||||
|
mov ecx, [edit1.size] ; ok now set the address
|
||||||
|
sub ecx, 8
|
||||||
|
|
||||||
|
mov esi, usercommand+8
|
||||||
|
push esi
|
||||||
|
mov edi, irc_server_name
|
||||||
|
rep movsb
|
||||||
|
xor al, al
|
||||||
|
stosb
|
||||||
|
pop esi
|
||||||
|
|
||||||
|
; set it also in window name
|
||||||
|
mov ebx, [window_print]
|
||||||
|
call window_set_name
|
||||||
|
|
||||||
|
; now connect
|
||||||
|
call socket_connect
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
cmd_usr_quer:
|
||||||
|
|
||||||
|
mov ecx, MAX_WINDOWS
|
||||||
|
mov ebx, windows
|
||||||
|
.loop:
|
||||||
|
cmp [ebx + window.data_ptr], 0
|
||||||
|
je .found
|
||||||
|
add ebx, sizeof.window
|
||||||
|
dec ecx
|
||||||
|
jnz .loop
|
||||||
|
|
||||||
|
; error: no available channels ! FIXME
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
.found:
|
||||||
|
call window_create
|
||||||
|
test eax, eax
|
||||||
|
jz .error
|
||||||
|
mov [ebx + window.data_ptr], eax
|
||||||
|
|
||||||
|
mov esi, usercommand+7
|
||||||
|
call window_set_name
|
||||||
|
|
||||||
|
mov [ebx + window.type], WINDOWTYPE_CHAT
|
||||||
|
mov [ebx + window.flags], 0
|
||||||
|
|
||||||
|
.error:
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_usr_help:
|
||||||
|
|
||||||
|
mov esi, str_help
|
||||||
|
call print_text2
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_usr_code:
|
||||||
|
|
||||||
|
; TODO
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cmd_usr_send:
|
||||||
|
|
||||||
|
mov esi, usercommand+1
|
||||||
|
mov ecx, [edit1.size]
|
||||||
|
inc ecx
|
||||||
|
mov edi, packetbuf
|
||||||
|
call recode
|
||||||
|
|
||||||
|
lea esi, [edi - packetbuf]
|
||||||
|
mcall send, [socketnum], packetbuf, , 0
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
163
kernel/branches/net/applications/ircc/window.inc
Normal file
163
kernel/branches/net/applications/ircc/window.inc
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;; ;;
|
||||||
|
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;;
|
||||||
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
|
;; ;;
|
||||||
|
;; ;;
|
||||||
|
;; GNU GENERAL PUBLIC LICENSE ;;
|
||||||
|
;; Version 2, June 1991 ;;
|
||||||
|
;; ;;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
|
||||||
|
window_create:
|
||||||
|
|
||||||
|
; allocate the window data block
|
||||||
|
mcall 68, 12, sizeof.window_data
|
||||||
|
test eax, eax
|
||||||
|
jz .fail
|
||||||
|
|
||||||
|
; fill it with all zeros
|
||||||
|
push eax
|
||||||
|
mov edi, eax
|
||||||
|
mov ecx, (sizeof.window_data+3)/4
|
||||||
|
xor eax, eax
|
||||||
|
rep stosd
|
||||||
|
pop eax
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
window_set_name: ; esi = ptr to name, ebx = window ptr
|
||||||
|
|
||||||
|
pusha
|
||||||
|
|
||||||
|
; Skip heading spaces
|
||||||
|
.spaceloop:
|
||||||
|
cmp byte[esi], ' '
|
||||||
|
jne .done
|
||||||
|
inc esi
|
||||||
|
jmp .spaceloop
|
||||||
|
.done:
|
||||||
|
|
||||||
|
; Now copy it
|
||||||
|
lea edi, [ebx + window.name]
|
||||||
|
mov ecx, MAX_WINDOWNAME_LEN
|
||||||
|
.loop:
|
||||||
|
lodsb
|
||||||
|
cmp al, 10
|
||||||
|
jbe .addzero
|
||||||
|
stosb
|
||||||
|
dec ecx
|
||||||
|
jnz .loop
|
||||||
|
.addzero:
|
||||||
|
xor al, al
|
||||||
|
stosb
|
||||||
|
|
||||||
|
call draw_windownames ; redraw it
|
||||||
|
|
||||||
|
popa
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
window_find: ; esi is ptr to windowname
|
||||||
|
|
||||||
|
; mov [current_window],
|
||||||
|
; call reset_gui
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
window_refresh:
|
||||||
|
|
||||||
|
; set the correct buffer pointers ; FIXME: what is it good for?
|
||||||
|
mov eax, [textbox_width] ;
|
||||||
|
imul eax, 11 ;
|
||||||
|
mov [pos], eax ;
|
||||||
|
|
||||||
|
mov eax, [window_open]
|
||||||
|
mov eax, [eax + window.data_ptr]
|
||||||
|
add eax, window_data.text
|
||||||
|
mov [text_start], eax
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
print_text: ; eax = start ptr
|
||||||
|
; dl = end char
|
||||||
|
pusha
|
||||||
|
ptr2:
|
||||||
|
mov bl, [eax]
|
||||||
|
|
||||||
|
cmp bl, dl
|
||||||
|
je ptr_ret
|
||||||
|
cmp bl, 0
|
||||||
|
je ptr_ret
|
||||||
|
call print_character
|
||||||
|
|
||||||
|
inc eax
|
||||||
|
jmp ptr2
|
||||||
|
|
||||||
|
ptr_ret:
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
print_text2: ; esi = ptr to ASCIIZ string
|
||||||
|
|
||||||
|
pusha
|
||||||
|
.loop:
|
||||||
|
lodsb
|
||||||
|
test al, al
|
||||||
|
jz .done
|
||||||
|
mov bl, al
|
||||||
|
call print_character
|
||||||
|
jmp .loop
|
||||||
|
|
||||||
|
.done:
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
if TIMESTAMP
|
||||||
|
print_timestamp:
|
||||||
|
|
||||||
|
pusha
|
||||||
|
mcall 3 ; get system time
|
||||||
|
|
||||||
|
mov bl, '['
|
||||||
|
call print_character
|
||||||
|
mov ecx, TIMESTAMP
|
||||||
|
.loop:
|
||||||
|
mov bl, al
|
||||||
|
shr bl, 4
|
||||||
|
add bl, '0'
|
||||||
|
call print_character
|
||||||
|
|
||||||
|
mov bl, al
|
||||||
|
and bl, 0x0f
|
||||||
|
add bl, '0'
|
||||||
|
call print_character
|
||||||
|
|
||||||
|
dec ecx
|
||||||
|
jz .done
|
||||||
|
|
||||||
|
mov bl, ':'
|
||||||
|
call print_character
|
||||||
|
shr eax, 8
|
||||||
|
jmp .loop
|
||||||
|
.done:
|
||||||
|
mov bl, ']'
|
||||||
|
call print_character
|
||||||
|
mov bl, ' '
|
||||||
|
call print_character
|
||||||
|
|
||||||
|
popa
|
||||||
|
ret
|
||||||
|
end if
|
Loading…
Reference in New Issue
Block a user