summaryrefslogtreecommitdiff
path: root/icespider/embedded/embedded.h
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2018-07-08 18:12:24 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2018-07-08 18:12:24 +0100
commit20be24a0baa2135c5fd4ddacdb76d3af2c5f3235 (patch)
tree3ab2e27daad6c99db46ec26c0ed04430bf393eb5 /icespider/embedded/embedded.h
parentInitial commit of embedded server (diff)
downloadicespider-20be24a0baa2135c5fd4ddacdb76d3af2c5f3235.tar.bz2
icespider-20be24a0baa2135c5fd4ddacdb76d3af2c5f3235.tar.xz
icespider-20be24a0baa2135c5fd4ddacdb76d3af2c5f3235.zip
WIP
Diffstat (limited to 'icespider/embedded/embedded.h')
-rw-r--r--icespider/embedded/embedded.h69
1 files changed, 7 insertions, 62 deletions
diff --git a/icespider/embedded/embedded.h b/icespider/embedded/embedded.h
index 08f280a..7d7fafa 100644
--- a/icespider/embedded/embedded.h
+++ b/icespider/embedded/embedded.h
@@ -1,75 +1,15 @@
#ifndef ICESPIDER_EMBEDDED_H
#define ICESPIDER_EMBEDDED_H
-#include <sys/select.h>
-#include <netinet/in.h>
#include <visibility.h>
#include <memory>
#include <array>
#include <vector>
-#include <future>
#include </usr/include/semaphore.h>
#include <blockingconcurrentqueue.h>
+#include "socketHandler.h"
namespace IceSpider::Embedded {
- class Listener;
-
- enum class FDSetChange {
- NoChange,
- AddNew,
- Remove,
- };
- typedef std::tuple<FDSetChange> SocketEventResult;
- typedef std::future<SocketEventResult> SocketEventResultFuture;
- typedef std::tuple<int, SocketEventResultFuture> FdSocketEventResultFuture;
-
- class SocketHandler {
- public:
- typedef std::packaged_task<SocketEventResult()> Work;
-
- SocketHandler(int f);
- ~SocketHandler();
-
- static inline FdSocketEventResultFuture returnNow(int, const SocketEventResult &&);
- static inline FdSocketEventResultFuture returnQueued(Listener *, int, Work &&);
-
- virtual FdSocketEventResultFuture read(Listener *) = 0;
- virtual FdSocketEventResultFuture except(Listener *);
-
- const int fd;
- };
-
- class ClientSocket : public SocketHandler {
- public:
- ClientSocket(int fd);
-
- FdSocketEventResultFuture read(Listener * listener) override;
-
- private:
- inline void read_headers(int bytes);
- inline void stream_input(int bytes);
-
- enum class State {
- reading_headers,
- streaming_input,
- };
-
- struct sockaddr_in clientaddr;
- std::vector<char> buf;
- std::size_t rec;
- State state;
- };
-
- class ListenSocket : public SocketHandler {
- public:
- ListenSocket(unsigned short portno);
-
- FdSocketEventResultFuture read(Listener * listener) override;
-
- private:
- struct sockaddr_in serveraddr;
- };
-
class DLL_PUBLIC Listener {
public:
typedef moodycamel::BlockingConcurrentQueue<SocketHandler::Work> WorkQueue;
@@ -83,7 +23,12 @@ namespace IceSpider::Embedded {
void run();
- template<typename T, typename ... P> inline int create(const P & ... p);
+ template<typename T, typename ... P> inline int create(const P & ... p)
+ {
+ auto s = std::make_unique<T>(p...);
+ topSock = std::max(s->fd + 1, topSock);
+ return (sockets[s->fd] = std::move(s))->fd;
+ }
WorkQueue work;