Exemplo n.º 1
0
static void
got_connection (SoupConnection *conn, guint status, gpointer session)
{
	SoupAddress *tunnel_addr;

	if (status != SOUP_STATUS_OK) {
		/* There may have been messages waiting for the
		 * connection count to go down, so queue a run_queue.
		 */
		do_idle_run_queue (session);

		soup_session_connection_failed (session, conn, status);
		/* session may be destroyed at this point */

		return;
	}

	tunnel_addr = soup_connection_get_tunnel_addr (conn);
	if (tunnel_addr) {
		SoupSessionAsyncTunnelData *data;

		data = g_slice_new (SoupSessionAsyncTunnelData);
		data->session = session;
		data->conn = conn;
		data->item = soup_session_make_connect_message (session, tunnel_addr);
		g_signal_emit_by_name (session, "tunneling", conn);
		g_signal_connect (data->item->msg, "finished",
				  G_CALLBACK (tunnel_connected), data);
		g_signal_connect (data->item->msg, "restarted",
				  G_CALLBACK (tunnel_connected), data);
		soup_session_send_queue_item (session, data->item, conn);
		return;
	}

	g_signal_connect (conn, "disconnected",
			  G_CALLBACK (connection_closed), session);

	/* @conn has been marked reserved by SoupSession, but
	 * we don't actually have any specific message in mind
	 * for it. (In particular, the message we were
	 * originally planning to queue on it may have already
	 * been queued on some other connection that became
	 * available while we were waiting for this one to
	 * connect.) So we release the connection into the
	 * idle pool and then just run the queue and see what
	 * happens.
	 */
	soup_connection_set_state (conn, SOUP_CONNECTION_IDLE);
	do_idle_run_queue (session);
}
Exemplo n.º 2
0
static void
got_connection (SoupConnection *conn, guint status, gpointer user_data)
{
	SoupMessageQueueItem *item = user_data;
	SoupSession *session = item->session;
	SoupAddress *tunnel_addr;

	if (item->state != SOUP_MESSAGE_CONNECTING) {
		soup_connection_disconnect (conn);
		do_idle_run_queue (session);
		soup_message_queue_item_unref (item);
		g_object_unref (session);
		return;
	}

	if (status != SOUP_STATUS_OK) {
		soup_session_set_item_status (session, item, status);
		item->state = SOUP_MESSAGE_FINISHING;

		soup_connection_disconnect (conn);
		do_idle_run_queue (session);
		soup_message_queue_item_unref (item);
		g_object_unref (session);
		return;
	}

	tunnel_addr = soup_connection_get_tunnel_addr (conn);
	if (tunnel_addr) {
		SoupMessageQueueItem *tunnel_item;

		item->state = SOUP_MESSAGE_TUNNELING;

		tunnel_item = soup_session_make_connect_message (session, conn);
		tunnel_item->related = item;
		soup_session_send_queue_item (session, tunnel_item, tunnel_message_completed);
		return;
	}

	item->state = SOUP_MESSAGE_READY;
	g_signal_connect (conn, "disconnected",
			  G_CALLBACK (connection_closed), session);
	run_queue ((SoupSessionAsync *)session);
	soup_message_queue_item_unref (item);
	g_object_unref (session);
}