comparison src/protocols/irc/irc.c @ 3622:2ef75915a13c

[gaim-migrate @ 3743] I haven't tested this thoroughly, but neither does Sean before he commits his code. committer: Tailor Script <tailor@pidgin.im>
author Rob Flynn <gaim@robflynn.com>
date Thu, 10 Oct 2002 06:54:08 +0000
parents a19850d6e718
children 159f624c617d
comparison
equal deleted inserted replaced
3621:e9f66d245253 3622:2ef75915a13c
469 ift->watcher = 0; 469 ift->watcher = 0;
470 } 470 }
471 } 471 }
472 472
473 473
474 void dcc_send_callback (gpointer data, gint source, GaimInputCondition condition) {
475 struct irc_file_transfer *ift = data;
476 struct irc_data *id = (struct irc_data *)ift->gc->proto_data;
477 struct sockaddr_in addr;
478 int len = sizeof(addr);
479
480 addr.sin_family = AF_INET;
481 addr.sin_port = htons(ift->port);
482 addr.sin_addr.s_addr = INADDR_ANY;
483
484 ift->fd = accept(ift->fd, (struct sockaddr *)&addr, &len);
485 if (!ift->fd) {
486 /* FIXME: Handle this gracefully XXX */
487 printf("Something bad happened here, bubba!");
488 return;
489 }
490
491 if (transfer_out_do(ift->xfer, ift->fd, 0)) {
492 gaim_input_remove(ift->watcher);
493 ift->watcher = 0;
494 }
495 }
496
474 void dcc_recv_callback (gpointer data, gint source, GaimInputCondition condition) { 497 void dcc_recv_callback (gpointer data, gint source, GaimInputCondition condition) {
475 struct irc_file_transfer *ift = data; 498 struct irc_file_transfer *ift = data;
476 499
477 ift->fd = source; 500 ift->fd = source;
478
479 printf("WELL, we should be doing something then, should we not?\n");
480
481 irc_file_transfer_do(ift->gc, ift); 501 irc_file_transfer_do(ift->gc, ift);
482 } 502 }
483 503
484 void dcc_chat_callback (gpointer data, gint source, GaimInputCondition condition) { 504 void dcc_chat_callback (gpointer data, gint source, GaimInputCondition condition) {
485 struct dcc_chat *chat = data; 505 struct dcc_chat *chat = data;
1973 } 1993 }
1974 1994
1975 static void irc_ask_send_file(struct gaim_connection *gc, char *destsn) { 1995 static void irc_ask_send_file(struct gaim_connection *gc, char *destsn) {
1976 struct irc_data *id = (struct irc_data *)gc->proto_data; 1996 struct irc_data *id = (struct irc_data *)gc->proto_data;
1977 struct irc_file_transfer *ift = g_new0(struct irc_file_transfer, 1); 1997 struct irc_file_transfer *ift = g_new0(struct irc_file_transfer, 1);
1998 char *localip = (char *)malloc(12);
1999
2000 if (getlocalip(localip) == -1) {
2001 free(localip);
2002 return;
2003 }
1978 2004
1979 ift->type = IFT_SENDFILE_OUT; 2005 ift->type = IFT_SENDFILE_OUT;
1980 ift->sn = g_strdup(destsn); 2006 ift->sn = g_strdup(destsn);
1981 ift->gc = gc; 2007 ift->gc = gc;
2008 snprintf(ift->ip, sizeof(ift->ip), "%s", localip);
1982 id->file_transfers = g_slist_append(id->file_transfers, ift); 2009 id->file_transfers = g_slist_append(id->file_transfers, ift);
2010
1983 ift->xfer = transfer_out_add(gc, ift->sn); 2011 ift->xfer = transfer_out_add(gc, ift->sn);
1984 } 2012 }
1985 2013
1986 2014
1987 static struct irc_file_transfer *find_ift_by_xfer(struct gaim_connection *gc, 2015 static struct irc_file_transfer *find_ift_by_xfer(struct gaim_connection *gc,
2008 2036
2009 ift->cur += len; 2037 ift->cur += len;
2010 pos = htonl(ift->cur); 2038 pos = htonl(ift->cur);
2011 write(ift->fd, (char *)&pos, 4); 2039 write(ift->fd, (char *)&pos, 4);
2012 2040
2013 printf("Cheap-O Progress Bar (%s) %d of %d: %2.0f\%\n", ift->name, ift->cur, ift->len, ((float)ift->cur/(float)ift->len) * 100); 2041 // printf("Cheap-O Progress Bar (%s) %d of %d: %2.0f\%\n", ift->name, ift->cur, ift->len, ((float)ift->cur/(float)ift->len) * 100);
2014 } 2042 }
2015 2043
2016 static void irc_file_transfer_cancel (struct gaim_connection *gc, struct file_transfer *xfer) { 2044 static void irc_file_transfer_cancel (struct gaim_connection *gc, struct file_transfer *xfer) {
2017 struct irc_data *id = (struct irc_data *)gc->proto_data; 2045 struct irc_data *id = (struct irc_data *)gc->proto_data;
2018 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); 2046 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer);
2052 g_free(ift->name); 2080 g_free(ift->name);
2053 2081
2054 g_free(ift); 2082 g_free(ift);
2055 } 2083 }
2056 2084
2085 static void irc_file_transfer_out (struct gaim_connection *gc, struct file_transfer *xfer, const char *name, int totfiles, int totsize) {
2086 struct irc_data *id = (struct irc_data *)gc->proto_data;
2087 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer);
2088 struct sockaddr_in addr;
2089 char buf[IRC_BUF_LEN];
2090 int len;
2091
2092
2093 ift->fd = socket (AF_INET, SOCK_STREAM, 0);
2094 addr.sin_family = AF_INET;
2095 addr.sin_port = 0;
2096 addr.sin_addr.s_addr = INADDR_ANY;
2097 bind (ift->fd, (struct sockaddr *) &addr, sizeof(addr));
2098 listen(ift->fd, 1);
2099
2100 len = sizeof(addr);
2101 getsockname (ift->fd, (struct sockaddr *) &addr, &len);
2102
2103 ift->port = ntohs(addr.sin_port);
2104
2105 ift->watcher = gaim_input_add (ift->fd, GAIM_INPUT_READ, dcc_send_callback, ift);
2106
2107 snprintf(buf, sizeof(buf), "\001DCC SEND %s %s %d %d\001\n", name, ift->ip, ift->port, totsize);
2108 printf("Trying: %s\n", buf);
2109 irc_send_im (gc, ift->sn, buf, -1, 0);
2110 }
2111
2057 static void irc_file_transfer_in(struct gaim_connection *gc, 2112 static void irc_file_transfer_in(struct gaim_connection *gc,
2058 struct file_transfer *xfer, int offset) { 2113 struct file_transfer *xfer, int offset) {
2059 2114
2060 struct irc_data *id = (struct irc_data *)gc->proto_data; 2115 struct irc_data *id = (struct irc_data *)gc->proto_data;
2061 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer); 2116 struct irc_file_transfer *ift = find_ift_by_xfer(gc, xfer);
2062 struct sockaddr_in addr; 2117 struct sockaddr_in addr;
2063 char *ip = (char *)malloc(32); 2118 char *ip = (char *)malloc(32);
2064 2119
2065 ift->xfer = xfer; 2120 ift->xfer = xfer;
2066 printf("You, I should be getting a file or some shit, hehe\n");
2067 printf("Connecting to: %s %d\n", ift->ip, ift->port);
2068 proxy_connect(ift->ip, ift->port, dcc_recv_callback, ift); 2121 proxy_connect(ift->ip, ift->port, dcc_recv_callback, ift);
2069 } 2122 }
2070 2123
2071 static void irc_start_chat(struct gaim_connection *gc, char *who) { 2124 static void irc_start_chat(struct gaim_connection *gc, char *who) {
2072 struct dcc_chat *chat; 2125 struct dcc_chat *chat;
2129 pbm->label = _("DCC Chat"); 2182 pbm->label = _("DCC Chat");
2130 pbm->callback = irc_start_chat; 2183 pbm->callback = irc_start_chat;
2131 pbm->gc = gc; 2184 pbm->gc = gc;
2132 m = g_list_append(m, pbm); 2185 m = g_list_append(m, pbm);
2133 2186
2134 /*
2135 pbm = g_new0(struct proto_buddy_menu, 1); 2187 pbm = g_new0(struct proto_buddy_menu, 1);
2136 pbm->label = _("DCC Send"); 2188 pbm->label = _("DCC Send");
2137 pbm->callback = irc_ask_send_file; 2189 pbm->callback = irc_ask_send_file;
2138 pbm->gc = gc; 2190 pbm->gc = gc;
2139 m = g_list_append(m, pbm); 2191 m = g_list_append(m, pbm);
2140 */
2141 2192
2142 return m; 2193 return m;
2143 } 2194 }
2144 2195
2145 static struct prpl *my_protocol = NULL; 2196 static struct prpl *my_protocol = NULL;
2164 ret->set_away = irc_set_away; 2215 ret->set_away = irc_set_away;
2165 ret->get_info = irc_get_info; 2216 ret->get_info = irc_get_info;
2166 ret->buddy_menu = irc_buddy_menu; 2217 ret->buddy_menu = irc_buddy_menu;
2167 ret->chat_invite = irc_chat_invite; 2218 ret->chat_invite = irc_chat_invite;
2168 ret->convo_closed = irc_convo_closed; 2219 ret->convo_closed = irc_convo_closed;
2169 ret->file_transfer_out = NULL; /* Implement me */ 2220 ret->file_transfer_out = irc_file_transfer_out;
2170 ret->file_transfer_in = irc_file_transfer_in; 2221 ret->file_transfer_in = irc_file_transfer_in;
2171 ret->file_transfer_data_chunk = irc_file_transfer_data_chunk; 2222 ret->file_transfer_data_chunk = irc_file_transfer_data_chunk;
2172 ret->file_transfer_done = irc_file_transfer_done; 2223 ret->file_transfer_done = irc_file_transfer_done;
2173 ret->file_transfer_cancel =irc_file_transfer_cancel; 2224 ret->file_transfer_cancel =irc_file_transfer_cancel;
2174 2225