pianod2
multisource multiuser scriptable networked music player
connection.h
Go to the documentation of this file.
1 
9 #pragma once
10 
11 #include <config.h>
12 
13 #include <football/football.h>
15 
16 #include "fundamentals.h"
17 #include "response.h"
18 #include "interpreter.h"
19 #include "user.h"
20 
21 class PianodService;
22 namespace Media {
23  class Source;
24 }
25 //class ThingieList;
26 
28 class WaitEvent {
29 public:
31  enum class Type {
32  None,
34  TrackEnded,
36  };
37  Type event = Type::None;
38  const void *parameter;
39  time_t timeout = 0;
40  bool close_after_event = false;
41 
43  static time_t nextTimeout;
44 };
45 
46 namespace WaitOptions {
48  extern void extract_options (const Parsnip::Data &options, WaitEvent &dest);
49 };
50 
51 
55  // Override original event handlers
56  virtual void newConnection (const FB_EVENT *event) override;
57  virtual void connectionClose (const FB_EVENT *event) override;
58  virtual void inputReceived (const FB_EVENT *event) override;
59 
60  // Connection state
61  Media::Source * _source = nullptr;
63  bool use_json = false;
64 
65 public:
66  virtual ~PianodConnection () override;
67  inline bool transmitJSON () const {
68  return use_json;
69  }
70 
71  static bool json_connections_only (FB_CONNECTION *);
72  static bool line_connections_only (FB_CONNECTION *);
73 
74  // Now add pianod junk
75  // Visibility of this item should be adjusted later??? ZZZZZ
76  User *user = nullptr;
77 
78  void close_after_events ();
81  inline bool authenticated (void) const { return user != nullptr; };
83  inline std::string username (void) const { return authenticated() ? user->username() : "A visitor"; };
86  inline Media::Source * const source() const { return _source; };
90  [[nodiscard]] ResponseGroup source (Media::Source * const source, bool announce = true);
91  bool haveRank (Rank rank) const;
92  Rank effectiveRank (void) const;
93  bool havePrivilege (Privilege priv) const;
94 
95  void waitForEventWithOptions (WaitEvent::Type type, const Parsnip::Data &options, const void *detail);
96  void waitForEvent (WaitEvent::Type type, const void *detail);
97  void event (WaitEvent::Type type, const void *detail, RESPONSE_CODE reply);
98  void checkTimeouts ();
99 
100  [[nodiscard]] ResponseGroup sendSelectedSource () const;
101  [[nodiscard]] ResponseGroup sendEffectivePrivileges () const;
102  void announceToRoom (ResponseGroup &&announcement) const;
103  void announceToAll (ResponseGroup &&announcement) const;
104 
105  inline PianodService &service (void) const {
107  }
108 };
109 
110 
111 class AudioEngine;
112 class ServiceManager;
113 
115 class PianodService : public Football::Service<PianodConnection> {
116  friend class ServiceManager;
117 private:
118  AudioEngine *engine = nullptr;
119  const std::string room_name;
120 public:
122 
123  ~PianodService ();
124  PianodService (const FB_SERVICE_OPTIONS &options,
125  const std::string &room,
126  const AudioSettings &audio,
127  PianodService *parent,
128  const Parsnip::ParserRef &parser,
129  const PianodSchemaRef &schema);
130  inline AudioEngine *audioEngine() { return engine; };
131  void serviceShutdown (void);
132  inline const std::string &roomName (void) { return room_name; };
133  void usersChangedNotification (void);
134  void announceToRoom (const Response &message);
135  void announceToRoom (const ResponseGroup &message);
136 };
137 
Audio engine, responsible for one "room" worth of audio.
Definition: engine.h:28
C++ Connection wrapper.
Definition: football.h:68
ServiceBase * service(void) const
Get a connection's parent service.
Definition: fb_connection.cpp:175
Football Service.
Definition: football.h:151
Base class that wraps any audio source, such as Pandora, Spotify, or local music.
Definition: mediaunit.h:68
Generic data type.
Definition: parsnip.h:81
std::vector< const char * > Definitions
Definition: parsnip_command.h:90
Connection to a pianod client, along with context and state of that connection.
Definition: connection.h:54
virtual void connectionClose(const FB_EVENT *event) override
Invoked when a connection is closing.
Definition: connection.cpp:154
Media::Source *const source() const
Get the connection's selected source.
Definition: connection.h:86
void event(WaitEvent::Type type, const void *detail, RESPONSE_CODE reply)
Process an event for a connection.
Definition: connection.cpp:262
void waitForEvent(WaitEvent::Type type, const void *detail)
Begin waiting for an event on a connection.
Definition: connection.cpp:229
bool haveRank(Rank rank) const
Definition: connection.cpp:203
void close_after_events()
Close after events are handled, or now if not waiting on one.
Definition: connection.cpp:290
ResponseGroup updateConnection()
Definition: connection.cpp:150
std::string username(void) const
Definition: connection.h:83
static bool line_connections_only(FB_CONNECTION *)
Callback function used to identify line protocol connections.
Definition: connection.cpp:95
bool havePrivilege(Privilege priv) const
Determine if the user has a privilege.
Definition: connection.cpp:211
Media::Source * _source
The current source.
Definition: connection.h:61
void waitForEventWithOptions(WaitEvent::Type type, const Parsnip::Data &options, const void *detail)
Interpret options and begin waiting for an event on a connection.
Definition: connection.cpp:242
bool use_json
Set to true if protocol is JSON.
Definition: connection.h:63
virtual void newConnection(const FB_EVENT *event) override
Invoked when a new connection has arrived/greeted.
Definition: connection.cpp:115
Rank effectiveRank(void) const
Get connected user's rank.
Definition: connection.cpp:198
WaitEvent pending
An event this connection is waited for.
Definition: connection.h:62
ResponseGroup sendSelectedSource() const
Report the selected source to the connection.
Definition: connection.cpp:347
bool authenticated(void) const
Determine if the connection is authenticated, i.e., has a user.
Definition: connection.h:81
static bool json_connections_only(FB_CONNECTION *)
Callback function used to identify JSON connections.
Definition: connection.cpp:86
void checkTimeouts()
Check if a pending event has timed out.
Definition: connection.cpp:276
User * user
Definition: connection.h:76
ResponseGroup sendEffectivePrivileges() const
Transmit the user's effective privileges.
Definition: connection.cpp:356
void announceToRoom(ResponseGroup &&announcement) const
Send some messages to all users in a room.
Definition: connection.cpp:305
void announceToAll(ResponseGroup &&announcement) const
Broadcast some messages to all connected sessions, all rooms.
Definition: connection.cpp:327
virtual ~PianodConnection() override
Definition: connection.cpp:36
PianodService & service(void) const
Definition: connection.h:105
bool transmitJSON() const
Definition: connection.h:67
virtual void inputReceived(const FB_EVENT *event) override
Invoked when a completed message is received.
Definition: connection.cpp:163
Dispatcher based on Parsnip template, customized for pianod by adding help support.
Definition: interpreter.h:80
Pianod service, a customized FootballService for Pianod connections.
Definition: connection.h:115
~PianodService()
Definition: connection.cpp:371
void serviceShutdown(void)
When a service has been completely shut down, remove it from the service manager.
Definition: connection.cpp:377
PianodService(const FB_SERVICE_OPTIONS &options, const std::string &room, const AudioSettings &audio, PianodService *parent, const Parsnip::ParserRef &parser, const PianodSchemaRef &schema)
Definition: connection.cpp:39
void announceToRoom(const Response &message)
Send a message to all users in a room.
Definition: connection.cpp:387
const std::string room_name
Definition: connection.h:119
AudioEngine * engine
Definition: connection.h:118
PianodDispatcher dispatch
Definition: connection.h:121
void usersChangedNotification(void)
Definition: connection.cpp:381
const std::string & roomName(void)
Definition: connection.h:132
AudioEngine * audioEngine()
Definition: connection.h:130
Container for multiple Responses.
Definition: response.h:155
Type combining RESPONSE_CODE with a value or explanation:
Definition: response.h:49
Contains and manages all the services/rooms.
Definition: servicemanager.h:30
Data about each user.
Definition: user.h:53
const std::string & username(void) const
Definition: user.h:82
Details of an event being awaited.
Definition: connection.h:28
Type
Kinds of events that can be waited for.
Definition: connection.h:31
bool close_after_event
True if connection is 'AS USER' and should closed after event.
Definition: connection.h:40
static time_t nextTimeout
Definition: connection.h:43
const void * parameter
Identifies a specific event instance.
Definition: connection.h:38
time_t timeout
Time at which to stop waiting.
Definition: connection.h:39
Football public C++ declarations.
Essential data structures and support.
enum server_status_t RESPONSE_CODE
pianod command processing.
std::shared_ptr< PianodSchema > PianodSchemaRef
Definition: interpreter.h:75
Media source, source parameters and player interfaces.
Definition: connection.h:22
std::shared_ptr< Parser > ParserRef
Definition: parsnip_command.h:138
Parser for options for events/WAIT commands.
Definition: connection.cpp:59
const Parsnip::OptionParser::Definitions & parser_definitions()
Create a parser.
Definition: connection.cpp:64
void extract_options(const Parsnip::Data &options, WaitEvent *dest)
Extract the wait options into the WaitEvent structure.
Definition: connection.cpp:72
Parsnip command-line parsing.
Send messages of various kinds to clients.
Audio output device & driver parameters.
Definition: fundamentals.h:52
Connection state information.
Definition: fb_service.h:199
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
User data, privileges, details and preferences implementation.
Privilege
User privilege flags, corresponding to an array position.
Definition: user.h:32
Rank
User types in ascending ranks/level of authority.
Definition: user.h:24