diff options
author | Timothy Pearson <[email protected]> | 2011-12-18 03:08:08 -0600 |
---|---|---|
committer | Timothy Pearson <[email protected]> | 2011-12-18 03:08:08 -0600 |
commit | bcc95cd92ca12c1783464b8ada6816d430dc0e98 (patch) | |
tree | 4701c447365db5392df0174b4bb00b5b5c369da4 /PerlQt/examples/network | |
download | libtqt-perl-bcc95cd92ca12c1783464b8ada6816d430dc0e98.tar.gz libtqt-perl-bcc95cd92ca12c1783464b8ada6816d430dc0e98.zip |
Initial import of libqt-perl (not yet TQt compatible)
Diffstat (limited to 'PerlQt/examples/network')
-rw-r--r-- | PerlQt/examples/network/httpd/httpd.pl | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/PerlQt/examples/network/httpd/httpd.pl b/PerlQt/examples/network/httpd/httpd.pl new file mode 100644 index 0000000..3f46041 --- /dev/null +++ b/PerlQt/examples/network/httpd/httpd.pl @@ -0,0 +1,140 @@ +#!/usr/bin/perl -w + +## This program is based on an example program for Qt. It +## may be used, distributed and modified without limitation. +## +## Copyright (C) 1992-2000 Trolltech AS. All rights reserved. + + +# When a new client connects, the server constructs a Qt::Socket and all +# communication with the client is done over this Socket object. Qt::Socket +# works asynchronously - this means that all the communication is done +# through the two slots readClient() and discardClient(). + +package HttpDaemon; + +use Qt; +use Qt::isa qw(Qt::ServerSocket); +use Qt::signals + newConnect => [], + endConnect => [], + wroteToClient => []; +use Qt::slots + readClient => [], + discardClient => []; +use Qt::attributes qw( + sockets +); + +sub NEW +{ + shift->SUPER::NEW(8080, 1, $_[0]); + if( !this->ok() ) + { + die "Failed to bind to port 8080\n"; + } + sockets = {}; +} + +sub newConnection +{ + my $s = Qt::Socket( this ); + this->connect( $s, SIGNAL 'readyRead()', this, SLOT 'readClient()' ); + this->connect( $s, SIGNAL 'delayedCloseFinished()', this, SLOT 'discardClient()' ); + $s->setSocket( shift ); + sockets->{ $s } = $s; + emit newConnect(); +} + +sub 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. + my $s = sender(); + if ( $s->canReadLine() ) + { + my @tokens = split( /\s\s*/, $s->readLine() ); + if ( $tokens[0] eq "GET" ) + { + my $string = "HTTP/1.0 200 Ok\n\rContent-Type: text/html; charset=\"utf-8\"\n\r". + "\n\r<h1>Nothing to see here</h1>\n"; + $s->writeBlock($string, length($string)); + $s->close(); + emit wroteToClient(); + } + } +} + +sub discardClient +{ + my $s = sender(); + sockets->{$s} = 0; + emit endConnect(); +} + +1; + + +# HttpInfo provides a simple graphical user interface to the server and shows +# the actions of the server. + +package HttpInfo; + +use Qt; +use Qt::isa qw(Qt::VBox); +use Qt::slots + newConnect => [], + endConnect => [], + wroteToClient => []; +use Qt::attributes qw( + httpd + infoText +); + +use HttpDaemon; + +sub NEW +{ + shift->SUPER::NEW(@_); + httpd = HttpDaemon( this ); + my $port = httpd->port(); + my $itext = "This is a small httpd example.\n". + "You can connect with your\n". + "web browser to port $port\n"; + my $lb = Label( $itext, this ); + $lb->setAlignment( &AlignHCenter ); + infoText = TextView( this ); + my $quit = PushButton( "quit" , this ); + this->connect( httpd, SIGNAL 'newConnect()', SLOT 'newConnect()' ); + this->connect( httpd, SIGNAL 'endConnect()', SLOT 'endConnect()' ); + this->connect( httpd, SIGNAL 'wroteToClient()', SLOT 'wroteToClient()' ); + this->connect( $quit, SIGNAL 'pressed()', Qt::app(), SLOT 'quit()' ); +} + +sub newConnect +{ + infoText->append( "New connection" ); +} + +sub endConnect +{ + infoText->append( "Connection closed\n\n" ); +} + +sub wroteToClient +{ + infoText->append( "Wrote to client" ); +} + +1; + +package main; +use Qt; +use HttpInfo; + +my $app = Qt::Application(\@ARGV); +my $info = HttpInfo; +$app->setMainWidget($info); +$info->show; +exit $app->exec; |