Support >=free-rdp-1.1.0.

https://git.reviewboard.kde.org/r/115059/

diff --git a/rdp/rdpview.cpp b/rdp/rdpview.cpp
index 0d14e04691549e084b58501cd10ca2382ef25c63..9062ba5fa060284a679f0c9bc211ab7dd6972c0a 100644
--- a/rdp/rdpview.cpp
+++ b/rdp/rdpview.cpp
@@ -158,71 +158,58 @@ bool RdpView::start()
         width = this->parentWidget()->size().width();
         height = this->parentWidget()->size().height();
     }
-    arguments << "-g" << QString::number(width) + 'x' + QString::number(height);
+    arguments << "-decorations";  // put this option first so we can detect xfreerdp < 1.1
+    arguments << "/w:" + QString::number(width);
+    arguments << "/h:" + QString::number(height);
 
-    arguments << "-k" << keymapToXfreerdp(m_hostPreferences->keyboardLayout());
+    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);
+            arguments << "/d:" + splittedName.at(0);
+            arguments << "/u:" + splittedName.at(1);
         } else {
-            arguments << "-u" << m_url.userName();
+            arguments << "/u:" + m_url.userName();
         }
     } else {
-        arguments << "-u" << "";
+        arguments << "-u:";
     }
 
-    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;
-    }
+    arguments << "/parent-window:" + QString::number(m_container->winId());
+    arguments << "/bpp:" + QString::number((m_hostPreferences->colorDepth() + 1) * 8);
+    arguments << "/audio-mode:" + m_hostPreferences->sound();
 
     if (!m_hostPreferences->shareMedia().isEmpty()) {
         QStringList shareMedia;
-        shareMedia << "--plugin" << "rdpdr" << "--data" << "disk:media:" + m_hostPreferences->shareMedia() << "--";
+        shareMedia << "/drive:media," + m_hostPreferences->shareMedia();
         arguments += shareMedia;
     }
 
     QString performance;
     switch (m_hostPreferences->performance()) {
     case 0:
-        performance = 'm';
+        performance = "modem";
         break;
     case 1:
-        performance = 'b';
+        performance = "broadband";
         break;
     case 2:
-        performance = 'l';
+        performance = "lan";
         break;
     default:
         break;
     }
 
-    arguments << "-x" << performance;
+    arguments << "/network:" + performance;
 
     if (m_hostPreferences->console()) {
-        arguments << "-0";
+        arguments << "/admin";
     }
 
     if (m_hostPreferences->remoteFX()) {
-        arguments << "--rfx";
+        arguments << "/rfx";
     }
 
     if (!m_hostPreferences->extraOptions().isEmpty()) {
@@ -233,16 +220,21 @@ bool RdpView::start()
     // 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 << "/cert-ignore";
 
     // clipboard sharing is activated in KRDC; user can disable it at runtime
-    arguments << "--plugin" << "cliprdr";
+    arguments << "/clipboard";
 
-    arguments << "-t" << QString::number(m_port);
-    arguments << m_host;
+    arguments << "/port:" + QString::number(m_port);
+    arguments << "/v:" + m_host;
 
     kDebug(5012) << "Starting xfreerdp with arguments:" << arguments;
 
+    //avoid printing the password in debug
+    if (!m_url.password().isNull()) {
+        arguments << "/p:" + m_url.password();
+    }
+
     setStatus(Connecting);
 
     connect(m_process, SIGNAL(error(QProcess::ProcessError)), SLOT(processError(QProcess::ProcessError)));
@@ -302,7 +294,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,33 +311,13 @@ void RdpView::processError(QProcess::ProcessError error)
 void RdpView::receivedStandardError()
 {
     const QString output(m_process->readAllStandardError());
-    kDebug(5012) << "receivedStandardError:" << 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)
-        //   Major opcode of failed request:  7 (X_ReparentWindow)
-        //   Resource id in failed request:  0x71303348
-        //   Serial number of failed request:  36
-        //   Current serial number in output stream:  36"
-        if (line.contains(QLatin1String("X_ReparentWindow"))) {
-            KMessageBox::error(0, i18n("The version of \"xfreerdp\" you are using is too old.\n"
-                                       "xfreerdp 1.0.2 or greater is required."),
-                               i18n("RDP Failure"));
-            connectionError();
-            return;
-        }
-        i++;
-    }
+    kDebug(5012) << output;
 }
 
 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()) {
@@ -373,6 +345,14 @@ void RdpView::receivedStandardOutput()
             return;
         }
 
+        // we no longer support freerdp < 1.1, we only support versions with the new interface
+        if (line.contains(QLatin1String("invalid option: -decorations"))) {
+            KMessageBox::error(0, i18n("The version of \"xfreerdp\" you are using is too old.\n"
+                                       "xfreerdp 1.1 or greater is required."),
+                               i18n("RDP Failure"));
+            connectionError();
+            return;
+        }
         i++;
     }
 }
