pianod2
multisource multiuser scriptable networked music player
football.h
Go to the documentation of this file.
1 
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 
31 namespace 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:
76  virtual inline void *myThingie (void) const final { return connection; }
77  int argvIndex (const char *itemname) const;
78  protected:
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; }
125  // Constructor
126  ServiceBase (FB_SERVICE_OPTIONS options, ServiceBase *parent = nullptr);
127  virtual ~ServiceBase() override;
128  // Factories
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;
157  inline void advancePastBadness (void) {
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  };
174  }
176  position++;
178  return *this;
179  }
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 {
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) {
198  return (Connection *) ServiceBase::newConnectionFromFile (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 ; };
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
friend ServiceBase
Definition: football.h:221
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 handleEvent(const FB_EVENT *)
Process a Football event by dispatching a call to the connection's.
Definition: fb_arena.cpp:35
static bool poll(void)
Poll services.
Definition: fb_arena.cpp:102
C++ Connection wrapper.
Definition: football.h:68
void setConnection(FB_CONNECTION *conn)
Definition: football.h:103
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
int argvIndex(const char *itemname) const
int argname_capacity
Definition: football.h:74
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
virtual void * myThingie(void) const final
Definition: football.h:76
friend class Iterator
Definition: football.h:69
static Connection * getFromOld(FB_CONNECTION *connection)
Definition: fb_connection.cpp:120
virtual ~Connection() override
Definition: fb_connection.cpp:111
static Connection * tryGetFromOld(FB_CONNECTION *connection)
Definition: football.h:83
FB_CONNECTION * connection
Pointer to underlying Football connection.
Definition: football.h:73
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
virtual ~ServiceBase() override
Definition: fb_servicepp.cpp:44
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
static ServiceBase * getFromOld(FB_SERVICE *service)
Definition: fb_servicepp.cpp:93
ServiceBase(FB_SERVICE_OPTIONS options, ServiceBase *parent=nullptr)
Create a new service with requested options.
Definition: fb_servicepp.cpp:32
friend class Iterator
Definition: football.h:116
virtual Connection * allocNewConnection()=0
virtual ssize_t conditional_print(bool(*callback)(FB_CONNECTION *), const std::string &message) override
Definition: fb_servicepp.cpp:107
virtual void * myThingie(void) const final
Definition: football.h:123
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
const_iterator begin() const
Definition: football.h:202
virtual Connection * allocNewConnection()
Factories for related types instead of generics.
Definition: football.h:206
Service(const FB_SERVICE_OPTIONS options, Service *parent=nullptr)
Definition: football.h:194
iterator end()
Definition: football.h:201
iterator begin()
Definition: football.h:200
Connection * newConnectionFromFile(const std::string &filename)
Definition: football.h:197
const_iterator end() const
Definition: football.h:203
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
virtual ssize_t conditional_print(bool(*callback)(FB_CONNECTION *), const std::string &message)=0
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
virtual void * myThingie(void) const =0
virtual int_type overflow(int_type c) override
Definition: fb_connection.cpp:101
virtual ~Thingie()
Definition: fb_connection.cpp:32
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
virtual std::streamsize xsputn(const char_type *data, std::streamsize count) override
Definition: fb_connection.cpp:97
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
Thingie & operator<<(Thingie &there, const char *message)
Helper functions for sending output to a connection or service.
Definition: football.h:57
std::vector< const char * > HelpList
Lists of commands.
Definition: football.h:33
Definition: football.h:190
const Connection * operator*()
Definition: football.h:192
Definition: football.h:153
size_t position
Definition: football.h:154
Connection * operator*()
Definition: football.h:172
const FB_SERVICE & service
Definition: football.h:155
iterator & operator++()
Definition: football.h:175
iterator operator++(int)
Definition: football.h:180
bool operator!=(iterator &compare)
Definition: football.h:186
void advancePastBadness(void)
Advance the iterator past any opening/closing connections.
Definition: football.h:157
iterator(const FB_SERVICE &svc)
Definition: football.h:163
iterator(const FB_SERVICE &svc, size_t pos)
Definition: football.h:167
Connection state information.
Definition: fb_service.h:199
void * relatedObject
C++ object for this connection.
Definition: fb_service.h:228
FB_SOCKETSTATE state
Definition: fb_service.h:203
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