diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2012-03-30 11:01:39 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2012-03-30 11:01:39 +0200 |
commit | d6bbc01097372dc318db99b0952dbf708ad5e1ab (patch) | |
tree | 20f33dfc4dfab208c4d496e4761ee509408ff7f2 | |
parent | 30fcce7ad8abdc1920085fa86f39f855f69369fc (diff) |
Added ConnectionHandler accroding to spec.
-rw-r--r-- | src/connectionhandler.cc | 176 | ||||
-rw-r--r-- | src/connectionhandler.h | 56 |
2 files changed, 232 insertions, 0 deletions
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<taskid_t>(); +} + +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<clientid_t> ConnectionHandler::observerlist(TaskIdList tasks) +{ + std::set<clientid_t> 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<taskid_t>::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<clientid_t> 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<clientid_t> 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<clientid_t> 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<clientid_t> 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<clientid_t> 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<clientid_t> 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<clientid_t> 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*/ diff --git a/src/connectionhandler.h b/src/connectionhandler.h new file mode 100644 index 0000000..ab46320 --- /dev/null +++ b/src/connectionhandler.h @@ -0,0 +1,56 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * connectionhandler.h + * + * 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. + */ +#ifndef __MUNIA_CONNECTIONHANDLER_H__ +#define __MUNIA_CONNECTIONHANDLER_H__ + +#include <list> +#include <set> +#include <map> + +#include "task.h" + +typedef void* clientid_t; + +typedef std::map<clientid_t, std::set<taskid_t> > ConnectionList; + +class ConnectionHandler { +public: + ConnectionHandler(); + + void init(clientid_t clientid); + void close(clientid_t clientid); + void observe(clientid_t clientid, taskid_t taskid); + void unobserve(clientid_t clientid, taskid_t taskid); + + std::set<clientid_t> observerlist(TaskIdList tasklist); + +private: + ConnectionList connlist; +}; + +#endif/*__MUNIA_CONNECTIONHANDLER_H__*/ |