static void* ggp_tcpsocket_connect(void *_gc, const char *host, int port, int is_tls, int is_async, void *priv) { PurpleConnection *gc = _gc; PurpleSocket *ps; PURPLE_ASSERT_CONNECTION_IS_VALID(gc); g_return_val_if_fail(!purple_connection_is_disconnecting(gc), NULL); g_return_val_if_fail(host != NULL, NULL); g_return_val_if_fail(is_async, NULL); purple_debug_misc("gg", "ggp_tcpsocket_connect(%p, %s:%d, %s, %p)", gc, host, port, is_tls ? "tls" : "tcp", priv); ps = purple_socket_new(gc); purple_socket_set_tls(ps, is_tls); purple_socket_set_host(ps, host); purple_socket_set_port(ps, port); if (!purple_socket_connect(ps, ggp_tcpsocket_connected, priv)) { purple_socket_destroy(ps); return NULL; } return ps; }
gboolean purple_socket_connect(PurpleSocket *ps, PurpleSocketConnectCb cb, gpointer user_data) { PurpleAccount *account = NULL; g_return_val_if_fail(ps != NULL, FALSE); if (ps->gc && purple_connection_is_disconnecting(ps->gc)) { purple_debug_error("socket", "connection is being destroyed"); ps->state = PURPLE_SOCKET_STATE_ERROR; return FALSE; } if (!purple_socket_check_state(ps, PURPLE_SOCKET_STATE_DISCONNECTED)) return FALSE; ps->state = PURPLE_SOCKET_STATE_CONNECTING; if (ps->host == NULL || ps->port < 0) { purple_debug_error("socket", "Host or port is not specified"); ps->state = PURPLE_SOCKET_STATE_ERROR; return FALSE; } if (ps->gc != NULL) account = purple_connection_get_account(ps->gc); ps->cb = cb; ps->cb_data = user_data; if (ps->is_tls) { ps->tls_connection = purple_ssl_connect(account, ps->host, ps->port, _purple_socket_connected_tls, _purple_socket_connected_tls_error, ps); } else { ps->raw_connection = purple_proxy_connect(ps->gc, account, ps->host, ps->port, _purple_socket_connected_raw, ps); } if (ps->tls_connection == NULL && ps->raw_connection == NULL) { ps->state = PURPLE_SOCKET_STATE_ERROR; return FALSE; } return TRUE; }