rdpRdp* rdp_new(freerdp* instance) { rdpRdp* rdp; rdp = (rdpRdp*) xzalloc(sizeof(rdpRdp)); if (rdp != NULL) { rdp->instance = instance; rdp->settings = settings_new((void*) instance); if (instance != NULL) instance->settings = rdp->settings; rdp->extension = extension_new(instance); rdp->transport = transport_new(rdp->settings); rdp->license = license_new(rdp); rdp->input = input_new(rdp); rdp->update = update_new(rdp); rdp->fastpath = fastpath_new(rdp); rdp->nego = nego_new(rdp->transport); rdp->mcs = mcs_new(rdp->transport); rdp->redirection = redirection_new(); rdp->mppc = mppc_new(rdp); } return rdp; }
rdpRdp* rdp_new(rdpContext* context) { rdpRdp* rdp; DWORD flags; rdp = (rdpRdp*) malloc(sizeof(rdpRdp)); if (rdp) { ZeroMemory(rdp, sizeof(rdpRdp)); rdp->context = context; rdp->instance = context->instance; flags = 0; if (context->ServerMode) flags |= FREERDP_SETTINGS_SERVER_MODE; if (!context->settings) context->settings = freerdp_settings_new(flags); rdp->settings = context->settings; rdp->settings->instance = context->instance; if (context->instance) context->instance->settings = rdp->settings; rdp->extension = extension_new(context->instance); rdp->transport = transport_new(rdp->settings); rdp->transport->rdp = rdp; rdp->license = license_new(rdp); rdp->input = input_new(rdp); rdp->update = update_new(rdp); rdp->fastpath = fastpath_new(rdp); rdp->nego = nego_new(rdp->transport); rdp->mcs = mcs_new(rdp->transport); rdp->redirection = redirection_new(); rdp->autodetect = autodetect_new(); rdp->heartbeat = heartbeat_new(); rdp->multitransport = multitransport_new(); rdp->bulk = bulk_new(context); } return rdp; }
boolean freerdp_connect(freerdp* instance) { rdpRdp* rdp; boolean status = false; rdp = instance->context->rdp; IFCALLRET(instance->PreConnect, status, instance); if (status != true) { printf("freerdp_pre_connect failed\n"); return false; } rdp->extension = extension_new(instance); extension_pre_connect(rdp->extension); status = rdp_client_connect(rdp); if (status) { if (instance->settings->dump_rfx) { instance->update->pcap_rfx = pcap_open(instance->settings->dump_rfx_file, true); if (instance->update->pcap_rfx) instance->update->dump_rfx = true; } extension_post_connect(rdp->extension); IFCALLRET(instance->PostConnect, status, instance); if (status != true) { printf("freerdp_post_connect failed\n"); return false; } if (instance->settings->play_rfx) { STREAM* s; rdpUpdate* update; pcap_record record; s = stream_new(1024); instance->update->pcap_rfx = pcap_open(instance->settings->play_rfx_file, false); if (instance->update->pcap_rfx) instance->update->play_rfx = true; update = instance->update; while (instance->update->play_rfx && pcap_has_next_record(update->pcap_rfx)) { pcap_get_next_record_header(update->pcap_rfx, &record); s->data = xrealloc(s->data, record.length); record.data = s->data; s->size = record.length; pcap_get_next_record_content(update->pcap_rfx, &record); stream_set_pos(s, 0); update->BeginPaint(update->context); update_recv_surfcmds(update, s->size, s); update->EndPaint(update->context); } xfree(s->data); return true; } } return status; }