Fixed QUIT command, cleaned up userparser, small bugfixes.

git-svn-id: svn://kolibrios.org@4710 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2014-03-28 20:03:30 +00:00
parent 42177203d6
commit 09143c58e9
4 changed files with 107 additions and 85 deletions

View File

@ -13,7 +13,7 @@
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
version equ '0.21' version equ '0.22'
; connection status ; connection status
STATUS_DISCONNECTED = 0 STATUS_DISCONNECTED = 0
@ -334,7 +334,7 @@ exit:
cmp [socketnum], 0 cmp [socketnum], 0
je @f je @f
mov esi, quit_msg mov esi, quit_msg
call cmd_usr_quit_server call quit_server
@@: @@:
error: error:
@ -462,9 +462,11 @@ str_connecting db 3, '3* Connecting to ', 0
str_sockerr db 3, '5* Socket error', 10, 0 str_sockerr db 3, '5* Socket error', 10, 0
str_dnserr db 3, '5* Unable to resolve hostname', 10, 0 str_dnserr db 3, '5* Unable to resolve hostname', 10, 0
str_refused db 3, '5* Connection refused', 10, 0 str_refused db 3, '5* Connection refused', 10, 0
str_disconnected db 3, '5* Server disconnected', 10, 0 str_srv_disconnected db 3, '5* Server disconnected', 10, 0
str_disconnected db 3, '5* Disconnected', 10, 0
str_reconnect db 3, '5* Connection reset by user', 10, 0 str_reconnect db 3, '5* Connection reset by user', 10, 0
str_notconnected db 3, '5* Not connected to server', 10, 0 str_notconnected db 3, '5* Not connected to server', 10, 0
str_notchannel db 3, '5* You are not on a channel', 10, 0
str_1 db 3, '13 -', 0 str_1 db 3, '13 -', 0
str_2 db '- ', 0 str_2 db '- ', 0

View File

@ -109,7 +109,7 @@ socket_connect:
call print_asciiz call print_asciiz
mov esi, quit_msg mov esi, quit_msg
call cmd_usr_quit.with_message call quit_server
jmp socket_connect jmp socket_connect
@ -250,7 +250,10 @@ socket_receive:
.disconnected: .disconnected:
mov esi, str_disconnected if TIMESTAMP
call print_timestamp
end if
mov esi, str_srv_disconnected
call print_asciiz call print_asciiz
mov [status], STATUS_DISCONNECTED mov [status], STATUS_DISCONNECTED

View File

@ -13,8 +13,8 @@
user_parser: user_parser:
push [window_active] ; print to the current window mov ebp, [window_active] ; print to the current window
pop [window_print] mov [window_print], ebp
mov eax, [edit1.size] mov eax, [edit1.size]
test eax, eax test eax, eax
@ -22,15 +22,17 @@ user_parser:
mov word[usercommand + eax], 0x0a0d ; terminate the line mov word[usercommand + eax], 0x0a0d ; terminate the line
cmp byte[usercommand], '/' ; is it a server command ? cmp byte[usercommand], '/' ; is it a server command ?
je server_command je .command
; Ignore data commands when not connected.
cmp [status], STATUS_CONNECTED cmp [status], STATUS_CONNECTED
jne .notconnected jne .not_connected
; Ok, we said something, print it to our textbox cmp [ebp + window.type], WINDOWTYPE_CHANNEL
; TODO: dont send if it's a server window? je .send_privmsg
cmp [ebp + window.type], WINDOWTYPE_CHAT
jne .not_channel
.send_privmsg:
if TIMESTAMP if TIMESTAMP
call print_timestamp call print_timestamp
end if end if
@ -59,8 +61,7 @@ user_parser:
mov dword[packetbuf], 'PRIV' mov dword[packetbuf], 'PRIV'
mov dword[packetbuf+4], 'MSG ' mov dword[packetbuf+4], 'MSG '
mov esi, [window_active] lea esi, [ebp + window.name]
add esi, window.name
mov edi, packetbuf+8 mov edi, packetbuf+8
mov ecx, MAX_WINDOWNAME_LEN mov ecx, MAX_WINDOWNAME_LEN
.loop: .loop:
@ -86,18 +87,53 @@ user_parser:
lea esi, [edi - packetbuf] lea esi, [edi - packetbuf]
mcall send, [socketnum], packetbuf, , 0 mcall send, [socketnum], packetbuf, , 0
.ret:
.ret:
ret ret
.notconnected: ; Text begins with a '/' lets try to find the command in the lookup table.
.command:
mov eax, dword[usercommand+1] ; skip '/'
or eax, 0x20202020 ; convert to lowercase
mov edi, user_commands
mov ecx, user_commands.number
cmp [status], STATUS_CONNECTED
je .cmd_loop
mov ecx, user_commands.number2
.cmd_loop:
scasd
je .got_cmd
add edi, 4
dec ecx
jnz .cmd_loop
cmp [status], STATUS_CONNECTED
jne .not_connected
; Commands shorter then 3 chars are placed here
and eax, 0x00ffffff
cmp eax, 'me '
je cmd_usr_me
; If none of the listed commands, send text straight to server
jmp cmd_usr_send
.got_cmd:
jmp dword[edi]
.not_connected:
mov esi, str_notconnected mov esi, str_notconnected
call print_asciiz call print_asciiz
ret
.not_channel:
mov esi, str_notchannel
call print_asciiz
ret ret
; user commands lookup table
user_commands: user_commands:
dd 'nick', cmd_usr_nick dd 'nick', cmd_usr_nick
dd 'real', cmd_usr_real dd 'real', cmd_usr_real
@ -117,42 +153,6 @@ user_commands:
.number = ($ - user_commands) / 8 .number = ($ - user_commands) / 8
server_command:
mov eax, dword[usercommand+1] ; skip '/'
or eax, 0x20202020 ; convert to lowercase
mov edi, user_commands
mov ecx, user_commands.number
cmp [status], STATUS_CONNECTED
je .loop
mov ecx, user_commands.number2
.loop:
scasd
je .got_cmd
add edi, 4
dec ecx
jnz .loop
cmp [status], STATUS_CONNECTED
jne .notconnected
; Commands shorter then 3 chars are placed here
and eax, 0x00ffffff
cmp eax, 'me '
je cmd_usr_me
jmp cmd_usr_send ; If none of the previous commands, just send to server
.got_cmd:
jmp dword[edi]
.notconnected:
mov esi, str_notconnected
call print_asciiz
ret
cmd_usr_msg: cmd_usr_msg:
@ -224,34 +224,14 @@ cmd_usr_msg:
cmd_usr_quit: cmd_usr_quit:
mov esi, quit_msg mov esi, quit_msg
cmp byte[usercommand+5], ' ' cmp byte[usercommand+5], ' '
jne .with_message jne quit_server
lea esi, [usercommand+6] lea esi, [usercommand+6]
.with_message:
call cmd_usr_quit_server
mcall close, [socketnum]
mov [status], STATUS_DISCONNECTED
mov ecx, MAX_WINDOWS
mov edi, windows
.loop:
mov [window_print], edi
push edi ecx
call window_close
pop ecx edi
add edi, sizeof.window
dec ecx
jnz .loop
ret
; esi = quit message ; esi = quit message
cmd_usr_quit_server: quit_server:
; User wants to close a channel, send PART command to server ; User wants to close a channel, send PART command to server
mov dword[packetbuf], 'QUIT' mov dword[packetbuf], 'QUIT'
@ -274,6 +254,27 @@ cmd_usr_quit_server:
lea esi, [edi - packetbuf] ; calculate length lea esi, [edi - packetbuf] ; calculate length
mcall send, [socketnum], packetbuf, , 0 ; and finally send to server mcall send, [socketnum], packetbuf, , 0 ; and finally send to server
mov ebp, windows
.window_loop:
cmp [ebp + window.type], WINDOWTYPE_NONE
je .next_window
mov [window_print], ebp
if TIMESTAMP
call print_timestamp
end if
mov esi, str_disconnected
call print_asciiz
cmp [ebp + window.type], WINDOWTYPE_CHANNEL
jne .next_window
call user_remove_all
.next_window:
add ebp, sizeof.window
cmp ebp, windows + (MAX_WINDOWS * sizeof.window)
jb .window_loop
mov [status], STATUS_DISCONNECTED
mcall close, [socketnum]
ret ret
@ -368,6 +369,10 @@ cmd_usr_server:
cmp eax, 'er ' cmp eax, 'er '
jne cmd_usr_send jne cmd_usr_send
; Server window is always first window in the list, switch to it.
mov [window_print], windows
mov [window_active], windows
mov ecx, [edit1.size] ; ok now set the address mov ecx, [edit1.size] ; ok now set the address
sub ecx, 8 sub ecx, 8

View File

@ -1,6 +1,6 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;; Written by hidnplayr@kolibrios.org ;; ;; Written by hidnplayr@kolibrios.org ;;
@ -22,7 +22,7 @@ align 4
user_add: user_add:
cmp [ebx + window.users], MAX_USERS cmp [ebx + window.users], MAX_USERS
jae fail jae .fail
mov edi, [ebx + window.data_ptr] mov edi, [ebx + window.data_ptr]
add edi, window_data.names add edi, window_data.names
@ -115,7 +115,7 @@ user_add:
inc [ebx + window.users] inc [ebx + window.users]
or [ebx + window.flags], FLAG_UPDATED or [ebx + window.flags], FLAG_UPDATED
.fail:
ret ret
@ -128,7 +128,7 @@ align 4
user_remove: user_remove:
call user_find call user_find
jz fail jz .fail
lea esi, [edi + MAX_NICK_LEN] lea esi, [edi + MAX_NICK_LEN]
mov ecx, [ebx + window.data_ptr] mov ecx, [ebx + window.data_ptr]
@ -139,7 +139,7 @@ user_remove:
dec [ebx + window.users] dec [ebx + window.users]
or [ebx + window.flags], FLAG_UPDATED or [ebx + window.flags], FLAG_UPDATED
.fail:
ret ret
@ -154,7 +154,7 @@ user_find:
mov eax, [ebx + window.users] mov eax, [ebx + window.users]
test eax, eax test eax, eax
jz fail jz .fail
mov edi, [ebx + window.data_ptr] mov edi, [ebx + window.data_ptr]
add edi, window_data.names add edi, window_data.names
@ -169,16 +169,28 @@ user_find:
add edi, MAX_NICK_LEN add edi, MAX_NICK_LEN
dec eax dec eax
jnz .loop jnz .loop
jmp fail jmp .fail
.got_it: .got_it:
pop edi esi pop edi esi
test edi, edi ; to clear zero flag test edi, edi ; to clear zero flag
ret ret
.fail:
fail:
xor edi, edi xor edi, edi
ret ret
user_remove_all:
xor eax, eax
mov edi, [window_print]
mov [edi + window.users], eax
mov [edi + window.selected], eax
mov edi, [edi + window.data_ptr]
add edi, window_data.names
mov ecx, MAX_NICK_LEN * MAX_USERS / 4
rep stosd
ret