Пример #1
0
void __cdecl CAimProto::aim_dc_helper(void* param) //only called when we are initiating a direct connection with someone else
{
	file_transfer *ft = (file_transfer*)param;	

	sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_CONNECTED, ft, 0);

	NETLIBPACKETRECVER packetRecv = {0};
	packetRecv.cbSize = sizeof(packetRecv);
	packetRecv.dwTimeout = 350000;

	HANDLE hServerPacketRecver = (HANDLE) CallService(MS_NETLIB_CREATEPACKETRECVER, (WPARAM)ft->hConn, 2048 * 4);

	int result;
	if (ft->sending)//we are sending
		result = sending_file(ft, hServerPacketRecver, packetRecv);
	else 
		result = receiving_file(ft, hServerPacketRecver, packetRecv);

	Netlib_CloseHandle(hServerPacketRecver);
	Netlib_CloseHandle(ft->hConn);
	ft->hConn = NULL;

	if (result == 0)
	{
		sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, ft, 0);
	}
	else
	{
		if (!ft->requester && result == 1 && !Miranda_Terminated())
		{
			ft->accepted = false;
			HANDLE hConn = aim_peer_connect(AIM_PROXY_SERVER, get_default_port());
			if (hConn) 
			{
				LOG("Connected to proxy ip because we want to use a proxy for the file transfer.");
				ft->requester = true;
				ft->hConn = hConn;
				ForkThread(&CAimProto::aim_proxy_helper, ft);
				return;
			}
		}
		aim_file_ad(hServerConn, seqno, ft->sn, ft->icbm_cookie, true, 0);
		sendBroadcast(ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0);
	}

	ft_list.remove_by_ft(ft);
}
Пример #2
0
void controller::start_connection(const std::string& hostname) {
    start_connection(hostname, get_default_nick(), get_default_username(),
                     get_default_fullname(), get_default_port());
}
Пример #3
0
void __cdecl CAimProto::accept_file_thread(void* param)//buddy sending file
{
	file_transfer *ft = (file_transfer*)param;

	HANDLE hConn = NULL;
	if (ft->peer_force_proxy)  //peer is forcing proxy
	{
		hConn = aim_peer_connect(ft->proxy_ip, get_default_port());
		if (hConn) {
			debugLogA("Connected to proxy ip that buddy specified.");
			ft->hConn = hConn;
			ForkThread(&CAimProto::aim_proxy_helper, ft);
			ft->stop_listen();
		}
	}
	else if (ft->me_force_proxy) //we are forcing proxy
	{
		hConn = aim_peer_connect(AIM_PROXY_SERVER, get_default_port());
		if (hConn) {
			debugLogA("Connected to proxy ip because we want to use a proxy for the file transfer.");
			ft->requester = true;
			ft->hConn = hConn;
			ForkThread(&CAimProto::aim_proxy_helper, ft);
			ft->stop_listen();
		}
	}
	else {
		bool verif = ft->verified_ip != m_detected_ip;
		hConn = aim_peer_connect(verif ? ft->verified_ip : ft->local_ip, ft->port);
		if (hConn) {
			debugLogA("Connected to buddy over P2P port via %s ip.", verif ? "verified" : "local");
			ft->accepted = true;
			ft->hConn = hConn;
			aim_file_ad(m_hServerConn, m_seqno, ft->sn, ft->icbm_cookie, false, ft->max_ver);
			ForkThread(&CAimProto::aim_dc_helper, ft);
			ft->stop_listen();
		}
		else if (ft->sending) {
			hConn = aim_peer_connect(AIM_PROXY_SERVER, get_default_port());
			if (hConn) {
				ft->hConn = hConn;
				ft->requester = true;
				ForkThread(&CAimProto::aim_proxy_helper, ft);
				ft->stop_listen();
			}
		}
		else {
			debugLogA("Failed to connect to buddy- asking buddy to connect to us.");
			ft->listen(this);
			ft->requester = true;
			aim_send_file(m_hServerConn, m_seqno, m_detected_ip, ft->local_port, false, ft);
			return;
		}
	}

	if (hConn == NULL) {
		if (ft->req_num)
			aim_file_ad(m_hServerConn, m_seqno, ft->sn, ft->icbm_cookie, true, 0);

		ProtoBroadcastAck(ft->hContact, ACKTYPE_FILE, ACKRESULT_FAILED, ft, 0);
		m_ft_list.remove_by_ft(ft);
	}
}