From 4ea34b413bd21c0e8ec4c3b93840bfe928d3c9c4 Mon Sep 17 00:00:00 2001
From: deva <deva>
Date: Mon, 7 Feb 2011 11:15:52 +0000
Subject: Cleaned up the Connection interface a bit.

---
 server/src/admin_connection.cc  | 34 ++++++++++++++++++----------------
 server/src/admin_connection.h   |  3 +--
 server/src/admin_rc.cc          | 18 ++++++++++++++++++
 server/src/client_connection.cc | 33 ++++++++++++++++++++++-----------
 server/src/client_connection.h  |  5 ++---
 server/src/server.cc            | 25 +++----------------------
 6 files changed, 64 insertions(+), 54 deletions(-)

(limited to 'server')

diff --git a/server/src/admin_connection.cc b/server/src/admin_connection.cc
index 21fe331..ae427a3 100644
--- a/server/src/admin_connection.cc
+++ b/server/src/admin_connection.cc
@@ -46,11 +46,6 @@ static std::string admin_sessionunlock(Environment &env, std::string id)
   return "Session " + id + " does not exist or has been committed.";
 }
 
-static std::string admin_favicon()
-{
-  return admin_rc("favicon");
-}
-
 AdminConnection::AdminConnection(Environment &e, headers_t a, std::string u)
   : env(e), args(a), uri(u) {}
 
@@ -61,13 +56,22 @@ bool AdminConnection::handle(const char *data, size_t size)
   if(data == NULL && size == 0) {
     DEBUG(admin, "URI: %s\n", uri.c_str());
 
+    if(uri == "/") {
+      reply = admin_rc("header") + 
+        "Command list:\n"
+        "/sessionunlock?id=[ID] unlock session with [ID] as its session id.\n"
+        + admin_rc("footer");
+      return true;
+    }
+
     if(uri == "/sessionunlock" && args.find("id") != args.end()) {
-      reply = admin_sessionunlock(env, args["id"]);
+      reply = admin_rc("header") + admin_sessionunlock(env, args["id"])
+        + admin_rc("footer");
       return true;
     }
 
     if(uri == "/favicon.ico") {
-      reply = admin_favicon();
+      reply = admin_rc("favicon");
       return true;
     }
 
@@ -78,18 +82,16 @@ bool AdminConnection::handle(const char *data, size_t size)
   return true;
 }
 
-std::string AdminConnection::getResponse()
-{
-  return reply;
-}
-
-headers_t AdminConnection::getHeaders()
+void AdminConnection::getReply(Httpd::Reply &r)
 {
   headers_t hdrs;
-  hdrs["Content-Type"] = "text/plain; charset=UTF-8";
-  return hdrs;
-}
+  if(uri == "/favicon.ico") hdrs["Content-Type"] = "image/ico";
+  else hdrs["Content-Type"] = "text/html; charset=UTF-8";
 
+  r.data = reply;
+  r.headers = hdrs;
+  r.status = 200; // http 'OK'
+}
 
 #ifdef TEST_ADMIN_CONNECTION
 //deps:
diff --git a/server/src/admin_connection.h b/server/src/admin_connection.h
index c3f70b7..1533d79 100644
--- a/server/src/admin_connection.h
+++ b/server/src/admin_connection.h
@@ -40,8 +40,7 @@ public:
 
   bool handle(const char *data, size_t size);
 
-  std::string getResponse();
-  headers_t getHeaders();
+  void getReply(Httpd::Reply &reply);
 
 private:
   Environment &env;
diff --git a/server/src/admin_rc.cc b/server/src/admin_rc.cc
index 495647b..ebf733e 100644
--- a/server/src/admin_rc.cc
+++ b/server/src/admin_rc.cc
@@ -389,9 +389,27 @@ static const char favicon[] = {
   0x07, 0xff, 0xff
 };
 
+static const char header[] =
+  "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\""
+  " \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n" 
+  "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" 
+  "<head>\n"
+  "  <title>Pracro admin</title>\n"
+  "    <link rel=\"shortcut icon\" href=\"/favicon.ico\"/>\n"
+  "  </head>\n"
+  "  <body>\n"
+  "    <pre>";
+
+static const char footer[] =
+  "</pre>\n"
+  "  </body>\n"
+  "</html>\n";
+
 std::string admin_rc(std::string key)
 {
   std::string val;
   if(key == "favicon") val.append(favicon, faviconsize);
+  if(key == "header") val = header;
+  if(key == "footer") val = footer;
   return val;
 }
diff --git a/server/src/client_connection.cc b/server/src/client_connection.cc
index af70916..9689ac4 100644
--- a/server/src/client_connection.cc
+++ b/server/src/client_connection.cc
@@ -54,11 +54,22 @@ ClientConnection::Parameters::Parameters()
   nocommit = false;
 }
 
-ClientConnection::ClientConnection(Environment &e, Parameters p)
-  : parms(p), env(e), parser(&transaction)
+ClientConnection::ClientConnection(Environment &e, headers_t &headers)
+  : env(e), parser(&transaction)
 {
   DEBUG(connection, "[%p] CREATE\n", this);
 
+  if(headers.contains("SessionID"))
+    parms.sessionid = headers["SessionID"];
+  if(headers.contains("SessionPatientID"))
+    parms.patientid = headers["SessionPatientID"];
+  if(headers.contains("SessionTemplate"))
+    parms.templ = headers["SessionTemplate"];
+      
+  parms.commit = headers.contains("SessionCommit");
+  parms.nocommit = headers.contains("SessionNoCommit");
+  parms.discard = headers.contains("SessionDiscard");
+
 #ifdef TEST_CONNECTION
   did_commit = false;
 #endif
@@ -183,21 +194,21 @@ bool ClientConnection::handle(const char *data, size_t size)
   return false;
 }
 
-std::string ClientConnection::getResponse()
-{
-  if(parser_complete == false)
-    return error_box(xml_encode("XML Parser need more data."));
-  return response;
-}
-
-headers_t ClientConnection::getHeaders()
+void ClientConnection::getReply(Httpd::Reply &reply)
 {
   headers_t hdrs;
 
   hdrs["Content-Type"] = "text/plain; charset=UTF-8";
   hdrs["SessionID"] = parms.sessionid;
 
-  return  hdrs;
+  reply.headers = hdrs;
+
+  if(parser_complete == false)
+    reply.data = error_box(xml_encode("XML Parser need more data."));
+  else
+   reply.data = response;
+
+  reply.status = 200; // http 'OK'
 }
 
 #ifdef TEST_CLIENT_CONNECTION
diff --git a/server/src/client_connection.h b/server/src/client_connection.h
index 69e6fe7..6427217 100644
--- a/server/src/client_connection.h
+++ b/server/src/client_connection.h
@@ -51,13 +51,12 @@ public:
     bool nocommit;
   };
 
-  ClientConnection(Environment &e, Parameters cp);
+  ClientConnection(Environment &e, headers_t &headers);
   ~ClientConnection();
 
   bool handle(const char *data, size_t size);
 
-  std::string getResponse();
-  headers_t getHeaders();
+  void getReply(Httpd::Reply &reply);
 
 private:
   void commit(Session *session);
diff --git a/server/src/server.cc b/server/src/server.cc
index 745b77b..d9daf3a 100644
--- a/server/src/server.cc
+++ b/server/src/server.cc
@@ -63,19 +63,7 @@ public:
        headers["User-Agent"].find("Pracro") == std::string::npos) { // Admin
       connection = new AdminConnection(env, getargs, url);
     } else { // Pracro client
-      ClientConnection::Parameters parms;
-      if(headers.contains("SessionID"))
-        parms.sessionid = headers["SessionID"];
-      if(headers.contains("SessionPatientID"))
-        parms.patientid = headers["SessionPatientID"];
-      if(headers.contains("SessionTemplate"))
-        parms.templ = headers["SessionTemplate"];
-      
-      parms.commit = headers.contains("SessionCommit");
-      parms.nocommit = headers.contains("SessionNoCommit");
-      parms.discard = headers.contains("SessionDiscard");
-
-      connection = new ClientConnection(env, parms);
+      connection = new ClientConnection(env, headers);
     }
 
     return connection;
@@ -95,17 +83,10 @@ public:
     if(ptr) {
       Connection *connection = (Connection *)ptr;
 
-      // Flush and do commit/discard
+      // Flush and do commit/discards
       connection->handle(NULL, 0);
 
-      reply.data = connection->getResponse();
-      reply.headers = connection->getHeaders();
-      reply.status = 200; // http 'OK'
-    } else {
-
-      reply.data = "Admin";
-      reply.status = 200; // http 'OK'
-
+      connection->getReply(reply);
     }
 
     return true;
-- 
cgit v1.2.3