Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
3545 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
3
;; Copyright (C) KolibriOS team 2004-2013. All rights reserved.    ;;
4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
6
;;  IRC client for KolibriOS                                       ;;
7
;;                                                                 ;;
8
;;   Written by hidnplayr@kolibrios.org,                           ;;
9
;;     text encoder/decoder by Clevermouse.                        ;;
10
;;                                                                 ;;
11
;;         GNU GENERAL PUBLIC LICENSE                              ;;
12
;;          Version 2, June 1991                                   ;;
13
;;                                                                 ;;
14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
15
 
4143 hidnplayr 16
version equ '0.15'
3545 hidnplayr 17
 
18
; connection status
19
STATUS_DISCONNECTED     = 0
20
STATUS_RESOLVING        = 1
21
STATUS_CONNECTING       = 2
22
STATUS_CONNECTED        = 3
23
 
24
; window flags
25
FLAG_UPDATED            = 1 shl 0
4143 hidnplayr 26
FLAG_RECEIVING_NAMES    = 1 shl 1
3545 hidnplayr 27
 
28
; window types
4143 hidnplayr 29
WINDOWTYPE_NONE         = 0
30
WINDOWTYPE_SERVER       = 1
31
WINDOWTYPE_CHANNEL      = 2
32
WINDOWTYPE_CHAT         = 3
33
WINDOWTYPE_LIST         = 4
34
WINDOWTYPE_DCC          = 5
3545 hidnplayr 35
 
36
; supported encodings
37
CP866                   = 0
38
CP1251                  = 1
39
UTF8                    = 2
40
 
41
; settings
42
USERCMD_MAX_SIZE        = 400
43
 
44
WIN_MIN_X               = 600
4143 hidnplayr 45
WIN_MIN_Y               = 170
3545 hidnplayr 46
 
47
TEXT_X                  = 5
4143 hidnplayr 48
TEXT_Y                  = TOP_Y + 2
3545 hidnplayr 49
 
4143 hidnplayr 50
TOP_Y                   = 24
51
BOTTOM_Y                = 15
3545 hidnplayr 52
 
53
MAX_WINDOWS             = 20
54
MAX_USERS               = 4096
4143 hidnplayr 55
TEXT_BUFFERSIZE         = 4096;*1024
3545 hidnplayr 56
 
57
MAX_NICK_LEN            = 32
58
MAX_REAL_LEN            = 32    ; realname
59
MAX_SERVER_NAME         = 256
60
 
61
MAX_CHANNEL_LEN         = 40
62
MAX_CHANNELS            = 37
63
 
64
MAX_COMMAND_LEN         = 512
65
 
66
TIMESTAMP               = 3     ; 3 = hh:mm:ss, 2 = hh:mm, 0 = no timestamp
67
 
68
MAX_WINDOWNAME_LEN      = 256
69
 
70
WINDOW_BTN_START        = 100
3981 hidnplayr 71
WINDOW_BTN_CLOSE        = 2
72
WINDOW_BTN_LIST         = 3
3545 hidnplayr 73
 
4143 hidnplayr 74
SCROLLBAR_WIDTH         = 14
75
USERLIST_WIDTH          = 100
3545 hidnplayr 76
 
4143 hidnplayr 77
FONT_HEIGHT             = 9
78
FONT_WIDTH              = 6
3545 hidnplayr 79
 
80
format binary as ""
81
 
82
use32
83
 
84
        org     0x0
85
 
86
        db      'MENUET01'              ; 8 byte id
87
        dd      1                       ; header version
88
        dd      START                   ; program start
89
        dd      I_END                   ; program image size
90
        dd      IM_END+2048             ; required amount of memory
91
        dd      IM_END+2048
92
        dd      param
93
        dd      path
94
 
3618 hidnplayr 95
include "../../macros.inc"
96
include "../../proc32.inc"
97
include "../../dll.inc"
98
include "../../network.inc"
99
include "../../struct.inc"
3549 yogev_ezra 100
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
3545 hidnplayr 101
 
102
struct  window
4143 hidnplayr 103
        data_ptr        dd ?
3545 hidnplayr 104
        flags           db ?
105
        type            db ?
106
        name            rb MAX_WINDOWNAME_LEN
107
        users           dd ?
108
        users_scroll    dd ?
109
        selected        dd ?            ; selected user, 0 if none selected
4143 hidnplayr 110
 
111
        text_start      dd ?            ; pointer to current textbox data
112
        text_end        dd ?
113
        text_print      dd ?            ; pointer to first character to print on screen
114
        text_line_print dd ?            ; line number of that character
115
        text_write      dd ?            ; write pointer
116
        text_lines      dd ?            ; total number of lines
117
        text_scanned    dd ?            ; pointer to beginning of unscanned data (we still need to count number of lines, insert newline characters,..)
118
 
3545 hidnplayr 119
ends
120
 
121
struct  window_data
4143 hidnplayr 122
        text            rb TEXT_BUFFERSIZE
3545 hidnplayr 123
        names           rb MAX_NICK_LEN * MAX_USERS
124
ends
125
 
126
include "encodings.inc"
4143 hidnplayr 127
include "window.inc"
3545 hidnplayr 128
include "serverparser.inc"
129
include "userparser.inc"
130
include "socket.inc"
131
include "gui.inc"
132
include "users.inc"
4060 hidnplayr 133
include "textbox.inc"
3545 hidnplayr 134
 
135
 
136
START:
137
 
138
        mcall   68, 11                  ; init heap so we can allocate memory dynamically
139
 
140
; wanted events
3981 hidnplayr 141
        mcall   40, EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_STACK+EVM_MOUSE+EVM_MOUSE_FILTER
3545 hidnplayr 142
 
143
; load libraries
144
        stdcall dll.Load, @IMPORT
145
        test    eax, eax
146
        jnz     exit
147
 
148
; find path to main settings file (ircc.ini)
149
        mov     edi, path               ; Calculate the length of zero-terminated string
150
        xor     al, al
151
        mov     ecx, 1024
152
        repne   scasb
153
        dec     edi
154
        mov     eax, '.ini'
155
        stosd
156
        xor     al, al
157
        stosb
158
 
159
; Fill the window buffer with zeros
160
        mov     edi, windows
161
        mov     ecx, (sizeof.window*MAX_WINDOWS+3)/4
162
        xor     eax, eax
163
        rep     stosd
164
 
165
; clear command area too
166
        mov     edi, servercommand
167
        mov     ecx, 600/4
168
        rep     stosd
169
 
170
; allocate window data block
4143 hidnplayr 171
        mov     ebx, windows
3545 hidnplayr 172
        call    window_create
4143 hidnplayr 173
        test    eax, eax
174
        jz      error
3545 hidnplayr 175
        mov     [ebx + window.type], WINDOWTYPE_SERVER
176
 
177
; get system colors
178
        mcall   48, 3, colors, 40
179
 
180
; set edit box and scrollbar colors
181
        mov     eax, [colors.work]
182
        mov     [scroll1.bg_color], eax
4143 hidnplayr 183
        mov     [scroll2.bg_color], eax
3545 hidnplayr 184
 
185
        mov     eax, [colors.work_button]
186
        mov     [scroll1.front_color], eax
4143 hidnplayr 187
        mov     [scroll2.front_color], eax
3545 hidnplayr 188
 
189
        mov     eax, [colors.work_text]
190
        mov     [scroll1.line_color], eax
4143 hidnplayr 191
        mov     [scroll2.line_color], eax
3545 hidnplayr 192
 
4143 hidnplayr 193
        mov     [scroll1.type], 1               ; 0 = simple, 1 = skinned
194
        mov     [scroll2.type], 1
195
 
3545 hidnplayr 196
; get settings from ini
197
        invoke  ini.get_str, path, str_user, str_nick, user_nick, MAX_NICK_LEN, default_nick
198
        invoke  ini.get_str, path, str_user, str_real, user_real_name, MAX_REAL_LEN, default_real
3981 hidnplayr 199
        invoke  ini.get_str, path, str_user, str_quitmsg, quit_msg, 250, default_quit
3545 hidnplayr 200
 
201
; Welcome user
202
        mov     esi, str_welcome
203
        call    print_text2
204
 
4143 hidnplayr 205
        call    draw_window     ; Draw window a first time, so we can figure out skin size
3545 hidnplayr 206
 
207
redraw:
208
        call    draw_window
209
 
210
still:
211
; wait here for event
212
        mcall   10
213
 
214
        dec     eax
215
        jz      redraw
216
 
217
        dec     eax
218
        jz      main_window_key
219
 
220
        dec     eax
221
        jz      button
222
 
223
        cmp     al, 3
224
        je      mouse
225
 
226
        call    process_network_event
227
 
4143 hidnplayr 228
        mov     edi, [window_active]
229
        test    [edi + window.flags], FLAG_UPDATED
3545 hidnplayr 230
        jz      .no_update
231
        call    draw_channel_text
4143 hidnplayr 232
        mov     edi, [window_active]
233
        cmp     [edi + window.type], WINDOWTYPE_CHANNEL
234
        jne     .no_update
235
        call    draw_channel_list
3545 hidnplayr 236
  .no_update:
237
 
238
        jmp     still
239
 
240
button:
241
 
242
        mcall   17              ; get id
3981 hidnplayr 243
        ror     eax, 8
3545 hidnplayr 244
 
245
        cmp     ax, 1           ; close program
246
        je      exit
247
 
3981 hidnplayr 248
        cmp     ax, WINDOW_BTN_CLOSE
3545 hidnplayr 249
        jne     @f
4143 hidnplayr 250
        call    cmd_usr_close_window
3981 hidnplayr 251
        jmp     still
252
 
253
  @@:
254
        cmp     ax, WINDOW_BTN_LIST
255
        jne     @f
256
 
257
        push    eax
258
 
3545 hidnplayr 259
        mcall   37, 1           ; Get mouse position
260
        sub     ax, TEXT_Y
4143 hidnplayr 261
        mov     bl, FONT_HEIGHT
3545 hidnplayr 262
        div     bl
263
        and     eax, 0x000000ff
264
        inc     eax
265
        add     eax, [scroll1.position]
3981 hidnplayr 266
        mov     ebx, [window_active]
3545 hidnplayr 267
        mov     [ebx + window.selected], eax
268
 
4143 hidnplayr 269
        call    draw_channel_list
3545 hidnplayr 270
 
3981 hidnplayr 271
        pop     eax
272
        test    eax, 1 shl 25   ; Right mouse button pressed?
273
        jz      still
274
 
275
; Right mouse BTN was pressed, open chat window
276
        mov     ebx, [window_active]
277
        mov     eax, [ebx + window.selected]
278
        dec     eax
279
        imul    eax, MAX_NICK_LEN
280
        mov     ebx, [ebx + window.data_ptr]
281
        lea     esi, [ebx + window_data.names + eax]
282
        call    window_open
283
        push    [window_print]
284
        pop     [window_active]
285
        call    redraw
286
 
3545 hidnplayr 287
        jmp     still
288
 
289
  @@:
290
        sub     ax, WINDOW_BTN_START
291
        jb      exit
292
 
293
        cmp     ax, MAX_WINDOWS
294
        ja      exit
295
 
4143 hidnplayr 296
; OK, time to switch to another window.
3545 hidnplayr 297
        mov     dx, sizeof.window
298
        mul     dx
299
        shl     edx, 16
300
        mov     dx, ax
301
        add     edx, windows
4143 hidnplayr 302
        cmp     [edx + window.type], WINDOWTYPE_NONE
3545 hidnplayr 303
        je      exit
3981 hidnplayr 304
        mov     [window_active], edx
4143 hidnplayr 305
 
306
        mov     [scroll2.position], 1           ;;; FIXME
3545 hidnplayr 307
        call    draw_window
308
 
309
        jmp     still
3981 hidnplayr 310
 
3545 hidnplayr 311
exit:
3981 hidnplayr 312
 
313
        cmp     [socketnum], 0
314
        je      @f
315
        mov     esi, quit_msg
316
        call    cmd_usr_quit_server
317
  @@:
318
 
4143 hidnplayr 319
error:
320
 
3545 hidnplayr 321
        mcall   -1
322
 
323
 
324
 
325
main_window_key:
326
 
327
        mcall   2
328
 
329
        push    dword edit1
330
        call    [edit_box_key]
331
 
4143 hidnplayr 332
;        cmp     ah, 178
333
;        jne     .no_up
334
;
335
;        jmp     still
336
;
337
;
338
;  .no_up:
339
;        cmp     ah, 177
340
;        jne     .no_down
341
;
342
;        jmp     still
343
;
344
;  .no_down:
3545 hidnplayr 345
        cmp     ah, 13          ; enter
346
        jne     no_send2
347
 
348
        call    user_parser
349
 
4143 hidnplayr 350
        mov     eax, [edit1.size]
351
 
3545 hidnplayr 352
        mov     [edit1.size], 0
353
        mov     [edit1.pos], 0
354
 
355
        push    dword edit1
356
        call    [edit_box_draw]
357
 
358
        call    draw_channel_text
359
 
360
        jmp     still
361
  no_send2:
362
 
363
        jmp     still
364
 
365
mouse:
366
        push    dword edit1
367
        call    [edit_box_mouse]
368
 
4143 hidnplayr 369
; TODO: check if scrollbar is active?
370
        mov     edi, [window_active]
371
        cmp     [edi + window.type], WINDOWTYPE_CHANNEL
372
        jne     @f
3545 hidnplayr 373
        push    [scroll1.position]
374
        push    dword scroll1
4143 hidnplayr 375
        call    [scrollbar_mouse]
3545 hidnplayr 376
        pop     eax
377
        cmp     eax, [scroll1.position] ; did the scrollbar move?
378
        je      @f
4143 hidnplayr 379
        call    draw_channel_list
3545 hidnplayr 380
  @@:
381
 
4143 hidnplayr 382
; TODO: check if scrollbar is active?
383
        mov     edi, [window_active]
384
        mov     eax, [edi + window.text_lines]
385
        cmp     eax, [textbox_height]
386
        jbe     @f
387
        push    dword scroll2
388
        call    [scrollbar_mouse]
389
;        mov     edi, [window_active]
390
        mov     edx, [scroll2.position]
391
        sub     edx, [edi + window.text_line_print]
392
        je      @f
393
        call    draw_channel_text.scroll_to_pos
394
  @@:
395
 
3545 hidnplayr 396
        jmp     still
397
 
398
 
399
; DATA AREA
400
 
401
encoding_text:
402
db      'CP866 '
403
db      'CP1251'
404
db      'UTF-8 '
405
encoding_text_len = 6
406
 
4143 hidnplayr 407
join_header             db 3,'3* ', 0
408
quit_header             db 3,'5* ', 0
409
nick_header             db 3,'2* ', 0
410
kick_header             db 3,'5* ', 0
411
mode_header             db 3,'2* ', 0
412
part_header             db 3,'5* ', 0
413
topic_header            db 3,'3* ', 0
414
action_header           db 3,'6* ', 0
415
ctcp_header             db 3,'13-> [',0
416
msg_header              db 3,'7-> *',0
3545 hidnplayr 417
ctcp_version            db '] VERSION',10,0
418
ctcp_ping               db '] PING',10,0
419
ctcp_time               db '] TIME',10,0
420
has_left_channel        db ' has left ', 0
421
joins_channel           db ' has joined ', 0
422
is_now_known_as         db ' is now known as ', 0
423
has_quit_irc            db ' has quit IRC', 10, 0
424
sets_mode               db ' sets mode ', 0
425
kicked                  db ' is kicked from ', 0
426
str_talking             db 'Now talking in ',0
427
str_topic               db 'Topic is ',0
428
str_setby               db 'Set by ',0
4143 hidnplayr 429
str_reconnect           db 'Connection reset by user.',10,0
3545 hidnplayr 430
 
431
str_version             db 'VERSION '
432
str_programname         db 'KolibriOS IRC client ', version, 0
433
 
434
str_user                db 'user', 0
435
str_nick                db 'nick', 0
436
str_real                db 'realname', 0
437
str_email               db 'email', 0
3981 hidnplayr 438
str_quitmsg             db 'quitmsg', 0
3545 hidnplayr 439
 
440
default_nick            db 'kolibri_user', 0
441
default_real            db 'Kolibri User', 0
3981 hidnplayr 442
default_quit            db 'KolibriOS forever', 0
3545 hidnplayr 443
 
4143 hidnplayr 444
str_welcome             db 3,'3 ___',3,'7__________',3,'6_________  ',3,'4         __   __               __',10
445
                        db 3,'3|   \',3,'7______   \',3,'6_   ___ \ ',3,'4   ____ |  | |__| ____   _____/  |_',10
446
                        db 3,'3|   |',3,'7|       _/',3,'6    \  \/ ',3,'4 _/ ___\|  | |  |/ __ \ /    \   __\',10
447
                        db 3,'3|   |',3,'7|    |   \',3,'6     \____',3,'4 \  \___|  |_|  \  ___/|   |  \  |',10
448
                        db 3,'3|___|',3,'7|____|_  /\',3,'6______  /',3,'4  \___  >____/__|\___  >___|  /__|',10
449
                        db 3,'3     ',3,'7      \/   ',3,'6     \/  ',3,'4     \/             \/     \/',10
3545 hidnplayr 450
                        db 10
4143 hidnplayr 451
                        db 'Welcome to the KolibriOS IRC client v',version,10
3545 hidnplayr 452
                        db 10
4143 hidnplayr 453
                        db 'Type /help for help',10,10,0
3545 hidnplayr 454
 
455
str_nickchange          db 'Nickname is now ',0
456
str_realchange          db 'Real name is now ',0
457
str_dotnewline          db '.',10, 0
458
str_newline             db 10, 0
4143 hidnplayr 459
str_connecting          db 3,'3* Connecting to ',0
3545 hidnplayr 460
str_help                db 10,'following commands are available:',10
461
                        db 10
462
                        db '/nick         : change nickname to ',10
463
                        db '/real    : change real name to ',10
464
                        db '/server 
: connect to server
',10
465
                        db '/code         : change codepage to cp866, cp1251, or utf8',10,0
466
 
4143 hidnplayr 467
str_1                   db 3,'13 -',0
3545 hidnplayr 468
str_2                   db '- ',0
469
 
470
str_sockerr             db 'Socket Error',10,0
471
str_dnserr              db 'Unable to resolve hostname.',10,0
472
str_refused             db 'Connection refused',10,0
473
 
4143 hidnplayr 474
irc_colors              dd 0xffffff     ;  0 white
475
                        dd 0x000000     ;  1 black
476
                        dd 0x00007f     ;  2 blue (navy)
477
                        dd 0x009300     ;  3 green
478
                        dd 0xff0000     ;  4 red
479
                        dd 0x7f0000     ;  5 brown (maroon)
480
                        dd 0x9c009c     ;  6 purple
481
                        dd 0xfc7f00     ;  7 olive
482
                        dd 0xffff00     ;  8 yellow
483
                        dd 0x00fc00     ;  9 light green
484
                        dd 0x009393     ; 10 teal
485
                        dd 0x00ffff     ; 11 cyan
486
                        dd 0x0000fc     ; 12 royal blue
487
                        dd 0xff00ff     ; 13 pink
488
                        dd 0x7f7f7f     ; 14 grey
489
                        dd 0xd4d0c4     ; 15 light grey (silver)
490
 
3545 hidnplayr 491
sockaddr1:
492
        dw AF_INET4
493
.port   dw 0x0b1a       ; 6667
494
.ip     dd 0
495
        rb 10
496
 
497
 
498
status                  dd STATUS_DISCONNECTED
499
 
500
 
4143 hidnplayr 501
textbox_height          dd 12                   ; in characters
502
textbox_width           dd 78                   ; in characters, not pixels ;)
503
 
3981 hidnplayr 504
window_active           dd windows
3545 hidnplayr 505
window_print            dd windows
506
 
507
align 4
508
@IMPORT:
509
 
510
library network,        'network.obj',\
511
        libini,         'libini.obj',\
512
        boxlib,         'box_lib.obj'
513
 
514
import  network,\
515
        getaddrinfo,    'getaddrinfo',\
516
        freeaddrinfo,   'freeaddrinfo',\
517
        inet_ntoa,      'inet_ntoa'
518
 
519
import  libini,\
520
        ini.get_str,    'ini_get_str',\
521
        ini.get_int,    'ini_get_int'
522
 
523
import  boxlib,\
4143 hidnplayr 524
        edit_box_draw,  'edit_box',\
525
        edit_box_key,   'edit_box_key',\
526
        edit_box_mouse, 'edit_box_mouse',\
527
        scrollbar_draw, 'scrollbar_v_draw',\
528
        scrollbar_mouse,'scrollbar_v_mouse'
3545 hidnplayr 529
 
530
I_END:
531
 
532
        ;         width, left, top
533
edit1   edit_box  0, 0, 0, 0xffffff, 0x6f9480, 0, 0, 0, USERCMD_MAX_SIZE, usercommand, mouse_dd, ed_focus, 25, 25
4143 hidnplayr 534
        ;         xsize, xpos, ysize, ypos, btn_height, max, cur, pos, bgcol, frcol, linecol
535
scroll1 scrollbar SCROLLBAR_WIDTH, 0, 0, TOP_Y, SCROLLBAR_WIDTH, 0, 0, 0, 0, 0, 0, 1
536
scroll2 scrollbar SCROLLBAR_WIDTH, 0, 0, TOP_Y, SCROLLBAR_WIDTH, 0, 0, 0, 0, 0, 0, 1
3545 hidnplayr 537
 
3618 hidnplayr 538
usercommand     db '/server chat.freenode.net', 0
539
                rb MAX_COMMAND_LEN
540
 
3545 hidnplayr 541
utf8_bytes_rest dd ?            ; bytes rest in current UTF8 sequence
542
utf8_char       dd ?            ; first bits of current UTF8 character
543
gai_reqdata     rb 32           ; buffer for getaddrinfo_start/process
544
ip_list         dd ?            ; will be filled as pointer to addrinfo list
545
packetbuf       rb 1024         ; buffer for packets to server
546
path            rb 1024
547
param           rb 1024
548
 
549
socketnum       dd ?
550
 
551
servercommand   rb 600
552
 
553
thread_info     rb 1024
554
xsize           dd ?
555
ysize           dd ?
556
 
557
colors          system_colors
558
 
559
irc_server_name rb MAX_SERVER_NAME
560
 
561
user_nick       rb MAX_NICK_LEN
562
user_real_name  rb MAX_REAL_LEN
3981 hidnplayr 563
quit_msg        rb 250
3545 hidnplayr 564
 
565
windows         rb MAX_WINDOWS*sizeof.window
566
 
567
mouse_dd        dd ?
568
 
569
IM_END:
570