@@ -5,12 +5,18 @@ InterfaceHttp::InterfaceHttp(QWidget *parent) :
55 NetworkInterface(parent),
66 ui(new Ui::InterfaceHttp) {
77 ui->setupUi (this );
8+
89 connect (ui->examples , SIGNAL (released ()), SLOT (openExamples ()));
910
11+ // HTTP server
1012 httpServer = new InterfaceHttpServer (this );
1113 connect (httpServer, SIGNAL (parseRequest (QNetworkReply*)), SLOT (parseRequest (QNetworkReply*)));
1214 connect (httpServer, SIGNAL (parseSocket (QTcpSocket*)), SLOT (parseSocket (QTcpSocket*)));
1315
16+ // Websockets server
17+ webSocketServer = new WebSocketServer (this );
18+ connect (webSocketServer, SIGNAL (newConnection ()), SLOT (webSocketsNewConnection ()));
19+
1420 // Html template
1521 QFile htmlTemplateFile (" Tools/HTML Template.html" );
1622 if (htmlTemplateFile.open (QFile::ReadOnly)) {
@@ -23,6 +29,9 @@ InterfaceHttp::InterfaceHttp(QWidget *parent) :
2329 port.setAction (ui->port , " interfaceHttpPort" );
2430 connect (&port, SIGNAL (triggered (qreal)), SLOT (portChanged ()));
2531 port = 1236 ;
32+ webSocketsPort.setAction (ui->portWebSockets , " interfaceHttpWebSocketsPort" );
33+ connect (&webSocketsPort, SIGNAL (triggered (qreal)), SLOT (portWebSocketsChanged ()));
34+ webSocketsPort = 1237 ;
2635}
2736
2837InterfaceHttpServer::InterfaceHttpServer (QObject *parent) :
@@ -35,7 +44,11 @@ InterfaceHttpServer::InterfaceHttpServer(QObject *parent) :
3544void InterfaceHttp::portChanged () {
3645 if (httpServer->portChanged (port.val ())) ui->port ->setStyleSheet (ihmFeedbackOk);
3746 else ui->port ->setStyleSheet (ihmFeedbackNok);
38-
47+ }
48+ void InterfaceHttp::portWebSocketsChanged () {
49+ webSocketServer->close ();
50+ if (webSocketServer->listen (QHostAddress::Any, webSocketsPort.val ())) ui->portWebSockets ->setStyleSheet (ihmFeedbackOk);
51+ else ui->portWebSockets ->setStyleSheet (ihmFeedbackNok);
3952}
4053bool InterfaceHttpServer::portChanged (quint16 port) {
4154 // Initialization
@@ -44,9 +57,55 @@ bool InterfaceHttpServer::portChanged(quint16 port) {
4457}
4558
4659
60+ void InterfaceHttp::webSocketsNewConnection () {
61+ WebSocket *webSocket = webSocketServer->nextPendingConnection ();
62+ connect (webSocket, SIGNAL (textMessageReceived (QString)), SLOT (webSocketsProcessMessage (QString)));
63+ connect (webSocket, SIGNAL (binaryMessageReceived (QByteArray)), SLOT (webSocketsProcessBinaryMessage (QByteArray)));
64+ connect (webSocket, SIGNAL (disconnected ()), SLOT (webSocketsSocketDisconnected ()));
65+ webSocketClients << webSocket;
66+ webSocketsUpdateConnectedClients ();
67+ }
68+ void InterfaceHttp::webSocketsProcessMessage (const QString &message) {
69+ WebSocket *webSocket = qobject_cast<WebSocket *>(sender ());
70+ if (webSocket) {
71+ QStringList commandItems = message.split (COMMAND_END, QString::SkipEmptyParts);;
72+ QString response;
73+ foreach (const QString & command, commandItems)
74+ response += MessageManager::incomingMessage (MessageIncomming (" http" , webSocket->peerAddress ().toString (), webSocket->peerPort (), " " , command, command.split (" " , QString::SkipEmptyParts)), true , (command != " goto" ));
75+ if (!response.isEmpty ())
76+ webSocket->send (response);
77+ }
78+ }
79+ void InterfaceHttp::webSocketsProcessBinaryMessage (const QByteArray &message) {
80+ WebSocket *webSocket = qobject_cast<WebSocket *>(sender ());
81+ if (webSocket) {
82+ }
83+ }
84+ void InterfaceHttp::webSocketsSocketDisconnected () {
85+ WebSocket *webSocket = qobject_cast<WebSocket *>(sender ());
86+ if (webSocket) {
87+ webSocketClients.removeAll (webSocket);
88+ webSocket->deleteLater ();
89+ }
90+ webSocketsUpdateConnectedClients ();
91+ }
92+ void InterfaceHttp::webSocketsUpdateConnectedClients () {
93+ QString clientsWebSockets;
94+ foreach (WebSocket *webSocket, webSocketClients)
95+ clientsWebSockets += QString (" %1:%2\n " ).arg (webSocket->peerAddress ().toString ()).arg (webSocket->peerPort ());
96+ clientsWebSockets.chop (1 );
97+ if (webSocketClients.count () == 0 ) ui->clientsWebSockets ->setText (tr (" No websocket connected" ));
98+ else if (webSocketClients.count () == 1 ) ui->clientsWebSockets ->setText (tr (" 1 websocket connected\n (%1)" ).arg (clientsWebSockets));
99+ else ui->clientsWebSockets ->setText (tr (" %1 websockets connected" ).arg (webSocketClients.count ()));
100+ ui->clientsWebSockets ->setToolTip (clientsWebSockets);
101+ }
102+
103+
104+
47105bool InterfaceHttp::send (const Message &message, QStringList *messageSent) {
48106 if (!enable)
49107 return false ;
108+
50109 return httpServer->send (message, messageSent);
51110}
52111bool InterfaceHttpServer::send (const Message &message, QStringList *messageSent) {
@@ -73,7 +132,6 @@ void InterfaceHttp::parseRequest(QNetworkReply *reply) {
73132}
74133
75134
76-
77135// HTTP reception
78136void InterfaceHttpServer::incomingConnection (int socketDescriptor) {
79137 QTcpSocket *socket = new QTcpSocket (this );
@@ -124,7 +182,7 @@ void InterfaceHttp::parseSocket(QTcpSocket *socket) {
124182
125183 QString response;
126184 foreach (const QString & command, commands)
127- response += MessageManager::incomingMessage (MessageIncomming (" http" , socket->peerAddress ().toString (), socket->peerPort (), url.path (), command, command.split (" " , QString::SkipEmptyParts)), true ) + " \n " ;
185+ response += MessageManager::incomingMessage (MessageIncomming (" http" , socket->peerAddress ().toString (), socket->peerPort (), url.path (), command, command.split (" " , QString::SkipEmptyParts)), true , (command != " goto " ) ) + " \n " ;
128186
129187 os << response;
130188 }
0 commit comments