summaryrefslogtreecommitdiff
path: root/server/src/server.cc
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/server.cc')
-rw-r--r--server/src/server.cc103
1 files changed, 75 insertions, 28 deletions
diff --git a/server/src/server.cc b/server/src/server.cc
index a419181..d2921b8 100644
--- a/server/src/server.cc
+++ b/server/src/server.cc
@@ -52,6 +52,8 @@
static std::string error_box(std::string message)
{
std::string errorbox =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<pracro version=\"1.0\">\n"
" <course name=\"error\">\n"
" <macro name=\"error\">\n"
" <window caption=\"ERROR!\" height=\"300\" layout=\"vbox\" name=\"error\" width=\"480\">\n"
@@ -59,7 +61,8 @@ static std::string error_box(std::string message)
" <button action=\"cancel\" caption=\"Luk\" name=\"cancel\"/>\n"
" </window>\n"
" </macro>\n"
- " </course>\n";
+ " </course>\n"
+ "</pracro>\n";
return errorbox;
}
@@ -69,16 +72,13 @@ public:
: Exception("Macro " + r.macro + " not found in course " + r.course) {}
};
-static void connection(TCPSocket &socket)
+static std::string handleTransaction(Transaction &transaction)
{
- socket.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
- socket.write("<pracro version=\"1.0\">\n");
+ std::string answer;
+ answer += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ answer += "<pracro version=\"1.0\">\n";
try {
- Transaction transaction;
- TransactionParser parser(socket, transaction);
- parser.parse();
-
Database db;
//
@@ -112,8 +112,6 @@ static void connection(TCPSocket &socket)
while(i != transaction.requests.end()) {
Request &request = *i;
- std::string answer;
-
printf("Handling request - macro: %s, course: %s\n",
request.macro.c_str(), request.course.c_str());
@@ -201,26 +199,72 @@ static void connection(TCPSocket &socket)
answer += " </course>\n";
- socket.write(answer);
i++;
}
+
+ answer += "</pracro>\n";
+
} catch( PGSTD::runtime_error &e ) {
- socket.write(error_box(xml_encode(std::string("PostgreSQL server error:\n") + e.what())));
+ answer = error_box(xml_encode(std::string("PostgreSQL server error:\n") + e.what()));
} catch( std::exception &e ) {
- socket.write(error_box(xml_encode(e.what())));
+ answer = error_box(xml_encode(e.what()));
}
- socket.write("</pracro>\n");
+ return answer;
}
+static void handleConnection(TCPSocket *socket)
+{
+ size_t bufsize = 256;
+ int size;
+ char buf[256];
+ memset(buf, 0, bufsize);
+
+ Transaction *transaction = NULL;
+ TransactionParser *parser = NULL;
+
+ while((size = socket->read(buf, bufsize)) > 0) {
+
+ if(transaction == NULL) {
+ transaction = new Transaction();
+ parser = new TransactionParser(transaction);
+ }
+
+ printf("Got %d bytes in read loop\n", size);
+ if(parser->parse(buf)) {
+ socket->write(handleTransaction(*transaction));
+
+ delete transaction;
+ transaction = NULL;
+
+ delete parser;
+ parser = NULL;
+ }
+ memset(buf, 0, bufsize);
+ }
+
+ if(transaction) {
+ delete transaction;
+ transaction = NULL;
+
+ delete parser;
+ parser = NULL;
+ }
+
+ printf("Out of read loop!\n");
+}
+
+//#define NON_FORKING
+#include <sys/socket.h>
+extern bool pracro_is_running;
void server()
{
port_t port = Conf::server_port;
TCPSocket *socket = NULL;
try {
- socket = new TCPSocket();
+ socket = new TCPSocket("Listen socket");
socket->listen(port);
} catch (Exception &e) {
fprintf(stderr, "Error during parsing:\n%s\n",
@@ -230,7 +274,7 @@ void server()
return;
}
- while(socket->connected()) {
+ while(pracro_is_running && socket->connected()) {
{ // Reload if new port is assigned.
int old_port = port;
@@ -239,41 +283,44 @@ void server()
if(port != old_port) {
// Start listening on the new port
delete socket;
- socket = new TCPSocket();
+ socket = new TCPSocket("Listen socket (reloaded)");
socket->listen(port);
}
}
- TCPSocket child = socket->accept();
- if(child.connected()) {
- //socket->disconnect();
- connection(child);
- //delete socket;
+ TCPSocket *child = socket->accept();
+ if(child) {
- /*
+#ifndef NON_FORKING
switch(fork()) {
case -1: // error
fprintf(stderr, "Could not fork: %s\n", strerror(errno));
break;
case 0: // child
- socket->disconnect();
- connection(child);
delete socket;
+#endif/*NON_FORKING*/
+ handleConnection(child);
+ delete child;
+#ifndef NON_FORKING
return;
default: // parent
- child.disconnect();
+ delete child;
break;
}
- */
+#endif/*NON_FORKING*/
+
}
}
+ //socket->shutdown();
delete socket;
- fprintf(stderr, "Oups... dropped out of the main loop\n");
+
+ printf("Server gracefully shut down.\n");
}
+
#ifdef TEST_SERVER
char request[] =