summaryrefslogtreecommitdiffstats
path: root/kpf/src/ServerWizard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kpf/src/ServerWizard.cpp')
-rw-r--r--kpf/src/ServerWizard.cpp410
1 files changed, 410 insertions, 0 deletions
diff --git a/kpf/src/ServerWizard.cpp b/kpf/src/ServerWizard.cpp
new file mode 100644
index 00000000..8ca47e22
--- /dev/null
+++ b/kpf/src/ServerWizard.cpp
@@ -0,0 +1,410 @@
+/*
+ KPF - Public fileserver for KDE
+
+ Copyright 2001 Rik Hemsley (rikkus) <[email protected]>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to
+ deal in the Software without restriction, including without limitation the
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qspinbox.h>
+#include <qdir.h>
+#include <qptrlist.h>
+#include <qlineedit.h>
+
+#include <kapplication.h>
+#include <klineedit.h>
+#include <kdialog.h>
+#include <klocale.h>
+#include <kurlrequester.h>
+#include <kfiledialog.h>
+
+#include "Defines.h"
+#include "ServerWizard.h"
+#include "WebServerManager.h"
+#include "WebServer.h"
+#include "Help.h"
+#include <dnssd/servicebrowser.h>
+
+#include <unistd.h>
+
+namespace KPF
+{
+ ServerWizard::ServerWizard(QWidget * parent)
+ : KWizard(parent, "KPF::ServerWizard", true)
+ {
+ setCaption(i18n("New Server - %1").arg("kpf"));
+
+ page1_ = new QWidget(this);
+ page2_ = new QWidget(this);
+ page3_ = new QWidget(this);
+// page4_ = new QWidget(this);
+ page5_ = new QWidget(this);
+
+ QLabel * l_rootDirectoryHelp =
+ new QLabel
+ (
+ i18n
+ (
+ "<p>"
+ "Specify the directory which contains the files"
+ " you wish to share."
+ "</p>"
+ "<p>"
+ "<em>Warning</em>: Do not share any directories that contain"
+ " sensitive information!"
+ "</p>"
+ ),
+ page1_
+ );
+
+ QLabel * l_listenPortHelp =
+ new QLabel
+ (
+ i18n
+ (
+ "<p>"
+ "Specify the network `port' on which the server should"
+ " listen for connections."
+ "</p>"
+ ),
+ page2_
+ );
+
+ QLabel * l_bandwidthLimitHelp =
+ new QLabel
+ (
+ i18n
+ (
+ "<p>"
+ "Specify the maximum amount of data (in kilobytes) that will be"
+ " sent out per second."
+ "</p>"
+ "<p>"
+ "This allows you to keep some bandwidth for yourself instead"
+ " of allowing connections with kpf to hog your connection."
+ "</p>"
+ ),
+ page3_
+ );
+/*
+ QLabel * l_connectionLimitHelp =
+ new QLabel
+ (
+ i18n
+ (
+ "<p>"
+ "Specify the maximum number of connections allowed at"
+ " any one time."
+ "</p>"
+ ),
+ page4_
+ );
+*/
+ bool canPublish = DNSSD::ServiceBrowser::isAvailable() == DNSSD::ServiceBrowser::Working;
+ QLabel * l_serverNameHelp =
+ new QLabel
+ (
+ KPF::HelpText::getServerNameHelp(),
+ page5_
+ );
+
+ QLabel * l_root_ =
+ new QLabel(i18n("&Root directory:"), page1_);
+
+ QLabel * l_listenPort_ =
+ new QLabel(i18n("&Listen port:"), page2_);
+
+ QLabel * l_bandwidthLimit_ =
+ new QLabel(i18n("&Bandwidth limit:"), page3_);
+
+// QLabel * l_connectionLimit_ =
+// new QLabel(i18n("Connection &limit"), page4_);
+
+ QLabel * l_serverName_ =
+ new QLabel(i18n("&Server name:"), page5_);
+
+ if(!canPublish)
+ l_serverName_->setEnabled(false);
+
+ kur_root_ = new KURLRequester(page1_);
+
+ sb_listenPort_ = new QSpinBox(1, 65535, 1, page2_);
+
+ sb_bandwidthLimit_ = new QSpinBox(1, 999999, 1, page3_);
+// sb_connectionLimit_ = new QSpinBox(1, 9999, 1, page4_);
+
+ char hostname[255];
+ gethostname(hostname, 255-2);
+ hostname[255-1]=0;
+ le_serverName_ = new QLineEdit(hostname, page5_);
+
+ if(!canPublish)
+ le_serverName_->setEnabled(false);
+
+ l_root_ ->setBuddy(kur_root_);
+ l_listenPort_ ->setBuddy(sb_listenPort_);
+ l_bandwidthLimit_ ->setBuddy(sb_bandwidthLimit_);
+ l_serverName_ ->setBuddy(le_serverName_);
+// l_connectionLimit_ ->setBuddy(sb_connectionLimit_);
+
+ sb_listenPort_
+ ->setValue(WebServerManager::instance()->nextFreePort());
+
+ sb_bandwidthLimit_ ->setValue(Config::DefaultBandwidthLimit);
+ sb_bandwidthLimit_ ->setSuffix(i18n(" kB/s"));
+// sb_connectionLimit_ ->setValue(Config::DefaultConnectionLimit);
+
+ QVBoxLayout * layout1 =
+ new QVBoxLayout(page1_, KDialog::marginHint(), KDialog::spacingHint());
+
+ QVBoxLayout * layout2 =
+ new QVBoxLayout(page2_, KDialog::marginHint(), KDialog::spacingHint());
+
+ QVBoxLayout * layout3 =
+ new QVBoxLayout(page3_, KDialog::marginHint(), KDialog::spacingHint());
+
+// QVBoxLayout * layout4 =
+// new QVBoxLayout(page4_, KDialog::marginHint(), KDialog::spacingHint());
+
+ QVBoxLayout * layout5 =
+ new QVBoxLayout(page5_, KDialog::marginHint(), KDialog::spacingHint());
+
+ layout1->addWidget(l_rootDirectoryHelp);
+ layout2->addWidget(l_listenPortHelp);
+ layout3->addWidget(l_bandwidthLimitHelp);
+// layout4->addWidget(l_connectionLimitHelp);
+ layout5->addWidget(l_serverNameHelp);
+
+ QHBoxLayout * layout10 = new QHBoxLayout(layout1);
+
+ layout10->addWidget(l_root_);
+ layout10->addWidget(kur_root_);
+
+ layout1->addStretch(1);
+
+ QHBoxLayout * layout20 = new QHBoxLayout(layout2);
+
+ layout20->addWidget(l_listenPort_);
+ layout20->addWidget(sb_listenPort_);
+
+ layout2->addStretch(1);
+
+ QHBoxLayout * layout30 = new QHBoxLayout(layout3);
+
+ layout30->addWidget(l_bandwidthLimit_);
+ layout30->addWidget(sb_bandwidthLimit_);
+
+ layout3->addStretch(1);
+
+// QHBoxLayout * layout40 = new QHBoxLayout(layout4);
+
+// layout40->addWidget(l_connectionLimit_);
+// layout40->addWidget(sb_connectionLimit_);
+
+// layout4->addStretch(1);
+
+ QHBoxLayout * layout50 = new QHBoxLayout(layout5);
+
+ layout50->addWidget(l_serverName_);
+ layout50->addWidget(le_serverName_);
+
+ addPage(page1_, i18n("Root Directory"));
+ addPage(page2_, i18n("Listen Port"));
+ addPage(page3_, i18n("Bandwidth Limit"));
+// addPage(page4_, i18n("Connection Limit"));
+ addPage(page5_, i18n("Server Name"));
+
+ kur_root_->setURL(QDir::homeDirPath() + "/public_html");
+ kur_root_->setMode
+ (KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly);
+
+// setFinishEnabled(page4_, true);
+ setFinishEnabled(page5_, true);
+
+ // This slot sets the 'Next' button on page 1 to enabled/disabled
+ // depending on whether the path is OK.
+
+ connect
+ (
+ kur_root_,
+ SIGNAL(textChanged(const QString &)),
+ SLOT(slotServerRootChanged(const QString &))
+ );
+
+ // Used for setting the caption on the file dialog.
+
+ connect
+ (
+ kur_root_,
+ SIGNAL(openFileDialog(KURLRequester *)),
+ SLOT(slotOpenFileDialog(KURLRequester *))
+ );
+
+ // This slot sets the 'Next' button on page 2 to enabled/disabled
+ // depending on whether the port is OK.
+
+ connect
+ (
+ sb_listenPort_,
+ SIGNAL(valueChanged(int)),
+ SLOT(slotListenPortChanged(int))
+ );
+
+ // Update 'Next' button on page 1.
+
+ slotServerRootChanged(kur_root_->url());
+
+ // Update 'Next' button on page 2.
+
+ slotListenPortChanged(sb_listenPort_->value());
+ }
+
+ ServerWizard::~ServerWizard()
+ {
+ }
+
+ void
+ ServerWizard::setLocation(const QString & location)
+ {
+ kur_root_->setURL(location);
+ }
+
+ QString
+ ServerWizard::root() const
+ {
+ return kur_root_->url();
+ }
+
+ uint
+ ServerWizard::listenPort() const
+ {
+ return sb_listenPort_->value();
+ }
+
+ uint
+ ServerWizard::bandwidthLimit() const
+ {
+ return sb_bandwidthLimit_->value();
+ }
+ QString
+
+ ServerWizard::serverName() const
+ {
+ return le_serverName_->text();
+ }
+
+ uint
+ ServerWizard::connectionLimit() const
+ {
+ return Config::DefaultConnectionLimit; // sb_connectionLimit_->value();
+ }
+
+ void
+ ServerWizard::accept()
+ {
+ QWizard::accept();
+ emit(dying(this));
+ }
+
+ void
+ ServerWizard::reject()
+ {
+ QWizard::reject();
+ emit(dying(this));
+ }
+
+ void
+ ServerWizard::slotListenPortChanged(int newPort)
+ {
+ if (newPort <= 1024)
+ {
+ setNextEnabled(page2_, false);
+ return;
+ }
+
+ QPtrList<WebServer>
+ serverList(WebServerManager::instance()->serverListLocal());
+
+ for (QPtrListIterator<WebServer> it(serverList); it.current(); ++it)
+ {
+ if (it.current()->listenPort() == uint(newPort))
+ {
+ setNextEnabled(page2_, false);
+ return;
+ }
+ }
+
+ setNextEnabled(page2_, true);
+ }
+
+ void
+ ServerWizard::slotServerRootChanged(const QString & _root)
+ {
+ QString root(_root);
+
+ kpfDebug << root << endl;
+
+ // Duplicate ?
+
+ if (WebServerManager::instance()->hasServer(root))
+ {
+ kpfDebug << "Already have a server at " << root << endl;
+ setNextEnabled(page1_, false);
+ return;
+ }
+
+ if ("/" != root.right(1))
+ root += "/";
+
+ QFileInfo fi(root);
+
+ if (!fi.isDir()) // || (fi.dirPath() == QDir::homeDirPath()))
+ {
+ kpfDebug << root << " isn't a dir" << endl; //, or it's $HOME" << endl;
+ setNextEnabled(page1_, false);
+ return;
+ }
+
+ setNextEnabled(page1_, true);
+ }
+
+ void
+ ServerWizard::slotOpenFileDialog(KURLRequester * urlRequester)
+ {
+ KFileDialog * fileDialog = urlRequester->fileDialog();
+
+ if (0 == fileDialog)
+ {
+ kpfDebug << "URL requester's file dialog is 0" << endl;
+ return;
+ }
+
+ fileDialog->setCaption(i18n("Choose Directory to Share - %1").arg("kpf"));
+ }
+
+ void
+ ServerWizard::help()
+ {
+ kapp->invokeHelp("share-config", "kpf");
+ }
+}
+
+#include "ServerWizard.moc"
+// vim:ts=2:sw=2:tw=78:et