Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2296 leency 1
;
2
;
3
; Поддержка контакт листа на сервере
4
;
5
;
6
 
7
;
8
; Заполняет таблицу с UIN
9
; и опционально таблицы с именем и доп. инфой
10
;
11
 
12
 
13
; Из comp.inc для отладки
14
;
15
;
16
; Массив с UIN
17
;
18
;UIN_LEN = 11            ; Длина
19
;UINS    = 15            ; Количество
20
;
21
;uins db UIN_LEN*UINS dup 0
22
;
23
; массив со статусами
24
;
25
;stats dd UINS dup -1
26
;
27
; Массив с именами
28
;
29
;NAME_LEN = 30
30
 
31
;names db NAME_LEN*UINS dup 0
32
 
33
 
34
;
35
; Достает из item UIN
36
; eax <- указатель на item
37
; Пропускает группы
38
;
39
 ssi_get_uin:
40
  push eax
41
  push ebx
42
  push ecx
43
  push edx
44
 
45
  ;
46
  ; Проверяем ItemID
47
  ;
48
  xor ebx, ebx
49
  mov bl, [eax + 1]     ; Length of the item name
50
  mov bh, [eax]       ;
51
 
52
 
53
  ;push ebx
54
  ;mov ebx, 128
55
  ;call print_mem
56
 
57
  ;pop ebx
58
 
59
 
60
  ;; FIXIT Разумнее проверять флаги
61
  ;; Если длина строки = 0
62
  ;; пропускаем item
63
  ;cmp ebx, 0
64
  ;jz ssi_get_end
65
 
66
  ;;
67
  ;;data_debug 'Item name len', ebx
68
 
69
  ;;+смещение до ItemID
70
 
71
  ;;xor ecx, ecx
72
  ;;mov ch, [eax + ebx + 4]
73
  ;;mov cl, [eax + ebx + 5]  ;	Item ID#
74
 
75
  ;;cmp ecx, 0
76
  ;;jz ssi_get_end
77
 
78
  ;
79
  ; Проверяем флаги, обрабатываем только записи UIN
80
  ;
81
  xor ecx, ecx
82
  mov ch, [eax + ebx + 6]
83
  mov cl, [eax + ebx + 7]
84
 
85
 
86
  cmp ecx, 0           ; 0x0000	  Buddy record (name: uin for ICQ and screenname for AIM)
87
  jz ssi_uin
88
 
89
  ; debug
90
  ;
91
 
92
  lea eax, [eax + ebx + 6]
93
  mov ebx, 2
94
  call print_mem
95
 
96
 
97
  jmp ssi_get_end
98
 
99
 
100
 ssi_uin:
101
  ;
102
  ; Копируем UIN в таблицу
103
  ;
104
  mov ecx, ebx  ; Длина строки
105
  lea eax, [eax + 2]
106
 
107
  mov edx, [uin_ind]
108
  cmp edx, UINS
109
  jnb ssi_get_end      ;Нет свободного места в таблице UIN
110
 
111
  imul edx, UIN_LEN
112
  mov ebx, uins
113
  lea ebx, [ebx + edx]
114
 
115
  call strcpy
116
 
117
  inc [uin_ind]
118
 
119
  ;debug
120
  ;mov eax, ebx
121
  ;xor ebx, ebx
122
  ;call writemsg
123
 
124
 
125
  ;
126
 ssi_get_end:
127
  pop edx
128
  pop ecx
129
  pop ebx
130
  pop eax
131
 ret
132
 
133
 
134
;
135
; eax <- указатель на item
136
; возвращает в eax указатель на следующий item
137
;
138
;
139
 
140
 ssi_next_item:
141
 
142
   push ebx
143
   push ecx
144
 
145
   xor ebx, ebx
146
   mov bl, [eax + 1]         ; длина UIN
147
   mov bh, [eax]             ;
148
 
149
   xor ecx, ecx
150
   mov cl, [eax + ebx + 9]   ; Длина дополнительных данных
151
   mov ch, [eax + ebx + 8]   ;
152
 
153
   add ebx, ecx
154
   add ebx, 10               ;+Длина заголовка
155
 
156
   lea eax, [eax + ebx]
157
 
158
 
159
   pop ecx
160
   pop ebx
161
 ret
162
 
163
 
164
;
165
; eax <- указатель на tlv
166
; возвращает в eax указатель на след tlv
167
;
168
 macro get_next_tlv {
169
   push ebx
170
 
171
   xor ebx, ebx
172
 
173
   mov bl, [eax + 3]
174
   mov bh, [eax + 2]
175
 
176
   ; + размер заголовка
177
   lea ebx, [ebx + 4]
178
 
179
   lea eax, [eax + ebx]
180
 
181
   pop ebx
182
 }
183
 
184
 
185
 
186
;
187
; Ищет в additional имя и др. сведения
188
; eax <- указатель на item
189
;
190
 ssi_get_add:
191
   push eax
192
   push ebx
193
   push ecx
194
   push edx
195
   push esi
196
 
197
 
198
   ;mov ebx, 128
199
   ;call print_mem
200
 
201
 
202
 
203
 
204
   xor ebx, ebx
205
   mov bl, [eax + 1]      ; Length of the item name
206
   mov bh, [eax]          ;
207
 
208
   ;;cmp ebx, 0             ; Если длина имени = 0
209
   ;;jz ssi_all_tlv         ; Нет смысла обрабатывать
210
 
211
 
212
   ;;+смещение до ItemID
213
 
214
   ;;xor ecx, ecx
215
   ;;mov ch, [eax + ebx + 4]
216
   ;;mov cl, [eax + ebx + 5]  ;	Item ID#
217
   ;
218
   ;;cmp ecx, 0               ; Группы пока не обрабатываются
219
   ;;jz ssi_all_tlv           ;
220
   ;
221
   ; Проверяем флаги, обрабатываем только записи UIN
222
   ;
223
   xor ecx, ecx
224
   mov ch, [eax + ebx + 6]
225
   mov cl, [eax + ebx + 7]
226
 
227
   cmp ecx, 0           ; 0x0000	  Buddy record (name: uin for ICQ and screenname for AIM)
228
   jnz ssi_all_tlv
229
 
230
 
231
   xor edx, edx
232
   mov dl, [eax + ebx + 9]  ;
233
   mov dh, [eax + ebx + 8]  ; Length of the additional data
234
 
235
 
236
   lea eax, [eax + ebx + 10] ; eax указатель на первый tlv
237
 
238
 
239
   ;FIXME : Iservd не присылает additional - пока не могу отладить
240
   ;debug
241
   ;push ebx
242
   ;mov ebx, edx
243
 
244
   ;data_debug 'length additional data', ebx
245
 
246
   ;call print_mem
247
   ;pop ebx
248
   ;
249
 
250
 
251
 
252
   xor esi, esi
253
 
254
  ssi_tlv_process:
255
   cmp esi, edx           ;
256
   jnb ssi_all_tlv        ;  additional закончилось
257
 
258
   xor ecx, ecx
259
   mov cl, [eax + 3]      ;
260
   mov ch, [eax + 2]      ; TLV.Length
261
 
262
   xor ebx, ebx
263
   mov bl, [eax + 1]      ; TLV.Type
264
   mov bh, [eax]          ;
265
 
266
   cmp bx, 0x0131         ;Имя пользователя
267
   jz ssi_name
268
 
269
   cmp bx, 0x0066         ;Ожидаем авторизации
270
   jz ssi_auth_wait
271
 
272
   jmp ssi_next_tlv
273
 
274
 
275
  ssi_auth_wait:
276
   ;
277
   ;
278
   ;
279
   jmp ssi_next_tlv
280
 
281
 
282
  ssi_name:
283
 
284
   ;
285
   ; Скопировать имя в массив
286
   ;
287
   push eax
288
   push ecx
289
 
290
   mov ebx, [name_ind]
291
   cmp ebx, UINS
292
   jnb ssi_name_end       ;Нет места в таблице
293
 
294
   lea eax, [eax + 4]     ;Указатель на строку (Прибавляем размер заголовка TLV)
295
 
296
   imul ebx, NAME_LEN
297
   lea ebx, [names + ebx]
298
 
299
   cmp ecx, NAME_LEN - 1     ; Если имя длиннее поля в таблице
300
   jna @f
301
 
302
   mov ecx, NAME_LEN - 1
303
 
304
  @@:
305
   call strcpy
306
 
307
   ;; FIXIT
308
   ;; Перекодировка имени
309
   ;;
310
   ;;mov eax, ebx
311
   ;;call win2dos
312
 
313
   ;
314
   ;debug
315
   ;push eax
316
   ;push ebx
317
 
318
   ;mov eax, ebx
319
   ;xor ebx, ebx
320
   ;call writemsg
321
 
322
   ;pop ebx
323
   ;pop eax
324
   ;
325
   ;
326
   inc [name_ind]
327
 
328
   pop ecx
329
   pop eax
330
 
331
 
332
 
333
  ssi_next_tlv:
334
   lea ecx, [ecx + 4] ; Длина данных tlv + длина заголовка
335
   add esi, ecx
336
 
337
   get_next_tlv
338
   jmp ssi_tlv_process
339
 
340
 
341
  ssi_name_end:
342
   pop ecx
343
   pop eax
344
 
345
 
346
  ssi_all_tlv:
347
 
348
 
349
   pop esi
350
   pop edx
351
   pop ecx
352
   pop ebx
353
   pop eax
354
 ret
355
 
356
;
357
;
358
; Обработка контакт листа, пришедшего от сервера
359
;
360
; в eax <- указатель на данные в пакете SNAC(13,06)
361
 ssi_process_data:
362
   push eax
363
   push ebx
364
   push ecx
365
   push edx
366
 
367
   ;
368
   ; Проверить версию протокола
369
   ;
370
   xor ebx, ebx
371
   mov bl, [eax]
372
   cmp bl, 0
373
   jnz ssi_bad_prot
374
   ;
375
   ;в ebx - количество items
376
   mov bl, [eax + 2]
377
   mov bh, [eax + 1]
378
   ;
379
   data_debug 'SSI items:', ebx
380
 
381
   lea eax, [eax + 3] ; Установить eax на список items
382
 
383
   xor ecx, ecx       ; Счетчик items
384
 
385
 
386
  ssi_next_uin:
387
   cmp ecx, ebx
388
   jnb ssi_all_items
389
 
390
 
391
   call ssi_get_uin
392
 
393
   call ssi_get_add
394
 
395
   call ssi_next_item
396
 
397
   inc ecx
398
   jmp ssi_next_uin
399
 
400
 
401
 
402
  ssi_bad_prot:
403
   write_debug "ERR: SSI protocol version mismatch"
404
 
405
  ssi_all_items:
406
 
407
   pop edx
408
   pop ecx
409
   pop ebx
410
   pop eax
411
 ret
412