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)