diff options
Diffstat (limited to 'examples/network/httpd/httpd.cpp')
-rw-r--r-- | examples/network/httpd/httpd.cpp | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/examples/network/httpd/httpd.cpp b/examples/network/httpd/httpd.cpp new file mode 100644 index 000000000..fd42891bb --- /dev/null +++ b/examples/network/httpd/httpd.cpp @@ -0,0 +1,141 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of an example program for TQt. This example +** program may be used, distributed and modified without limitation. +** +*****************************************************************************/ +#include <stdlib.h> +#include <qsocket.h> +#include <qregexp.h> +#include <qserversocket.h> +#include <qapplication.h> +#include <qmainwindow.h> +#include <qtextstream.h> +#include <qvbox.h> +#include <qlabel.h> +#include <qtextview.h> +#include <qpushbutton.h> + +// HttpDaemon is the the class that implements the simple HTTP server. +class HttpDaemon : public TQServerSocket +{ + Q_OBJECT +public: + HttpDaemon( TQObject* parent=0 ) : + TQServerSocket(8080,1,parent) + { + if ( !ok() ) { + qWarning("Failed to bind to port 8080"); + exit( 1 ); + } + } + + void newConnection( int socket ) + { + // When a new client connects, the server constructs a TQSocket and all + // communication with the client is done over this TQSocket. TQSocket + // works asynchronouslyl, this means that all the communication is done + // in the two slots readClient() and discardClient(). + TQSocket* s = new TQSocket( this ); + connect( s, SIGNAL(readyRead()), this, SLOT(readClient()) ); + connect( s, SIGNAL(delayedCloseFinished()), this, SLOT(discardClient()) ); + s->setSocket( socket ); + emit newConnect(); + } + +signals: + void newConnect(); + void endConnect(); + void wroteToClient(); + +private slots: + void readClient() + { + // This slot is called when the client sent data to the server. The + // server looks if it was a get request and sends a very simple HTML + // document back. + TQSocket* socket = (TQSocket*)sender(); + if ( socket->canReadLine() ) { + TQStringList tokens = TQStringList::split( TQRegExp("[ \r\n][ \r\n]*"), socket->readLine() ); + if ( tokens[0] == "GET" ) { + TQTextStream os( socket ); + os.setEncoding( TQTextStream::UnicodeUTF8 ); + os << "HTTP/1.0 200 Ok\r\n" + "Content-Type: text/html; charset=\"utf-8\"\r\n" + "\r\n" + "<h1>Nothing to see here</h1>\n"; + socket->close(); + emit wroteToClient(); + } + } + } + void discardClient() + { + TQSocket* socket = (TQSocket*)sender(); + delete socket; + emit endConnect(); + } +}; + + +// HttpInfo provides a simple graphical user interface to the server and shows +// the actions of the server. +class HttpInfo : public TQVBox +{ + Q_OBJECT +public: + HttpInfo() + { + HttpDaemon *httpd = new HttpDaemon( this ); + + TQString itext = TQString( + "This is a small httpd example.\n" + "You can connect with your\n" + "web browser to port %1" + ).arg( httpd->port() ); + TQLabel *lb = new TQLabel( itext, this ); + lb->setAlignment( AlignHCenter ); + infoText = new TQTextView( this ); + TQPushButton *tquit = new TQPushButton( "tquit" , this ); + + connect( httpd, SIGNAL(newConnect()), SLOT(newConnect()) ); + connect( httpd, SIGNAL(endConnect()), SLOT(endConnect()) ); + connect( httpd, SIGNAL(wroteToClient()), SLOT(wroteToClient()) ); + connect( tquit, SIGNAL(pressed()), qApp, SLOT(tquit()) ); + } + + ~HttpInfo() + { + } + +private slots: + void newConnect() + { + infoText->append( "New connection" ); + } + void endConnect() + { + infoText->append( "Connection closed\n\n" ); + } + void wroteToClient() + { + infoText->append( "Wrote to client" ); + } + +private: + TQTextView *infoText; +}; + + +int main( int argc, char** argv ) +{ + TQApplication app( argc, argv ); + HttpInfo info; + app.setMainWidget( &info ); + info.show(); + return app.exec(); +} + +#include "httpd.moc" |