summaryrefslogtreecommitdiff
path: root/libpurple/protocols/bonjour/bonjour_ft.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpurple/protocols/bonjour/bonjour_ft.c')
-rw-r--r--libpurple/protocols/bonjour/bonjour_ft.c136
1 files changed, 63 insertions, 73 deletions
diff --git a/libpurple/protocols/bonjour/bonjour_ft.c b/libpurple/protocols/bonjour/bonjour_ft.c
index c551e533ef..4d08badd0e 100644
--- a/libpurple/protocols/bonjour/bonjour_ft.c
+++ b/libpurple/protocols/bonjour/bonjour_ft.c
@@ -38,7 +38,7 @@ static void
bonjour_xfer_init(PurpleXfer *xfer);
static void
bonjour_xfer_receive(PurpleConnection *pc, const char *id, const char *sid, const char *from,
- const int filesize, const char *filename, int option);
+ const goffset filesize, const char *filename, int option);
static void bonjour_free_xfer(PurpleXfer *xfer);
/* Look for specific xfer handle */
@@ -90,12 +90,12 @@ static void bonjour_xfer_cancel_send(PurpleXfer *xfer)
static void bonjour_xfer_request_denied(PurpleXfer *xfer)
{
- XepXfer *xf = xfer->data;
+ XepXfer *xf = purple_xfer_get_protocol_data(xfer);
purple_debug_info("bonjour", "Bonjour-xfer-request-denied.\n");
if(xf)
- xep_ft_si_reject(xf->data, xf->sid, xfer->who, "403", "cancel");
+ xep_ft_si_reject(xf->data, xf->sid, purple_xfer_get_remote_user(xfer), "403", "cancel");
bonjour_free_xfer(xfer);
}
@@ -136,8 +136,8 @@ static void bonjour_xfer_end(PurpleXfer *xfer)
* otherwise there is a RST resulting in an error on the client side */
if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && purple_xfer_is_completed(xfer)) {
struct socket_cleanup *sc = g_new0(struct socket_cleanup, 1);
- sc->fd = xfer->fd;
- xfer->fd = -1;
+ sc->fd = purple_xfer_get_fd(xfer);
+ purple_xfer_set_fd(xfer, -1);
sc->handle = purple_input_add(sc->fd, PURPLE_INPUT_READ,
_wait_for_socket_close, sc);
}
@@ -162,11 +162,11 @@ bonjour_si_xfer_find(BonjourData *bd, const char *sid, const char *from)
xfer = xfers->data;
if(xfer == NULL)
break;
- xf = xfer->data;
+ xf = purple_xfer_get_protocol_data(xfer);
if(xf == NULL)
break;
- if(xf->sid && xfer->who && !strcmp(xf->sid, sid) &&
- !strcmp(xfer->who, from))
+ if(xf->sid && purple_xfer_get_remote_user(xfer) && !strcmp(xf->sid, sid) &&
+ !strcmp(purple_xfer_get_remote_user(xfer), from))
return xfer;
}
@@ -180,7 +180,7 @@ xep_ft_si_offer(PurpleXfer *xfer, const gchar *to)
{
xmlnode *si_node, *feature, *field, *file, *x;
XepIq *iq;
- XepXfer *xf = xfer->data;
+ XepXfer *xf = purple_xfer_get_protocol_data(xfer);
BonjourData *bd = NULL;
char buf[32];
@@ -210,8 +210,8 @@ xep_ft_si_offer(PurpleXfer *xfer, const gchar *to)
file = xmlnode_new_child(si_node, "file");
xmlnode_set_namespace(file, "http://jabber.org/protocol/si/profile/file-transfer");
- xmlnode_set_attrib(file, "name", xfer->filename);
- g_snprintf(buf, sizeof(buf), "%" G_GSIZE_FORMAT, xfer->size);
+ xmlnode_set_attrib(file, "name", purple_xfer_get_filename(xfer));
+ g_snprintf(buf, sizeof(buf), "%" G_GOFFSET_FORMAT, purple_xfer_get_size(xfer));
xmlnode_set_attrib(file, "size", buf);
feature = xmlnode_new_child(si_node, "feature");
@@ -240,7 +240,7 @@ xep_ft_si_offer(PurpleXfer *xfer, const gchar *to)
}
static void
-xep_ft_si_result(PurpleXfer *xfer, char *to)
+xep_ft_si_result(PurpleXfer *xfer, const char *to)
{
xmlnode *si_node, *feature, *field, *value, *x;
XepIq *iq;
@@ -249,7 +249,7 @@ xep_ft_si_result(PurpleXfer *xfer, char *to)
if(!to || !xfer)
return;
- xf = xfer->data;
+ xf = purple_xfer_get_protocol_data(xfer);
if(!xf)
return;
@@ -290,14 +290,14 @@ bonjour_free_xfer(PurpleXfer *xfer)
return;
}
- purple_debug_info("bonjour", "bonjour-free-xfer-%p.\n", xfer);
+ purple_debug_misc("bonjour", "bonjour-free-xfer-%p.\n", xfer);
- xf = (XepXfer*)xfer->data;
+ xf = purple_xfer_get_protocol_data(xfer);
if(xf != NULL) {
BonjourData *bd = (BonjourData*)xf->data;
if(bd != NULL) {
bd->xfer_lists = g_slist_remove(bd->xfer_lists, xfer);
- purple_debug_info("bonjour", "B free xfer from lists(%p).\n", bd->xfer_lists);
+ purple_debug_misc("bonjour", "B free xfer from lists(%p).\n", bd->xfer_lists);
}
if (xf->proxy_connection != NULL)
purple_proxy_connect_cancel(xf->proxy_connection);
@@ -311,10 +311,10 @@ bonjour_free_xfer(PurpleXfer *xfer)
g_free(xf->buddy_ip);
g_free(xf->sid);
g_free(xf);
- xfer->data = NULL;
+ purple_xfer_set_protocol_data(xfer, NULL);
}
- purple_debug_info("bonjour", "Need close socket=%d.\n", xfer->fd);
+ purple_debug_misc("bonjour", "Need close socket.\n");
}
PurpleXfer *
@@ -328,13 +328,14 @@ bonjour_new_xfer(PurpleConnection *gc, const char *who)
return NULL;
purple_debug_info("bonjour", "Bonjour-new-xfer to %s.\n", who);
- bd = (BonjourData*) gc->proto_data;
+ bd = purple_connection_get_protocol_data(gc);
if(bd == NULL)
return NULL;
/* Build the file transfer handle */
- xfer = purple_xfer_new(gc->account, PURPLE_XFER_SEND, who);
- xfer->data = xep_xfer = g_new0(XepXfer, 1);
+ xfer = purple_xfer_new(purple_connection_get_account(gc), PURPLE_XFER_SEND, who);
+ xep_xfer = g_new0(XepXfer, 1);
+ purple_xfer_set_protocol_data(xfer, xep_xfer);
xep_xfer->data = bd;
purple_debug_info("bonjour", "Bonjour-new-xfer bd=%p data=%p.\n", bd, xep_xfer->data);
@@ -379,13 +380,13 @@ bonjour_xfer_init(PurpleXfer *xfer)
BonjourBuddy *bb;
XepXfer *xf;
- xf = (XepXfer*)xfer->data;
+ xf = purple_xfer_get_protocol_data(xfer);
if(xf == NULL)
return;
purple_debug_info("bonjour", "Bonjour-xfer-init.\n");
- buddy = purple_find_buddy(xfer->account, xfer->who);
+ buddy = purple_find_buddy(purple_xfer_get_account(xfer), purple_xfer_get_remote_user(xfer));
/* this buddy is offline. */
if (buddy == NULL || (bb = purple_buddy_get_protocol_data(buddy)) == NULL)
return;
@@ -396,10 +397,10 @@ bonjour_xfer_init(PurpleXfer *xfer)
if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) {
/* initiate file transfer, send SI offer. */
purple_debug_info("bonjour", "Bonjour xfer type is PURPLE_XFER_SEND.\n");
- xep_ft_si_offer(xfer, xfer->who);
+ xep_ft_si_offer(xfer, purple_xfer_get_remote_user(xfer));
} else {
/* accept file transfer request, send SI result. */
- xep_ft_si_result(xfer, xfer->who);
+ xep_ft_si_result(xfer, purple_xfer_get_remote_user(xfer));
purple_debug_info("bonjour", "Bonjour xfer type is PURPLE_XFER_RECEIVE.\n");
}
}
@@ -416,7 +417,7 @@ xep_si_parse(PurpleConnection *pc, xmlnode *packet, PurpleBuddy *pb)
g_return_if_fail(packet != NULL);
g_return_if_fail(pb != NULL);
- bd = (BonjourData*) pc->proto_data;
+ bd = purple_connection_get_protocol_data(pc);
if(bd == NULL)
return;
@@ -553,9 +554,8 @@ __xep_bytestreams_parse(PurpleBuddy *pb, PurpleXfer *xfer, xmlnode *query,
const char *jid, *host, *port;
int portnum;
xmlnode *streamhost;
- XepXfer *xf = NULL;
+ XepXfer *xf = purple_xfer_get_protocol_data(xfer);
- xf = (XepXfer*)xfer->data;
for(streamhost = xmlnode_get_child(query, "streamhost");
streamhost;
streamhost = xmlnode_get_next_twin(streamhost)) {
@@ -598,7 +598,7 @@ xep_bytestreams_parse(PurpleConnection *pc, xmlnode *packet, PurpleBuddy *pb)
g_return_if_fail(packet != NULL);
g_return_if_fail(pb != NULL);
- bd = (BonjourData*) pc->proto_data;
+ bd = purple_connection_get_protocol_data(pc);
if(bd == NULL)
return;
@@ -632,7 +632,7 @@ xep_bytestreams_parse(PurpleConnection *pc, xmlnode *packet, PurpleBuddy *pb)
static void
bonjour_xfer_receive(PurpleConnection *pc, const char *id, const char *sid, const char *from,
- const int filesize, const char *filename, int option)
+ const goffset filesize, const char *filename, int option)
{
PurpleXfer *xfer;
XepXfer *xf;
@@ -641,15 +641,16 @@ bonjour_xfer_receive(PurpleConnection *pc, const char *id, const char *sid, cons
if(pc == NULL || id == NULL || from == NULL)
return;
- bd = (BonjourData*) pc->proto_data;
+ bd = purple_connection_get_protocol_data(pc);
if(bd == NULL)
return;
purple_debug_info("bonjour", "bonjour-xfer-receive.\n");
/* Build the file transfer handle */
- xfer = purple_xfer_new(pc->account, PURPLE_XFER_RECEIVE, from);
- xfer->data = xf = g_new0(XepXfer, 1);
+ xfer = purple_xfer_new(purple_connection_get_account(pc), PURPLE_XFER_RECEIVE, from);
+ xf = g_new0(XepXfer, 1);
+ purple_xfer_set_protocol_data(xfer, xf);
xf->data = bd;
purple_xfer_set_filename(xfer, filename);
xf->iq_id = g_strdup(id);
@@ -671,7 +672,7 @@ static void
bonjour_sock5_request_cb(gpointer data, gint source, PurpleInputCondition cond)
{
PurpleXfer *xfer = data;
- XepXfer *xf = xfer->data;
+ XepXfer *xf = purple_xfer_get_protocol_data(xfer);
int acceptfd;
int len = 0;
@@ -689,8 +690,6 @@ bonjour_sock5_request_cb(gpointer data, gint source, PurpleInputCondition cond)
/* This should cancel the ft */
purple_debug_error("bonjour", "Error accepting incoming SOCKS5 connection. (%d)\n", errno);
- purple_input_remove(xfer->watcher);
- xfer->watcher = 0;
close(source);
purple_xfer_cancel_remote(xfer);
return;
@@ -705,29 +704,26 @@ bonjour_sock5_request_cb(gpointer data, gint source, PurpleInputCondition cond)
fcntl(acceptfd, F_SETFD, FD_CLOEXEC);
#endif
- purple_input_remove(xfer->watcher);
+ purple_input_remove(purple_xfer_get_watcher(xfer));
close(source);
- xfer->watcher = purple_input_add(acceptfd, PURPLE_INPUT_READ,
- bonjour_sock5_request_cb, xfer);
+ purple_xfer_set_watcher(xfer, purple_input_add(acceptfd, PURPLE_INPUT_READ,
+ bonjour_sock5_request_cb, xfer));
xf->sock5_req_state++;
xf->rxlen = 0;
}
break;
case 0x01:
- xfer->fd = source;
+ purple_xfer_set_fd(xfer, source);
len = read(source, xf->rx_buf + xf->rxlen, 3);
if(len < 0 && errno == EAGAIN)
return;
else if(len <= 0){
- purple_input_remove(xfer->watcher);
- xfer->watcher = 0;
- close(source);
purple_xfer_cancel_remote(xfer);
return;
} else {
- purple_input_remove(xfer->watcher);
- xfer->watcher = purple_input_add(source, PURPLE_INPUT_WRITE,
- bonjour_sock5_request_cb, xfer);
+ purple_input_remove(purple_xfer_get_watcher(xfer));
+ purple_xfer_set_watcher(xfer, purple_input_add(source, PURPLE_INPUT_WRITE,
+ bonjour_sock5_request_cb, xfer));
xf->sock5_req_state++;
xf->rxlen = 0;
bonjour_sock5_request_cb(xfer, source, PURPLE_INPUT_WRITE);
@@ -740,15 +736,13 @@ bonjour_sock5_request_cb(gpointer data, gint source, PurpleInputCondition cond)
if (len < 0 && errno == EAGAIN)
return;
else if (len < 0) {
- purple_input_remove(xfer->watcher);
- xfer->watcher = 0;
close(source);
purple_xfer_cancel_remote(xfer);
return;
} else {
- purple_input_remove(xfer->watcher);
- xfer->watcher = purple_input_add(source, PURPLE_INPUT_READ,
- bonjour_sock5_request_cb, xfer);
+ purple_input_remove(purple_xfer_get_watcher(xfer));
+ purple_xfer_set_watcher(xfer, purple_input_add(source, PURPLE_INPUT_READ,
+ bonjour_sock5_request_cb, xfer));
xf->sock5_req_state++;
xf->rxlen = 0;
}
@@ -757,9 +751,9 @@ bonjour_sock5_request_cb(gpointer data, gint source, PurpleInputCondition cond)
len = read(source, xf->rx_buf + xf->rxlen, 20);
if(len<=0){
} else {
- purple_input_remove(xfer->watcher);
- xfer->watcher = purple_input_add(source, PURPLE_INPUT_WRITE,
- bonjour_sock5_request_cb, xfer);
+ purple_input_remove(purple_xfer_get_watcher(xfer));
+ purple_xfer_set_watcher(xfer, purple_input_add(source, PURPLE_INPUT_WRITE,
+ bonjour_sock5_request_cb, xfer));
xf->sock5_req_state++;
xf->rxlen = 0;
bonjour_sock5_request_cb(xfer, source, PURPLE_INPUT_WRITE);
@@ -778,14 +772,12 @@ bonjour_sock5_request_cb(gpointer data, gint source, PurpleInputCondition cond)
if (len < 0 && errno == EAGAIN) {
return;
} else if (len < 0) {
- purple_input_remove(xfer->watcher);
- xfer->watcher = 0;
close(source);
purple_xfer_cancel_remote(xfer);
return;
} else {
- purple_input_remove(xfer->watcher);
- xfer->watcher = 0;
+ purple_input_remove(purple_xfer_get_watcher(xfer));
+ purple_xfer_set_watcher(xfer, 0);
xf->rxlen = 0;
/*close(source);*/
purple_xfer_start(xfer, source, NULL, -1);
@@ -814,25 +806,25 @@ bonjour_bytestreams_listen(int sock, gpointer data)
return;
}
- xfer->watcher = purple_input_add(sock, PURPLE_INPUT_READ,
- bonjour_sock5_request_cb, xfer);
- xf = (XepXfer*)xfer->data;
+ purple_xfer_set_watcher(xfer, purple_input_add(sock, PURPLE_INPUT_READ,
+ bonjour_sock5_request_cb, xfer));
+ xf = purple_xfer_get_protocol_data(xfer);
xf->listen_data = NULL;
bd = xf->data;
- iq = xep_iq_new(bd, XEP_IQ_SET, xfer->who, bonjour_get_jid(bd->jabber_data->account), xf->sid);
+ iq = xep_iq_new(bd, XEP_IQ_SET, purple_xfer_get_remote_user(xfer), bonjour_get_jid(bd->jabber_data->account), xf->sid);
query = xmlnode_new_child(iq->node, "query");
xmlnode_set_namespace(query, "http://jabber.org/protocol/bytestreams");
xmlnode_set_attrib(query, "sid", xf->sid);
xmlnode_set_attrib(query, "mode", "tcp");
- xfer->local_port = purple_network_get_port_from_fd(sock);
+ purple_xfer_set_local_port(xfer, purple_network_get_port_from_fd(sock));
local_ips = bonjour_jabber_get_local_ips(sock);
- port = g_strdup_printf("%hu", xfer->local_port);
+ port = g_strdup_printf("%hu", purple_xfer_get_local_port(xfer));
while(local_ips) {
streamhost = xmlnode_new_child(query, "streamhost");
xmlnode_set_attrib(streamhost, "jid", xf->sid);
@@ -854,12 +846,10 @@ bonjour_bytestreams_init(PurpleXfer *xfer)
return;
purple_debug_info("bonjour", "Bonjour-bytestreams-init.\n");
- xf = xfer->data;
+ xf = purple_xfer_get_protocol_data(xfer);
- purple_network_listen_map_external(FALSE);
- xf->listen_data = purple_network_listen_range(0, 0, SOCK_STREAM,
+ xf->listen_data = purple_network_listen_range(0, 0, AF_UNSPEC, SOCK_STREAM, FALSE,
bonjour_bytestreams_listen, xfer);
- purple_network_listen_map_external(TRUE);
if (xf->listen_data == NULL)
purple_xfer_cancel_local(xfer);
@@ -870,7 +860,7 @@ static void
bonjour_bytestreams_connect_cb(gpointer data, gint source, const gchar *error_message)
{
PurpleXfer *xfer = data;
- XepXfer *xf = xfer->data;
+ XepXfer *xf = purple_xfer_get_protocol_data(xfer);
XepIq *iq;
xmlnode *q_node, *tmp_node;
BonjourData *bd;
@@ -880,7 +870,7 @@ bonjour_bytestreams_connect_cb(gpointer data, gint source, const gchar *error_me
if(source < 0) {
purple_debug_error("bonjour", "Error connecting via SOCKS5 - %s\n",
error_message ? error_message : "(null)");
- xep_ft_si_reject(xf->data, xf->iq_id, xfer->who, "404", "cancel");
+ xep_ft_si_reject(xf->data, xf->iq_id, purple_xfer_get_remote_user(xfer), "404", "cancel");
/* Cancel the connection */
purple_xfer_cancel_local(xfer);
return;
@@ -893,7 +883,7 @@ bonjour_bytestreams_connect_cb(gpointer data, gint source, const gchar *error_me
/* Here, start the file transfer.*/
/* Notify Initiator of Connection */
- iq = xep_iq_new(bd, XEP_IQ_RESULT, xfer->who, bonjour_get_jid(bd->jabber_data->account), xf->iq_id);
+ iq = xep_iq_new(bd, XEP_IQ_RESULT, purple_xfer_get_remote_user(xfer), bonjour_get_jid(bd->jabber_data->account), xf->iq_id);
q_node = xmlnode_new_child(iq->node, "query");
xmlnode_set_namespace(q_node, "http://jabber.org/protocol/bytestreams");
tmp_node = xmlnode_new_child(q_node, "streamhost-used");
@@ -919,7 +909,7 @@ bonjour_bytestreams_connect(PurpleXfer *xfer, PurpleBuddy *pb)
purple_debug_info("bonjour", "bonjour-bytestreams-connect.\n");
- xf = (XepXfer*)xfer->data;
+ xf = purple_xfer_get_protocol_data(xfer);
if(!xf)
return;
@@ -948,7 +938,7 @@ bonjour_bytestreams_connect(PurpleXfer *xfer, PurpleBuddy *pb)
bonjour_bytestreams_connect_cb, xfer);
if(xf->proxy_connection == NULL) {
- xep_ft_si_reject(xf->data, xf->iq_id, xfer->who, "404", "cancel");
+ xep_ft_si_reject(xf->data, xf->iq_id, purple_xfer_get_remote_user(xfer), "404", "cancel");
/* Cancel the connection */
purple_xfer_cancel_local(xfer);
}