text: <?xml version="1.0" encoding="iso-8859-1"?>
  <!DOCTYPE html
      PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>Qt 4.6: sslclient.cpp Example File (network/securesocketclient/sslclient.cpp)</title>
    <link href="classic.css" rel="stylesheet" type="text/css" />
  </head>
  <body>
  <table border="0" cellpadding="0" cellspacing="0" width="100%">
  <tr>
  <td align="left" valign="top" width="32"><a href="http://qt.nokia.com/"><img src="images/qt-logo.png" align="left" border="0" /></a></td>
  <td width="1">&nbsp;&nbsp;</td><td class="postheader" valign="center"><a href="index.html"><font color="#004faf">Home</font></a>&nbsp;&middot; <a href="classes.html"><font color="#004faf">All&nbsp;Classes</font></a>&nbsp;&middot; <a href="functions.html"><font color="#004faf">All&nbsp;Functions</font></a>&nbsp;&middot; <a href="overviews.html"><font color="#004faf">Overviews</font></a></td></tr></table><h1 class="title">sslclient.cpp Example File<br /><span class="small-subtitle">network/securesocketclient/sslclient.cpp</span>
  </h1>
  <pre><span class="comment"> /****************************************************************************
   **
   ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
   ** All rights reserved.
   ** Contact: Nokia Corporation (qt-info@nokia.com)
   **
   ** This file is part of the examples of the Qt Toolkit.
   **
   ** $QT_BEGIN_LICENSE:LGPL$
   ** Commercial Usage
   ** Licensees holding valid Qt Commercial licenses may use this file in
   ** accordance with the Qt Commercial License Agreement provided with the
   ** Software or, alternatively, in accordance with the terms contained in
   ** a written agreement between you and Nokia.
   **
   ** GNU Lesser General Public License Usage
   ** Alternatively, this file may be used under the terms of the GNU Lesser
   ** General Public License version 2.1 as published by the Free Software
   ** Foundation and appearing in the file LICENSE.LGPL included in the
   ** packaging of this file.  Please review the following information to
   ** ensure the GNU Lesser General Public License version 2.1 requirements
   ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
   **
   ** In addition, as a special exception, Nokia gives you certain additional
   ** rights.  These rights are described in the Nokia Qt LGPL Exception
   ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
   **
   ** GNU General Public License Usage
   ** Alternatively, this file may be used under the terms of the GNU
   ** General Public License version 3.0 as published by the Free Software
   ** Foundation and appearing in the file LICENSE.GPL included in the
   ** packaging of this file.  Please review the following information to
   ** ensure the GNU General Public License version 3.0 requirements will be
   ** met: http://www.gnu.org/copyleft/gpl.html.
   **
   ** If you have questions regarding the use of this file, please contact
   ** Nokia at qt-info@nokia.com.
   ** $QT_END_LICENSE$
   **
   ****************************************************************************/</span>
  
   #include &quot;certificateinfo.h&quot;
   #include &quot;sslclient.h&quot;
   #include &quot;ui_sslclient.h&quot;
   #include &quot;ui_sslerrors.h&quot;
  
   #include &lt;QtGui/QScrollBar&gt;
   #include &lt;QtGui/QStyle&gt;
   #include &lt;QtGui/QToolButton&gt;
   #include &lt;QtNetwork/QSslCipher&gt;
  
   SslClient::SslClient(QWidget *parent)
       : QWidget(parent), socket(0), padLock(0), executingDialog(false)
   {
       form = new Ui_Form;
       form-&gt;setupUi(this);
       form-&gt;hostNameEdit-&gt;setSelection(0, form-&gt;hostNameEdit-&gt;text().size());
       form-&gt;sessionOutput-&gt;setHtml(tr(&quot;&amp;lt;not connected&amp;gt;&quot;));
  
       connect(form-&gt;hostNameEdit, SIGNAL(textChanged(QString)),
               this, SLOT(updateEnabledState()));
       connect(form-&gt;connectButton, SIGNAL(clicked()),
               this, SLOT(secureConnect()));
       connect(form-&gt;sendButton, SIGNAL(clicked()),
               this, SLOT(sendData()));
   }
  
   SslClient::~SslClient()
   {
       delete form;
   }
  
   void SslClient::updateEnabledState()
   {
       bool unconnected = !socket || socket-&gt;state() == QAbstractSocket::UnconnectedState;
  
       form-&gt;hostNameEdit-&gt;setReadOnly(!unconnected);
       form-&gt;hostNameEdit-&gt;setFocusPolicy(unconnected ? Qt::StrongFocus : Qt::NoFocus);
  
       form-&gt;hostNameLabel-&gt;setEnabled(unconnected);
       form-&gt;portBox-&gt;setEnabled(unconnected);
       form-&gt;portLabel-&gt;setEnabled(unconnected);
       form-&gt;connectButton-&gt;setEnabled(unconnected &amp;&amp; !form-&gt;hostNameEdit-&gt;text().isEmpty());
  
       bool connected = socket &amp;&amp; socket-&gt;state() == QAbstractSocket::ConnectedState;
       form-&gt;sessionBox-&gt;setEnabled(connected);
       form-&gt;sessionOutput-&gt;setEnabled(connected);
       form-&gt;sessionInput-&gt;setEnabled(connected);
       form-&gt;sessionInputLabel-&gt;setEnabled(connected);
       form-&gt;sendButton-&gt;setEnabled(connected);
   }
  
   void SslClient::secureConnect()
   {
       if (!socket) {
           socket = new QSslSocket(this);
           connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
                   this, SLOT(socketStateChanged(QAbstractSocket::SocketState)));
           connect(socket, SIGNAL(encrypted()),
                   this, SLOT(socketEncrypted()));
           connect(socket, SIGNAL(sslErrors(QList&lt;QSslError&gt;)),
                   this, SLOT(sslErrors(QList&lt;QSslError&gt;)));
           connect(socket, SIGNAL(readyRead()),
                   this, SLOT(socketReadyRead()));
       }
  
       socket-&gt;connectToHostEncrypted(form-&gt;hostNameEdit-&gt;text(), form-&gt;portBox-&gt;value());
       updateEnabledState();
   }
  
   void SslClient::socketStateChanged(QAbstractSocket::SocketState state)
   {
       if (executingDialog)
           return;
  
       updateEnabledState();
       if (state == QAbstractSocket::UnconnectedState) {
           form-&gt;hostNameEdit-&gt;setPalette(QPalette());
           form-&gt;hostNameEdit-&gt;setFocus();
           form-&gt;cipherLabel-&gt;setText(tr(&quot;&lt;none&gt;&quot;));
           if (padLock)
               padLock-&gt;hide();
           socket-&gt;deleteLater();
           socket = 0;
       }
   }
  
   void SslClient::socketEncrypted()
   {
       if (!socket)
           return;                 <span class="comment">// might have disconnected already</span>
  
       form-&gt;sessionOutput-&gt;clear();
       form-&gt;sessionInput-&gt;setFocus();
  
       QPalette palette;
       palette.setColor(QPalette::Base, QColor(255, 255, 192));
       form-&gt;hostNameEdit-&gt;setPalette(palette);
  
       QSslCipher ciph = socket-&gt;sessionCipher();
       QString cipher = QString(&quot;%1, %2 (%3/%4)&quot;).arg(ciph.authenticationMethod())
                        .arg(ciph.name()).arg(ciph.usedBits()).arg(ciph.supportedBits());;
       form-&gt;cipherLabel-&gt;setText(cipher);
  
       if (!padLock) {
           padLock = new QToolButton;
           padLock-&gt;setIcon(QIcon(&quot;:/encrypted.png&quot;));
   #ifndef QT_NO_CURSOR
           padLock-&gt;setCursor(Qt::ArrowCursor);
   #endif
           padLock-&gt;setToolTip(tr(&quot;Display encryption details.&quot;));
  
           int extent = form-&gt;hostNameEdit-&gt;height() - 2;
           padLock-&gt;resize(extent, extent);
           padLock-&gt;setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Ignored);
  
           QHBoxLayout *layout = new QHBoxLayout(form-&gt;hostNameEdit);
           layout-&gt;setMargin(form-&gt;hostNameEdit-&gt;style()-&gt;pixelMetric(QStyle::PM_DefaultFrameWidth));
           layout-&gt;setSpacing(0);
           layout-&gt;addStretch();
           layout-&gt;addWidget(padLock);
  
           form-&gt;hostNameEdit-&gt;setLayout(layout);
  
           connect(padLock, SIGNAL(clicked()),
                   this, SLOT(displayCertificateInfo()));
       } else {
           padLock-&gt;show();
       }
   }
  
   void SslClient::socketReadyRead()
   {
       appendString(QString::fromUtf8(socket-&gt;readAll()));
   }
  
   void SslClient::sendData()
   {
       QString input = form-&gt;sessionInput-&gt;text();
       appendString(input + &quot;\n&quot;);
       socket-&gt;write(input.toUtf8() + &quot;\r\n&quot;);
       form-&gt;sessionInput-&gt;clear();
   }
  
   void SslClient::sslErrors(const QList&lt;QSslError&gt; &amp;errors)
   {
       QDialog errorDialog(this);
       Ui_SslErrors ui;
       ui.setupUi(&amp;errorDialog);
       connect(ui.certificateChainButton, SIGNAL(clicked()),
               this, SLOT(displayCertificateInfo()));
  
       foreach (const QSslError &amp;error, errors)
           ui.sslErrorList-&gt;addItem(error.errorString());
  
       executingDialog = true;
       if (errorDialog.exec() == QDialog::Accepted)
           socket-&gt;ignoreSslErrors();
       executingDialog = false;
  
       <span class="comment">// did the socket state change?</span>
       if (socket-&gt;state() != QAbstractSocket::ConnectedState)
           socketStateChanged(socket-&gt;state());
   }
  
   void SslClient::displayCertificateInfo()
   {
       CertificateInfo *info = new CertificateInfo(this);
       info-&gt;setCertificateChain(socket-&gt;peerCertificateChain());
       info-&gt;exec();
       info-&gt;deleteLater();
   }
  
   void SslClient::appendString(const QString &amp;line)
   {
       QTextCursor cursor(form-&gt;sessionOutput-&gt;textCursor());
       cursor.movePosition(QTextCursor::End);
       cursor.insertText(line);
       form-&gt;sessionOutput-&gt;verticalScrollBar()-&gt;setValue(form-&gt;sessionOutput-&gt;verticalScrollBar()-&gt;maximum());
   }</pre>
  <p /><address><hr /><div align="center">
  <table width="100%" cellspacing="0" border="0"><tr class="address">
  <td width="40%" align="left">Copyright &copy; 2009 Nokia Corporation and/or its subsidiary(-ies)</td>
  <td width="20%" align="center"><a href="trademarks.html">Trademarks</a></td>
  <td width="40%" align="right"><div align="right">Qt 4.6.0</div></td>
  </tr></table></div></address></body>
  </html>
  