From 709398ef1737dd5e83eab6c656bc597a54ebbd61 Mon Sep 17 00:00:00 2001
From: Brad Hards <bradh@frogmouth.net>
Date: Mon, 20 Mar 2006 02:54:03 +0000
Subject: [PATCH] Complete conversion of TLS/SSL server example to Qt4.

svn path=/trunk/kdesupport/qca/; revision=520483
---
 examples/sslservtest/sslservtest.cpp | 96 ++++++++++++++++------------
 examples/sslservtest/sslservtest.pro |  3 +-
 2 files changed, 55 insertions(+), 44 deletions(-)

diff --git a/examples/sslservtest/sslservtest.cpp b/examples/sslservtest/sslservtest.cpp
index 0c682264..b06c8945 100644
--- a/examples/sslservtest/sslservtest.cpp
+++ b/examples/sslservtest/sslservtest.cpp
@@ -22,7 +22,6 @@
 
 #include <QtCore>
 #include <QtNetwork>
-#include<q3serversocket.h>
 #include <QtCrypto>
 
 char pemdata_cert[] =
@@ -116,7 +115,7 @@ public:
 
 	    encoded -= i.encoded;
 	    plain += i.plain;
-	    it = list.remove(it);
+	    it = list.erase(it);
 	}
 	return plain;
     }
@@ -125,28 +124,25 @@ public:
     QList<Item> list;
 };
 
-class SecureServerTest : public Q3ServerSocket
+class SecureServer : public QObject
 {
     Q_OBJECT
+
 public:
     enum { Idle, Handshaking, Active, Closing };
     
-    SecureServerTest(int _port) : Q3ServerSocket(_port), port(_port)
+    SecureServer(quint16 _port) : port(_port)
     {
-	sock = new QTcpSocket;
-	connect(sock, SIGNAL(readyRead()), SLOT(sock_readyRead()));
-	connect(sock, SIGNAL(connectionClosed()), SLOT(sock_connectionClosed()));
-	connect(sock, SIGNAL(error(QAbstractSocket::SocketError)),
-		SLOT(sock_error(QAbstractSocket::SocketError)));
-	connect(sock, SIGNAL(bytesWritten(qint64)), SLOT(sock_bytesWritten(qint64)));
-	
+	server = new QTcpServer;
+	connect( server, SIGNAL(newConnection()), SLOT(server_handleConnection()) );
+
 	ssl = new QCA::TLS;
 	connect(ssl, SIGNAL(handshaken()), SLOT(ssl_handshaken()));
 	connect(ssl, SIGNAL(readyRead()), SLOT(ssl_readyRead()));
 	connect(ssl, SIGNAL(readyReadOutgoing()), SLOT(ssl_readyReadOutgoing()));
 	connect(ssl, SIGNAL(closed()), SLOT(ssl_closed()));
 	connect(ssl, SIGNAL(error()), SLOT(ssl_error()));
-	
+
 	cert = QCA::Certificate::fromPEM(pemdata_cert);
 	QCA::PrivateKey key = QCA::PrivateKey::fromPEM(pemdata_privkey);
 	privkey = key.toRSA();
@@ -154,10 +150,10 @@ public:
 	mode = Idle;
     }
 
-    ~SecureServerTest()
+    ~SecureServer()
     {
 	delete ssl;
-	delete sock;
+	delete server;
     }
 
     void start()
@@ -172,7 +168,7 @@ public:
 	    QTimer::singleShot(0, this, SIGNAL(quit()));
 	    return;
 	}
-	if(!ok()) {
+	if(false == server->listen(QHostAddress::Any, port)) {
 	    printf("Error binding to port %d!\n", port);
 	    QTimer::singleShot(0, this, SIGNAL(quit()));
 	    return;
@@ -180,35 +176,48 @@ public:
 	printf("Listening on port %d ...\n", port);
     }
 
-    void newConnection(int s)
-    {
-	// Note: only 1 connection supported at a time in this example!
-	if(sock->isOpen()) {
-	    QTcpSocket tmp;
-	    tmp.setSocket(s);
-	    printf("throwing away extra connection\n");
-	    return;
-	}
-	mode = Handshaking;
-	sock->setSocket(s);
-	printf("Connection received!  Starting TLS handshake...\n");
-	ssl->setCertificate(cert, privkey);
-	ssl->startServer();
-    }
-
 signals:
     void quit();
 
 private slots:
     void sock_readyRead()
     {
-	QByteArray buf(sock->bytesAvailable());
-	int num = sock->readBlock(buf.data(), buf.size());
-	if(num < (int)buf.size())
+	QByteArray buf(sock->bytesAvailable(), 0x00);
+
+	int num = sock->read(buf.data(), buf.size());
+
+	if ( -1 == num )
+	    qDebug() << "Error reading data from socket";
+
+	if (num < buf.size() )
 	    buf.resize(num);
+
 	ssl->writeIncoming(buf);
     }
 
+    void server_handleConnection()
+    {
+	// Note: only 1 connection supported at a time in this example!
+	if(mode != Idle) {
+	    QTcpSocket* tmp = server->nextPendingConnection();
+	    tmp->close();
+	    connect(tmp, SIGNAL(disconnected()), tmp, SLOT(deleteLater()));
+	    printf("throwing away extra connection\n");
+	    return;
+	}
+	mode = Handshaking;
+	sock = server->nextPendingConnection();
+	connect(sock, SIGNAL(readyRead()), SLOT(sock_readyRead()));
+	connect(sock, SIGNAL(connectionClosed()), SLOT(sock_connectionClosed()));
+	connect(sock, SIGNAL(error(QAbstractSocket::SocketError)),
+		SLOT(sock_error(QAbstractSocket::SocketError)));
+	connect(sock, SIGNAL(bytesWritten(qint64)), SLOT(sock_bytesWritten(qint64)));
+
+	printf("Connection received!  Starting TLS handshake...\n");
+	ssl->setCertificate(cert, privkey);
+	ssl->startServer();
+    }
+
     void sock_connectionClosed()
     {
 	printf("Connection closed.\n");
@@ -259,15 +268,16 @@ private slots:
 
     void ssl_readyReadOutgoing()
     {
-	QByteArray a = ssl->readOutgoing();
-	layer.specifyEncoded(a.size(), ssl->bytesOutgoingAvailable());
-	sock->writeBlock(a.data(), a.size());
+	QByteArray outgoingData = ssl->readOutgoing();
+	layer.specifyEncoded( outgoingData.size(), ssl->bytesOutgoingAvailable());
+	sock->write( outgoingData );
     }
     
     void ssl_closed()
     {
 	printf("Closing.\n");
 	sock->close();
+	mode = Idle;
     }
     
     void ssl_error()
@@ -280,10 +290,12 @@ private slots:
 	    printf("SSL Error!  Closing.\n");
 	    sock->close();
 	}
+	mode = Idle;
     }
 
 private:
-    int port;
+    quint16 port;
+    QTcpServer *server;
     QTcpSocket *sock;
     QCA::TLS *ssl;
     QCA::Certificate cert;
@@ -309,11 +321,11 @@ int main(int argc, char **argv)
 	return 1;
     }
     
-    SecureServerTest *s = new SecureServerTest(port);
-    QObject::connect(s, SIGNAL(quit()), &app, SLOT(quit()));
-    s->start();
+    SecureServer *server = new SecureServer(port);
+    QObject::connect(server, SIGNAL(quit()), &app, SLOT(quit()));
+    server->start();
     app.exec();
-    delete s;
+    delete server;
     
     return 0;
 }
diff --git a/examples/sslservtest/sslservtest.pro b/examples/sslservtest/sslservtest.pro
index 8902d6d4..4deb7763 100644
--- a/examples/sslservtest/sslservtest.pro
+++ b/examples/sslservtest/sslservtest.pro
@@ -1,7 +1,6 @@
 CONFIG  -= app_bundle
-CONFIG  += thread console
+CONFIG  += console
 QT      += network
-QT 	+= qt3support 
 
 SOURCES += sslservtest.cpp
 include(../examples.pri)