diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/connectionhandler.cc | 176 | ||||
-rw-r--r-- | src/connectionhandler.h | 56 | ||||
-rw-r--r-- | src/task_proto.cc | 5 |
3 files changed, 236 insertions, 1 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__*/ diff --git a/src/task_proto.cc b/src/task_proto.cc index ced0552..d273344 100644 --- a/src/task_proto.cc +++ b/src/task_proto.cc @@ -75,7 +75,7 @@ static void dump_handshake_info(struct lws_tokens *lwst) } } -std::map<struct libwebsocket *, std::queue<std::string> > msgqueue; +static std::map<struct libwebsocket *, std::queue<std::string> > msgqueue; int callback_lws_task(struct libwebsocket_context * context, struct libwebsocket *wsi, @@ -93,6 +93,7 @@ int callback_lws_task(struct libwebsocket_context * context, fprintf(stderr, "callback_lws_task: LWS_CALLBACK_ESTABLISHED\n"); // pss->ringbuffer_tail = ringbuffer_head; pss->wsi = wsi; + /* // send all current tasks // char buf[512]; @@ -115,6 +116,7 @@ int callback_lws_task(struct libwebsocket_context * context, msgqueue[wsi].push(msg); libwebsocket_callback_on_writable(context, wsi); + */ } break; @@ -123,6 +125,7 @@ int callback_lws_task(struct libwebsocket_context * context, printf("Closing connection\n"); msgqueue.erase(wsi); } + break; case LWS_CALLBACK_SERVER_WRITEABLE: { |