# HG changeset patch # User Mark Doliner # Date 1106803688 0 # Node ID 8bc7ba019e9654ea1b97ce28055d528ef2183b71 # Parent 1596ade006641625ab885fad8d885171b802c409 [gaim-migrate @ 11919] This should make rendezvous compile again. It's back to being able to somewhat sign on and see other people. Still nowhere near being able to message. I think I want to work on messaging, then maybe come back and look into using a third party lib or maybe just an external mDNS server for presence. committer: Tailor Script diff -r 1596ade00664 -r 8bc7ba019e96 src/protocols/rendezvous/Makefile.am --- a/src/protocols/rendezvous/Makefile.am Thu Jan 27 05:24:26 2005 +0000 +++ b/src/protocols/rendezvous/Makefile.am Thu Jan 27 05:28:08 2005 +0000 @@ -4,6 +4,8 @@ pkgdir = $(libdir)/gaim RENDEZVOUSSOURCES = \ + direct.c \ + direct.h \ mdns.c \ mdns.h \ mdns_cache.c \ diff -r 1596ade00664 -r 8bc7ba019e96 src/protocols/rendezvous/Makefile.mingw --- a/src/protocols/rendezvous/Makefile.mingw Thu Jan 27 05:24:26 2005 +0000 +++ b/src/protocols/rendezvous/Makefile.mingw Thu Jan 27 05:28:08 2005 +0000 @@ -68,7 +68,8 @@ ## SOURCES, OBJECTS ## -C_SRC = mdns.c \ +C_SRC = direct.c \ + mdns.c \ mdns_cache.c \ rendezvous.c diff -r 1596ade00664 -r 8bc7ba019e96 src/protocols/rendezvous/direct.c --- a/src/protocols/rendezvous/direct.c Thu Jan 27 05:24:26 2005 +0000 +++ b/src/protocols/rendezvous/direct.c Thu Jan 27 05:28:08 2005 +0000 @@ -27,7 +27,7 @@ #include "direct.h" #include "rendezvous.h" -/* +#if 0 gchar * gaim_network_convert_ipv4_to_string(void *ip) { @@ -50,27 +50,31 @@ return ret; } -*/ -static gboolean rendezvous_find_buddy_by_ip(gpointer key, gpointer value, gpointer user_data) +static gboolean +rendezvous_find_buddy_by_ip(gpointer key, gpointer value, gpointer user_data) { RendezvousBuddy *rb = value; -printf("looking at ip=%s\n", rb->ip); - if ((rb->ip != NULL) && !strcasecmp(rb->ip, user_data)) - return TRUE; + if (rb->ipv4 == NULL) + return FALSE; - return FALSE; +printf("looking at ip=%hu.%hu.%hu.%hu\n", rb->ipv4[0], rb->ipv4[1], rb->ipv4[2], rb->ipv4[3]); + return !memcmp(rb->ipv4, user_data, 4); } +#endif -void rendezvous_direct_acceptconnection(gpointer data, gint source, GaimInputCondition condition) +void +rendezvous_direct_acceptconnection(gpointer data, gint source, GaimInputCondition condition) { GaimConnection *gc = (GaimConnection *)data; RendezvousData *rd = gc->proto_data; int fd; struct sockaddr_in6 addr; socklen_t addrlen = sizeof(addr); +#if 0 gchar *ip; +#endif RendezvousBuddy *rb; fd = accept(rd->listener, (struct sockaddr *)&addr, &addrlen); @@ -78,7 +82,8 @@ gaim_debug_warning("rendezvous", "accept: %s\n", strerror(errno)); return; } -/* + +#if 0 printf("\nsa_family=%d\n\n", ((struct sockaddr *)&addr)->sa_family); if (((struct sockaddr *)&addr)->sa_family == AF_INET) ip = gaim_network_convert_ipv4_to_string((unsigned char *)&ip); @@ -88,7 +93,8 @@ rb = g_hash_table_find(rd->buddies, rendezvous_find_buddy_by_ip, ip); g_free(ip); -*/ +#endif + if (rb == NULL) { /* We don't want to talk to people that don't advertise themselves */ printf("\ndid not find rb\n\n"); @@ -98,5 +104,4 @@ printf("\nip belongs to=%s\n\n", rb->aim); rb->fd = fd; - } diff -r 1596ade00664 -r 8bc7ba019e96 src/protocols/rendezvous/mdns.c --- a/src/protocols/rendezvous/mdns.c Thu Jan 27 05:24:26 2005 +0000 +++ b/src/protocols/rendezvous/mdns.c Thu Jan 27 05:28:08 2005 +0000 @@ -277,7 +277,6 @@ return ret; } -#if 0 ResourceRecord * mdns_copy_rr(const ResourceRecord *rr) { @@ -297,6 +296,7 @@ return ret; } +#if 0 static GSList * mdns_copy_rrs(const GSList *rrs) { @@ -367,6 +367,7 @@ addr.sin_addr.s_addr = INADDR_ANY; if (bind(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { gaim_debug_error("mdns", "Unable to bind socket to interface.\n"); + gaim_debug_error("mdns", "%s\n", strerror(errno)); close(fd); return -1; } diff -r 1596ade00664 -r 8bc7ba019e96 src/protocols/rendezvous/rendezvous.c --- a/src/protocols/rendezvous/rendezvous.c Thu Jan 27 05:24:26 2005 +0000 +++ b/src/protocols/rendezvous/rendezvous.c Thu Jan 27 05:28:08 2005 +0000 @@ -82,6 +82,23 @@ /* Buddy List Functions */ /****************************/ +static RendezvousBuddy * +rendezvous_find_or_create_rendezvousbuddy(GaimConnection *gc, const char *name) +{ + RendezvousData *rd = gc->proto_data; + RendezvousBuddy *rb; + + rb = g_hash_table_lookup(rd->buddies, name); + if (rb == NULL) { + rb = g_malloc0(sizeof(RendezvousBuddy)); + rb->fd = -1; + rb->watcher = -1; + g_hash_table_insert(rd->buddies, g_strdup(name), rb); + } + + return rb; +} + static void rendezvous_addtolocal(GaimConnection *gc, const char *name, const char *domain) { @@ -100,17 +117,14 @@ return; b = gaim_buddy_new(account, name, NULL); + gaim_blist_node_set_flags((GaimBlistNode *)b, GAIM_BLIST_NODE_FLAG_NO_SAVE); /* gaim_blist_node_set_flag(b, GAIM_BLIST_NODE_FLAG_NO_SAVE); */ gaim_blist_add_buddy(b, NULL, g, NULL); gaim_prpl_got_user_status(account, b->name, "online", NULL); #if 0 RendezvousBuddy *rb; - rb = g_hash_table_lookup(rd->buddies, name); - if (rb == NULL) { - rb = g_malloc0(sizeof(RendezvousBuddy)); - g_hash_table_insert(rd->buddies, g_strdup(name), rb); - } + rb = rendezvous_find_or_create_rendezvousbuddy(gc, name); rb->ttltimer = gaim_timeout_add(time * 10000, rendezvous_buddy_timeout, gc); gaim_timeout_remove(rb->ttltimer); @@ -177,25 +191,19 @@ static void rendezvous_handle_rr_a(GaimConnection *gc, ResourceRecord *rr, const gchar *name) { - RendezvousData *rd = gc->proto_data; RendezvousBuddy *rb; ResourceRecordRDataSRV *rdata; rdata = rr->rdata; - rb = g_hash_table_lookup(rd->buddies, name); - if (rb == NULL) { - rb = g_malloc0(sizeof(RendezvousBuddy)); - g_hash_table_insert(rd->buddies, g_strdup(name), rb); - } + rb = rendezvous_find_or_create_rendezvousbuddy(gc, name); - /* rb->ipv4 = gaim_network_convert_ipv4_to_string((unsigned char *)rdata); */ + memcpy(rb->ipv4, rdata, 4); } static void rendezvous_handle_rr_txt(GaimConnection *gc, ResourceRecord *rr, const gchar *name) { - RendezvousData *rd = gc->proto_data; GaimAccount *account = gaim_connection_get_account(gc); RendezvousBuddy *rb; GSList *rdata; @@ -208,11 +216,7 @@ if ((node1 == NULL) || (node1->value == NULL) || (strcmp(node1->value, "1"))) return; - rb = g_hash_table_lookup(rd->buddies, name); - if (rb == NULL) { - rb = g_malloc0(sizeof(RendezvousBuddy)); - g_hash_table_insert(rd->buddies, g_strdup(name), rb); - } + rb = rendezvous_find_or_create_rendezvousbuddy(gc, name); node1 = mdns_txt_find(rdata, "1st"); node2 = mdns_txt_find(rdata, "last"); @@ -253,7 +257,8 @@ rb->idle += 978307200; /* convert to seconds-since-epoch */ } rb->status = UC_IDLE; - gaim_prpl_got_user_idle(account, name, TRUE, rb->idle); + /* TODO: Do this when the user is added to the buddy list? Definitely not here! */ + /* gaim_prpl_got_user_idle(account, name, TRUE, rb->idle); */ } else if (!strcmp(node1->value, "dnd")) { /* Away */ rb->status = UC_UNAVAILABLE; @@ -272,35 +277,25 @@ static void rendezvous_handle_rr_aaaa(GaimConnection *gc, ResourceRecord *rr, const gchar *name) { - RendezvousData *rd = gc->proto_data; RendezvousBuddy *rb; ResourceRecordRDataSRV *rdata; rdata = rr->rdata; - rb = g_hash_table_lookup(rd->buddies, name); - if (rb == NULL) { - rb = g_malloc0(sizeof(RendezvousBuddy)); - g_hash_table_insert(rd->buddies, g_strdup(name), rb); - } + rb = rendezvous_find_or_create_rendezvousbuddy(gc, name); - /* rb->ip = gaim_network_convert_ipv6_to_string((unsigned char *)rdata); */ + memcpy(rb->ipv6, rdata, 16); } static void rendezvous_handle_rr_srv(GaimConnection *gc, ResourceRecord *rr, const gchar *name) { - RendezvousData *rd = gc->proto_data; RendezvousBuddy *rb; ResourceRecordRDataSRV *rdata; rdata = rr->rdata; - rb = g_hash_table_lookup(rd->buddies, name); - if (rb == NULL) { - rb = g_malloc0(sizeof(RendezvousBuddy)); - g_hash_table_insert(rd->buddies, g_strdup(name), rb); - } + rb = rendezvous_find_or_create_rendezvousbuddy(gc, name); rb->p2pjport = rdata->port; } @@ -444,6 +439,21 @@ return g_string_free(ret, FALSE); } +static GList * +rendezvous_prpl_status_types(GaimAccount *account) +{ + GList *status_types = NULL; + GaimStatusType *type; + + type = gaim_status_type_new_full(GAIM_STATUS_OFFLINE, "offline", _("Offline"), FALSE, TRUE, FALSE); + status_types = g_list_append(status_types, type); + + type = gaim_status_type_new_full(GAIM_STATUS_ONLINE, "online", _("Online"), FALSE, TRUE, FALSE); + status_types = g_list_append(status_types, type); + + return status_types; +} + /****************************/ /* Connection Functions */ /****************************/ @@ -556,20 +566,24 @@ { RendezvousData *rd = gc->proto_data; GaimAccount *account = gaim_connection_get_account(gc); - const gchar *me; + const gchar *me, *myip; gchar *myname, *mycomp, *myport; + gchar **mysplitip; unsigned char myipv4[4]; me = gaim_account_get_username(account); myname = g_strdup_printf("%s._presence._tcp.local", me); mycomp = g_strdup_printf("%s.local", strchr(me, '@') + 1); - /* myipv4 = gaim_network_ip_atoi(gaim_network_get_local_system_ip(-1)); */ - myipv4[0] = 192; - myipv4[1] = 168; - myipv4[2] = 1; - myipv4[3] = 41; myport = g_strdup_printf("%d", rd->listener_port); + myip = gaim_network_get_local_system_ip(-1); + mysplitip = g_strsplit(myip, ".", 0); + myipv4[0] = atoi(mysplitip[0]); + myipv4[1] = atoi(mysplitip[1]); + myipv4[2] = atoi(mysplitip[2]); + myipv4[3] = atoi(mysplitip[3]); + g_strfreev(mysplitip); + mdns_advertise_a(rd->fd, mycomp, myipv4); mdns_advertise_ptr(rd->fd, "_presence._tcp.local", myname); mdns_advertise_srv(rd->fd, myname, rd->listener_port, mycomp); @@ -677,8 +691,19 @@ static int rendezvous_prpl_send_im(GaimConnection *gc, const char *who, const char *message, GaimConvImFlags flags) { + RendezvousData *rd = gc->proto_data; + RendezvousBuddy *rb; + gaim_debug_info("rendezvous", "Sending IM\n"); + rb = g_hash_table_lookup(rd->buddies, who); + if (rb == NULL) { + /* TODO: Should print an error to the user, here */ + gaim_debug_error("rendezvous", "Could not send message to %s: Could not find user information.\n", who); + } + + /* TODO: Establish a direct connection then send IM. Will need to queue the message somewhere. */ + return 1; } @@ -740,6 +765,7 @@ prpl_info.list_emblems = rendezvous_prpl_list_emblems; prpl_info.status_text = rendezvous_prpl_status_text; prpl_info.tooltip_text = rendezvous_prpl_tooltip_text; + prpl_info.status_types = rendezvous_prpl_status_types; prpl_info.login = rendezvous_prpl_login; prpl_info.close = rendezvous_prpl_close; prpl_info.send_im = rendezvous_prpl_send_im; diff -r 1596ade00664 -r 8bc7ba019e96 src/protocols/rendezvous/rendezvous.h --- a/src/protocols/rendezvous/rendezvous.h Thu Jan 27 05:24:26 2005 +0000 +++ b/src/protocols/rendezvous/rendezvous.h Thu Jan 27 05:28:08 2005 +0000 @@ -51,14 +51,14 @@ #endif gchar *firstandlast; gchar *aim; - gchar *ipv4; /* String representation of an IPv4 address */ - gchar *ipv6; /* String representation of an IPv6 address */ + unsigned char ipv4[4]; /**< An IPv4 address */ + unsigned char ipv6[16]; /**< An IPv6 address */ unsigned short p2pjport; int status; - int idle; /**< Current idle time in seconds since the epoch. */ - gchar *msg; /**< Current status message of this buddy. */ - int fd; /**< File descriptor of the P2PJ socket. */ - int watcher; /**< Handle for the watcher of the P2PJ socket. */ + int idle; /**< Current idle time in seconds since the epoch. */ + gchar *msg; /**< Current status message of this buddy. */ + int fd; /**< File descriptor of the P2PJ socket. */ + int watcher; /**< Handle for the watcher of the P2PJ socket. */ } RendezvousBuddy; #endif /* _RENDEZVOUS_H_ */