football
socket abstraction layer
Loading...
Searching...
No Matches
football.h
Go to the documentation of this file.
1
11
12#pragma once
13
14#include <config.h>
15
16#include <stdarg.h>
17#include <stdbool.h>
18#include <sys/types.h>
19#include "assert.h"
20
21#include <string>
22#include <vector>
23#include <map>
24#include <iostream>
25#include <functional>
26
27#include "fb_public.h"
28#include "fb_service.h"
29
31namespace Football {
33 using HelpList = std::vector<const char *>;
34
37 class Thingie : public std::basic_streambuf<char> {
38 protected:
39 virtual void *myThingie (void) const = 0;
40 public:
41 virtual ~Thingie();
42 ssize_t print (const std::string &message);
43 virtual ssize_t conditional_print (bool (*callback) (FB_CONNECTION *), const std::string &message) = 0;
44 ssize_t conditional_broadcast (bool (*callback) (FB_CONNECTION *), const std::string &message);
45 ssize_t printf (const char *format, ...);
46 ssize_t vprintf (const char *format, va_list parameters);
47 ssize_t bprintf (const char *format, ...);
48 ssize_t bvprintf (const char *format, va_list parameters);
49 ssize_t cbprintf (bool (*callback) (FB_CONNECTION *), const char *format, ...);
50 ssize_t cbvprintf (bool (*callback) (FB_CONNECTION *), const char *format, va_list parameters);
51 // Overrides to implement streambuf
52 virtual std::streamsize xsputn(const char_type* data, std::streamsize count) override;
53 virtual int_type overflow(int_type c) override;
54 };
55
57 inline Thingie &operator << (Thingie &there, const char *message) {
58 there.printf ("%s", message);
59 return there;
60 };
61
62 // Declare all these inbred bastards
63 class Connection;
64 class ServiceBase;
65
66
68 class Connection: public Thingie {
69 friend class Iterator;
70 friend class ServiceBase;
71 friend class Arena;
72 private:
73 FB_CONNECTION *connection = nullptr;
74 int argname_capacity = 0;
75 static Connection *getFromOld (FB_CONNECTION *connection);
76 virtual inline void *myThingie (void) const final { return connection; }
77 int argvIndex (const char *itemname) const;
78 protected:
83 static Connection *tryGetFromOld (FB_CONNECTION *connection) {
84 return (Connection *) connection->relatedObject;
85 }
86 public:
87 ServiceBase *service (void) const;
88 virtual ~Connection() override;
89
90 virtual ssize_t conditional_print (bool (*callback) (FB_CONNECTION *), const std::string &message) override;
91
92 // Actions
93 bool transfer (ServiceBase *service, bool invokeNewConnectionHandler = false);
94 void close (void);
95 void acceptInput (bool mode);
96
97 // Stubs with default behavior, but probably will be overriden
98 virtual void newConnection (const FB_EVENT *event);
99 virtual void connectionClose (const FB_EVENT *event);
100 virtual void inputReceived (const FB_EVENT *event);
101
102 private:
103 void setConnection (FB_CONNECTION *conn) { connection = conn; };
104
105#ifdef FOOTBALL_TRANSITIONAL
106 // Getters to get easy access to underlying C data structures.
107 FB_CONNECTION *operator()(void) { return connection; }
108#endif
109 };
110
111
115 class ServiceBase: public Thingie {
116 friend class Iterator;
117 friend class Connection;
118 friend class Arena;
119 private:
120 protected:
122 protected:
123 virtual inline void *myThingie (void) const final { return service; }
124 static ServiceBase *getFromOld (FB_SERVICE *service);
125 // Constructor
126 ServiceBase (FB_SERVICE_OPTIONS options, ServiceBase *parent = nullptr);
127 virtual ~ServiceBase() override;
128 // Factories
129 virtual Connection *allocNewConnection () = 0;
130 public:
131 void close (void);
132 Connection *newConnectionFromFile (const std::string &filename);
133 Connection *newLoopbackConnection (int *loopback);
134 virtual ssize_t conditional_print (bool (*callback) (FB_CONNECTION *), const std::string &message) override;
135
136 // Stubs, expected to be overridden
137 virtual void serviceShutdown (void);
138
139#ifdef FOOTBALL_TRANSITIONAL
140 // Getters to get easy access to underlying C data structures.
141 FB_SERVICE *operator()(void) { return service; }
142#endif
143 };
144
145
151 template <class Connection> class Service : public ServiceBase {
152 public:
153 struct iterator : public std::iterator<std::forward_iterator_tag, Connection> {
154 size_t position;
155 const FB_SERVICE &service;
157 inline void advancePastBadness (void) {
158 while (position < service.connection_count && !service.connections [position]->relatedObject) {
159 assert (service.connections [position]->state != FB_SOCKET_STATE_OPEN);
160 position++;
161 }
162 }
163 iterator (const FB_SERVICE &svc) : service (svc) {
164 position = 0;
166 };
167 iterator (const FB_SERVICE &svc, size_t pos) : service (svc) {
168 assert (pos == svc.connection_count);
169 position = pos;
171 };
172 Connection *operator *() {
173 return (Connection *)(service.connections [position]->relatedObject);
174 }
175 iterator &operator++() {
176 position++;
178 return *this;
179 }
180 iterator operator++(int) {
181 iterator item = *this;
182 position++;
184 return item;
185 }
186 bool operator!=(iterator &compare) {
187 return position != compare.position;
188 }
189 };
190 struct const_iterator : public iterator {
191 using iterator::iterator;
192 inline const Connection *operator *() { return iterator::operator *(); };
193 };
194 Service (const FB_SERVICE_OPTIONS options,
195 Service *parent = nullptr) : ServiceBase (options, parent) {
196 };
197 Connection *newConnectionFromFile (const std::string &filename) {
199 };
200 iterator begin() { iterator it (*service); return it ; };
201 iterator end() { iterator it (*service, service->connection_count); return it ; };
202 const_iterator begin() const { const_iterator it (*service); return it ; };
203 const_iterator end() const { const_iterator it (*service, service->connection_count); return it ; };
204 protected:
207 return new (std::nothrow) Connection ();
208 };
209 };
210
211
220 class Arena {
221 friend ServiceBase;
222 public:
223 static bool ready (void);
224
225 static bool poll (void);
226 static bool pollWait (void);
227 static bool pollUntil (time_t untilwhen);
228 static bool pollWithTimeout (double timeout);
229 private:
230 static bool handleEvent (const FB_EVENT *);
231 };
232
233
234} // </namespace>
235
Football Arena: Manager for services.
Definition football.h:220
static bool pollWithTimeout(double timeout)
pollWithTimeout.
Definition fb_arena.cpp:122
static bool ready(void)
Determine if the Arena (service manager) is ready.
Definition fb_arena.cpp:27
static bool pollUntil(time_t untilwhen)
Poll services.
Definition fb_arena.cpp:115
static bool pollWait(void)
Poll services.
Definition fb_arena.cpp:108
static bool poll(void)
Poll services.
Definition fb_arena.cpp:102
C++ Connection wrapper.
Definition football.h:68
virtual void connectionClose(const FB_EVENT *event)
Invoked when a connection is closing.
Definition fb_connection.cpp:207
ServiceBase * service(void) const
Get a connection's parent service.
Definition fb_connection.cpp:175
void acceptInput(bool mode)
Control acceptance of input.
Definition fb_connection.cpp:185
virtual void inputReceived(const FB_EVENT *event)
Invoked when a completed message is received.
Definition fb_connection.cpp:214
virtual void newConnection(const FB_EVENT *event)
Invoked when a new connection has arrived/greeted.
Definition fb_connection.cpp:198
void close(void)
Initiate connection closure.
Definition fb_connection.cpp:155
virtual ssize_t conditional_print(bool(*callback)(FB_CONNECTION *), const std::string &message) override
Send a message to some output queues depending on the callback function return value.
Definition fb_connection.cpp:146
bool transfer(ServiceBase *service, bool invokeNewConnectionHandler=false)
Transfer a connection to another service.
Definition fb_connection.cpp:163
C++ Service wrapper Manages the service's connections.
Definition football.h:115
FB_SERVICE * service
Pointer to underlying Football service structure.
Definition football.h:121
virtual void serviceShutdown(void)
Invoked when a service is shutting down.
Definition fb_servicepp.cpp:103
void close(void)
Initiate shutdown of a service.
Definition fb_servicepp.cpp:49
Connection * newConnectionFromFile(const std::string &filename)
Create a new "connection" that reads from a file.
Definition fb_servicepp.cpp:62
Connection * newLoopbackConnection(int *loopback)
Create a new connection that loops back to the service.
Definition fb_servicepp.cpp:80
Football Service.
Definition football.h:151
virtual Connection * allocNewConnection()
Factories for related types instead of generics.
Definition football.h:206
Base class for services, events, and connections.
Definition football.h:37
ssize_t cbprintf(bool(*callback)(FB_CONNECTION *), const char *format,...)
Definition fb_connection.cpp:83
ssize_t cbvprintf(bool(*callback)(FB_CONNECTION *), const char *format, va_list parameters)
Definition fb_connection.cpp:92
ssize_t bvprintf(const char *format, va_list parameters)
Definition fb_connection.cpp:77
ssize_t printf(const char *format,...)
Add messages to output queues.
Definition fb_connection.cpp:54
ssize_t print(const std::string &message)
Add a string to the output queues.
Definition fb_connection.cpp:37
ssize_t conditional_broadcast(bool(*callback)(FB_CONNECTION *), const std::string &message)
Send a message to some output queues depending on the callback function return value.
Definition fb_connection.cpp:42
ssize_t vprintf(const char *format, va_list parameters)
Definition fb_connection.cpp:63
ssize_t bprintf(const char *format,...)
Definition fb_connection.cpp:68
Football public declarations.
Football private declarations.
@ FB_SOCKET_STATE_OPEN
Line-oriented or WebSocket session in process.
Definition fb_service.h:98
Football C++ connections, services and parsers.
Definition fb_arena.cpp:23
std::vector< const char * > HelpList
Lists of commands.
Definition football.h:33
Thingie & operator<<(Thingie &there, const char *message)
Helper functions for sending output to a connection or service.
Definition football.h:57
Definition football.h:190
Definition football.h:153
void advancePastBadness(void)
Advance the iterator past any opening/closing connections.
Definition football.h:157
Connection state information.
Definition fb_service.h:199
void * relatedObject
C++ object for this connection.
Definition fb_service.h:229
Events are returned in this structure.
Definition fb_public.h:42
Service options are passed to a new service, defining its behavior.
Definition fb_public.h:75
Football service state structure.
Definition fb_service.h:128
struct fb_connection_t ** connections
Connections to services.
Definition fb_service.h:136
size_t connection_count
Number of active connections in the collection.
Definition fb_service.h:134