diff options
author | deva <deva> | 2010-05-07 12:36:13 +0000 |
---|---|---|
committer | deva <deva> | 2010-05-07 12:36:13 +0000 |
commit | 016e4ba553044edee32c2a20ee34463ad82106e8 (patch) | |
tree | 8fdde7232ee847ba39eb94449b18fd3de7bb4fb8 /server/src/connection.cc | |
parent | 965e43178736e6635cf27410e6d73f4ec0fdced2 (diff) |
Use connection object instead of struct and make xml parsing on-the-fly instead of collecting all data first.
Diffstat (limited to 'server/src/connection.cc')
-rw-r--r-- | server/src/connection.cc | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/server/src/connection.cc b/server/src/connection.cc new file mode 100644 index 0000000..36c030e --- /dev/null +++ b/server/src/connection.cc @@ -0,0 +1,129 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * connection.cc + * + * Fri May 7 11:35:44 CEST 2010 + * Copyright 2010 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Pracro. + * + * Pracro is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Pracro is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Pracro; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "connection.h" + +#include "transactionhandler.h" +#include "xml_encode_decode.h" + +static std::string error_box(std::string message) +{ + std::string errorbox = + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<pracro version=\"1.0\">\n" + " <error>" + message + "</error>\n" + "</pracro>\n"; + return errorbox; +} + +Connection::Connection(Environment &e, std::string sid, bool c) + : env(e), parser(&transaction) +{ + PRACRO_DEBUG(connection, "[%p] CREATE\n", this); + + sessionid = sid; + commit = c; +} + +Connection::~Connection() +{ + PRACRO_DEBUG(connection, "[%p] DESTROY\n", this); +} + +bool Connection::handle(const char *data, size_t size) +{ + Session *session = NULL; + if(sessionid == "") { + // Create new session + session = env.sessions.newSession(); + } 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) { + PRACRO_ERR(connection, "New session could not be created."); + response = error_box(xml_encode("New session could not be created.")); + return true; + } + + sessionid = session->id(); + + if(!data || !size) return true; + + try { + if(parser.parse(data, size)) { + { + SessionAutolock lock(*session); + response = handleTransaction(transaction, env, *session); + } + + if(commit) { + session->commit(); + env.sessions.deleteSession(session->id()); + } + + return true; + } + } catch(...) { + PRACRO_ERR(server, "Failed to parse data!\n"); + response = error_box(xml_encode("XML Parse error.")); + return true; + } + + return false; +} + +std::string Connection::getResponse() +{ + return response; +} + +std::string Connection::getSessionID() +{ + return sessionid; +} + +#ifdef TEST_CONNECTION +//Additional dependency files +//deps: +//Required cflags (autoconf vars may be used) +//cflags: +//Required link options (autoconf vars may be used) +//libs: +#include "test.h" + +TEST_BEGIN; + +// TODO: Put some testcode here (see test.h for usable macros). + +TEST_END; + +#endif/*TEST_CONNECTION*/ |