diff options
author | Morten Sorvig <msorvig@trolltech.com> | 2009-08-20 19:00:13 +0200 |
---|---|---|
committer | Morten Sorvig <msorvig@trolltech.com> | 2009-08-20 19:00:13 +0200 |
commit | 541b7c36250aa0338665a83fab6abf3bd30e36b2 (patch) | |
tree | b13eecaed1a558a3e92e2a8e71ffa0b163419f03 | |
parent | 957e3cc7e3722bd93f78976c68eba0e5a0535f61 (diff) |
Add an active session limit
-rw-r--r-- | demos/irc/main.cpp | 2 | ||||
-rw-r--r-- | src/webclient.cpp | 11 | ||||
-rw-r--r-- | src/webclient.h | 4 | ||||
-rw-r--r-- | src/webclientserver.cpp | 9 | ||||
-rw-r--r-- | src/webclientserver.h | 4 |
5 files changed, 30 insertions, 0 deletions
diff --git a/demos/irc/main.cpp b/demos/irc/main.cpp index e505173..947e352 100644 --- a/demos/irc/main.cpp +++ b/demos/irc/main.cpp @@ -66,6 +66,8 @@ int main(int argc, char **argv) WebClient webClient; +// webClient.setActiveSessionLimit(100); + QRcServer qrcServer; QRcServer object; diff --git a/src/webclient.cpp b/src/webclient.cpp index 517d971..3a5320d 100644 --- a/src/webclient.cpp +++ b/src/webclient.cpp @@ -16,6 +16,7 @@ void WebClient::setPort(quint16 port) { delete server; server = new Server(port); + connect(server, SIGNAL(sessionBegin(Session *)), this, SLOT(newSession_internal(Session *))); @@ -31,6 +32,16 @@ void WebClient::setRootWidget(QWidget *widget) globalRootWidget = widget; } +void WebClient::setActiveSessionLimit(int sessionLimit) +{ + this->server->activeSessionLimit = sessionLimit; +} + +void WebClient::setActiveSessionLimitHtml(const QString &html) +{ + this->server->activeSessionLimitHtml = html.toUtf8(); +} + void WebClient::newSession_internal(Session *session) { QWidget *rootWidget = 0; diff --git a/src/webclient.h b/src/webclient.h index c6f7e2c..f59d90f 100644 --- a/src/webclient.h +++ b/src/webclient.h @@ -19,8 +19,12 @@ public: void setRootWidget(QWidget *widget); void setPort(quint16 port); + void setActiveSessionLimit(int sessionLimit); + void setActiveSessionLimitHtml(const QString &html); + enum WidgetHint { StaticWidget, NoDisplayWidget }; void setWidgetHint(QWidget *widget, WidgetHint hint); + signals: void newSession(QWidget **rootWidget, Session *session); private slots: diff --git a/src/webclientserver.cpp b/src/webclientserver.cpp index f690cf5..3e0f7eb 100644 --- a/src/webclientserver.cpp +++ b/src/webclientserver.cpp @@ -187,6 +187,8 @@ Server::Server(quint16 port) bytesRead = 0; serverStart = QDateTime::currentDateTime(); totalSessions = 0; + + activeSessionLimitHtml = "<html><body>Active session limit exceeded.</body></html>"; } Server::~Server() @@ -264,6 +266,13 @@ void Server::dataOnSocket() // ### accept unknown sessions for now, TODO do authentication here. DEBUG << "new session for" << sessionId; + if (totalSessions >= activeSessionLimit) { + dynamicBytesWritten += activeSessionLimitHtml.size(); + socket->write(activeSessionLimitHtml); + socket->disconnectFromHost(); + return; + } + ++totalSessions; sessionId = nextCookieId; nextCookieId = qrand(); // ### diff --git a/src/webclientserver.h b/src/webclientserver.h index 9a823df..ebaf6a4 100644 --- a/src/webclientserver.h +++ b/src/webclientserver.h @@ -115,6 +115,10 @@ private: int totalSessions; QDateTime serverStart; QByteArray createStatiticsPage(); + +public: + int activeSessionLimit; + QByteArray activeSessionLimitHtml; }; #endif |