Mercurial > pidgin
comparison libpurple/protocols/gg/lib/pubdir50.c @ 29538:6359fde67f4c
Update our internal libgadu to 1.9.0-rc2. This does not yet build on Windows.
Refs #10542. The Windows build errors are the only reason this isn't on
`im.pidgin.pidgin` already.
author | John Bailey <rekkanoryo@rekkanoryo.org> |
---|---|
date | Sun, 21 Feb 2010 16:52:42 +0000 |
parents | 259bbfb423d4 |
children | a8cc50c2279f |
comparison
equal
deleted
inserted
replaced
29474:551253814063 | 29538:6359fde67f4c |
---|---|
1 /* $Id: pubdir50.c 16856 2006-08-19 01:13:25Z evands $ */ | 1 /* $Id: pubdir50.c 854 2009-10-12 21:06:28Z wojtekka $ */ |
2 | 2 |
3 /* | 3 /* |
4 * (C) Copyright 2003 Wojtek Kaniewski <wojtekka@irc.pl> | 4 * (C) Copyright 2003 Wojtek Kaniewski <wojtekka@irc.pl> |
5 * | 5 * |
6 * This program is free software; you can redistribute it and/or modify | 6 * This program is free software; you can redistribute it and/or modify |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 * GNU Lesser General Public License for more details. | 13 * GNU Lesser General Public License for more details. |
14 * | 14 * |
15 * You should have received a copy of the GNU Lesser General Public | 15 * You should have received a copy of the GNU Lesser General Public |
16 * License along with this program; if not, write to the Free Software | 16 * License along with this program; if not, write to the Free Software |
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, | 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, |
18 * USA. | 18 * USA. |
19 */ | 19 */ |
20 | 20 |
21 #include "libgadu.h" | 21 /** |
22 * \file pubdir50.c | |
23 * | |
24 * \brief Obsługa katalogu publicznego od wersji Gadu-Gadu 5.x | |
25 */ | |
22 | 26 |
23 #include <errno.h> | 27 #include <errno.h> |
24 #include <stdlib.h> | 28 #include <stdlib.h> |
25 #include <string.h> | 29 #include <string.h> |
26 #include <time.h> | 30 #include <time.h> |
27 | 31 |
28 /* | 32 #include "libgadu.h" |
29 * gg_pubdir50_new() | 33 #include "libgadu-internal.h" |
30 * | 34 |
31 * tworzy now± zmienn± typu gg_pubdir50_t. | 35 /** |
32 * | 36 * Tworzy nowe zapytanie katalogu publicznego. |
33 * zaalokowana zmienna lub NULL w przypadku braku pamięci. | 37 * |
38 * \param type Rodzaj zapytania | |
39 * | |
40 * \return Zmienna \c gg_pubdir50_t lub \c NULL w przypadku błędu. | |
41 * | |
42 * \ingroup pubdir50 | |
34 */ | 43 */ |
35 gg_pubdir50_t gg_pubdir50_new(int type) | 44 gg_pubdir50_t gg_pubdir50_new(int type) |
36 { | 45 { |
37 gg_pubdir50_t res = malloc(sizeof(struct gg_pubdir50_s)); | 46 gg_pubdir50_t res = malloc(sizeof(struct gg_pubdir50_s)); |
38 | 47 |
48 res->type = type; | 57 res->type = type; |
49 | 58 |
50 return res; | 59 return res; |
51 } | 60 } |
52 | 61 |
53 /* | 62 /** |
54 * gg_pubdir50_add_n() // funkcja wewnętrzna | 63 * \internal Dodaje lub zastÄ™puje pole zapytania lub odpowiedzi katalogu |
55 * | 64 * publicznego. |
56 * funkcja dodaje lub zastępuje istniej±ce pole do zapytania lub odpowiedzi. | 65 * |
57 * | 66 * \param req Zapytanie lub odpowiedĹş |
58 * - req - wskaĽnik opisu zapytania, | 67 * \param num Numer wyniku odpowiedzi (0 dla zapytania) |
59 * - num - numer wyniku (0 dla zapytania), | 68 * \param field Nazwa pola |
60 * - field - nazwa pola, | 69 * \param value Wartość pola |
61 * - value - warto¶ć pola, | 70 * |
62 * | 71 * \return 0 jeśli się powiodło, -1 w przypadku błędu |
63 * 0/-1 | |
64 */ | 72 */ |
65 static int gg_pubdir50_add_n(gg_pubdir50_t req, int num, const char *field, const char *value) | 73 static int gg_pubdir50_add_n(gg_pubdir50_t req, int num, const char *field, const char *value) |
66 { | 74 { |
67 struct gg_pubdir50_entry *tmp = NULL, *entry; | 75 struct gg_pubdir50_entry *tmp = NULL, *entry; |
68 char *dupfield, *dupvalue; | 76 char *dupfield, *dupvalue; |
108 req->entries_count++; | 116 req->entries_count++; |
109 | 117 |
110 return 0; | 118 return 0; |
111 } | 119 } |
112 | 120 |
113 /* | 121 /** |
114 * gg_pubdir50_add() | 122 * Dodaje pole zapytania. |
115 * | 123 * |
116 * funkcja dodaje pole do zapytania. | 124 * \param req Zapytanie |
117 * | 125 * \param field Nazwa pola |
118 * - req - wskaĽnik opisu zapytania, | 126 * \param value Wartość pola |
119 * - field - nazwa pola, | 127 * |
120 * - value - warto¶ć pola, | 128 * \return 0 jeĹ›li siÄ™ powiodĹ‚o, -1 w przypadku bĹ‚Ä™du |
121 * | 129 * |
122 * 0/-1 | 130 * \ingroup pubdir50 |
123 */ | 131 */ |
124 int gg_pubdir50_add(gg_pubdir50_t req, const char *field, const char *value) | 132 int gg_pubdir50_add(gg_pubdir50_t req, const char *field, const char *value) |
125 { | 133 { |
126 return gg_pubdir50_add_n(req, 0, field, value); | 134 return gg_pubdir50_add_n(req, 0, field, value); |
127 } | 135 } |
128 | 136 |
129 /* | 137 /** |
130 * gg_pubdir50_seq_set() | 138 * Ustawia numer sekwencyjny zapytania. |
131 * | 139 * |
132 * ustawia numer sekwencyjny zapytania. | 140 * \param req Zapytanie |
133 * | 141 * \param seq Numer sekwencyjny |
134 * - req - zapytanie, | 142 * |
135 * - seq - nowy numer sekwencyjny. | 143 * \return 0 jeśli się powiodło, -1 w przypadku błędu |
136 * | 144 * |
137 * 0/-1. | 145 * \ingroup pubdir50 |
138 */ | 146 */ |
139 int gg_pubdir50_seq_set(gg_pubdir50_t req, uint32_t seq) | 147 int gg_pubdir50_seq_set(gg_pubdir50_t req, uint32_t seq) |
140 { | 148 { |
141 gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_seq_set(%p, %d);\n", req, seq); | 149 gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_seq_set(%p, %d);\n", req, seq); |
142 | 150 |
149 req->seq = seq; | 157 req->seq = seq; |
150 | 158 |
151 return 0; | 159 return 0; |
152 } | 160 } |
153 | 161 |
154 /* | 162 /** |
155 * gg_pubdir50_free() | 163 * Zwalnia zasoby po zapytaniu lub odpowiedzi katalogu publicznego. |
156 * | 164 * |
157 * zwalnia pamięć po zapytaniu lub rezultacie szukania użytkownika. | 165 * \param s Zapytanie lub odpowiedĹş |
158 * | 166 * |
159 * - s - zwalniana zmienna, | 167 * \ingroup pubdir50 |
160 */ | 168 */ |
161 void gg_pubdir50_free(gg_pubdir50_t s) | 169 void gg_pubdir50_free(gg_pubdir50_t s) |
162 { | 170 { |
163 int i; | 171 int i; |
164 | 172 |
172 | 180 |
173 free(s->entries); | 181 free(s->entries); |
174 free(s); | 182 free(s); |
175 } | 183 } |
176 | 184 |
177 /* | 185 /** |
178 * gg_pubdir50() | 186 * Wysyła zapytanie katalogu publicznego do serwera. |
179 * | 187 * |
180 * wysyła zapytanie katalogu publicznego do serwera. | 188 * \param sess Struktura sesji |
181 * | 189 * \param req Zapytanie |
182 * - sess - sesja, | 190 * |
183 * - req - zapytanie. | 191 * \return Numer sekwencyjny zapytania lub 0 w przypadku błędu |
184 * | 192 * |
185 * numer sekwencyjny wyszukiwania lub 0 w przypadku błędu. | 193 * \ingroup pubdir50 |
186 */ | 194 */ |
187 uint32_t gg_pubdir50(struct gg_session *sess, gg_pubdir50_t req) | 195 uint32_t gg_pubdir50(struct gg_session *sess, gg_pubdir50_t req) |
188 { | 196 { |
189 int i, size = 5; | 197 int i, size = 5; |
190 uint32_t res; | 198 uint32_t res; |
191 char *buf, *p; | 199 char *buf, *p; |
192 struct gg_pubdir50_request *r; | 200 struct gg_pubdir50_request *r; |
193 | 201 |
194 gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50(%p, %p);\n", sess, req); | 202 gg_debug_session(sess, GG_DEBUG_FUNCTION, "** gg_pubdir50(%p, %p);\n", sess, req); |
195 | 203 |
196 if (!sess || !req) { | 204 if (!sess || !req) { |
197 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50() invalid arguments\n"); | 205 gg_debug_session(sess, GG_DEBUG_MISC, "// gg_pubdir50() invalid arguments\n"); |
198 errno = EFAULT; | 206 errno = EFAULT; |
199 return 0; | 207 return 0; |
200 } | 208 } |
201 | 209 |
202 if (sess->state != GG_STATE_CONNECTED) { | 210 if (sess->state != GG_STATE_CONNECTED) { |
203 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50() not connected\n"); | 211 gg_debug_session(sess, GG_DEBUG_MISC, "// gg_pubdir50() not connected\n"); |
204 errno = ENOTCONN; | 212 errno = ENOTCONN; |
205 return 0; | 213 return 0; |
206 } | 214 } |
207 | 215 |
208 for (i = 0; i < req->entries_count; i++) { | 216 for (i = 0; i < req->entries_count; i++) { |
209 /* wyszukiwanie bierze tylko pierwszy wpis */ | 217 /* wyszukiwanie bierze tylko pierwszy wpis */ |
210 if (req->entries[i].num) | 218 if (req->entries[i].num) |
211 continue; | 219 continue; |
212 | 220 |
213 size += strlen(req->entries[i].field) + 1; | 221 if (sess->encoding == GG_ENCODING_CP1250) { |
214 size += strlen(req->entries[i].value) + 1; | 222 size += strlen(req->entries[i].field) + 1; |
223 size += strlen(req->entries[i].value) + 1; | |
224 } else { | |
225 char *tmp; | |
226 | |
227 tmp = gg_utf8_to_cp(req->entries[i].field); | |
228 | |
229 if (tmp == NULL) | |
230 return -1; | |
231 | |
232 size += strlen(tmp) + 1; | |
233 | |
234 free(tmp); | |
235 | |
236 tmp = gg_utf8_to_cp(req->entries[i].value); | |
237 | |
238 if (tmp == NULL) | |
239 return -1; | |
240 | |
241 size += strlen(tmp) + 1; | |
242 | |
243 free(tmp); | |
244 } | |
215 } | 245 } |
216 | 246 |
217 if (!(buf = malloc(size))) { | 247 if (!(buf = malloc(size))) { |
218 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50() out of memory (%d bytes)\n", size); | 248 gg_debug_session(sess, GG_DEBUG_MISC, "// gg_pubdir50() out of memory (%d bytes)\n", size); |
219 return 0; | 249 return 0; |
220 } | 250 } |
221 | 251 |
252 if (!req->seq) | |
253 req->seq = time(NULL); | |
254 | |
255 res = req->seq; | |
256 | |
222 r = (struct gg_pubdir50_request*) buf; | 257 r = (struct gg_pubdir50_request*) buf; |
223 res = time(NULL); | |
224 r->type = req->type; | 258 r->type = req->type; |
225 r->seq = (req->seq) ? gg_fix32(req->seq) : gg_fix32(time(NULL)); | 259 r->seq = gg_fix32(req->seq); |
226 req->seq = gg_fix32(r->seq); | |
227 | 260 |
228 for (i = 0, p = buf + 5; i < req->entries_count; i++) { | 261 for (i = 0, p = buf + 5; i < req->entries_count; i++) { |
229 if (req->entries[i].num) | 262 if (req->entries[i].num) |
230 continue; | 263 continue; |
231 | 264 |
232 strcpy(p, req->entries[i].field); | 265 if (sess->encoding == GG_ENCODING_CP1250) { |
233 p += strlen(p) + 1; | 266 strcpy(p, req->entries[i].field); |
234 | 267 p += strlen(p) + 1; |
235 strcpy(p, req->entries[i].value); | 268 |
236 p += strlen(p) + 1; | 269 strcpy(p, req->entries[i].value); |
270 p += strlen(p) + 1; | |
271 } else { | |
272 char *tmp; | |
273 | |
274 tmp = gg_utf8_to_cp(req->entries[i].field); | |
275 | |
276 if (tmp == NULL) { | |
277 free(buf); | |
278 return -1; | |
279 } | |
280 | |
281 strcpy(p, tmp); | |
282 p += strlen(tmp) + 1; | |
283 free(tmp); | |
284 | |
285 tmp = gg_utf8_to_cp(req->entries[i].value); | |
286 | |
287 if (tmp == NULL) { | |
288 free(buf); | |
289 return -1; | |
290 } | |
291 | |
292 strcpy(p, tmp); | |
293 p += strlen(tmp) + 1; | |
294 free(tmp); | |
295 } | |
237 } | 296 } |
238 | 297 |
239 if (gg_send_packet(sess, GG_PUBDIR50_REQUEST, buf, size, NULL, 0) == -1) | 298 if (gg_send_packet(sess, GG_PUBDIR50_REQUEST, buf, size, NULL, 0) == -1) |
240 res = 0; | 299 res = 0; |
241 | 300 |
243 | 302 |
244 return res; | 303 return res; |
245 } | 304 } |
246 | 305 |
247 /* | 306 /* |
248 * gg_pubdir50_handle_reply() // funkcja wewnętrzna | 307 * \internal Analizuje przychodzÄ…cy pakiet odpowiedzi i zapisuje wynik |
249 * | 308 * w strukturze \c gg_event. |
250 * analizuje przychodz±cy pakiet odpowiedzi i zapisuje wynik w struct gg_event. | 309 * |
251 * | 310 * \param sess Struktura sesji |
252 * - e - opis zdarzenia | 311 * \param e Struktura zdarzenia |
253 * - packet - zawarto¶ć pakietu odpowiedzi | 312 * \param packet Pakiet odpowiedzi |
254 * - length - długo¶ć pakietu odpowiedzi | 313 * \param length DĹ‚ugość pakietu odpowiedzi |
255 * | 314 * |
256 * 0/-1 | 315 * \return 0 jeśli się powiodło, -1 w przypadku błędu |
257 */ | 316 */ |
258 int gg_pubdir50_handle_reply(struct gg_event *e, const char *packet, int length) | 317 int gg_pubdir50_handle_reply_sess(struct gg_session *sess, struct gg_event *e, const char *packet, int length) |
259 { | 318 { |
260 const char *end = packet + length, *p; | 319 const char *end = packet + length, *p; |
261 struct gg_pubdir50_reply *r = (struct gg_pubdir50_reply*) packet; | 320 struct gg_pubdir50_reply *r = (struct gg_pubdir50_reply*) packet; |
262 gg_pubdir50_t res; | 321 gg_pubdir50_t res; |
263 int num = 0; | 322 int num = 0; |
264 | 323 |
265 gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_handle_reply(%p, %p, %d);\n", e, packet, length); | 324 gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_handle_reply_sess(%p, %p, %p, %d);\n", sess, e, packet, length); |
266 | 325 |
267 if (!e || !packet) { | 326 if (!sess || !e || !packet) { |
268 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_handle_reply() invalid arguments\n"); | 327 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_handle_reply() invalid arguments\n"); |
269 errno = EFAULT; | 328 errno = EFAULT; |
270 return -1; | 329 return -1; |
271 } | 330 } |
272 | 331 |
297 default: | 356 default: |
298 e->type = GG_EVENT_PUBDIR50_SEARCH_REPLY; | 357 e->type = GG_EVENT_PUBDIR50_SEARCH_REPLY; |
299 break; | 358 break; |
300 } | 359 } |
301 | 360 |
302 /* brak wyników? */ | 361 /* brak wynikĂłw? */ |
303 if (length == 5) | 362 if (length == 5) |
304 return 0; | 363 return 0; |
305 | 364 |
306 /* pomiń pocz±tek odpowiedzi */ | 365 /* pomiĹ„ poczÄ…tek odpowiedzi */ |
307 p = packet + 5; | 366 p = packet + 5; |
308 | 367 |
309 while (p < end) { | 368 while (p < end) { |
310 const char *field, *value; | 369 const char *field, *value; |
311 | 370 |
312 field = p; | 371 field = p; |
313 | 372 |
314 /* sprawdĽ, czy nie mamy podziału na kolejne pole */ | 373 /* sprawdĹş, czy nie mamy podziaĹ‚u na kolejne pole */ |
315 if (!*field) { | 374 if (!*field) { |
316 num++; | 375 num++; |
317 field++; | 376 field++; |
318 } | 377 } |
319 | 378 |
320 value = NULL; | 379 value = NULL; |
321 | 380 |
322 for (p = field; p < end; p++) { | 381 for (p = field; p < end; p++) { |
323 /* je¶li mamy koniec tekstu... */ | 382 /* jeĹ›li mamy koniec tekstu... */ |
324 if (!*p) { | 383 if (!*p) { |
325 /* ...i jeszcze nie mieli¶my warto¶ci pola to | 384 /* ...i jeszcze nie mieliĹ›my wartoĹ›ci pola to |
326 * wiemy, że po tym zerze jest warto¶ć... */ | 385 * wiemy, ĹĽe po tym zerze jest wartość... */ |
327 if (!value) | 386 if (!value) |
328 value = p + 1; | 387 value = p + 1; |
329 else | 388 else |
330 /* ...w przeciwym wypadku koniec | 389 /* ...w przeciwym wypadku koniec |
331 * warto¶ci i możemy wychodzić | 390 * wartoĹ›ci i moĹĽemy wychodzić |
332 * grzecznie z pętli */ | 391 * grzecznie z pÄ™tli */ |
333 break; | 392 break; |
334 } | 393 } |
335 } | 394 } |
336 | 395 |
337 /* sprawdĽmy, czy pole nie wychodzi poza pakiet, żeby nie | 396 /* sprawdĹşmy, czy pole nie wychodzi poza pakiet, ĹĽeby nie |
338 * mieć segfaultów, je¶li serwer przestanie zakańczać pakietów | 397 * mieć segfaultĂłw, jeĹ›li serwer przestanie zakaĹ„czać pakietĂłw |
339 * przez \0 */ | 398 * przez \0 */ |
340 | 399 |
341 if (p == end) { | 400 if (p == end) { |
342 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_handle_reply() premature end of packet\n"); | 401 gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_handle_reply() premature end of packet\n"); |
343 goto failure; | 402 goto failure; |
344 } | 403 } |
345 | 404 |
346 p++; | 405 p++; |
347 | 406 |
348 /* je¶li dostali¶my namier na następne wyniki, to znaczy że | 407 /* jeĹ›li dostaliĹ›my namier na nastÄ™pne wyniki, to znaczy ĹĽe |
349 * mamy koniec wyników i nie jest to kolejna osoba. */ | 408 * mamy koniec wynikĂłw i nie jest to kolejna osoba. */ |
350 if (!strcasecmp(field, "nextstart")) { | 409 if (!strcasecmp(field, "nextstart")) { |
351 res->next = atoi(value); | 410 res->next = atoi(value); |
352 num--; | 411 num--; |
353 } else { | 412 } else { |
354 if (gg_pubdir50_add_n(res, num, field, value) == -1) | 413 if (sess->encoding == GG_ENCODING_CP1250) { |
355 goto failure; | 414 if (gg_pubdir50_add_n(res, num, field, value) == -1) |
415 goto failure; | |
416 } else { | |
417 char *tmp; | |
418 | |
419 tmp = gg_cp_to_utf8(value); | |
420 | |
421 if (tmp == NULL) | |
422 goto failure; | |
423 | |
424 if (gg_pubdir50_add_n(res, num, field, tmp) == -1) { | |
425 free(tmp); | |
426 goto failure; | |
427 } | |
428 | |
429 free(tmp); | |
430 } | |
356 } | 431 } |
357 } | 432 } |
358 | 433 |
359 res->count = num + 1; | 434 res->count = num + 1; |
360 | 435 |
363 failure: | 438 failure: |
364 gg_pubdir50_free(res); | 439 gg_pubdir50_free(res); |
365 return -1; | 440 return -1; |
366 } | 441 } |
367 | 442 |
368 /* | 443 /** |
369 * gg_pubdir50_get() | 444 * Pobiera pole z odpowiedzi katalogu publicznego. |
370 * | 445 * |
371 * pobiera informację z rezultatu wyszukiwania. | 446 * \param res OdpowiedĹş |
372 * | 447 * \param num Numer wyniku odpowiedzi |
373 * - res - rezultat wyszukiwania, | 448 * \param field Nazwa pola (wielkość liter nie ma znaczenia) |
374 * - num - numer odpowiedzi, | 449 * |
375 * - field - nazwa pola (wielko¶ć liter nie ma znaczenia). | 450 * \return Wartość pola lub \c NULL jeĹ›li nie znaleziono |
376 * | 451 * |
377 * warto¶ć pola lub NULL, je¶li nie znaleziono. | 452 * \ingroup pubdir50 |
378 */ | 453 */ |
379 const char *gg_pubdir50_get(gg_pubdir50_t res, int num, const char *field) | 454 const char *gg_pubdir50_get(gg_pubdir50_t res, int num, const char *field) |
380 { | 455 { |
381 char *value = NULL; | 456 char *value = NULL; |
382 int i; | 457 int i; |
397 } | 472 } |
398 | 473 |
399 return value; | 474 return value; |
400 } | 475 } |
401 | 476 |
402 /* | 477 /** |
403 * gg_pubdir50_count() | 478 * Zwraca liczbÄ™ wynikĂłw odpowiedzi. |
404 * | 479 * |
405 * zwraca ilo¶ć wyników danego zapytania. | 480 * \param res OdpowiedĹş |
406 * | 481 * |
407 * - res - odpowiedĽ | 482 * \return Liczba wynikĂłw lub -1 w przypadku bĹ‚Ä™du |
408 * | 483 * |
409 * ilo¶ć lub -1 w przypadku błędu. | 484 * \ingroup pubdir50 |
410 */ | 485 */ |
411 int gg_pubdir50_count(gg_pubdir50_t res) | 486 int gg_pubdir50_count(gg_pubdir50_t res) |
412 { | 487 { |
413 return (!res) ? -1 : res->count; | 488 return (!res) ? -1 : res->count; |
414 } | 489 } |
415 | 490 |
416 /* | 491 /** |
417 * gg_pubdir50_type() | 492 * Zwraca rodzaj zapytania lub odpowiedzi. |
418 * | 493 * |
419 * zwraca rodzaj zapytania lub odpowiedzi. | 494 * \param res Zapytanie lub odpowiedĹş |
420 * | 495 * |
421 * - res - zapytanie lub odpowiedĽ | 496 * \return Rodzaj lub -1 w przypadku bĹ‚Ä™du |
422 * | 497 * |
423 * ilo¶ć lub -1 w przypadku błędu. | 498 * \ingroup pubdir50 |
424 */ | 499 */ |
425 int gg_pubdir50_type(gg_pubdir50_t res) | 500 int gg_pubdir50_type(gg_pubdir50_t res) |
426 { | 501 { |
427 return (!res) ? -1 : res->type; | 502 return (!res) ? -1 : res->type; |
428 } | 503 } |
429 | 504 |
430 /* | 505 /** |
431 * gg_pubdir50_next() | 506 * Zwraca numer, od ktĂłrego naleĹĽy rozpoczÄ…c kolejne wyszukiwanie. |
432 * | 507 * |
433 * zwraca numer, od którego należy rozpocz±ć kolejne wyszukiwanie, je¶li | 508 * DĹ‚uĹĽsze odpowiedzi katalogu publicznego sÄ… wysyĹ‚ane przez serwer |
434 * zależy nam na kolejnych wynikach. | 509 * w mniejszych paczkach. Po otrzymaniu odpowiedzi, jeĹ›li numer kolejnego |
435 * | 510 * wyszukiwania jest większy od zera, dalsze wyniki można otrzymać przez |
436 * - res - odpowiedĽ | 511 * wywoĹ‚anie kolejnego zapytania z okreĹ›lonym numerem poczÄ…tkowym. |
437 * | 512 * |
438 * numer lub -1 w przypadku błędu. | 513 * \param res OdpowiedĹş |
514 * | |
515 * \return Numer lub -1 w przypadku błędu | |
516 * | |
517 * \ingroup pubdir50 | |
439 */ | 518 */ |
440 uin_t gg_pubdir50_next(gg_pubdir50_t res) | 519 uin_t gg_pubdir50_next(gg_pubdir50_t res) |
441 { | 520 { |
442 return (!res) ? (unsigned) -1 : res->next; | 521 return (!res) ? (unsigned) -1 : res->next; |
443 } | 522 } |
444 | 523 |
445 /* | 524 /** |
446 * gg_pubdir50_seq() | 525 * Zwraca numer sekwencyjny zapytania lub odpowiedzi. |
447 * | 526 * |
448 * zwraca numer sekwencyjny zapytania lub odpowiedzi. | 527 * \param res Zapytanie lub odpowiedĹş |
449 * | 528 * |
450 * - res - zapytanie lub odpowiedĽ | 529 * \return Numer sekwencyjny lub -1 w przypadku bĹ‚Ä™du |
451 * | 530 * |
452 * numer lub -1 w przypadku błędu. | 531 * \ingroup pubdir50 |
453 */ | 532 */ |
454 uint32_t gg_pubdir50_seq(gg_pubdir50_t res) | 533 uint32_t gg_pubdir50_seq(gg_pubdir50_t res) |
455 { | 534 { |
456 return (!res) ? (unsigned) -1 : res->seq; | 535 return (!res) ? (unsigned) -1 : res->seq; |
457 } | 536 } |