freerdp_peer* freerdp_peer_new(int sockfd) { freerdp_peer* client; rdpPeer* peer; client = xnew(freerdp_peer); client->Initialize = freerdp_peer_initialize; client->GetFileDescriptor = freerdp_peer_get_fds; client->CheckFileDescriptor = freerdp_peer_check_fds; client->Disconnect = freerdp_peer_disconnect; peer = xnew(rdpPeer); peer->client = client; peer->rdp = rdp_new(NULL); client->peer = (void*) peer; client->settings = peer->rdp->settings; client->input = peer->rdp->input; client->update = peer->rdp->update; update_register_server_callbacks(client->update); transport_attach(peer->rdp->transport, sockfd); peer->rdp->transport->recv_callback = peer_recv_callback; peer->rdp->transport->recv_extra = peer; transport_set_blocking_mode(peer->rdp->transport, False); return client; }
void freerdp_peer_context_new(freerdp_peer* client) { rdpRdp* rdp; rdp = rdp_new(NULL); client->input = rdp->input; client->update = rdp->update; client->settings = rdp->settings; client->context = (rdpContext*) malloc(client->context_size); ZeroMemory(client->context, client->context_size); client->context->rdp = rdp; client->context->peer = client; client->update->context = client->context; client->input->context = client->context; update_register_server_callbacks(client->update); transport_attach(rdp->transport, client->sockfd); rdp->transport->ReceiveCallback = peer_recv_callback; rdp->transport->ReceiveExtra = client; transport_set_blocking_mode(rdp->transport, FALSE); IFCALL(client->ContextNew, client, client->context); }
PJ_DEF(pj_status_t) pjsip_udp_transport_attach( pjsip_endpoint *endpt, pj_sock_t sock, const pjsip_host_port *a_name, unsigned async_cnt, pjsip_transport **p_transport) { return transport_attach(endpt, PJSIP_TRANSPORT_UDP, sock, a_name, async_cnt, p_transport); }
PJ_DEF(pj_status_t) pjsip_udp_transport_attach2( pjsip_endpoint *endpt, pjsip_transport_type_e type, pj_sock_t sock, const pjsip_host_port *a_name, unsigned async_cnt, pjsip_transport **p_transport) { return transport_attach(endpt, type, sock, a_name, async_cnt, p_transport); }
void freerdp_peer_context_new(freerdp_peer* client) { rdpRdp* rdp; client->context = (rdpContext*) calloc(1, client->ContextSize); client->context->ServerMode = TRUE; client->context->metrics = metrics_new(client->context); rdp = rdp_new(client->context); client->input = rdp->input; client->update = rdp->update; client->settings = rdp->settings; client->autodetect = rdp->autodetect; client->context->rdp = rdp; client->context->peer = client; client->context->input = client->input; client->context->update = client->update; client->context->settings = client->settings; client->context->autodetect = client->autodetect; client->update->context = client->context; client->input->context = client->context; client->autodetect->context = client->context; update_register_server_callbacks(client->update); autodetect_register_server_callbacks(client->autodetect); transport_attach(rdp->transport, client->sockfd); rdp->transport->ReceiveCallback = peer_recv_callback; rdp->transport->ReceiveExtra = client; transport_set_blocking_mode(rdp->transport, FALSE); client->IsWriteBlocked = freerdp_peer_is_write_blocked; client->DrainOutputBuffer = freerdp_peer_drain_output_buffer; IFCALL(client->ContextNew, client, client->context); }
BOOL freerdp_peer_context_new(freerdp_peer* client) { rdpRdp* rdp; rdpContext* context; BOOL ret = TRUE; if (!client) return FALSE; if (!(context = (rdpContext*) calloc(1, client->ContextSize))) goto fail_context; client->context = context; context->peer = client; context->ServerMode = TRUE; context->settings = client->settings; if (!(context->metrics = metrics_new(context))) goto fail_metrics; if (!(rdp = rdp_new(context))) goto fail_rdp; client->input = rdp->input; client->update = rdp->update; client->settings = rdp->settings; client->autodetect = rdp->autodetect; context->rdp = rdp; context->input = client->input; context->update = client->update; context->settings = client->settings; context->autodetect = client->autodetect; client->update->context = context; client->input->context = context; client->autodetect->context = context; update_register_server_callbacks(client->update); autodetect_register_server_callbacks(client->autodetect); if (!(context->errorDescription = calloc(1, 500))) { WLog_ERR(TAG, "calloc failed!"); goto fail_error_description; } if (!transport_attach(rdp->transport, client->sockfd)) goto fail_transport_attach; rdp->transport->ReceiveCallback = peer_recv_callback; rdp->transport->ReceiveExtra = client; transport_set_blocking_mode(rdp->transport, FALSE); client->IsWriteBlocked = freerdp_peer_is_write_blocked; client->DrainOutputBuffer = freerdp_peer_drain_output_buffer; client->HasMoreToRead = freerdp_peer_has_more_to_read; IFCALLRET(client->ContextNew, ret, client, client->context); if (ret) return TRUE; WLog_ERR(TAG, "ContextNew callback failed"); fail_transport_attach: free(context->errorDescription); fail_error_description: rdp_free(client->context->rdp); fail_rdp: metrics_free(context->metrics); fail_metrics: free(client->context); fail_context: client->context = NULL; WLog_ERR(TAG, "Failed to create new peer context"); return FALSE; }
BOOL transport_connect(rdpTransport* transport, const char* hostname, UINT16 port, int timeout) { int sockfd; BOOL status = FALSE; rdpSettings* settings = transport->settings; rdpContext* context = transport->context; transport->async = settings->AsyncTransport; if (transport->GatewayEnabled) { if (!status && settings->GatewayHttpTransport) { transport->rdg = rdg_new(transport); if (!transport->rdg) return FALSE; status = rdg_connect(transport->rdg, hostname, port, timeout); if (status) { transport->frontBio = transport->rdg->frontBio; BIO_set_nonblock(transport->frontBio, 0); transport->layer = TRANSPORT_LAYER_TSG; status = TRUE; } else { rdg_free(transport->rdg); transport->rdg = NULL; } } if (!status && settings->GatewayRpcTransport) { transport->tsg = tsg_new(transport); if (!transport->tsg) return FALSE; status = tsg_connect(transport->tsg, hostname, port, timeout); if (status) { transport->frontBio = transport->tsg->bio; transport->layer = TRANSPORT_LAYER_TSG; status = TRUE; } else { tsg_free(transport->tsg); transport->tsg = NULL; } } } else { sockfd = freerdp_tcp_connect(context, settings, hostname, port, timeout); if (sockfd < 1) return FALSE; if (!transport_attach(transport, sockfd)) return FALSE; status = TRUE; } if (status) { if (transport->async) { if (!(transport->stopEvent = CreateEvent(NULL, TRUE, FALSE, NULL))) { WLog_ERR(TAG, "Failed to create transport stop event"); return FALSE; } if (!(transport->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) transport_client_thread, transport, 0, NULL))) { WLog_ERR(TAG, "Failed to create transport client thread"); CloseHandle(transport->stopEvent); transport->stopEvent = NULL; return FALSE; } } } return status; }
BOOL transport_connect(rdpTransport* transport, const char* hostname, UINT16 port, int timeout) { int sockfd; BOOL status = FALSE; rdpSettings* settings = transport->settings; rdpContext* context = transport->context; BOOL rpcFallback = !settings->GatewayHttpTransport; if (transport->GatewayEnabled) { if (!status && settings->GatewayHttpTransport) { transport->rdg = rdg_new(transport); if (!transport->rdg) return FALSE; status = rdg_connect(transport->rdg, timeout, &rpcFallback); if (status) { transport->frontBio = transport->rdg->frontBio; BIO_set_nonblock(transport->frontBio, 0); transport->layer = TRANSPORT_LAYER_TSG; status = TRUE; } else { rdg_free(transport->rdg); transport->rdg = NULL; } } if (!status && settings->GatewayRpcTransport && rpcFallback) { transport->tsg = tsg_new(transport); if (!transport->tsg) return FALSE; status = tsg_connect(transport->tsg, hostname, port, timeout); if (status) { transport->frontBio = tsg_get_bio(transport->tsg); transport->layer = TRANSPORT_LAYER_TSG; status = TRUE; } else { tsg_free(transport->tsg); transport->tsg = NULL; } } } else { UINT16 peerPort; const char* proxyHostname, *proxyUsername, *proxyPassword; BOOL isProxyConnection = proxy_prepare(settings, &proxyHostname, &peerPort, &proxyUsername, &proxyPassword); if (isProxyConnection) sockfd = freerdp_tcp_connect(context, settings, proxyHostname, peerPort, timeout); else sockfd = freerdp_tcp_connect(context, settings, hostname, port, timeout); if (sockfd < 0) return FALSE; if (!transport_attach(transport, sockfd)) return FALSE; if (isProxyConnection) { if (!proxy_connect(settings, transport->frontBio, proxyUsername, proxyPassword, hostname, port)) return FALSE; } status = TRUE; } return status; }