From ed9e290b441a6486c576c2e2e4baa69fa0f3ed37 Mon Sep 17 00:00:00 2001 From: deva Date: Tue, 2 Aug 2011 08:00:20 +0000 Subject: New 'open course' feature. --- server/src/client_connection.cc | 49 +++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 14 deletions(-) (limited to 'server/src/client_connection.cc') diff --git a/server/src/client_connection.cc b/server/src/client_connection.cc index 9a1ac0f..1ec7e7c 100644 --- a/server/src/client_connection.cc +++ b/server/src/client_connection.cc @@ -44,21 +44,42 @@ static std::string error_box(std::string message) static bool did_commit = false; #endif -ClientConnection::ClientConnection(Environment &e, headers_t &headers) +ClientConnection::ClientConnection(Environment &e, headers_t &headers, + headers_t args, std::string uri) : env(e), parser(&transaction) { DEBUG(connection, "[%p] CREATE\n", this); - if(headers.contains("SessionID")) - sessionid = headers["SessionID"]; - if(headers.contains("SessionPatientID")) - patientid = headers["SessionPatientID"]; - if(headers.contains("SessionTemplate")) - templ = headers["SessionTemplate"]; - - docommit = headers.contains("SessionCommit"); - donocommit = headers.contains("SessionNoCommit"); - dodiscard = headers.contains("SessionDiscard"); + size_t i = 0; + std::string *tar[3]; + tar[0] = &request.course; + tar[1] = &request.templ; + tar[2] = &request.macro; + int p = -1; + while(i < uri.size() && p < 3) { + if(uri[i] == '/') { + p++; + } else if(p > -1) { + *(tar[p]) += uri[i]; + } else { + ERR(connection, "Malformed URI. Missing beginning '/'!"); + } + i++; + } + + DEBUG(connection, "Course: %s, Template: %s, Macro: %s\n", + request.course.c_str(), + request.templ.c_str(), + request.macro.c_str()); + + templ = request.templ; + + request.patientid = patientid = args.lookup("patientid"); + sessionid = args.lookup("sessionid"); + + docommit = args.lookup("statechange") == "commit"; + donocommit = args.lookup("statechange") == "nocommit"; + dodiscard = args.lookup("statechange") == "discard"; #ifdef TEST_CLIENT_CONNECTION did_commit = false; @@ -151,7 +172,7 @@ bool ClientConnection::handle(const char *data, size_t size) try { - if(!data || !size) { + if((!data || !size) && (docommit || donocommit || dodiscard)) { parser_complete = true; commit(session); nocommit(session); @@ -159,12 +180,12 @@ bool ClientConnection::handle(const char *data, size_t size) return true; } - if(parser.parse(data, size)) { + if(size == 0 || parser.parse(data, size)) { parser_complete = true; { SessionAutolock lock(*session); - response = handleTransaction(transaction, env, *session); + response = handleTransaction(request, transaction, env, *session); } commit(session); -- cgit v1.2.3