aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2011-05-17 04:18:13 +0000
committerMike Buland <eichlan@xagasoft.com>2011-05-17 04:18:13 +0000
commit6aefa6632023c99c5b91bae0e099df94fa69d890 (patch)
tree6ac83b347cc70dca827c887f0046924dabec042d
parentefcbdb7a0347b4399cbabacf3cbea432eeafb17b (diff)
downloadlibgats-6aefa6632023c99c5b91bae0e099df94fa69d890.tar.gz
libgats-6aefa6632023c99c5b91bae0e099df94fa69d890.tar.bz2
libgats-6aefa6632023c99c5b91bae0e099df94fa69d890.tar.xz
libgats-6aefa6632023c99c5b91bae0e099df94fa69d890.zip
GatsCon now supports proxying, and way better than qtbenc ever did. Not only
does it proxy, but you can inject your own messages going to the client or host. Pretty slick, really. Next up, reading and creating files.
-rw-r--r--default.bld4
-rw-r--r--src/gatscon/clientthread.cpp2
-rw-r--r--src/gatscon/clientwidget.cpp17
-rw-r--r--src/gatscon/clientwidget.h2
-rw-r--r--src/gatscon/mainwnd.cpp25
-rw-r--r--src/gatscon/proxythread.cpp108
-rw-r--r--src/gatscon/proxythread.h60
-rw-r--r--src/gatscon/proxywidget.cpp115
-rw-r--r--src/gatscon/proxywidget.h30
-rw-r--r--src/gatscon/proxywidget.ui181
-rw-r--r--src/gatscon/setupproxydlg.cpp27
-rw-r--r--src/gatscon/setupproxydlg.h18
-rw-r--r--src/gatscon/setupproxydlg.ui112
13 files changed, 684 insertions, 17 deletions
diff --git a/default.bld b/default.bld
index a2e7e23..b3a9020 100644
--- a/default.bld
+++ b/default.bld
@@ -94,7 +94,7 @@ target "gatscon"
94 94
95 CXXFLAGS += "-Isrc/gatscon"; 95 CXXFLAGS += "-Isrc/gatscon";
96 96
97 CXXFLAGS += "-I. -Ilibbu++ -Itmp"; 97 CXXFLAGS += "-I. -Ilibbu++ -Itmp -Ilibzamui/src";
98 LDFLAGS += "-L. -lgats -Llibbu++ -lbu++"; 98 LDFLAGS += "-L. -lgats -Llibbu++ -lbu++ -Llibzamui -lzamui";
99} 99}
100 100
diff --git a/src/gatscon/clientthread.cpp b/src/gatscon/clientthread.cpp
index b1dc4d0..4c7b72a 100644
--- a/src/gatscon/clientthread.cpp
+++ b/src/gatscon/clientthread.cpp
@@ -30,7 +30,7 @@ void ClientThread::run()
30 { 30 {
31 Gats::Object *pObj = gsCli.readObject(); 31 Gats::Object *pObj = gsCli.readObject();
32 if( pObj == NULL ) 32 if( pObj == NULL )
33 break; 33 continue;
34 34
35 emit recv( pObj ); 35 emit recv( pObj );
36 } 36 }
diff --git a/src/gatscon/clientwidget.cpp b/src/gatscon/clientwidget.cpp
index 6039035..0ea04a3 100644
--- a/src/gatscon/clientwidget.cpp
+++ b/src/gatscon/clientwidget.cpp
@@ -1,5 +1,4 @@
1#include "clientwidget.h" 1#include "clientwidget.h"
2#include "connectdlg.h"
3#include "clientthread.h" 2#include "clientthread.h"
4 3
5#include "gatstotree.h" 4#include "gatstotree.h"
@@ -11,23 +10,17 @@
11 10
12using namespace Bu; 11using namespace Bu;
13 12
14ClientWidget::ClientWidget( QWidget *pParent ) : 13ClientWidget::ClientWidget( QWidget *pParent, const QByteArray &baHost,
14 int iPort ) :
15 QWidget( pParent ) 15 QWidget( pParent )
16{ 16{
17 setupUi( this ); 17 setupUi( this );
18 18
19 { 19 pCli = new ClientThread( this, baHost, iPort );
20 ConnectDlg dlg( this );
21 dlg.exec();
22
23 sio << "Connect: " << dlg.getHostname().constData() << ":"
24 << dlg.getPort() << sio.nl;
25
26 pCli = new ClientThread( this, dlg.getHostname(), dlg.getPort() );
27 }
28 pCli->start();
29 connect( pCli, SIGNAL(recv( Gats::Object *)), 20 connect( pCli, SIGNAL(recv( Gats::Object *)),
30 this, SLOT(recv(Gats::Object *)), Qt::QueuedConnection ); 21 this, SLOT(recv(Gats::Object *)), Qt::QueuedConnection );
22
23 pCli->start();
31} 24}
32 25
33ClientWidget::~ClientWidget() 26ClientWidget::~ClientWidget()
diff --git a/src/gatscon/clientwidget.h b/src/gatscon/clientwidget.h
index 21fb1b7..9ce2798 100644
--- a/src/gatscon/clientwidget.h
+++ b/src/gatscon/clientwidget.h
@@ -12,7 +12,7 @@ class ClientWidget : public QWidget, protected Ui::ClientWidget
12{ 12{
13 Q_OBJECT; 13 Q_OBJECT;
14public: 14public:
15 ClientWidget( QWidget *pParent=NULL ); 15 ClientWidget( QWidget *pParent, const QByteArray &baHost, int iPort );
16 virtual ~ClientWidget(); 16 virtual ~ClientWidget();
17 17
18public slots: 18public slots:
diff --git a/src/gatscon/mainwnd.cpp b/src/gatscon/mainwnd.cpp
index c86e1c2..f20a531 100644
--- a/src/gatscon/mainwnd.cpp
+++ b/src/gatscon/mainwnd.cpp
@@ -1,5 +1,10 @@
1#include "mainwnd.h" 1#include "mainwnd.h"
2
2#include "clientwidget.h" 3#include "clientwidget.h"
4#include "proxywidget.h"
5
6#include "connectdlg.h"
7#include "setupproxydlg.h"
3 8
4MainWnd::MainWnd() 9MainWnd::MainWnd()
5{ 10{
@@ -12,11 +17,29 @@ MainWnd::~MainWnd()
12 17
13void MainWnd::connect() 18void MainWnd::connect()
14{ 19{
15 setCentralWidget( new ClientWidget( this ) ); 20 ConnectDlg dlg( this );
21 if( dlg.exec() == QDialog::Accepted )
22 {
23 setCentralWidget(
24 new ClientWidget(
25 this, dlg.getHostname(), dlg.getPort()
26 )
27 );
28 }
16} 29}
17 30
18void MainWnd::proxy() 31void MainWnd::proxy()
19{ 32{
33 SetupProxyDlg dlg( this );
34
35 if( dlg.exec() == QDialog::Accepted )
36 {
37 setCentralWidget(
38 new ProxyWidget(
39 this, dlg.getPortIn(), dlg.getHostOut(), dlg.getPortOut()
40 )
41 );
42 }
20} 43}
21 44
22void MainWnd::open() 45void MainWnd::open()
diff --git a/src/gatscon/proxythread.cpp b/src/gatscon/proxythread.cpp
new file mode 100644
index 0000000..574b56b
--- /dev/null
+++ b/src/gatscon/proxythread.cpp
@@ -0,0 +1,108 @@
1#include "proxythread.h"
2
3#include <gats/types.h>
4
5#include <bu/tcpsocket.h>
6#include <bu/tcpserversocket.h>
7#include <bu/sio.h>
8#include <bu/membuf.h>
9
10using namespace Bu;
11
12ProxyThread::ProxyThread( QObject *pParent, int iPortIn,
13 const QByteArray &baHostOut, int iPortOut ) :
14 QThread( pParent ),
15 pHost( NULL ),
16 iPortIn( iPortIn ),
17 baHostOut( baHostOut ),
18 iPortOut( iPortOut ),
19 gsCli( ssCli )
20{
21 pHost = new ProxyHostThread( pParent, this );
22}
23
24ProxyThread::~ProxyThread()
25{
26}
27
28void ProxyThread::send( Gats::Object *pObj )
29{
30 MemBuf bg;
31 Gats::GatsStream gs( bg );
32 gs.writeObject( pObj );
33 ssCli.write( bg.getString().getStr(), bg.getString().getSize() );
34}
35
36void ProxyThread::run()
37{
38 int iSockIn;
39
40 {
41 TcpServerSocket tsIn( iPortIn );
42 do
43 {
44 iSockIn = tsIn.accept( 5 );
45 } while( iSockIn < 0 );
46 }
47
48 emit gotConnection();
49
50 ssCli.setStream( new TcpSocket( iSockIn ) );
51 ssCli.setBlocking( true );
52
53 pHost->setStream(
54 new TcpSocket( baHostOut.constData(), iPortOut )
55 );
56
57 pHost->start();
58
59 while( !ssCli.isEos() )
60 {
61 Gats::Object *pObj = gsCli.readObject();
62 if( pObj == NULL )
63 continue;
64
65 pHost->send( pObj );
66 emit recv( pObj );
67 }
68
69}
70
71ProxyHostThread::ProxyHostThread( QObject *pParent, ProxyThread *pClient ) :
72 QThread( pParent ),
73 pClient( pClient ),
74 ssHst(),
75 gsHst( ssHst )
76{
77}
78
79ProxyHostThread::~ProxyHostThread()
80{
81}
82
83void ProxyHostThread::send( Gats::Object *pObj )
84{
85 MemBuf bg;
86 Gats::GatsStream gs( bg );
87 gs.writeObject( pObj );
88 ssHst.write( bg.getString().getStr(), bg.getString().getSize() );
89}
90
91void ProxyHostThread::setStream( Bu::Stream *pStr )
92{
93 ssHst.setStream( pStr );
94}
95
96void ProxyHostThread::run()
97{
98 while( !ssHst.isEos() )
99 {
100 Gats::Object *pObj = gsHst.readObject();
101 if( pObj == NULL )
102 continue;
103
104 pClient->send( pObj );
105 emit recv( pObj );
106 }
107}
108
diff --git a/src/gatscon/proxythread.h b/src/gatscon/proxythread.h
new file mode 100644
index 0000000..df75046
--- /dev/null
+++ b/src/gatscon/proxythread.h
@@ -0,0 +1,60 @@
1#ifndef PROXY_THREAD_H
2#define PROXY_THREAD_H
3
4#include <QThread>
5
6#include <bu/streamstack.h>
7#include <gats/gatsstream.h>
8
9class ProxyThread : public QThread
10{
11 Q_OBJECT;
12public:
13 ProxyThread( QObject *pParent, int iPortIn, const QByteArray &baHostOut,
14 int iPortOut );
15 virtual ~ProxyThread();
16
17 class ProxyHostThread *pHost;
18
19 void send( Gats::Object *pObj );
20
21signals:
22 void recv( Gats::Object *pObj );
23 void gotConnection();
24
25protected:
26 virtual void run();
27
28private:
29 int iPortIn;
30 QByteArray baHostOut;
31 int iPortOut;
32
33 Bu::StreamStack ssCli;
34 Gats::GatsStream gsCli;
35};
36
37class ProxyHostThread : public QThread
38{
39 Q_OBJECT;
40public:
41 ProxyHostThread( QObject *pParent, ProxyThread *pClient );
42 virtual ~ProxyHostThread();
43
44 void send( Gats::Object *pObj );
45
46 void setStream( Bu::Stream *pStr );
47
48signals:
49 void recv( Gats::Object *pObj );
50
51protected:
52 virtual void run();
53
54private:
55 ProxyThread *pClient;
56 Bu::StreamStack ssHst;
57 Gats::GatsStream gsHst;
58};
59
60#endif
diff --git a/src/gatscon/proxywidget.cpp b/src/gatscon/proxywidget.cpp
new file mode 100644
index 0000000..28bd1fc
--- /dev/null
+++ b/src/gatscon/proxywidget.cpp
@@ -0,0 +1,115 @@
1#include "proxywidget.h"
2#include "proxythread.h"
3
4#include "gatstotree.h"
5
6#include <QMessageBox>
7
8#include <gats/types.h>
9#include <bu/sio.h>
10
11using namespace Bu;
12
13ProxyWidget::ProxyWidget( QWidget *pParent, int iPortIn,
14 const QByteArray baHost, int iPortOut ) :
15 QWidget( pParent ),
16 pPrx( NULL )
17{
18 setupUi( this );
19
20 pPrx = new ProxyThread( this, iPortIn, baHost, iPortOut );
21
22 connect( pPrx, SIGNAL(gotConnection()),
23 this, SLOT(gotConnection()), Qt::QueuedConnection );
24 connect( pPrx, SIGNAL(recv( Gats::Object *)),
25 this, SLOT(clientRecv(Gats::Object *)), Qt::QueuedConnection );
26 connect( pPrx->pHost, SIGNAL(recv( Gats::Object *)),
27 this, SLOT(hostRecv(Gats::Object *)), Qt::QueuedConnection );
28
29 pPrx->start();
30}
31
32ProxyWidget::~ProxyWidget()
33{
34}
35
36void ProxyWidget::sendToClient()
37{
38 try
39 {
40 Gats::Object *pObj = Gats::Object::strToGats(
41 leGats->text().toAscii().constData()
42 );
43 sio << "Send: " << *pObj << sio.nl;
44 QTreeWidgetItem *pIt = new QTreeWidgetItem(
45 twHistory->invisibleRootItem()
46 );
47 pIt->setText( 0, "proxy -> client" );
48 gatsToTree( pIt, pObj );
49 pPrx->send( pObj );
50 delete pObj;
51
52 leGats->setText("");
53 leGats->setFocus();
54 }
55 catch( Bu::ExceptionBase &e )
56 {
57 QMessageBox::critical( this, "GatsCon - Error", e.what() );
58 }
59}
60
61void ProxyWidget::sendToServer()
62{
63 try
64 {
65 Gats::Object *pObj = Gats::Object::strToGats(
66 leGats->text().toAscii().constData()
67 );
68 sio << "Send: " << *pObj << sio.nl;
69 QTreeWidgetItem *pIt = new QTreeWidgetItem(
70 twHistory->invisibleRootItem()
71 );
72 pIt->setText( 0, "proxy -> host" );
73 gatsToTree( pIt, pObj );
74 pPrx->pHost->send( pObj );
75 delete pObj;
76
77 leGats->setText("");
78 leGats->setFocus();
79 }
80 catch( Bu::ExceptionBase &e )
81 {
82 QMessageBox::critical( this, "GatsCon - Error", e.what() );
83 }
84}
85
86void ProxyWidget::clientRecv( Gats::Object *pObj )
87{
88 sio << "Recv: " << *pObj << sio.nl;
89
90 QTreeWidgetItem *pIt = new QTreeWidgetItem(
91 twHistory->invisibleRootItem()
92 );
93 pIt->setText( 0, "client -> host" );
94 gatsToTree( pIt, pObj );
95 delete pObj;
96}
97
98void ProxyWidget::hostRecv( Gats::Object *pObj )
99{
100 sio << "Recv: " << *pObj << sio.nl;
101
102 QTreeWidgetItem *pIt = new QTreeWidgetItem(
103 twHistory->invisibleRootItem()
104 );
105 pIt->setText( 0, "host -> client" );
106 gatsToTree( pIt, pObj );
107 delete pObj;
108}
109
110void ProxyWidget::gotConnection()
111{
112 lwConnect->stop();
113 swRoot->setCurrentIndex( 1 );
114}
115
diff --git a/src/gatscon/proxywidget.h b/src/gatscon/proxywidget.h
new file mode 100644
index 0000000..0ef1fd4
--- /dev/null
+++ b/src/gatscon/proxywidget.h
@@ -0,0 +1,30 @@
1#ifndef PROXY_WIDGET_H
2#define PROXY_WIDGET_H
3
4#include "ui_proxywidget.h"
5
6namespace Gats
7{
8 class Object;
9};
10
11class ProxyWidget : public QWidget, protected Ui::ProxyWidget
12{
13 Q_OBJECT;
14public:
15 ProxyWidget( QWidget *pParent, int iPortIn, const QByteArray baHost,
16 int iPortOut );
17 virtual ~ProxyWidget();
18
19public slots:
20 void sendToClient();
21 void sendToServer();
22 void clientRecv( Gats::Object *pObj );
23 void hostRecv( Gats::Object *pObj );
24 void gotConnection();
25
26private:
27 class ProxyThread *pPrx;
28};
29
30#endif
diff --git a/src/gatscon/proxywidget.ui b/src/gatscon/proxywidget.ui
new file mode 100644
index 0000000..995fc73
--- /dev/null
+++ b/src/gatscon/proxywidget.ui
@@ -0,0 +1,181 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<ui version="4.0">
3 <class>ProxyWidget</class>
4 <widget class="QWidget" name="ProxyWidget">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>338</width>
10 <height>300</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>Form</string>
15 </property>
16 <layout class="QVBoxLayout" name="verticalLayout_2">
17 <property name="margin">
18 <number>0</number>
19 </property>
20 <item>
21 <widget class="QStackedWidget" name="swRoot">
22 <property name="currentIndex">
23 <number>0</number>
24 </property>
25 <widget class="QWidget" name="page">
26 <layout class="QVBoxLayout" name="verticalLayout_4">
27 <item>
28 <spacer name="verticalSpacer">
29 <property name="orientation">
30 <enum>Qt::Vertical</enum>
31 </property>
32 <property name="sizeHint" stdset="0">
33 <size>
34 <width>20</width>
35 <height>40</height>
36 </size>
37 </property>
38 </spacer>
39 </item>
40 <item>
41 <widget class="QLabel" name="label_2">
42 <property name="text">
43 <string>Listening for connections...</string>
44 </property>
45 <property name="alignment">
46 <set>Qt::AlignCenter</set>
47 </property>
48 </widget>
49 </item>
50 <item>
51 <widget class="LoadingWidget" name="lwConnect" native="true">
52 <property name="minimumSize">
53 <size>
54 <width>0</width>
55 <height>50</height>
56 </size>
57 </property>
58 </widget>
59 </item>
60 <item>
61 <spacer name="verticalSpacer_2">
62 <property name="orientation">
63 <enum>Qt::Vertical</enum>
64 </property>
65 <property name="sizeHint" stdset="0">
66 <size>
67 <width>20</width>
68 <height>40</height>
69 </size>
70 </property>
71 </spacer>
72 </item>
73 </layout>
74 </widget>
75 <widget class="QWidget" name="page_2">
76 <layout class="QVBoxLayout" name="verticalLayout_3">
77 <item>
78 <widget class="QTreeWidget" name="twHistory">
79 <column>
80 <property name="text">
81 <string>Name</string>
82 </property>
83 </column>
84 <column>
85 <property name="text">
86 <string>Type</string>
87 </property>
88 </column>
89 <column>
90 <property name="text">
91 <string>Value</string>
92 </property>
93 </column>
94 </widget>
95 </item>
96 <item>
97 <layout class="QHBoxLayout" name="horizontalLayout">
98 <item>
99 <widget class="QLabel" name="label">
100 <property name="text">
101 <string>Gats:</string>
102 </property>
103 </widget>
104 </item>
105 <item>
106 <widget class="QLineEdit" name="leGats"/>
107 </item>
108 <item>
109 <layout class="QVBoxLayout" name="verticalLayout">
110 <item>
111 <widget class="QPushButton" name="pushButton">
112 <property name="text">
113 <string>Send to Client</string>
114 </property>
115 </widget>
116 </item>
117 <item>
118 <widget class="QPushButton" name="pushButton_2">
119 <property name="text">
120 <string>Send to Server</string>
121 </property>
122 </widget>
123 </item>
124 </layout>
125 </item>
126 </layout>
127 </item>
128 </layout>
129 </widget>
130 </widget>
131 </item>
132 </layout>
133 </widget>
134 <customwidgets>
135 <customwidget>
136 <class>LoadingWidget</class>
137 <extends>QWidget</extends>
138 <header>loadingwidget.h</header>
139 <container>1</container>
140 </customwidget>
141 </customwidgets>
142 <resources/>
143 <connections>
144 <connection>
145 <sender>pushButton</sender>
146 <signal>clicked()</signal>
147 <receiver>ProxyWidget</receiver>
148 <slot>sendToClient()</slot>
149 <hints>
150 <hint type="sourcelabel">
151 <x>280</x>
152 <y>258</y>
153 </hint>
154 <hint type="destinationlabel">
155 <x>392</x>
156 <y>223</y>
157 </hint>
158 </hints>
159 </connection>
160 <connection>
161 <sender>pushButton_2</sender>
162 <signal>clicked()</signal>
163 <receiver>ProxyWidget</receiver>
164 <slot>sendToServer()</slot>
165 <hints>
166 <hint type="sourcelabel">
167 <x>306</x>
168 <y>284</y>
169 </hint>
170 <hint type="destinationlabel">
171 <x>199</x>
172 <y>340</y>
173 </hint>
174 </hints>
175 </connection>
176 </connections>
177 <slots>
178 <slot>sendToClient()</slot>
179 <slot>sendToServer()</slot>
180 </slots>
181</ui>
diff --git a/src/gatscon/setupproxydlg.cpp b/src/gatscon/setupproxydlg.cpp
new file mode 100644
index 0000000..7c7a873
--- /dev/null
+++ b/src/gatscon/setupproxydlg.cpp
@@ -0,0 +1,27 @@
1#include "setupproxydlg.h"
2
3SetupProxyDlg::SetupProxyDlg( QWidget *pParent ) :
4 QDialog( pParent )
5{
6 setupUi( this );
7}
8
9SetupProxyDlg::~SetupProxyDlg()
10{
11}
12
13int SetupProxyDlg::getPortIn() const
14{
15 return sbPortIn->value();
16}
17
18QByteArray SetupProxyDlg::getHostOut() const
19{
20 return leHostOut->text().toAscii();
21}
22
23int SetupProxyDlg::getPortOut() const
24{
25 return sbPortOut->value();
26}
27
diff --git a/src/gatscon/setupproxydlg.h b/src/gatscon/setupproxydlg.h
new file mode 100644
index 0000000..6cc31bd
--- /dev/null
+++ b/src/gatscon/setupproxydlg.h
@@ -0,0 +1,18 @@
1#ifndef SETUP_PROXY_DLG_H
2#define SETUP_PROXY_DLG_H
3
4#include "ui_setupproxydlg.h"
5
6class SetupProxyDlg : public QDialog, protected Ui::SetupProxyDlg
7{
8 Q_OBJECT;
9public:
10 SetupProxyDlg( QWidget *pParent=NULL );
11 virtual ~SetupProxyDlg();
12
13 int getPortIn() const;
14 QByteArray getHostOut() const;
15 int getPortOut() const;
16};
17
18#endif
diff --git a/src/gatscon/setupproxydlg.ui b/src/gatscon/setupproxydlg.ui
new file mode 100644
index 0000000..8482193
--- /dev/null
+++ b/src/gatscon/setupproxydlg.ui
@@ -0,0 +1,112 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<ui version="4.0">
3 <class>SetupProxyDlg</class>
4 <widget class="QDialog" name="SetupProxyDlg">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>359</width>
10 <height>122</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>GatsCon - Setup Proxy</string>
15 </property>
16 <layout class="QVBoxLayout" name="verticalLayout">
17 <item>
18 <layout class="QFormLayout" name="formLayout">
19 <item row="0" column="0">
20 <widget class="QLabel" name="label_2">
21 <property name="text">
22 <string>Listening port:</string>
23 </property>
24 </widget>
25 </item>
26 <item row="0" column="1">
27 <widget class="QSpinBox" name="sbPortIn">
28 <property name="minimum">
29 <number>1</number>
30 </property>
31 <property name="maximum">
32 <number>32767</number>
33 </property>
34 </widget>
35 </item>
36 <item row="1" column="0">
37 <widget class="QLabel" name="label_3">
38 <property name="text">
39 <string>Target host:</string>
40 </property>
41 </widget>
42 </item>
43 <item row="1" column="1">
44 <widget class="QLineEdit" name="leHostOut"/>
45 </item>
46 <item row="2" column="0">
47 <widget class="QLabel" name="label_4">
48 <property name="text">
49 <string>Target port:</string>
50 </property>
51 </widget>
52 </item>
53 <item row="2" column="1">
54 <widget class="QSpinBox" name="sbPortOut">
55 <property name="minimum">
56 <number>1</number>
57 </property>
58 <property name="maximum">
59 <number>32767</number>
60 </property>
61 </widget>
62 </item>
63 </layout>
64 </item>
65 <item>
66 <widget class="QDialogButtonBox" name="buttonBox">
67 <property name="orientation">
68 <enum>Qt::Horizontal</enum>
69 </property>
70 <property name="standardButtons">
71 <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
72 </property>
73 </widget>
74 </item>
75 </layout>
76 </widget>
77 <resources/>
78 <connections>
79 <connection>
80 <sender>buttonBox</sender>
81 <signal>accepted()</signal>
82 <receiver>SetupProxyDlg</receiver>
83 <slot>accept()</slot>
84 <hints>
85 <hint type="sourcelabel">
86 <x>248</x>
87 <y>254</y>
88 </hint>
89 <hint type="destinationlabel">
90 <x>157</x>
91 <y>274</y>
92 </hint>
93 </hints>
94 </connection>
95 <connection>
96 <sender>buttonBox</sender>
97 <signal>rejected()</signal>
98 <receiver>SetupProxyDlg</receiver>
99 <slot>reject()</slot>
100 <hints>
101 <hint type="sourcelabel">
102 <x>316</x>
103 <y>260</y>
104 </hint>
105 <hint type="destinationlabel">
106 <x>286</x>
107 <y>274</y>
108 </hint>
109 </hints>
110 </connection>
111 </connections>
112</ui>