From 775d9c9c11f3906766c0dc7070eb7ef01606ef96 Mon Sep 17 00:00:00 2001
From: deva <deva>
Date: Fri, 28 Jan 2011 08:50:42 +0000
Subject: New cross client system.

---
 server/src/connection.cc        | 10 +++++++---
 server/src/connection.h         |  3 +++
 server/src/server.cc            |  7 ++++++-
 server/src/session.cc           | 19 ++++++++++++++++---
 server/src/session.h            |  7 +++++--
 server/src/sessionserialiser.cc |  2 +-
 6 files changed, 38 insertions(+), 10 deletions(-)

(limited to 'server')

diff --git a/server/src/connection.cc b/server/src/connection.cc
index dd76f97..e4ec7f4 100644
--- a/server/src/connection.cc
+++ b/server/src/connection.cc
@@ -44,11 +44,15 @@ static std::string error_box(std::string message)
 static bool did_commit = false;
 #endif
 
-Connection::Connection(Environment &e, std::string sid, bool c, bool d, bool nc)
+Connection::Connection(Environment &e, std::string sid,
+                       std::string pid, std::string t,
+                       bool c, bool d, bool nc)
   : env(e), parser(&transaction)
 {
   DEBUG(connection, "[%p] CREATE\n", this);
 
+  patientid = pid;
+  templ = t;
   sessionid = sid;
   docommit = c;
   dodiscard = d;
@@ -104,13 +108,13 @@ bool Connection::handle(const char *data, size_t size)
   Session *session = NULL;
   if(sessionid == "") {
     // Create new session
-    session = env.sessions.newSession();
+    session = env.sessions.newSession(patientid, templ);
   } else {
     // Attach to old session
     session = env.sessions.session(sessionid);
 
     // Session didn't exist - create a new one anyway.
-    if(session == NULL) session = env.sessions.newSession();
+    if(session == NULL) session = env.sessions.newSession(patientid, templ);
   }
   
   if(session == NULL) {
diff --git a/server/src/connection.h b/server/src/connection.h
index 010034e..e9a4e50 100644
--- a/server/src/connection.h
+++ b/server/src/connection.h
@@ -38,6 +38,7 @@ class Session;
 class Connection {
 public:
   Connection(Environment &e, std::string sessionid,
+             std::string patientid, std::string templ,
              bool commit, bool discard, bool nocommit);
   ~Connection();
 
@@ -51,6 +52,8 @@ private:
   void nocommit(Session *session);
   void discard(Session *session);
 
+  std::string patientid;
+  std::string templ;
   std::string sessionid;
   bool docommit;
   bool donocommit;
diff --git a/server/src/server.cc b/server/src/server.cc
index 3973756..6474fb5 100644
--- a/server/src/server.cc
+++ b/server/src/server.cc
@@ -54,13 +54,18 @@ public:
               headers_t &headers)
   {
     std::string sessionid;
+    std::string patientid;
+    std::string templ;
     if(headers.contains("SessionID")) sessionid = headers["SessionID"];
+    if(headers.contains("SessionPatientID"))
+      patientid = headers["SessionPatientID"];
+    if(headers.contains("SessionTemplate")) templ = headers["SessionTemplate"];
     
     bool commit = headers.contains("SessionCommit");
     bool nocommit = headers.contains("SessionNoCommit");
     bool discard = headers.contains("SessionDiscard");
 
-    Connection *connection = new Connection(env, sessionid,
+    Connection *connection = new Connection(env, sessionid, patientid, templ,
                                             commit, discard, nocommit);
 
     return connection;
diff --git a/server/src/session.cc b/server/src/session.cc
index 612f264..58249af 100644
--- a/server/src/session.cc
+++ b/server/src/session.cc
@@ -44,10 +44,14 @@
 #include "connectionpool.h"
 #include "sessionserialiser.h"
 
-Session::Session(std::string sessionid)
+Session::Session(std::string sessionid, std::string pid, std::string t)
 {
   _journal = NULL;
   _database = NULL;
+
+  patientid = pid;
+  templ = t;
+
   database()->setSessionId(sessionid);
 }
 
@@ -141,9 +145,18 @@ static bool fexists(const std::string &f)
   return ret;
 }
 
-Session *Sessions::newSession()
+Session *Sessions::newSession(std::string patientid, std::string templ)
 {
-  Session *session = new Session();
+  std::map<std::string, Session *>::iterator i = sessions.begin();
+  while(i != sessions.end()) {
+    if(i->second->patientid == patientid &&
+       i->second->templ == templ) {
+      return i->second;
+    }
+    i++;
+  }
+
+  Session *session = new Session("", patientid, templ);
   sessions[session->id()] = session;
   return session;
 }
diff --git a/server/src/session.h b/server/src/session.h
index c0f6dfc..5b9b0bb 100644
--- a/server/src/session.h
+++ b/server/src/session.h
@@ -38,7 +38,7 @@ class Journal;
 
 class Session {
 public:
-  Session(std::string sessionid = "");
+  Session(std::string sessionid, std::string patientid, std::string templ);
   ~Session();
 
   std::string id();
@@ -53,6 +53,9 @@ public:
   Journal *journal();
   Database *database();
 
+  std::string patientid;
+  std::string templ;
+
 private:
   Journal *_journal;
   Database *_database;
@@ -67,7 +70,7 @@ public:
    * Create a new session, with a unique id. Insert it into the session list,
    * and return its pointer.
    */
-  Session *newSession();
+  Session *newSession(std::string patientid, std::string templ);
 
   /**
    * Lookup session in session list. Returns the session or NULL if no session
diff --git a/server/src/sessionserialiser.cc b/server/src/sessionserialiser.cc
index b816331..4065214 100644
--- a/server/src/sessionserialiser.cc
+++ b/server/src/sessionserialiser.cc
@@ -70,7 +70,7 @@ Session *SessionSerialiser::loadStr(const std::string &xml,
   SessionParser parser;
   parser.parse(xml.data(), xml.length());
 
-  Session *session = new Session(sessionid);
+  Session *session = new Session(sessionid, parser.patientid, "");
   Journal *j = session->journal();
   j->setUser(XDEC(parser.userid));
   j->setPatientID(XDEC(parser.patientid));
-- 
cgit v1.2.3