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); }
void controller::start_connection(const std::string& hostname) { start_connection(hostname, get_default_nick(), get_default_username(), get_default_fullname(), get_default_port()); }
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); } }