forked from KolibriOS/kolibrios
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:
parent
42177203d6
commit
09143c58e9
@ -13,7 +13,7 @@
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
version equ '0.21'
|
||||
version equ '0.22'
|
||||
|
||||
; connection status
|
||||
STATUS_DISCONNECTED = 0
|
||||
@ -334,7 +334,7 @@ exit:
|
||||
cmp [socketnum], 0
|
||||
je @f
|
||||
mov esi, quit_msg
|
||||
call cmd_usr_quit_server
|
||||
call quit_server
|
||||
@@:
|
||||
|
||||
error:
|
||||
@ -462,9 +462,11 @@ str_connecting db 3, '3* Connecting to ', 0
|
||||
str_sockerr db 3, '5* Socket error', 10, 0
|
||||
str_dnserr db 3, '5* Unable to resolve hostname', 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_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_2 db '- ', 0
|
||||
|
@ -109,7 +109,7 @@ socket_connect:
|
||||
call print_asciiz
|
||||
|
||||
mov esi, quit_msg
|
||||
call cmd_usr_quit.with_message
|
||||
call quit_server
|
||||
|
||||
jmp socket_connect
|
||||
|
||||
@ -250,7 +250,10 @@ socket_receive:
|
||||
|
||||
|
||||
.disconnected:
|
||||
mov esi, str_disconnected
|
||||
if TIMESTAMP
|
||||
call print_timestamp
|
||||
end if
|
||||
mov esi, str_srv_disconnected
|
||||
call print_asciiz
|
||||
|
||||
mov [status], STATUS_DISCONNECTED
|
||||
|
@ -13,8 +13,8 @@
|
||||
|
||||
user_parser:
|
||||
|
||||
push [window_active] ; print to the current window
|
||||
pop [window_print]
|
||||
mov ebp, [window_active] ; print to the current window
|
||||
mov [window_print], ebp
|
||||
|
||||
mov eax, [edit1.size]
|
||||
test eax, eax
|
||||
@ -22,15 +22,17 @@ user_parser:
|
||||
mov word[usercommand + eax], 0x0a0d ; terminate the line
|
||||
|
||||
cmp byte[usercommand], '/' ; is it a server command ?
|
||||
je server_command
|
||||
je .command
|
||||
|
||||
; Ignore data commands when not connected.
|
||||
cmp [status], STATUS_CONNECTED
|
||||
jne .notconnected
|
||||
jne .not_connected
|
||||
|
||||
; Ok, we said something, print it to our textbox
|
||||
; TODO: dont send if it's a server window?
|
||||
cmp [ebp + window.type], WINDOWTYPE_CHANNEL
|
||||
je .send_privmsg
|
||||
cmp [ebp + window.type], WINDOWTYPE_CHAT
|
||||
jne .not_channel
|
||||
|
||||
.send_privmsg:
|
||||
if TIMESTAMP
|
||||
call print_timestamp
|
||||
end if
|
||||
@ -59,8 +61,7 @@ user_parser:
|
||||
mov dword[packetbuf], 'PRIV'
|
||||
mov dword[packetbuf+4], 'MSG '
|
||||
|
||||
mov esi, [window_active]
|
||||
add esi, window.name
|
||||
lea esi, [ebp + window.name]
|
||||
mov edi, packetbuf+8
|
||||
mov ecx, MAX_WINDOWNAME_LEN
|
||||
.loop:
|
||||
@ -86,18 +87,53 @@ user_parser:
|
||||
|
||||
lea esi, [edi - packetbuf]
|
||||
mcall send, [socketnum], packetbuf, , 0
|
||||
.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
|
||||
call print_asciiz
|
||||
ret
|
||||
|
||||
.not_channel:
|
||||
mov esi, str_notchannel
|
||||
call print_asciiz
|
||||
ret
|
||||
|
||||
|
||||
|
||||
; user commands lookup table
|
||||
user_commands:
|
||||
dd 'nick', cmd_usr_nick
|
||||
dd 'real', cmd_usr_real
|
||||
@ -117,42 +153,6 @@ user_commands:
|
||||
.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:
|
||||
|
||||
@ -224,34 +224,14 @@ cmd_usr_msg:
|
||||
|
||||
|
||||
cmd_usr_quit:
|
||||
|
||||
mov esi, quit_msg
|
||||
|
||||
cmp byte[usercommand+5], ' '
|
||||
jne .with_message
|
||||
jne quit_server
|
||||
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
|
||||
cmd_usr_quit_server:
|
||||
quit_server:
|
||||
|
||||
; User wants to close a channel, send PART command to server
|
||||
mov dword[packetbuf], 'QUIT'
|
||||
@ -274,6 +254,27 @@ cmd_usr_quit_server:
|
||||
lea esi, [edi - packetbuf] ; calculate length
|
||||
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
|
||||
|
||||
|
||||
@ -368,6 +369,10 @@ cmd_usr_server:
|
||||
cmp eax, 'er '
|
||||
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
|
||||
sub ecx, 8
|
||||
|
||||
|
@ -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 ;;
|
||||
;; ;;
|
||||
;; Written by hidnplayr@kolibrios.org ;;
|
||||
@ -22,7 +22,7 @@ align 4
|
||||
user_add:
|
||||
|
||||
cmp [ebx + window.users], MAX_USERS
|
||||
jae fail
|
||||
jae .fail
|
||||
|
||||
mov edi, [ebx + window.data_ptr]
|
||||
add edi, window_data.names
|
||||
@ -115,7 +115,7 @@ user_add:
|
||||
|
||||
inc [ebx + window.users]
|
||||
or [ebx + window.flags], FLAG_UPDATED
|
||||
|
||||
.fail:
|
||||
ret
|
||||
|
||||
|
||||
@ -128,7 +128,7 @@ align 4
|
||||
user_remove:
|
||||
|
||||
call user_find
|
||||
jz fail
|
||||
jz .fail
|
||||
|
||||
lea esi, [edi + MAX_NICK_LEN]
|
||||
mov ecx, [ebx + window.data_ptr]
|
||||
@ -139,7 +139,7 @@ user_remove:
|
||||
|
||||
dec [ebx + window.users]
|
||||
or [ebx + window.flags], FLAG_UPDATED
|
||||
|
||||
.fail:
|
||||
ret
|
||||
|
||||
|
||||
@ -154,7 +154,7 @@ user_find:
|
||||
|
||||
mov eax, [ebx + window.users]
|
||||
test eax, eax
|
||||
jz fail
|
||||
jz .fail
|
||||
mov edi, [ebx + window.data_ptr]
|
||||
add edi, window_data.names
|
||||
|
||||
@ -169,16 +169,28 @@ user_find:
|
||||
add edi, MAX_NICK_LEN
|
||||
dec eax
|
||||
jnz .loop
|
||||
jmp fail
|
||||
jmp .fail
|
||||
|
||||
.got_it:
|
||||
pop edi esi
|
||||
test edi, edi ; to clear zero flag
|
||||
ret
|
||||
|
||||
.fail:
|
||||
xor edi, edi
|
||||
ret
|
||||
|
||||
|
||||
fail:
|
||||
|
||||
xor edi, edi
|
||||
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
|
Loading…
Reference in New Issue
Block a user