Mercurial > pidgin.yaz
comparison src/protocols/rendezvous/rendezvous.c @ 8806:8212661dc3cc
[gaim-migrate @ 9568]
I think mDNS records should be caching now... my iBook isn't booting,
so I don't really have a way to test it. I need to fix that.
I change some stuff from GHashTables to GSLists, I think, which
meant changing a lot of code.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 25 Apr 2004 16:23:20 +0000 |
parents | d7b8eb1f0a18 |
children | beb7be215db3 |
comparison
equal
deleted
inserted
replaced
8805:6ad548495275 | 8806:8212661dc3cc |
---|---|
181 | 181 |
182 static void rendezvous_handle_rr_txt(GaimConnection *gc, ResourceRecord *rr, const gchar *name) | 182 static void rendezvous_handle_rr_txt(GaimConnection *gc, ResourceRecord *rr, const gchar *name) |
183 { | 183 { |
184 RendezvousData *rd = gc->proto_data; | 184 RendezvousData *rd = gc->proto_data; |
185 RendezvousBuddy *rb; | 185 RendezvousBuddy *rb; |
186 GHashTable *rdata; | 186 GSList *rdata; |
187 gchar *tmp1, *tmp2; | 187 ResourceRecordRDataTXTNode *node1, *node2; |
188 | 188 |
189 rdata = rr->rdata; | 189 rdata = rr->rdata; |
190 | 190 |
191 /* Don't do a damn thing if the version is greater than 1 */ | 191 /* Don't do a damn thing if the version is greater than 1 */ |
192 tmp1 = g_hash_table_lookup(rdata, "version"); | 192 node1 = mdns_txt_find(rdata, "version"); |
193 if ((tmp1 == NULL) || (strcmp(tmp1, "1"))) | 193 if ((node1 == NULL) || (node1->value == NULL) || (strcmp(node1->value, "1"))) |
194 return; | 194 return; |
195 | 195 |
196 rb = g_hash_table_lookup(rd->buddies, name); | 196 rb = g_hash_table_lookup(rd->buddies, name); |
197 if (rb == NULL) { | 197 if (rb == NULL) { |
198 rb = g_malloc0(sizeof(RendezvousBuddy)); | 198 rb = g_malloc0(sizeof(RendezvousBuddy)); |
199 g_hash_table_insert(rd->buddies, g_strdup(name), rb); | 199 g_hash_table_insert(rd->buddies, g_strdup(name), rb); |
200 } | 200 } |
201 | 201 |
202 tmp1 = g_hash_table_lookup(rdata, "1st"); | 202 node1 = mdns_txt_find(rdata, "1st"); |
203 tmp2 = g_hash_table_lookup(rdata, "last"); | 203 node2 = mdns_txt_find(rdata, "last"); |
204 g_free(rb->firstandlast); | 204 g_free(rb->firstandlast); |
205 rb->firstandlast = g_strdup_printf("%s%s%s", | 205 rb->firstandlast = g_strdup_printf("%s%s%s", |
206 (tmp1 ? tmp1 : ""), | 206 (node1 && node1->value ? node1->value : ""), |
207 (tmp1 && tmp2 ? " " : ""), | 207 (node1 && node1->value && node2 && node2->value ? " " : ""), |
208 (tmp2 ? tmp2 : "")); | 208 (node2 && node2->value ? node2->value : "")); |
209 serv_got_alias(gc, name, rb->firstandlast); | 209 serv_got_alias(gc, name, rb->firstandlast); |
210 | 210 |
211 tmp1 = g_hash_table_lookup(rdata, "aim"); | 211 node1 = mdns_txt_find(rdata, "aim"); |
212 if (tmp1 != NULL) { | 212 if ((node1 != NULL) && (node1->value != NULL)) { |
213 g_free(rb->aim); | 213 g_free(rb->aim); |
214 rb->aim = g_strdup(tmp1); | 214 rb->aim = g_strdup(node1->value); |
215 } | 215 } |
216 | 216 |
217 /* | 217 /* |
218 * We only want to use this port as a back-up. Ideally the port | 218 * We only want to use this port as a back-up. Ideally the port |
219 * is specified in a separate, SRV resource record. | 219 * is specified in a separate, SRV resource record. |
220 */ | 220 */ |
221 if (rb->p2pjport == 0) { | 221 if (rb->p2pjport == 0) { |
222 tmp1 = g_hash_table_lookup(rdata, "port.p2pj"); | 222 node1 = mdns_txt_find(rdata, "port.p2pj"); |
223 rb->p2pjport = atoi(tmp1); | 223 if ((node1 != NULL) && (node1->value)) |
224 } | 224 rb->p2pjport = atoi(node1->value); |
225 | 225 } |
226 tmp1 = g_hash_table_lookup(rdata, "status"); | 226 |
227 if (tmp1 != NULL) { | 227 node1 = mdns_txt_find(rdata, "status");; |
228 if (!strcmp(tmp1, "avail")) { | 228 if ((node1 != NULL) && (node1->value != NULL)) { |
229 if (!strcmp(node1->value, "avail")) { | |
229 /* Available */ | 230 /* Available */ |
230 rb->status = 0; | 231 rb->status = 0; |
231 } else if (!strcmp(tmp1, "away")) { | 232 } else if (!strcmp(node1->value, "away")) { |
232 /* Idle */ | 233 /* Idle */ |
233 tmp2 = g_hash_table_lookup(rdata, "away"); | 234 node2 = mdns_txt_find(rdata, "away"); |
234 rb->idle = atoi(tmp2); | 235 if ((node2 != NULL) && (node2->value)) { |
235 gaim_debug_error("XXX", "User has been idle since %d\n", rb->idle); | 236 rb->idle = atoi(node2->value); |
237 gaim_debug_error("XXX", "User has been idle since %d\n", rb->idle); | |
238 } | |
236 rb->status = UC_IDLE; | 239 rb->status = UC_IDLE; |
237 } else if (!strcmp(tmp1, "dnd")) { | 240 } else if (!strcmp(node1->value, "dnd")) { |
238 /* Away */ | 241 /* Away */ |
239 rb->status = UC_UNAVAILABLE; | 242 rb->status = UC_UNAVAILABLE; |
240 } | 243 } |
241 serv_got_update(gc, name, 1, 0, 0, 0, rb->status); | 244 serv_got_update(gc, name, 1, 0, 0, 0, rb->status); |
242 } | 245 } |
243 | 246 |
244 tmp1 = g_hash_table_lookup(rdata, "msg"); | 247 node1 = mdns_txt_find(rdata, "msg"); |
245 if (tmp1 != NULL) { | 248 if ((node1 != NULL) && (node1->value != NULL)) { |
246 g_free(rb->msg); | 249 g_free(rb->msg); |
247 rb->msg = g_strdup(tmp1); | 250 rb->msg = g_strdup(node1->value); |
248 } | 251 } |
249 } | 252 } |
250 | 253 |
251 static void rendezvous_handle_rr_srv(GaimConnection *gc, ResourceRecord *rr, const gchar *name) | 254 static void rendezvous_handle_rr_srv(GaimConnection *gc, ResourceRecord *rr, const gchar *name) |
252 { | 255 { |
253 RendezvousData *rd = gc->proto_data; | 256 RendezvousData *rd = gc->proto_data; |
254 RendezvousBuddy *rb; | 257 RendezvousBuddy *rb; |
255 ResourceRecordSRV *rdata; | 258 ResourceRecordRDataSRV *rdata; |
256 | 259 |
257 rdata = rr->rdata; | 260 rdata = rr->rdata; |
258 | 261 |
259 rb = g_hash_table_lookup(rd->buddies, name); | 262 rb = g_hash_table_lookup(rd->buddies, name); |
260 if (rb == NULL) { | 263 if (rb == NULL) { |
390 static void rendezvous_callback(gpointer data, gint source, GaimInputCondition condition) | 393 static void rendezvous_callback(gpointer data, gint source, GaimInputCondition condition) |
391 { | 394 { |
392 GaimConnection *gc = data; | 395 GaimConnection *gc = data; |
393 RendezvousData *rd = gc->proto_data; | 396 RendezvousData *rd = gc->proto_data; |
394 DNSPacket *dns; | 397 DNSPacket *dns; |
395 int i; | 398 GSList *cur; |
396 | 399 |
397 gaim_debug_misc("rendezvous", "Received rendezvous datagram\n"); | 400 gaim_debug_misc("rendezvous", "Received rendezvous datagram\n"); |
398 | 401 |
399 dns = mdns_read(rd->fd); | 402 dns = mdns_read(rd->fd); |
400 if (dns == NULL) | 403 if (dns == NULL) |
401 return; | 404 return; |
402 | 405 |
403 /* Handle the DNS packet */ | 406 /* Handle the DNS packet */ |
404 for (i = 0; i < dns->header.numanswers; i++) | 407 for (cur = dns->answers; cur != NULL; cur = cur->next) |
405 rendezvous_handle_rr(gc, &dns->answers[i]); | 408 rendezvous_handle_rr(gc, cur->data); |
406 for (i = 0; i < dns->header.numauthority; i++) | 409 for (cur = dns->authority; cur != NULL; cur = cur->next) |
407 rendezvous_handle_rr(gc, &dns->authority[i]); | 410 rendezvous_handle_rr(gc, cur->data); |
408 for (i = 0; i < dns->header.numadditional; i++) | 411 for (cur = dns->additional; cur != NULL; cur = cur->next) |
409 rendezvous_handle_rr(gc, &dns->additional[i]); | 412 rendezvous_handle_rr(gc, cur->data); |
410 | 413 |
411 mdns_free(dns); | 414 mdns_free(dns); |
412 } | 415 } |
413 | 416 |
414 static void rendezvous_add_to_txt(RendezvousData *rd, const char *name, const char *value) | 417 static void rendezvous_add_to_txt(RendezvousData *rd, const char *name, const char *value) |