Subversion Repositories Kolibri OS

Rev

Rev 4143 | Rev 4617 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2014. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;   Written by hidnplayr@kolibrios.org                            ;;
  7. ;;                                                                 ;;
  8. ;;         GNU GENERAL PUBLIC LICENSE                              ;;
  9. ;;          Version 2, June 1991                                   ;;
  10. ;;                                                                 ;;
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12.  
  13.  
  14. user_parser:
  15.  
  16.         push    [window_active]   ; print to the current window
  17.         pop     [window_print]
  18.  
  19.         mov     eax, [edit1.size]
  20.         test    eax, eax
  21.         jz      .ret                                    ; ignore empty commands
  22.         mov     word [usercommand + eax], 0x0a0d        ; terminate the line
  23.  
  24.         cmp     byte[usercommand], '/'                  ; is it a server command ?
  25.         je      server_command
  26.  
  27. ; Ignore data commands when not connected.
  28.         cmp     [status], STATUS_CONNECTED
  29.         jne     .notconnected
  30.  
  31. ; Ok, we said something, print it to our textbox
  32. ; TODO: dont send if it's a server window?
  33.  
  34.         if TIMESTAMP
  35.         call    print_timestamp
  36.         end if
  37.  
  38.         mov     bl, '<'
  39.         call    print_character
  40.  
  41.         mov     esi, user_nick
  42.         call    print_text2
  43.  
  44.         mov     bl, '>'
  45.         call    print_character
  46.         mov     bl, ' '
  47.         call    print_character
  48.  
  49.         mov     eax, [edit1.size]
  50.         mov     byte[usercommand + eax],0
  51.  
  52.         mov     esi, usercommand
  53.         call    print_text2
  54.  
  55.         mov     bl, 10
  56.         call    print_character
  57.  
  58. ; and now send it to the server
  59.         mov     dword[packetbuf], 'PRIV'
  60.         mov     dword[packetbuf+4], 'MSG '
  61.  
  62.         mov     esi, [window_active]
  63.         add     esi, window.name
  64.         mov     edi, packetbuf+8
  65.         mov     ecx, MAX_WINDOWNAME_LEN
  66.   .loop:
  67.         lodsb
  68.         test    al, al
  69.         jz      .done
  70.         stosb
  71.         dec     ecx
  72.         jnz     .loop
  73.   .done:
  74.  
  75.         mov     ax, ' :'
  76.         stosw
  77.  
  78.         mov     esi, usercommand
  79.         mov     ecx, [edit1.size]
  80.         inc     ecx
  81.         call    recode
  82.  
  83. ; end the command with a CRLF
  84.         mov     ax, 0x0a0d
  85.         stosw
  86.  
  87.         lea     esi, [edi - packetbuf]
  88.         mcall   send, [socketnum], packetbuf, , 0
  89.   .ret:
  90.  
  91.         ret
  92.  
  93.   .notconnected:
  94.         mov     esi, str_notconnected
  95.         call    print_text2
  96.  
  97.         ret
  98.  
  99.  
  100.  
  101. user_commands:
  102.         dd      'nick', cmd_usr_nick
  103.         dd      'real', cmd_usr_real
  104.         dd      'serv', cmd_usr_server
  105.         dd      'help', cmd_usr_help
  106.         dd      'code', cmd_usr_code
  107.  
  108.         .number2 = ($ - user_commands) / 8
  109.  
  110. ; All following commands require a connection to the server.
  111.         dd      'quer', cmd_usr_quer
  112.         dd      'quit', cmd_usr_quit
  113.         dd      'part', cmd_usr_part
  114.         dd      'ctcp', cmd_usr_ctcp
  115.         dd      'msg ', cmd_usr_msg
  116.  
  117.         .number = ($ - user_commands) / 8
  118.  
  119.  
  120.  
  121. server_command:
  122.  
  123.         mov     eax, dword[usercommand+1]       ; skip '/'
  124.         or      eax, 0x20202020                 ; convert to lowercase
  125.  
  126.         mov     edi, user_commands
  127.         mov     ecx, user_commands.number
  128.         cmp     [status], STATUS_CONNECTED
  129.         jne     .loop
  130.         mov     ecx, user_commands.number2
  131.   .loop:
  132.         scasd
  133.         je      .got_cmd
  134.         add     edi, 4
  135.         dec     ecx
  136.         jnz     .loop
  137.  
  138.         cmp     [status], STATUS_CONNECTED
  139.         jne     .notconnected
  140.  
  141.         jmp     cmd_usr_send                    ; If none of the previous commands, just send to server
  142.  
  143.   .got_cmd:
  144.         jmp     dword[edi]
  145.  
  146.   .notconnected:
  147.         mov     esi, str_notconnected
  148.         call    print_text2
  149.  
  150.         ret
  151.  
  152.  
  153.  
  154. cmd_usr_msg:
  155.  
  156.         lea     esi, [usercommand+5]
  157.  
  158.         mov     dword[packetbuf], 'PRIV'
  159.         mov     dword[packetbuf+4], 'MSG '
  160.         lea     edi, [packetbuf+8]
  161.  
  162.   @@:
  163.         lodsb
  164.         test    al, al
  165.         jz      .fail
  166.         cmp     al, 10
  167.         je      .fail
  168.         cmp     al, 13
  169.         je      .fail
  170.         stosb
  171.         cmp     al, ' '
  172.         jne     @r
  173.  
  174.         mov     al, ':'
  175.         stosb
  176.  
  177.         push    edi
  178.   @@:
  179.         lodsb
  180.         test    al, al
  181.         jz      @f
  182.         cmp     al, 10
  183.         je      @f
  184.         cmp     al, 13
  185.         je      @f
  186.         stosb
  187.         jmp     @r
  188.   @@:
  189. ; end the command with a CRLF
  190.         mov     ax, 0x0a0d
  191.         stosw
  192.         mov     byte[edi], 0
  193.  
  194.         lea     esi, [edi - packetbuf]
  195.         mcall   send, [socketnum], packetbuf, , 0
  196.  
  197. ; now print to the window
  198.         if TIMESTAMP
  199.         call    print_timestamp
  200.         end if
  201.  
  202.         mov     esi, msg_header
  203.         call    print_text2
  204.  
  205.         mov     eax, packetbuf+8
  206.         mov     dl, ' '
  207.         call    print_text
  208.  
  209.         mov     bl, '*'
  210.         call    print_character
  211.  
  212.         mov     bl, ' '
  213.         call    print_character
  214.  
  215.         pop     esi
  216.         call    print_text2
  217.  
  218.   .fail:
  219.         ret
  220.  
  221.  
  222.  
  223. cmd_usr_quit:
  224.         mov     esi, quit_msg
  225.  
  226.         cmp     byte[usercommand+5], ' '
  227.         jne     .with_message
  228.         lea     esi, [usercommand+6]
  229.   .with_message:
  230.         call    cmd_usr_quit_server
  231.  
  232.         mcall   close, [socketnum]
  233.         mov     [status], STATUS_DISCONNECTED
  234.  
  235.         mov     ecx, MAX_WINDOWS
  236.         mov     edi, windows
  237.   .loop:
  238.         mov     [window_print], edi
  239.         push    edi ecx
  240.         call    window_close
  241.         pop     ecx edi
  242.         add     edi, sizeof.window
  243.         dec     ecx
  244.         jnz     .loop
  245.  
  246.         ret
  247.  
  248.  
  249.  
  250. ; esi = quit message
  251. cmd_usr_quit_server:
  252.  
  253. ; User wants to close a channel, send PART command to server
  254.         mov     dword[packetbuf], 'QUIT'
  255.         mov     word[packetbuf+4], ' :'
  256.         lea     edi, [packetbuf+6]
  257. ; Append our quit msg
  258.   @@:
  259.         lodsb
  260.         cmp     al, 13
  261.         je      @f
  262.         test    al, al
  263.         jz      @f
  264.         stosb
  265.         jmp     @r
  266.   @@:
  267. ; end the command with a CRLF
  268.         mov     ax, 0x0a0d
  269.         stosw
  270.  
  271.         lea     esi, [edi - packetbuf]                  ; calculate length
  272.         mcall   send, [socketnum], packetbuf, , 0       ; and finally send to server
  273.  
  274.         ret
  275.  
  276.  
  277.  
  278.  
  279. cmd_usr_nick:
  280.  
  281.         cmp     [edit1.size], 5
  282.         je      .dontsend
  283.         cmp     byte[usercommand+5], ' '
  284.         jne     .fail
  285.         cmp     [socketnum], 0
  286.         je      .dontsend
  287.  
  288.         mov     dword[usercommand+1], 'NICK'
  289.         mov     esi, [edit1.size]
  290.         mov     word[usercommand + esi], 0x0a0d
  291.         inc     esi
  292.         mcall   send, [socketnum], usercommand+1, , 0
  293.  
  294.   .fail:
  295.  
  296.         ret
  297.  
  298.   .dontsend:
  299.         mov     ecx, MAX_NICK_LEN
  300.         mov     esi, usercommand+6
  301.         mov     edi, user_nick
  302.   @@:
  303.         lodsb
  304.         cmp     al, 13
  305.         je      @f
  306.         stosb
  307.         dec     ecx
  308.         jnz     @r
  309.   @@:
  310.         xor     al, al
  311.         stosb
  312.  
  313.         mov     esi, str_nickchange
  314.         call    print_text2
  315.         mov     esi, user_nick
  316.         call    print_text2
  317.         mov     esi, str_dotnewline
  318.         call    print_text2
  319.  
  320.         ret
  321.  
  322.  
  323.  
  324. cmd_usr_real:
  325.  
  326.         cmp     byte[usercommand+5], ' '
  327.         jne     cmd_usr_send
  328.  
  329.         mov     ecx, MAX_REAL_LEN
  330.         mov     esi, usercommand+6
  331.         mov     edi, user_real_name
  332.   .loop:
  333.         lodsb
  334.         cmp     al, 13
  335.         je      .done
  336.         stosb
  337.         dec     ecx
  338.         jnz     .loop
  339.   .done:
  340.         xor     al, al
  341.         stosb
  342.  
  343.         mov     esi, str_realchange
  344.         call    print_text2
  345.         mov     esi, user_real_name
  346.         call    print_text2
  347.         mov     esi, str_dotnewline
  348.         call    print_text2
  349.  
  350.         ret
  351.  
  352.  
  353.  
  354. cmd_usr_server:
  355.  
  356.         mov     eax, dword[usercommand+5]       ; check for 'er ', we only checked 'serv'
  357.         or      eax, 0x00002020
  358.         and     eax, 0x00ffffff
  359.         cmp     eax, 'er '
  360.         jne     cmd_usr_send
  361.  
  362.         mov     ecx, [edit1.size]               ; ok now set the address
  363.         sub     ecx, 8
  364.  
  365.         mov     esi, usercommand+8
  366.   .now:
  367.         push    esi
  368.         mov     edi, irc_server_name
  369.   .loop:                                        ; copy until zero byte, or ecx reaches zero.
  370.         lodsb
  371.         stosb
  372.         test    al, al
  373.         jz      .done
  374.         dec     ecx
  375.         jnz     .loop
  376.         xor     al, al
  377.         stosb
  378.   .done:
  379.         pop     esi
  380.  
  381. ; set it also in window name
  382.         mov     ebx, [window_print]
  383.         call    window_set_name
  384.  
  385. ; now connect
  386.         call    socket_connect
  387.  
  388.         ret
  389.  
  390.  
  391. cmd_usr_quer:
  392.  
  393.         mov     esi, usercommand+7
  394.         call    window_open
  395.  
  396.         ret
  397.  
  398.  
  399.  
  400. cmd_usr_help:
  401.  
  402.         mov     esi, str_help
  403.         call    print_text2
  404.  
  405.         ret
  406.  
  407.  
  408.  
  409. cmd_usr_code:
  410.  
  411.         ; TODO
  412.  
  413.         ret
  414.  
  415.  
  416.  
  417. ; User typed a part command
  418. cmd_usr_part:
  419.  
  420.         cmp     byte[usercommand+5], 13         ; parameters given?
  421.         jne     cmd_usr_send                    ; yes, send command straight to server
  422.  
  423. ; close active window
  424. cmd_usr_close_window:
  425.  
  426.         mov     esi, [window_active]
  427.         mov     [window_print], esi
  428.         cmp     [esi + window.type], WINDOWTYPE_SERVER
  429.         je      .not_channel
  430.  
  431.         lea     esi, [esi + window.name]
  432.         call    cmd_usr_part_channel
  433.         call    window_close
  434.         ret
  435.  
  436.   .not_channel:
  437.         cmp     [esi + window.type], WINDOWTYPE_CHAT
  438.         jne     .not_chat
  439.  
  440.         call    window_close
  441.   .not_chat:
  442.  
  443.         ret
  444.  
  445.  
  446.  
  447. ; Send part command to server
  448. ; esi must point to channel name (ASCIIZ)
  449. cmd_usr_part_channel:
  450.  
  451. ; User wants to close a channel, send PART command to server
  452.         mov     dword[packetbuf], 'PART'
  453.         mov     byte[packetbuf+4], ' '
  454.         lea     edi, [packetbuf+5]
  455.   @@:
  456.         lodsb
  457.         test    al, al
  458.         jz      @f
  459.         cmp     al, 13
  460.         je      @f
  461.         cmp     al, 10
  462.         je      @f
  463.         stosb
  464.         jmp     @r
  465.   @@:
  466. ; end the command with a CRLF
  467.         mov     ax, 0x0a0d
  468.         stosw
  469.  
  470.         lea     esi, [edi - packetbuf]                  ; calculate length
  471.         mcall   send, [socketnum], packetbuf, , 0       ; and finally send to server
  472.  
  473.         ret
  474.  
  475.  
  476.  
  477. cmd_usr_ctcp:
  478.  
  479.         cmp     byte[usercommand+5], ' '
  480.         jne     cmd_usr_send
  481.  
  482.         mov     esi, usercommand+6
  483. ; prepare a 'PRIVMSG '
  484.         mov     dword[packetbuf], 'PRIV'
  485.         mov     dword[packetbuf+4], 'MSG '
  486.         lea     edi, [packetbuf+8]
  487.  
  488. ; append the destination (nickname/channel)
  489.   @@:
  490.         lodsb
  491.         test    al, al
  492.         jz      .fail
  493.         cmp     al, ' '
  494.         je      @f
  495.         stosb
  496.         jmp     @r
  497.   @@:
  498.  
  499.         mov     ax, ' :'
  500.         stosw
  501.         mov     al, 0x01
  502.         stosb
  503.  
  504. ; copy the message itself
  505.   @@:
  506.         lodsb
  507.         test    al, al
  508.         jz      @f
  509.         cmp     al, 13
  510.         je      @f
  511.         cmp     al, 10
  512.         je      @f
  513.         stosb
  514.         jmp     @r
  515.   @@:
  516.  
  517. ; end of message
  518.         mov     al, 0x01
  519.         stosb
  520.         mov     ax, 0x0a0d
  521.         stosw
  522.  
  523. ; now send it away
  524.         lea     esi, [edi - packetbuf]                  ; calculate length
  525.         mcall   send, [socketnum], packetbuf, , 0       ; and finally send to server
  526.  
  527. ;; TODO: print to window
  528.  
  529.   .fail:
  530.  
  531.         ret
  532.  
  533.  
  534.  
  535. ; The user typed some undefined command, just recode it and send to the server
  536. cmd_usr_send:
  537.  
  538.         mov     esi, usercommand+1
  539.         mov     ecx, [edit1.size]
  540.         inc     ecx
  541.         mov     edi, packetbuf
  542.         call    recode
  543.  
  544.         lea     esi, [edi - packetbuf]
  545.         mcall   send, [socketnum], packetbuf, , 0
  546.  
  547.         ret
  548.  
  549.  
  550.  
  551.  
  552.  
  553.