Mercurial > pidgin
diff libpurple/protocols/oscar/flap_connection.c @ 27590:a08e84032814
merge of '2348ff22f0ff3453774b8b25b36238465580c609'
and 'e76f11543c2a4aa05bdf584f087cbe3439029661'
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Sun, 12 Jul 2009 05:43:38 +0000 |
parents | 74e487f82f39 |
children | bff61dad9a6b |
line wrap: on
line diff
--- a/libpurple/protocols/oscar/flap_connection.c Sun Jul 12 05:42:40 2009 +0000 +++ b/libpurple/protocols/oscar/flap_connection.c Sun Jul 12 05:43:38 2009 +0000 @@ -46,7 +46,7 @@ FlapFrame *frame; frame = flap_frame_new(od, 0x01, 4); - byte_stream_put32(&frame->data, 0x00000001); + byte_stream_put32(&frame->data, 0x00000001); /* FLAP Version */ flap_connection_send(conn, frame); } @@ -64,7 +64,7 @@ GSList *tlvlist = NULL; frame = flap_frame_new(od, 0x01, 4 + 2 + 2 + length); - byte_stream_put32(&frame->data, 0x00000001); + byte_stream_put32(&frame->data, 0x00000001); /* FLAP Version */ aim_tlvlist_add_raw(&tlvlist, 0x0006, length, chipsahoy); aim_tlvlist_write(&frame->data, &tlvlist); aim_tlvlist_free(tlvlist); @@ -72,6 +72,37 @@ flap_connection_send(conn, frame); } +void +flap_connection_send_version_with_cookie_and_clientinfo(OscarData *od, FlapConnection *conn, guint16 length, const guint8 *chipsahoy, ClientInfo *ci) +{ + FlapFrame *frame; + GSList *tlvlist = NULL; + + frame = flap_frame_new(od, 0x01, 1152 + length); + + byte_stream_put32(&frame->data, 0x00000001); /* FLAP Version */ + aim_tlvlist_add_raw(&tlvlist, 0x0006, length, chipsahoy); + + if (ci->clientstring != NULL) + aim_tlvlist_add_str(&tlvlist, 0x0003, ci->clientstring); + else { + gchar *clientstring = oscar_get_clientstring(); + aim_tlvlist_add_str(&tlvlist, 0x0003, clientstring); + g_free(clientstring); + } + aim_tlvlist_add_16(&tlvlist, 0x0017, (guint16)ci->major); + aim_tlvlist_add_16(&tlvlist, 0x0018, (guint16)ci->minor); + aim_tlvlist_add_16(&tlvlist, 0x0019, (guint16)ci->point); + aim_tlvlist_add_16(&tlvlist, 0x001a, (guint16)ci->build); + aim_tlvlist_add_8(&tlvlist, 0x004a, 0x01); + + aim_tlvlist_write(&frame->data, &tlvlist); + + aim_tlvlist_free(tlvlist); + + flap_connection_send(conn, frame); +} + static struct rateclass * flap_connection_get_rateclass(FlapConnection *conn, guint16 family, guint16 subtype) { @@ -355,23 +386,9 @@ } } - if (conn->fd >= 0) - { - if (conn->type == SNAC_FAMILY_LOCATE) - flap_connection_send_close(od, conn); - - close(conn->fd); - conn->fd = -1; - } - - if (conn->gsc != NULL) - { - if (conn->type == SNAC_FAMILY_LOCATE) - flap_connection_send_close(od, conn); - - purple_ssl_close(conn->gsc); - conn->gsc = NULL; - } + if ((conn->fd >= 0 || conn->gsc != NULL) + && conn->type == SNAC_FAMILY_LOCATE) + flap_connection_send_close(od, conn); if (conn->watcher_incoming != 0) { @@ -385,6 +402,18 @@ conn->watcher_outgoing = 0; } + if (conn->fd >= 0) + { + close(conn->fd); + conn->fd = -1; + } + + if (conn->gsc != NULL) + { + purple_ssl_close(conn->gsc); + conn->gsc = NULL; + } + g_free(conn->buffer_incoming.data.data); conn->buffer_incoming.data.data = NULL; @@ -445,18 +474,18 @@ if (conn->disconnect_code == 0x0001) { reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE; - tmp = g_strdup(_("You have signed on from another location.")); + tmp = g_strdup(_("You have signed on from another location")); if (!purple_account_get_remember_password(account)) purple_account_set_password(account, NULL); } else if (conn->disconnect_reason == OSCAR_DISCONNECT_REMOTE_CLOSED) - tmp = g_strdup(_("Server closed the connection.")); + tmp = g_strdup(_("Server closed the connection")); else if (conn->disconnect_reason == OSCAR_DISCONNECT_LOST_CONNECTION) - tmp = g_strdup_printf(_("Lost connection with server:\n%s"), + tmp = g_strdup_printf(_("Lost connection with server: %s"), conn->error_message); else if (conn->disconnect_reason == OSCAR_DISCONNECT_INVALID_DATA) - tmp = g_strdup(_("Received invalid data on connection with server.")); + tmp = g_strdup(_("Received invalid data on connection with server")); else if (conn->disconnect_reason == OSCAR_DISCONNECT_COULD_NOT_CONNECT) - tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"), + tmp = g_strdup_printf(_("Unable to connect: %s"), conn->error_message); else /* @@ -1029,7 +1058,7 @@ ret = send(conn->fd, conn->buffer_outgoing->outptr, writelen, 0); if (ret <= 0) { - if (ret < 0 && ((errno == EAGAIN) || (errno == EWOULDBLOCK))) + if (ret < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) /* No worries */ return;