From d6bbc01097372dc318db99b0952dbf708ad5e1ab Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 30 Mar 2012 11:01:39 +0200 Subject: Added ConnectionHandler accroding to spec. --- src/connectionhandler.cc | 176 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 src/connectionhandler.cc (limited to 'src/connectionhandler.cc') diff --git a/src/connectionhandler.cc b/src/connectionhandler.cc new file mode 100644 index 0000000..61738e2 --- /dev/null +++ b/src/connectionhandler.cc @@ -0,0 +1,176 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * connectionhandler.cc + * + * Fri Mar 30 09:25:16 CEST 2012 + * Copyright 2012 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Munia. + * + * Munia 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. + * + * Munia 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 Munia; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "connectionhandler.h" + +ConnectionHandler::ConnectionHandler() +{ +} + +void ConnectionHandler::init(clientid_t clientid) +{ + connlist[clientid] = std::set(); +} + +void ConnectionHandler::close(clientid_t clientid) +{ + connlist.erase(clientid); +} + +void ConnectionHandler::observe(clientid_t clientid, taskid_t taskid) +{ + connlist[clientid].insert(taskid); +} + +void ConnectionHandler::unobserve(clientid_t clientid, taskid_t taskid) +{ + connlist[clientid].erase(taskid); +} + +std::set ConnectionHandler::observerlist(TaskIdList tasks) +{ + std::set clients; + + for(TaskIdList::iterator i = tasks.begin(); i != tasks.end(); i++) { + taskid_t tid = *i; + for(ConnectionList::iterator ci = connlist.begin(); + ci != connlist.end(); ci++) { + std::set::iterator ti = ci->second.find(tid); + if(ti != ci->second.end()) clients.insert(ci->first); + } + } + + return clients; +} + + +#ifdef TEST_CONNECTIONHANDLER +//deps: +//cflags: +//libs: + +#include "test.h" + +TEST_BEGIN; + +ConnectionHandler h; + +h.init((clientid_t)1); +h.observe((clientid_t)1, (taskid_t)1); +h.observe((clientid_t)1, (taskid_t)2); + +h.init((clientid_t)2); +h.observe((clientid_t)2, (taskid_t)1); +h.observe((clientid_t)2, (taskid_t)2); + +h.init((clientid_t)3); +h.observe((clientid_t)3, (taskid_t)3); + +{ + TaskIdList tasks; + tasks.push_back((taskid_t)1); + std::set clst = h.observerlist(tasks); + + TEST_TRUE(clst.find((clientid_t)1) != clst.end(), "Got client 1?"); + TEST_TRUE(clst.find((clientid_t)2) != clst.end(), "Got client 2?"); + TEST_FALSE(clst.find((clientid_t)3) != clst.end(), "Got client 3?"); +} + +{ + TaskIdList tasks; + tasks.push_back((taskid_t)3); + std::set clst = h.observerlist(tasks); + + TEST_FALSE(clst.find((clientid_t)1) != clst.end(), "Got client 1?"); + TEST_FALSE(clst.find((clientid_t)2) != clst.end(), "Got client 2?"); + TEST_TRUE(clst.find((clientid_t)3) != clst.end(), "Got client 3?"); +} + +{ + TaskIdList tasks; + tasks.push_back((taskid_t)4); + std::set clst = h.observerlist(tasks); + + TEST_FALSE(clst.find((clientid_t)1) != clst.end(), "Got client 1?"); + TEST_FALSE(clst.find((clientid_t)2) != clst.end(), "Got client 2?"); + TEST_FALSE(clst.find((clientid_t)3) != clst.end(), "Got client 3?"); +} + +{ + TaskIdList tasks; + tasks.push_back((taskid_t)1); + tasks.push_back((taskid_t)2); + tasks.push_back((taskid_t)3); + std::set clst = h.observerlist(tasks); + + TEST_TRUE(clst.find((clientid_t)1) != clst.end(), "Got client 1?"); + TEST_TRUE(clst.find((clientid_t)2) != clst.end(), "Got client 2?"); + TEST_TRUE(clst.find((clientid_t)3) != clst.end(), "Got client 3?"); +} + +h.close((clientid_t)1); +{ + TaskIdList tasks; + tasks.push_back((taskid_t)1); + tasks.push_back((taskid_t)2); + tasks.push_back((taskid_t)3); + std::set clst = h.observerlist(tasks); + + TEST_FALSE(clst.find((clientid_t)1) != clst.end(), "Got client 1?"); + TEST_TRUE(clst.find((clientid_t)2) != clst.end(), "Got client 2?"); + TEST_TRUE(clst.find((clientid_t)3) != clst.end(), "Got client 3?"); +} + +h.close((clientid_t)2); +{ + TaskIdList tasks; + tasks.push_back((taskid_t)1); + tasks.push_back((taskid_t)2); + tasks.push_back((taskid_t)3); + std::set clst = h.observerlist(tasks); + + TEST_FALSE(clst.find((clientid_t)1) != clst.end(), "Got client 1?"); + TEST_FALSE(clst.find((clientid_t)2) != clst.end(), "Got client 2?"); + TEST_TRUE(clst.find((clientid_t)3) != clst.end(), "Got client 3?"); +} + +h.close((clientid_t)3); +{ + TaskIdList tasks; + tasks.push_back((taskid_t)1); + tasks.push_back((taskid_t)2); + tasks.push_back((taskid_t)3); + std::set clst = h.observerlist(tasks); + + TEST_FALSE(clst.find((clientid_t)1) != clst.end(), "Got client 1?"); + TEST_FALSE(clst.find((clientid_t)2) != clst.end(), "Got client 2?"); + TEST_FALSE(clst.find((clientid_t)3) != clst.end(), "Got client 3?"); +} + +TEST_END; + +#endif/*TEST_CONNECTIONHANDLER*/ -- cgit v1.2.3