Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
3545 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
4477 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved.    ;;
3545 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
4143 hidnplayr 6
;;   Written by hidnplayr@kolibrios.org                            ;;
3545 hidnplayr 7
;;                                                                 ;;
8
;;         GNU GENERAL PUBLIC LICENSE                              ;;
9
;;          Version 2, June 1991                                   ;;
10
;;                                                                 ;;
11
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
 
13
 
14
user_parser:
15
 
4143 hidnplayr 16
        push    [window_active]   ; print to the current window
17
        pop     [window_print]
18
 
3545 hidnplayr 19
        mov     eax, [edit1.size]
3563 hidnplayr 20
        test    eax, eax
4477 hidnplayr 21
        jz      .ret                                    ; ignore empty commands
3545 hidnplayr 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
4477 hidnplayr 29
        jne     .notconnected
3545 hidnplayr 30
 
31
; Ok, we said something, print it to our textbox
32
; TODO: dont send if it's a server window?
33
 
4143 hidnplayr 34
        if TIMESTAMP
3545 hidnplayr 35
        call    print_timestamp
4143 hidnplayr 36
        end if
3545 hidnplayr 37
 
38
        mov     bl, '<'
39
        call    print_character
40
 
41
        mov     esi, user_nick
42
        call    print_text2
43
 
3981 hidnplayr 44
        mov     bl, '>'
3545 hidnplayr 45
        call    print_character
3981 hidnplayr 46
        mov     bl, ' '
3545 hidnplayr 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
4143 hidnplayr 59
        mov     dword[packetbuf], 'PRIV'
60
        mov     dword[packetbuf+4], 'MSG '
3545 hidnplayr 61
 
3981 hidnplayr 62
        mov     esi, [window_active]
3545 hidnplayr 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
 
4143 hidnplayr 83
; end the command with a CRLF
84
        mov     ax, 0x0a0d
85
        stosw
3545 hidnplayr 86
 
87
        lea     esi, [edi - packetbuf]
88
        mcall   send, [socketnum], packetbuf, , 0
4477 hidnplayr 89
  .ret:
3545 hidnplayr 90
 
4477 hidnplayr 91
        ret
3545 hidnplayr 92
 
4477 hidnplayr 93
  .notconnected:
94
        mov     esi, str_notconnected
95
        call    print_text2
96
 
3545 hidnplayr 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
4143 hidnplayr 107
 
4477 hidnplayr 108
        .number2 = ($ - user_commands) / 8
109
 
110
; All following commands require a connection to the server.
3545 hidnplayr 111
        dd      'quer', cmd_usr_quer
112
        dd      'quit', cmd_usr_quit
3981 hidnplayr 113
        dd      'part', cmd_usr_part
4143 hidnplayr 114
        dd      'ctcp', cmd_usr_ctcp
115
        dd      'msg ', cmd_usr_msg
3545 hidnplayr 116
 
117
        .number = ($ - user_commands) / 8
118
 
119
 
120
 
121
server_command:
122
 
4477 hidnplayr 123
        mov     eax, dword[usercommand+1]       ; skip '/'
124
        or      eax, 0x20202020                 ; convert to lowercase
3545 hidnplayr 125
 
126
        mov     edi, user_commands
127
        mov     ecx, user_commands.number
4477 hidnplayr 128
        cmp     [status], STATUS_CONNECTED
129
        jne     .loop
130
        mov     ecx, user_commands.number2
3545 hidnplayr 131
  .loop:
132
        scasd
133
        je      .got_cmd
134
        add     edi, 4
135
        dec     ecx
136
        jnz     .loop
137
 
4477 hidnplayr 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
 
3545 hidnplayr 143
  .got_cmd:
144
        jmp     dword[edi]
145
 
4477 hidnplayr 146
  .notconnected:
147
        mov     esi, str_notconnected
148
        call    print_text2
3545 hidnplayr 149
 
4477 hidnplayr 150
        ret
3545 hidnplayr 151
 
152
 
153
 
4143 hidnplayr 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
 
3545 hidnplayr 223
cmd_usr_quit:
3981 hidnplayr 224
        mov     esi, quit_msg
225
 
3545 hidnplayr 226
        cmp     byte[usercommand+5], ' '
4143 hidnplayr 227
        jne     .with_message
228
        lea     esi, [usercommand+6]
229
  .with_message:
3981 hidnplayr 230
        call    cmd_usr_quit_server
3545 hidnplayr 231
 
232
        mcall   close, [socketnum]
4143 hidnplayr 233
        mov     [status], STATUS_DISCONNECTED
3545 hidnplayr 234
 
235
        mov     ecx, MAX_WINDOWS
236
        mov     edi, windows
237
  .loop:
4143 hidnplayr 238
        mov     [window_print], edi
239
        push    edi ecx
240
        call    window_close
241
        pop     ecx edi
3545 hidnplayr 242
        add     edi, sizeof.window
243
        dec     ecx
244
        jnz     .loop
245
 
246
        ret
247
 
248
 
249
 
3981 hidnplayr 250
; esi = quit message
251
cmd_usr_quit_server:
3545 hidnplayr 252
 
3981 hidnplayr 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
4143 hidnplayr 260
        cmp     al, 13
261
        je      @f
262
        test    al, al
263
        jz      @f
3981 hidnplayr 264
        stosb
4143 hidnplayr 265
        jmp     @r
266
  @@:
3981 hidnplayr 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
 
3545 hidnplayr 279
cmd_usr_nick:
280
 
281
        cmp     [edit1.size], 5
4143 hidnplayr 282
        je      .dontsend
3545 hidnplayr 283
        cmp     byte[usercommand+5], ' '
4143 hidnplayr 284
        jne     .fail
285
        cmp     [socketnum], 0
286
        je      .dontsend
3545 hidnplayr 287
 
4143 hidnplayr 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:
3545 hidnplayr 299
        mov     ecx, MAX_NICK_LEN
300
        mov     esi, usercommand+6
301
        mov     edi, user_nick
4143 hidnplayr 302
  @@:
3545 hidnplayr 303
        lodsb
304
        cmp     al, 13
4143 hidnplayr 305
        je      @f
3545 hidnplayr 306
        stosb
307
        dec     ecx
4143 hidnplayr 308
        jnz     @r
309
  @@:
3545 hidnplayr 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
 
4477 hidnplayr 362
        mov     ecx, [edit1.size]               ; ok now set the address
3545 hidnplayr 363
        sub     ecx, 8
364
 
365
        mov     esi, usercommand+8
4477 hidnplayr 366
  .now:
3545 hidnplayr 367
        push    esi
368
        mov     edi, irc_server_name
4477 hidnplayr 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
3545 hidnplayr 376
        xor     al, al
377
        stosb
4477 hidnplayr 378
  .done:
3545 hidnplayr 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
4477 hidnplayr 394
        call    window_open
3545 hidnplayr 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
 
3981 hidnplayr 417
; User typed a part command
418
cmd_usr_part:
419
 
4143 hidnplayr 420
        cmp     byte[usercommand+5], 13         ; parameters given?
421
        jne     cmd_usr_send                    ; yes, send command straight to server
3981 hidnplayr 422
 
4143 hidnplayr 423
; close active window
424
cmd_usr_close_window:
425
 
426
        mov     esi, [window_active]
427
        mov     [window_print], esi
3981 hidnplayr 428
        cmp     [esi + window.type], WINDOWTYPE_SERVER
4143 hidnplayr 429
        je      .not_channel
3981 hidnplayr 430
 
4143 hidnplayr 431
        lea     esi, [esi + window.name]
432
        call    cmd_usr_part_channel
433
        call    window_close
434
        ret
3981 hidnplayr 435
 
4143 hidnplayr 436
  .not_channel:
437
        cmp     [esi + window.type], WINDOWTYPE_CHAT
438
        jne     .not_chat
439
 
440
        call    window_close
441
  .not_chat:
442
 
3981 hidnplayr 443
        ret
444
 
4143 hidnplayr 445
 
446
 
3981 hidnplayr 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
4143 hidnplayr 457
        test    al, al
458
        jz      @f
459
        cmp     al, 13
460
        je      @f
461
        cmp     al, 10
462
        je      @f
3981 hidnplayr 463
        stosb
4143 hidnplayr 464
        jmp     @r
465
  @@:
3981 hidnplayr 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
 
4477 hidnplayr 476
 
4143 hidnplayr 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
 
4477 hidnplayr 534
 
3981 hidnplayr 535
; The user typed some undefined command, just recode it and send to the server
3545 hidnplayr 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
 
4143 hidnplayr 549