Subversion Repositories Kolibri OS

Rev

Rev 895 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
895 barsuk 1
 
2
; version 0.2
3
; see readme.txt
4
5
 
6
{
7
#buf_name:
8
.size	dd	buf_size
9
.sys1	dd	?
10
.sys2	dd	?
11
.data	db	buf_size dup(?)
12
}
13
14
 
15
; internally used routine
16
; esi->buffer, edx = byte count
17
18
 
19
	push	ecx
20
	push	ebp
21
22
 
23
	xchg	edx, esi
24
.send_again:
25
	mov	eax, 5
26
	mov	ebx, SEND_DELAY
27
	int	0x40
28
29
 
30
	mov	ebx, 2
31
	mov	ecx, [clipboard_init.clipserv_pid]
32
	int	0x40
33
print "send result eax"
34
pregs
35
36
 
37
	jz	.ok
38
	cmp	eax, 2
39
	jz	.wait
40
	jmp	.err
41
.wait:
42
	dec	ebp
43
	jz	.err
44
	jmp	.send_again
45
.ok:
46
	mov	eax, 1
47
	jmp	.exit
48
.err:
49
	xor	eax, eax
50
.exit:
51
	pop	ebp
52
	pop	ecx
53
	pop	ebx
54
	xchg	edx, esi
55
	ret
56
57
 
58
; used internally.
59
; edx = default event mask of thread(!!!)
60
; esi -> CLIP_buffer
61
; result: eax == 1 - suc, 0 - err
62
63
 
64
	push	ecx
65
66
 
67
	mov	dword [esi + 8], 0	;
68
69
 
70
	mov	eax, 60			; register buffer
71
	mov	ebx, 1
72
	lea	ecx, [esi + 4]
73
	mov	edx, [esi]
74
	add	edx, 8
75
;print "register buffer"
76
;pregs
77
	int	0x40
78
	pop	edx
79
80
 
81
	mov	eax, 40			; listen for IPC
82
	mov	ebx, 01000000b
83
	int	0x40
84
85
 
86
	mov	ebx, RECV_DELAY		; not too long
87
	int	0x40
88
	cmp	eax, 7
89
	jnz	.err
90
91
 
92
	cmp	eax, [esi + 4]				; daemon, so ignore
93
	jnz	.wait
94
95
 
96
97
 
98
dph1	[esi]
99
dph1	[esi+4]
100
dph1	[esi+8]
101
dph1	[esi+12]
102
dph1	[esi+16]
103
dph1	[esi+20]
104
print ""
105
106
 
107
	mov	ebx, edx
108
	int	0x40
109
	mov	eax, 1
110
	jmp	.exit
111
.err:
112
	xor	eax, eax
113
.exit:
114
	pop	ecx
115
	pop	ebx
116
	ret
117
118
 
119
 
120
; action: define IPC buffer and find clipserv process
121
; output: eax == 0 - error, eax == 1 - success
122
123
 
124
	push	ecx
125
	push	edx
126
127
 
128
;	mov	ebx, 1
129
;	mov	ecx, .IPC_real_buffer
130
;	mov	edx, IPC_buffer_size
131
;	int	0x40
132
133
 
134
135
 
136
137
 
138
	mov	ebp, 1
139
.next_process:
140
	mov	eax, 9
141
	mov	ebx, .process_info
142
	mov	ecx, ebp
143
	int	0x40
144
	mov	ecx, eax
145
	mov	ebx, .process_info + 10
146
	mov	eax, [ebx]
147
	cmp	eax, '@CLI'
148
	jnz	.differ
149
	mov	al, [ebx + 4]
150
	cmp	al, 'P'
151
	jnz	.differ
152
	jmp	.similar
153
154
 
155
;.compare:
156
;	mov	al, [edx]
157
;	cmp	al, 0
158
;	jz	.similar
159
;	cmp	al, [ebx]
160
;	jnz	.differ
161
;	inc	edx
162
;	inc	ebx
163
;	jmp	.compare
164
.differ:
165
	inc	ebp
166
	cmp	ebp, ecx
167
	jae	.err		; process not found
168
	jmp	.next_process
169
.similar:
170
;print "found server"
171
	mov	eax, dword [.process_info + 30]
172
	mov	[.clipserv_pid], eax
173
174
 
175
	jmp	.exit
176
.err:
177
;print "no server"
178
	xor	eax, eax
179
.exit:
180
	pop	ebp
181
	pop	edx
182
	pop	ecx
183
	pop	ebx
184
	ret
185
.clipserv_pid	dd	0
186
.process_info	db	1024 dup(0)
187
;;.clipserv_name	db	'@clip',0
188
;.IPC_buffer	dd	.IPC_real_buffer	; sorry
189
;.IPC_real_buffer	db	IPC_buffer_size dup(0)
190
191
 
192
; action: put to clipboard data in format (ax) from buffer
193
; input: esi -> CLIP_buffer, ax = format id
194
; output: eax == 0 - error, eax == 1 - success
195
196
 
197
	push	edx
198
	push	edi
199
200
 
201
202
 
203
	push	esi
204
	mov	[.msg_set_size + 2], ax
205
	mov	word [esi + 4 + 2], ax	; format id to low word of sys1
206
	mov	dword [.msg_set_size + 8], edx
207
	mov	esi, .msg_set_size
208
	mov	edx, 12
209
	call	_ipc_send
210
	pop	esi
211
	pop	edx
212
	or	eax, eax
213
	jz	.err
214
215
 
216
	add	esi, 4			; esi->buffer.sys1
217
	add	edx, 8
218
	call	_ipc_send
219
	sub	esi, 4
220
	or	eax, eax
221
	jz	.err
222
223
 
224
print "write success"
225
	jmp	.exit
226
.err:
227
print "write failed"
228
	xor	eax, eax
229
.exit:
230
	pop	edi
231
	pop	edx
232
	pop	ecx
233
	ret
234
235
 
236
		dw	1
237
		dd	0
238
		dd	0
239
240
 
241
; esi -> CLIP_buffer, ax = format id
242
; edx - маска событий по умолчанию
243
; result: eax = 1 - success, 0 - general failure,
244
; -1 - buffer too small
245
; edx = size of data
246
247
 
248
	push	ecx
249
	push	ebp
250
	push	esi
251
	push	edi
252
253
 
254
255
 
256
257
 
258
	mov	esi, .msg_get_size
259
	mov	word [esi], 3
260
	mov	[esi + 2], ax
261
	mov	[.msg_get_buf + 2], ax
262
	mov	edx, 8
263
	call	_ipc_send
264
	or	eax, eax
265
	jz	.err
266
267
 
268
	mov	edx, ebp
269
	mov	esi, .buf_for_size
270
	mov	dword [esi], 4
271
	call	_ipc_recv
272
	or	eax, eax
273
	jz	.err
274
275
 
276
	mov	edx, [edi]		; space we have
277
print "read size eax"
278
pregs
279
	mov	ecx, eax
280
	cmp	eax, edx
281
	ja	.size
282
	or	eax, eax
283
	jz	.err
284
	mov	ebx, eax
285
286
 
287
	mov	word [esi], 4
288
	mov	edx, 8
289
	call	_ipc_send
290
	or	eax, eax
291
	jz	.err
292
293
 
294
295
 
296
	mov	esi, edi
297
	call	_ipc_recv
298
	or	eax, eax
299
	jz	.err
300
301
 
302
303
 
304
	mov	eax, 1
305
print "read ok"
306
	jmp	.exit		; i'm an idiot. Never will I code at night again
307
				; i put jz instead of jmp.
308
309
 
310
print "buffer small"
311
	mov	edx, eax
312
	or	eax, -1
313
	jmp	.exit
314
.err:
315
print "read error"
316
	xor	eax, eax
317
.exit:
318
	pop	edi
319
	pop	esi
320
	pop	ebp
321
	pop	ecx
322
	pop	ebx
323
	ret
324
325
 
326
		dw	1
327
		dd	0
328
.msg_get_buf	dw	0
329
		dw	1
330
		dd	0
331
.buf_for_size	dd	0
332
		dd	0
333
		dd	0
334
		dd	0
335
336
 
337
 
338
; ax = format id to delete
339
; result: eax = 0 error, = 1 ok
340
341
 
342
	push	esi
343
344
 
345
	mov	word [esi], 5
346
	mov	[esi + 2], ax
347
	mov	edx, 8
348
349
 
350
351
 
352
	pop	edx
353
354
 
355
.msg_del	dw	0
356
		dw	1
357
		dd	0
358