/vp_plugins/qtservice-2.6_1-opensource/examples/server/main.cpp

http://cupsfilter.googlecode.com/ · C++ · 190 lines · 112 code · 23 blank · 55 comment · 8 complexity · ef4c1dd3b2420d2180518e68c72d8b76 MD5 · raw file

  1. /****************************************************************************
  2. **
  3. ** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
  4. ** All rights reserved.
  5. ** Contact: Nokia Corporation (qt-info@nokia.com)
  6. **
  7. ** This file is part of a Qt Solutions component.
  8. **
  9. ** Commercial Usage
  10. ** Licensees holding valid Qt Commercial licenses may use this file in
  11. ** accordance with the Qt Solutions Commercial License Agreement provided
  12. ** with the Software or, alternatively, in accordance with the terms
  13. ** contained in a written agreement between you and Nokia.
  14. **
  15. ** GNU Lesser General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU Lesser
  17. ** General Public License version 2.1 as published by the Free Software
  18. ** Foundation and appearing in the file LICENSE.LGPL included in the
  19. ** packaging of this file. Please review the following information to
  20. ** ensure the GNU Lesser General Public License version 2.1 requirements
  21. ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
  22. **
  23. ** In addition, as a special exception, Nokia gives you certain
  24. ** additional rights. These rights are described in the Nokia Qt LGPL
  25. ** Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
  26. ** package.
  27. **
  28. ** GNU General Public License Usage
  29. ** Alternatively, this file may be used under the terms of the GNU
  30. ** General Public License version 3.0 as published by the Free Software
  31. ** Foundation and appearing in the file LICENSE.GPL included in the
  32. ** packaging of this file. Please review the following information to
  33. ** ensure the GNU General Public License version 3.0 requirements will be
  34. ** met: http://www.gnu.org/copyleft/gpl.html.
  35. **
  36. ** Please note Third Party Software included with Qt Solutions may impose
  37. ** additional restrictions and it is the user's responsibility to ensure
  38. ** that they have met the licensing requirements of the GPL, LGPL, or Qt
  39. ** Solutions Commercial license and the relevant license of the Third
  40. ** Party Software they are using.
  41. **
  42. ** If you are unsure which license is appropriate for your use, please
  43. ** contact Nokia at qt-info@nokia.com.
  44. **
  45. ****************************************************************************/
  46. #include <QtCore/QCoreApplication>
  47. #include <QtNetwork/QTcpServer>
  48. #include <QtNetwork/QTcpSocket>
  49. #include <QtCore/QTextStream>
  50. #include <QtCore/QDateTime>
  51. #include <QtCore/QStringList>
  52. #include <QtCore/QDir>
  53. #include <QtCore/QSettings>
  54. #include "qtservice.h"
  55. // HttpDaemon is the the class that implements the simple HTTP server.
  56. class HttpDaemon : public QTcpServer
  57. {
  58. Q_OBJECT
  59. public:
  60. HttpDaemon(quint16 port, QObject* parent = 0)
  61. : QTcpServer(parent), disabled(false)
  62. {
  63. listen(QHostAddress::Any, port);
  64. }
  65. void incomingConnection(int socket)
  66. {
  67. if (disabled)
  68. return;
  69. // When a new client connects, the server constructs a QTcpSocket and all
  70. // communication with the client is done over this QTcpSocket. QTcpSocket
  71. // works asynchronously, this means that all the communication is done
  72. // in the two slots readClient() and discardClient().
  73. QTcpSocket* s = new QTcpSocket(this);
  74. connect(s, SIGNAL(readyRead()), this, SLOT(readClient()));
  75. connect(s, SIGNAL(disconnected()), this, SLOT(discardClient()));
  76. s->setSocketDescriptor(socket);
  77. QtServiceBase::instance()->logMessage("New Connection");
  78. }
  79. void pause()
  80. {
  81. disabled = true;
  82. }
  83. void resume()
  84. {
  85. disabled = false;
  86. }
  87. private slots:
  88. void readClient()
  89. {
  90. if (disabled)
  91. return;
  92. // This slot is called when the client sent data to the server. The
  93. // server looks if it was a get request and sends a very simple HTML
  94. // document back.
  95. QTcpSocket* socket = (QTcpSocket*)sender();
  96. if (socket->canReadLine()) {
  97. QStringList tokens = QString(socket->readLine()).split(QRegExp("[ \r\n][ \r\n]*"));
  98. if (tokens[0] == "GET") {
  99. QTextStream os(socket);
  100. os.setAutoDetectUnicode(true);
  101. os << "HTTP/1.0 200 Ok\r\n"
  102. "Content-Type: text/html; charset=\"utf-8\"\r\n"
  103. "\r\n"
  104. "<h1>Nothing to see here</h1>\n"
  105. << QDateTime::currentDateTime().toString() << "\n";
  106. socket->close();
  107. QtServiceBase::instance()->logMessage("Wrote to client");
  108. if (socket->state() == QTcpSocket::UnconnectedState) {
  109. delete socket;
  110. QtServiceBase::instance()->logMessage("Connection closed");
  111. }
  112. }
  113. }
  114. }
  115. void discardClient()
  116. {
  117. QTcpSocket* socket = (QTcpSocket*)sender();
  118. socket->deleteLater();
  119. QtServiceBase::instance()->logMessage("Connection closed");
  120. }
  121. private:
  122. bool disabled;
  123. };
  124. class HttpService : public QtService<QCoreApplication>
  125. {
  126. public:
  127. HttpService(int argc, char **argv)
  128. : QtService<QCoreApplication>(argc, argv, "Qt HTTP Daemon")
  129. {
  130. setServiceDescription("A dummy HTTP service implemented with Qt");
  131. setServiceFlags(QtServiceBase::CanBeSuspended);
  132. }
  133. protected:
  134. void start()
  135. {
  136. QCoreApplication *app = application();
  137. quint16 port = (app->argc() > 1) ?
  138. QString::fromLocal8Bit(app->argv()[1]).toUShort() : 8080;
  139. daemon = new HttpDaemon(port, app);
  140. if (!daemon->isListening()) {
  141. logMessage(QString("Failed to bind to port %1").arg(daemon->serverPort()), QtServiceBase::Error);
  142. app->quit();
  143. }
  144. }
  145. void pause()
  146. {
  147. daemon->pause();
  148. }
  149. void resume()
  150. {
  151. daemon->resume();
  152. }
  153. private:
  154. HttpDaemon *daemon;
  155. };
  156. #include "main.moc"
  157. int main(int argc, char **argv)
  158. {
  159. #if !defined(Q_WS_WIN)
  160. // QtService stores service settings in SystemScope, which normally require root privileges.
  161. // To allow testing this example as non-root, we change the directory of the SystemScope settings file.
  162. QSettings::setPath(QSettings::NativeFormat, QSettings::SystemScope, QDir::tempPath());
  163. qWarning("(Example uses dummy settings file: %s/QtSoftware.conf)", QDir::tempPath().toLatin1().constData());
  164. #endif
  165. HttpService service(argc, argv);
  166. return service.exec();
  167. }