--- rdp/rdpview.cpp +++ rdp/rdpview.cpp @@ -146,102 +146,205 @@ bool RdpView::start() } } + // Check the version of FreeRDP so we can use pre-1.1 switches if needed + QProcess *xfreeRDPVersionCheck = new QProcess(this); + xfreeRDPVersionCheck->start("xfreerdp", QStringList("--version")); + xfreeRDPVersionCheck->waitForFinished(); + QString versionOutput = xfreeRDPVersionCheck->readAllStandardOutput(); + xfreeRDPVersionCheck->deleteLater(); + m_process = new QProcess(m_container); QStringList arguments; - int width, height; - if (m_hostPreferences->width() > 0) { - width = m_hostPreferences->width(); - height = m_hostPreferences->height(); - } else { - width = this->parentWidget()->size().width(); - height = this->parentWidget()->size().height(); - } - arguments << "-g" << QString::number(width) + 'x' + QString::number(height); - - arguments << "-k" << keymapToXfreerdp(m_hostPreferences->keyboardLayout()); + if (versionOutput.contains(QLatin1String(" 1.0"))) { + kDebug(5012) << "Use FreeRDP 1.0 compatible arguments"; - if (!m_url.userName().isEmpty()) { - // if username contains a domain, it needs to be set with another parameter - if (m_url.userName().contains('\\')) { - const QStringList splittedName = m_url.userName().split('\\'); - arguments << "-d" << splittedName.at(0); - arguments << "-u" << splittedName.at(1); + int width, height; + if (m_hostPreferences->width() > 0) { + width = m_hostPreferences->width(); + height = m_hostPreferences->height(); } else { - arguments << "-u" << m_url.userName(); + width = this->parentWidget()->size().width(); + height = this->parentWidget()->size().height(); } + arguments << "-g" << QString::number(width) + 'x' + QString::number(height); + + arguments << "-k" << keymapToXfreerdp(m_hostPreferences->keyboardLayout()); + + if (!m_url.userName().isEmpty()) { + // if username contains a domain, it needs to be set with another parameter + if (m_url.userName().contains('\\')) { + const QStringList splittedName = m_url.userName().split('\\'); + arguments << "-d" << splittedName.at(0); + arguments << "-u" << splittedName.at(1); + } else { + arguments << "-u" << m_url.userName(); + } + } else { + arguments << "-u" << ""; + } + + arguments << "-D"; // request the window has no decorations + arguments << "-X" << QString::number(m_container->winId()); + arguments << "-a" << QString::number((m_hostPreferences->colorDepth() + 1) * 8); + + switch (m_hostPreferences->sound()) { + case 1: + arguments << "-o"; + break; + case 0: + arguments << "--plugin" << "rdpsnd"; + break; + case 2: + default: + break; + } + + if (!m_hostPreferences->shareMedia().isEmpty()) { + QStringList shareMedia; + shareMedia << "--plugin" << "rdpdr" << "--data" << "disk:media:" + m_hostPreferences->shareMedia() << "--"; + arguments += shareMedia; + } + + QString performance; + switch (m_hostPreferences->performance()) { + case 0: + performance = 'm'; + break; + case 1: + performance = 'b'; + break; + case 2: + performance = 'l'; + break; + default: + break; + } + + arguments << "-x" << performance; + + if (m_hostPreferences->console()) { + arguments << "-0"; + } + + if (m_hostPreferences->remoteFX()) { + arguments << "--rfx"; + } + + if (!m_hostPreferences->extraOptions().isEmpty()) { + const QStringList additionalArguments = KShell::splitArgs(m_hostPreferences->extraOptions()); + arguments += additionalArguments; + } + + // krdc has no support for certificate management yet; it would not be possbile to connect to any host: + // "The host key for example.com has changed" ... + // "Add correct host key in ~/.freerdp/known_hosts to get rid of this message." + arguments << "--ignore-certificate"; + + // clipboard sharing is activated in KRDC; user can disable it at runtime + arguments << "--plugin" << "cliprdr"; + + arguments << "-t" << QString::number(m_port); + arguments << m_host; + + kDebug(5012) << "Starting xfreerdp with arguments: " << arguments.join(" "); + + arguments.removeLast(); // host must be last, remove and re-add it after the password + if (!m_url.password().isNull()) + arguments << "-p" << m_url.password(); + arguments << m_host; + } else { - arguments << "-u" << ""; - } + kDebug(5012) << "Use FreeRDP 1.1+ compatible arguments"; - if (!m_url.password().isNull()) - arguments << "-p" << m_url.password(); - - arguments << "-D"; // request the window has no decorations - arguments << "-X" << QString::number(m_container->winId()); - arguments << "-a" << QString::number((m_hostPreferences->colorDepth() + 1) * 8); - - switch (m_hostPreferences->sound()) { - case 1: - arguments << "-o"; - break; - case 0: - arguments << "--plugin" << "rdpsnd"; - break; - case 2: - default: - break; - } + int width, height; + if (m_hostPreferences->width() > 0) { + width = m_hostPreferences->width(); + height = m_hostPreferences->height(); + } else { + width = this->parentWidget()->size().width(); + height = this->parentWidget()->size().height(); + } + arguments << "-decorations"; + arguments << "/w:" + QString::number(width); + arguments << "/h:" + QString::number(height); + + arguments << "/kbd:" + keymapToXfreerdp(m_hostPreferences->keyboardLayout()); + + if (!m_url.userName().isEmpty()) { + // if username contains a domain, it needs to be set with another parameter + if (m_url.userName().contains('\\')) { + const QStringList splittedName = m_url.userName().split('\\'); + arguments << "/d:" + splittedName.at(0); + arguments << "/u:" + splittedName.at(1); + } else { + arguments << "/u:" + m_url.userName(); + } + } else { + arguments << "/u:"; + } - if (!m_hostPreferences->shareMedia().isEmpty()) { - QStringList shareMedia; - shareMedia << "--plugin" << "rdpdr" << "--data" << "disk:media:" + m_hostPreferences->shareMedia() << "--"; - arguments += shareMedia; - } + arguments << "/parent-window:" + QString::number(m_container->winId()); + arguments << "/bpp:" + QString::number((m_hostPreferences->colorDepth() + 1) * 8); + arguments << "/audio-mode:" + QString::number(m_hostPreferences->sound()); - QString performance; - switch (m_hostPreferences->performance()) { - case 0: - performance = 'm'; - break; - case 1: - performance = 'b'; - break; - case 2: - performance = 'l'; - break; - default: - break; - } + if (!m_hostPreferences->shareMedia().isEmpty()) { + QStringList shareMedia; + shareMedia << "/drive:media," + m_hostPreferences->shareMedia(); + arguments += shareMedia; + } - arguments << "-x" << performance; + QString performance; + switch (m_hostPreferences->performance()) { + case 0: + performance = "modem"; + break; + case 1: + performance = "broadband"; + break; + case 2: + performance = "lan"; + break; + default: + break; + } - if (m_hostPreferences->console()) { - arguments << "-0"; - } + arguments << "/network:" + performance; - if (m_hostPreferences->remoteFX()) { - arguments << "--rfx"; - } + if (m_hostPreferences->console()) { + arguments << "/admin"; + } - if (!m_hostPreferences->extraOptions().isEmpty()) { - const QStringList additionalArguments = KShell::splitArgs(m_hostPreferences->extraOptions()); - arguments += additionalArguments; - } + if (m_hostPreferences->remoteFX()) { + arguments << "/rfx"; + } + + if (!m_hostPreferences->extraOptions().isEmpty()) { + const QStringList additionalArguments = KShell::splitArgs(m_hostPreferences->extraOptions()); + arguments += additionalArguments; + } + + // krdc has no support for certificate management yet; it would not be possbile to connect to any host: + // "The host key for example.com has changed" ... + // "Add correct host key in ~/.freerdp/known_hosts to get rid of this message." + arguments << "/cert-ignore"; + + // clipboard sharing is activated in KRDC; user can disable it at runtime + arguments << "+clipboard"; - // krdc has no support for certificate management yet; it would not be possbile to connect to any host: - // "The host key for example.com has changed" ... - // "Add correct host key in ~/.freerdp/known_hosts to get rid of this message." - arguments << "--ignore-certificate"; + arguments << "/port:" + QString::number(m_port); + arguments << "/v:" + m_host; - // clipboard sharing is activated in KRDC; user can disable it at runtime - arguments << "--plugin" << "cliprdr"; + kDebug(5012) << "Starting xfreerdp with arguments: " << arguments.join(" "); - arguments << "-t" << QString::number(m_port); - arguments << m_host; + //avoid printing the password in debug + if (!m_url.password().isNull()) { + arguments << "/p:" + m_url.password(); + } + kDebug(5012) << "Starting xfreerdp with arguments: " << arguments.join(" "); - kDebug(5012) << "Starting xfreerdp with arguments:" << arguments; + } setStatus(Connecting); @@ -302,7 +405,7 @@ void RdpView::connectionError() void RdpView::processError(QProcess::ProcessError error) { - kDebug(5012) << "processError:" << error; + kDebug(5012) << error; if (m_quitFlag) // do not try to show error messages while quitting (prevent crashes) return; @@ -319,11 +422,11 @@ void RdpView::processError(QProcess::ProcessError error) void RdpView::receivedStandardError() { const QString output(m_process->readAllStandardError()); - kDebug(5012) << "receivedStandardError:" << output; + kDebug(5012) << output; QString line; int i = 0; while (!(line = output.section('\n', i, i)).isEmpty()) { - + // the following error is issued by freerdp because of a bug in freerdp 1.0.1 and below; // see: https://github.com/FreeRDP/FreeRDP/pull/576 //"X Error of failed request: BadWindow (invalid Window parameter) @@ -345,7 +448,7 @@ void RdpView::receivedStandardError() void RdpView::receivedStandardOutput() { const QString output(m_process->readAllStandardOutput()); - kDebug(5012) << "receivedStandardOutput:" << output; + kDebug(5012) << output; QString line; int i = 0; while (!(line = output.section('\n', i, i)).isEmpty()) {