summaryrefslogtreecommitdiffstats
path: root/examples/network/infoprotocol/infoserver
diff options
context:
space:
mode:
Diffstat (limited to 'examples/network/infoprotocol/infoserver')
-rw-r--r--examples/network/infoprotocol/infoserver/infodata.cpp88
-rw-r--r--examples/network/infoprotocol/infoserver/infodata.h31
-rw-r--r--examples/network/infoprotocol/infoserver/infoserver.pro13
-rw-r--r--examples/network/infoprotocol/infoserver/main.cpp22
-rw-r--r--examples/network/infoprotocol/infoserver/server.cpp99
-rw-r--r--examples/network/infoprotocol/infoserver/server.h69
-rw-r--r--examples/network/infoprotocol/infoserver/serverbase.ui117
7 files changed, 439 insertions, 0 deletions
diff --git a/examples/network/infoprotocol/infoserver/infodata.cpp b/examples/network/infoprotocol/infoserver/infodata.cpp
new file mode 100644
index 000000000..347c78d31
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/infodata.cpp
@@ -0,0 +1,88 @@
+/****************************************************************************
+**
+** 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 "infodata.h"
+
+
+// we hard code all nodes and data in InfoData class
+InfoData::InfoData() :
+ nodes( 17, TRUE ), data( 17, TRUE )
+{
+ nodes.setAutoDelete(TRUE);
+ data.setAutoDelete(TRUE);
+ TQStringList *item;
+
+ nodes.insert( "/", item = new TQStringList( ) );
+ (*item) << "D network";
+ nodes.insert( "/network/", item = new TQStringList() );
+ (*item) << "D workstations" << "D printers" << "D fax";
+ nodes.insert( "/network/workstations/", item = new TQStringList() );
+ (*item) << "D nibble" << "D douglas";
+ nodes.insert( "/network/workstations/nibble/", item = new TQStringList() );
+ (*item) << "F os" << "F cpu" << "F memory";
+ nodes.insert( "/network/workstations/douglas/", item = new TQStringList() );
+ (*item) << "F os" << "F cpu" << "F memory";
+ nodes.insert( "/network/printers/", item = new TQStringList() );
+ (*item) << "D overbitt" << "D kroksleiven";
+ nodes.insert( "/network/printers/overbitt/", item = new TQStringList() );
+ (*item) << "D jobs" << "F type";
+ nodes.insert( "/network/printers/overbitt/jobs/", item = new TQStringList() );
+ (*item) << "F job1" << "F job2";
+ nodes.insert( "/network/printers/kroksleiven/", item = new TQStringList() );
+ (*item) << "D jobs" << "F type";
+ nodes.insert( "/network/printers/kroksleiven/jobs/", item = new TQStringList() );
+ nodes.insert( "/network/fax/", item = new TQStringList() );
+ (*item) << "F last_number";
+
+ data.insert( "/network/workstations/nibble/os", new TQString( "Linux" ) );
+ data.insert( "/network/workstations/nibble/cpu", new TQString( "AMD Athlon 1000" ) );
+ data.insert( "/network/workstations/nibble/memory", new TQString( "256 MB" ) );
+ data.insert( "/network/workstations/douglas/os", new TQString( "Windows 2000" ) );
+ data.insert( "/network/workstations/douglas/cpu", new TQString( "2 x Intel Pentium III 800" ) );
+ data.insert( "/network/workstations/douglas/memory", new TQString( "256 MB" ) );
+ data.insert( "/network/printers/overbitt/type", new TQString( "Lexmark Optra S 1255 PS" ) );
+ data.insert( "/network/printers/overbitt/jobs/job1",
+ new TQString( "TQt manual\n" "A4 size\n" "3000 pages" ) );
+ data.insert( "/network/printers/overbitt/jobs/job2",
+ new TQString( "Monthly report\n" "Letter size\n" "24 pages\n" "8 copies" ) );
+ data.insert( "/network/printers/kroksleiven/type", new TQString( "HP C LaserJet 4500-PS" ) );
+ data.insert( "/network/fax/last_number", new TQString( "22 22 22 22" ) );
+}
+
+TQStringList InfoData::list( TQString path, bool *found ) const
+{
+ if ( !path.endsWith( "/" ) )
+ path += "/";
+ if ( !path.startsWith( "/" ) )
+ path = "/" + path;
+ TQStringList *list = nodes[ path ];
+ if ( list ) {
+ *found = TRUE;
+ return *list;
+ } else {
+ *found = FALSE;
+ TQStringList empty;
+ return empty;
+ }
+}
+
+TQString InfoData::get( TQString path, bool *found ) const
+{
+ if ( !path.startsWith( "/" ) )
+ path = "/" + path;
+ TQString *file = data[ path ];
+ if ( file ) {
+ *found = TRUE;
+ return *file;
+ } else {
+ *found = FALSE;
+ TQString empty;
+ return empty;
+ }
+}
diff --git a/examples/network/infoprotocol/infoserver/infodata.h b/examples/network/infoprotocol/infoserver/infodata.h
new file mode 100644
index 000000000..5a293ceb0
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/infodata.h
@@ -0,0 +1,31 @@
+/****************************************************************************
+**
+** 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.
+**
+*****************************************************************************/
+
+#ifndef INFODATA_H
+#define INFODATA_H
+
+#include <qdict.h>
+#include <qstringlist.h>
+
+
+// The InfoData class manages data, organized in tree structure.
+class InfoData
+{
+public:
+ InfoData();
+ TQStringList list( TQString path, bool *found ) const;
+ TQString get( TQString path, bool *found ) const;
+
+private:
+ TQDict< TQStringList > nodes;
+ TQDict< TQString > data;
+};
+
+#endif // INFODATA_H
+
diff --git a/examples/network/infoprotocol/infoserver/infoserver.pro b/examples/network/infoprotocol/infoserver/infoserver.pro
new file mode 100644
index 000000000..3d79aeff2
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/infoserver.pro
@@ -0,0 +1,13 @@
+TEMPLATE = app
+TARGET = infoserver
+
+CONFIG += qt warn_on release
+
+REQUIRES = network full-config nocrosscompiler
+
+HEADERS = server.h \
+ infodata.h
+SOURCES = main.cpp \
+ server.cpp \
+ infodata.cpp
+INTERFACES = serverbase.ui
diff --git a/examples/network/infoprotocol/infoserver/main.cpp b/examples/network/infoprotocol/infoserver/main.cpp
new file mode 100644
index 000000000..42c0c7fad
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/main.cpp
@@ -0,0 +1,22 @@
+/****************************************************************************
+**
+** 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 <qapplication.h>
+
+#include "server.h"
+
+int main( int argc, char** argv )
+{
+ TQApplication app( argc, argv );
+ Q_UINT16 port = ( argc > 1 ) ? TQString( argv[ 1 ] ).toInt() : infoPort;
+ ServerInfo info( port, 0, "server info" );
+ app.setMainWidget( &info );
+ info.show();
+ return app.exec();
+}
diff --git a/examples/network/infoprotocol/infoserver/server.cpp b/examples/network/infoprotocol/infoserver/server.cpp
new file mode 100644
index 000000000..4e5ef6d17
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/server.cpp
@@ -0,0 +1,99 @@
+/****************************************************************************
+**
+** 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 <qtextview.h>
+#include <qpushbutton.h>
+#include <qtextstream.h>
+#include <qapplication.h>
+#include <qmessagebox.h>
+#include <stdlib.h>
+
+#include "server.h"
+
+
+
+ServerInfo::ServerInfo( Q_UINT16 port, TQWidget *parent, const char *name ) :
+ ServerInfoBase( parent, name )
+{
+ SimpleServer *server = new SimpleServer( port, this, "simple server" );
+ connect( server, SIGNAL(newConnect()), SLOT(newConnect()) );
+ connect( btnQuit, SIGNAL(clicked()), qApp, SLOT(tquit()) );
+}
+
+void ServerInfo::newConnect()
+{
+ infoText->append( tr( "New connection\n" ) );
+}
+
+
+SimpleServer::SimpleServer( Q_UINT16 port, TQObject* parent, const char *name ) :
+ TQServerSocket( port, 1, parent, name )
+{
+ if ( !ok() ) {
+ TQMessageBox::critical( 0, tr( "Error" ), tr( "Failed to bind to port %1" ).arg( port ) );
+ exit(1);
+ }
+}
+
+void SimpleServer::newConnection( int socket )
+{
+ (void)new ClientSocket( socket, &info, this, "client socket" );
+ emit newConnect();
+}
+
+
+ClientSocket::ClientSocket( int sock, InfoData *i, TQObject *parent, const char *name ) :
+ TQSocket( parent, name ), info( i )
+{
+ connect( this, SIGNAL(readyRead()), SLOT(readClient()) );
+ connect( this, SIGNAL(connectionClosed()), SLOT(connectionClosed()) );
+ setSocket( sock );
+}
+
+void ClientSocket::readClient()
+{
+ TQTextStream stream( this );
+ TQStringList answer;
+ while ( canReadLine() ) {
+ stream << processCommand( stream.readLine() );
+ }
+}
+
+TQString ClientSocket::processCommand( const TQString& command )
+{
+ TQString answer;
+ TQString com = command.simplifyWhiteSpace ();
+ if ( com.startsWith( "LIST" ) ) {
+ bool ok;
+ TQStringList nodes = info->list( com.mid( 5 ), &ok );
+ if ( ok ) {
+ for ( TQStringList::Iterator it = nodes.begin(); it != nodes.end(); ++it )
+ answer += "212+" + *it + "\r\n";
+ answer += "212 \r\n";
+ } else
+ answer += "550 Invalid path\r\n";
+ } else if ( com.startsWith( "GET " ) ) {
+ bool ok;
+ TQStringList data = TQStringList::split( '\n', info->get( com.mid( 4 ), &ok ), TRUE );
+ if ( ok ) {
+ for ( TQStringList::Iterator it = data.begin(); it != data.end(); ++it )
+ answer += "213+" + *it + "\r\n";
+ answer += "213 \r\n";
+ } else
+ answer += "550 Info not found\r\n";
+ } else
+ answer += "500 Syntax error\r\n";
+
+ return answer;
+}
+
+void ClientSocket::connectionClosed()
+{
+ delete this;
+}
diff --git a/examples/network/infoprotocol/infoserver/server.h b/examples/network/infoprotocol/infoserver/server.h
new file mode 100644
index 000000000..d7b9c9ae2
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/server.h
@@ -0,0 +1,69 @@
+/****************************************************************************
+**
+** 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.
+**
+*****************************************************************************/
+
+#ifndef SERVER_H
+#define SERVER_H
+
+#include <qsocket.h>
+#include <qserversocket.h>
+
+#include "infodata.h"
+#include "serverbase.h"
+
+static const Q_UINT16 infoPort = 42417;
+
+
+/*
+ The ServerInfo class provides a small GUI for the server. It also creates the
+ SimpleServer and as a result the server.
+*/
+class ServerInfo : public ServerInfoBase
+{
+ Q_OBJECT
+public:
+ ServerInfo( Q_UINT16 port = infoPort, TQWidget *parent = 0, const char *name = 0 );
+
+private slots:
+ void newConnect();
+};
+
+
+class SimpleServer : public TQServerSocket
+{
+ Q_OBJECT
+public:
+ SimpleServer( Q_UINT16 port = infoPort, TQObject* parent = 0, const char *name = 0 );
+ void newConnection( int socket );
+
+signals:
+ void newConnect();
+
+private:
+ InfoData info;
+};
+
+
+class ClientSocket : public TQSocket
+{
+ Q_OBJECT
+public:
+ ClientSocket( int sock, InfoData *i, TQObject *parent = 0, const char *name = 0 );
+
+private slots:
+ void readClient();
+ void connectionClosed();
+
+private:
+ TQString processCommand( const TQString& command );
+ InfoData *info;
+};
+
+
+#endif //SERVER_H
+
diff --git a/examples/network/infoprotocol/infoserver/serverbase.ui b/examples/network/infoprotocol/infoserver/serverbase.ui
new file mode 100644
index 000000000..ddf1bffb2
--- /dev/null
+++ b/examples/network/infoprotocol/infoserver/serverbase.ui
@@ -0,0 +1,117 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>ServerInfoBase</class>
+<widget class="TQWidget">
+ <property name="name">
+ <cstring>ServerInfoBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>272</width>
+ <height>282</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Info Server</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="TQLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>This is a small Information Server.
+Accepting client requests...</string>
+ </property>
+ <property name="alignment">
+ <set>AlignCenter</set>
+ </property>
+ </widget>
+ <widget class="TQTextEdit">
+ <property name="name">
+ <cstring>infoText</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="TQLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="TQPushButton">
+ <property name="name">
+ <cstring>btnQuit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Quit</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>