Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
264 hidnplayr 1
;
2
;
3
; VNC Client for kolibrios by hidnplayr
4
;
5
;
6
; WORK IN PROGRESS...
7
;
8
; FEEL FREE TO CONTRIBUTE !
9
;
10
; hidnplayr@gmail.com
11
;
12
 
13
use32
14
 
15
    org     0x0
16
 
17
    db	   'MENUET01'	     ; 8 byte id
18
    dd	   0x01 	     ; header version
19
    dd	   START	     ; start of code
20
    dd	   I_END	     ; size of image
21
    dd	   IM_END	     ; memory for app
22
    dd	   IM_END	     ; esp
23
    dd	   0x0 , 0x0	     ; I_Param , I_Icon
24
 
25
__DEBUG__ equ 1
26
__DEBUG_LEVEL__ equ 1
27
 
28
STRLEN = 64	 ; password and server max length
29
xpos = 4	 ; coordinates of image
30
ypos = 22	 ;
31
 
32
TIMEOUT = 60	 ; timeout in seconds
33
BUFFER	= 1500	 ; Buffer size for DNS
34
 
35
include 'fdo.inc'
36
include 'ETH.INC'
37
include 'logon.inc'
38
include 'raw.inc'
39
include 'copyrect.inc'
40
include 'thread.inc'
41
 
42
 
43
START:				       ; start of execution
44
 
45
    call    red_logon
46
 
47
    mov     eax,40		       ; Report events
48
    mov     ebx,00000000b	       ; Only Stack
49
    int     0x40
50
 
51
    mov     eax,67		       ; resize the window (hide it)
52
    xor     ebx,ebx
53
    mov     ecx,ebx
54
    mov     edx,ebx
55
    mov     esi,ebx
56
    int     0x40
57
 
58
    mov     eax,51
59
    mov     ebx,1
60
    mov     ecx,thread_start
61
    mov     edx,thread_stack
62
    int     0x40
63
 
64
    DEBUGF 1,'Thread created: %u\n',eax
65
 
66
   @@:
67
    mov     eax,5
68
    mov     ebx,10
69
    int     0x40
70
 
71
    cmp     byte[thread_ready],0
72
    je	    @r
73
 
74
    mov     eax,40		   ; report events
75
    mov     ebx,100111b 	   ; mouse, button, key, redraw
76
    int     0x40
77
 
78
    mov     eax,67		   ; resize the window
79
    mov     ebx,10
80
    mov     ecx,10
81
    mov     edx,dword[framebuffer]
82
    bswap   edx
83
    movzx   esi,dx
84
    shr     edx,16
85
    add     edx,2*xpos
86
    add     esi,ypos+xpos
87
    int     0x40
88
 
89
  mainloop:
90
    eth.socket_status [socket],eax
91
    cmp     al,TCB_CLOSE_WAIT
92
    je	    close
93
 
94
    mov     eax,23		   ; wait for event with timeout
95
    mov     ebx,50		   ; 0,5 s
96
    int     0x40
97
 
98
    cmp     eax,1
99
    je	    redraw
100
    cmp     eax,2		   ; key
101
    je	    key
102
    cmp     eax,3		   ; button
103
    je	    button
104
    cmp     eax,6		   ; mouse
105
    je	    mouse
106
 
107
    call    drawbuffer
108
 
109
    jmp     mainloop
110
 
111
  key:
112
    DEBUGF 1,'Sending key event\n'
113
 
114
    mov     eax,2
115
    int     0x40
116
    mov     byte[keyevent.key+3],ah
117
 
118
    eth.write_tcp [socket],8,keyevent
119
 
120
    jmp     mainloop
121
 
122
  mouse:
123
    DEBUGF 1,'Sending mouse event\n'
124
 
125
    mov     eax,37
126
    mov     ebx,1
127
    int     0x40
128
 
129
    sub     eax,xpos*65536+ypos
130
    bswap   eax
131
    mov     word[pointerevent.x],ax
132
    shr     eax,16
133
    mov     word[pointerevent.y],ax
134
 
135
    mov     eax,37
136
    mov     ebx,2
137
    int     0x40
138
 
139
    test    al,00000010b	    ; test if right button was pressed  (bit 1 in kolibri)
140
    jz	    @f
141
    add     al,00000010b	    ; in RFB protocol it is bit 2, so if we add bit 2 again, we'll get bit 3 and bit 1 will remain the same
142
   @@:
143
 
144
    mov     byte[pointerevent.mask],al
145
 
146
    eth.write_tcp [socket],6,pointerevent
147
 
148
    jmp     mainloop
149
 
150
  redraw:
151
 
152
    DEBUGF 1,'Drawing window\n'
153
 
154
    mov     eax,12
155
    mov     ebx,1
156
    int     0x40
157
 
158
    mov     eax,0		      ; draw window
159
    mov     ebx,dword[framebuffer]
160
    bswap   ebx
161
    movzx   ecx,bx
162
    shr     ebx,16
163
    add     ebx,2*xpos
164
    add     ecx,ypos+xpos
165
    mov     edx,0x03ffffff
166
    mov     esi,0x80555599
167
    mov     edi,0x00ffffff
168
    int     0x40
169
 
170
    mov     eax,4		      ; label
171
    mov     ebx,9*65536+8
172
    mov     ecx,0x10ffffff
173
    mov     edx,name
174
    mov     esi,[name_length]
175
    bswap   esi
176
    int     0x40
177
 
178
    call    drawbuffer
179
 
180
    mov     eax,12
181
    mov     ebx,2
182
    int     0x40
183
 
184
    jmp     mainloop
185
 
186
  drawbuffer:
187
 
188
    mov     eax,7
189
    mov     ebx,framebuffer_data
190
    mov     ecx,dword[screen]
191
    mov     edx,xpos*65536+ypos
192
    int     0x40
193
 
194
    ret
195
 
196
 
197
  button:			  ; button
198
    mov     eax,17		  ; get id
199
    int     0x40
200
 
201
  close:
202
    call    read_data
203
;    eth.close_tcp [socket]             ; We're done, close the socket ;;; BUG WHEN CLOSING SOCKET !!
204
    DEBUGF 1,'Socket closed\n'
205
 
206
    mov     eax,-1
207
    int     0x40
208
 
209
    no_rfb:
210
    DEBUGF 1,'This is no vnc server!\n'
211
    jmp     close
212
 
213
    invalid_security:
214
    DEBUGF 1,'Security error: %s\n',receive_buffer+5
215
    jmp     close
216
 
217
 
218
; DATA AREA
219
 
220
include_debug_strings	 ; ALWAYS present in data section
221
 
222
handshake	   db 'RFB 003.003',0x0a
223
shared		   db 0
224
beep		   db 0x85,0x25,0x85,0x40,0
225
 
226
pixel_format32	   db 0       ; setPixelformat
227
		   rb 3       ; padding
228
.bpp		   db 32      ; bits per pixel
229
.depth		   db 32      ; depth
230
.big_endian	   db 0       ; big-endian flag
231
.true_color	   db 1       ; true-colour flag
232
.red_max	   db 0,255   ; red-max
233
.green_max	   db 0,255   ; green-max
234
.blue_max	   db 0,255   ; blue-max
235
.red_shif	   db 0       ; red-shift
236
.green_shift	   db 8       ; green-shift
237
.blue_shift	   db 16      ; blue-shift
238
		   rb 3       ; padding
239
 
240
pixel_format16	   db 0       ; setPixelformat
241
		   rb 3       ; padding
242
.bpp		   db 16      ; bits per pixel
243
.depth		   db 15      ; depth
244
.big_endian	   db 0       ; big-endian flag
245
.true_color	   db 1       ; true-colour flag
246
.red_max	   db 0,31    ; red-max
247
.green_max	   db 0,31    ; green-max
248
.blue_max	   db 0,31    ; blue-max
249
.red_shif	   db 0       ; red-shift
250
.green_shift	   db 5       ; green-shift
251
.blue_shift	   db 10      ; blue-shift
252
		   rb 3       ; padding
253
 
254
pixel_format8	   db 0       ; setPixelformat
255
		   rb 3       ; padding
256
.bpp		   db 8       ; bits per pixel
257
.depth		   db 6       ; depth
258
.big_endian	   db 0       ; big-endian flag
259
.true_color	   db 1       ; true-colour flag
260
.red_max	   db 0,3     ; red-max
261
.green_max	   db 0,3     ; green-max
262
.blue_max	   db 0,3     ; blue-max
263
.red_shif	   db 0       ; red-shift
264
.green_shift	   db 2       ; green-shift
265
.blue_shift	   db 4       ; blue-shift
266
		   rb 3       ; padding
267
 
268
encodings	   db 2       ; setEncodings
269
		   rb 1       ; padding
270
		   db 1,0     ; number of encodings
271
		   db 0,0,0,0 ; raw encoding        (DWORD, Big endian order)
272
		   db 1,0,0,0 ; Copyrect encoding
273
 
274
fbur		   db 3       ; frame buffer update request
275
.inc		   db 0       ; incremental
276
.x		   dw 0
277
.y		   dw 0
278
.width		   dw 0
279
.height 	   dw 0
280
 
281
keyevent	   db 4       ; keyevent
282
.down		   db 0       ; down-flag
283
		   dw 0       ; padding
284
.key		   dd 0       ; key
285
 
286
pointerevent	   db 5       ; pointerevent
287
.mask		   db 0       ; button-mask
288
.x		   dw 0       ; x-position
289
.y		   dw 0       ; y-position
290
 
291
I_END:
292
 
293
framebuffer:
294
.width		   dw ?
295
.height 	   dw ?
296
pixelformat:
297
.bpp		   db ?
298
.depth		   db ?
299
.big_endian	   db ?
300
.true_color	   db ?
301
.red_max	   dw ?
302
.green_max	   dw ?
303
.blue_max	   dw ?
304
.red_shift	   db ?
305
.green_shift	   db ?
306
.blue_shift	   db ?
307
.padding	   rb 3
308
name_length	   dd ?
309
name		   rb 256
310
 
311
server_ip	   dd 0
312
server_port	   dd 0
313
socket		   dd 0
314
datapointer	   dd 0
315
 
316
frame:
317
.width		   dw 0
318
.height 	   dw 0
319
.x		   dw 0
320
.y		   dw 0
321
 
322
screen:
323
.height 	   dw 0
324
.width		   dw 0
325
 
326
thread_ready	   db 0
327
 
328
dnsMsg:
329
receive_buffer	   rb 5*1024*1024 ; 5 mb buffer for received data (incoming frbupdate etc)
330
framebuffer_data   rb 1024*768*3  ; framebuffer
331
 
332
thread_stack	   rb 0x1000
333
 
334
IM_END:
335