diff options
Diffstat (limited to '')
-rw-r--r-- | src/ClientInternal.hxx (renamed from src/client_internal.h) | 131 |
1 files changed, 55 insertions, 76 deletions
diff --git a/src/client_internal.h b/src/ClientInternal.hxx index ba97e4b8f..dee5d9c71 100644 --- a/src/client_internal.h +++ b/src/ClientInternal.hxx @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003-2011 The Music Player Daemon Project + * Copyright (C) 2003-2013 The Music Player Daemon Project * http://www.musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -17,13 +17,22 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef MPD_CLIENT_INTERNAL_H -#define MPD_CLIENT_INTERNAL_H +#ifndef MPD_CLIENT_INTERNAL_HXX +#define MPD_CLIENT_INTERNAL_HXX -#include "client.h" -#include "client_message.h" +#include "check.h" +#include "Client.hxx" +#include "ClientMessage.hxx" +#include "CommandListBuilder.hxx" +#include "event/BufferedSocket.hxx" #include "command.h" +#include <set> +#include <string> +#include <list> + +#include <glib.h> + #undef G_LOG_DOMAIN #define G_LOG_DOMAIN "client" @@ -32,20 +41,14 @@ enum { CLIENT_MAX_MESSAGES = 64, }; -struct deferred_buffer { - size_t size; - char data[sizeof(long)]; -}; +struct Partition; -struct client { +class Client final : private BufferedSocket { +public: + Partition &partition; + struct playlist &playlist; struct player_control *player_control; - GIOChannel *channel; - guint source_id; - - /** the buffer for reading lines from the #channel */ - struct fifo_buffer *input; - unsigned permission; /** the uid of the client process, or -1 if unknown */ @@ -56,15 +59,9 @@ struct client { */ GTimer *last_activity; - GSList *cmd_list; /* for when in list mode */ - int cmd_list_OK; /* print OK after each command execution */ - size_t cmd_list_size; /* mem cmd_list consumes */ - GQueue *deferred_send; /* for output if client is slow */ - size_t deferred_bytes; /* mem deferred_send consumes */ - unsigned int num; /* client number */ + CommandListBuilder cmd_list; - char send_buf[16384]; - size_t send_buf_used; /* bytes used this instance */ + unsigned int num; /* client number */ /** is this client waiting for an "idle" response? */ bool idle_waiting; @@ -79,7 +76,7 @@ struct client { /** * A list of channel names this client is subscribed to. */ - GSList *subscriptions; + std::set<std::string> subscriptions; /** * The number of subscriptions in #subscriptions. Used to @@ -88,60 +85,45 @@ struct client { unsigned num_subscriptions; /** - * A list of messages this client has received in reverse - * order (latest first). + * A list of messages this client has received. */ - GSList *messages; + std::list<ClientMessage> messages; - /** - * The number of messages in #messages. - */ - unsigned num_messages; -}; + Client(EventLoop &loop, Partition &partition, + int fd, int uid, int num); + ~Client(); -extern unsigned int client_max_connections; -extern int client_timeout; -extern size_t client_max_command_list_size; -extern size_t client_max_output_buffer_size; + bool IsConnected() const { + return BufferedSocket::IsDefined(); + } -bool -client_list_is_empty(void); + gcc_pure + bool IsSubscribed(const char *channel_name) const { + return subscriptions.find(channel_name) != subscriptions.end(); + } -bool -client_list_is_full(void); + gcc_pure + bool IsExpired() const { + return !BufferedSocket::IsDefined(); + } -struct client * -client_list_get_first(void); + void Close(); + void SetExpired(); -void -client_list_add(struct client *client); + using BufferedSocket::Write; -void -client_list_foreach(GFunc func, gpointer user_data); - -void -client_list_remove(struct client *client); - -void -client_close(struct client *client); - -static inline void -new_cmd_list_ptr(struct client *client, const char *s) -{ - client->cmd_list = g_slist_prepend(client->cmd_list, g_strdup(s)); -} - -static inline void -free_cmd_list(GSList *list) -{ - for (GSList *tmp = list; tmp != NULL; tmp = g_slist_next(tmp)) - g_free(tmp->data); - - g_slist_free(list); -} +private: + /* virtual methods from class BufferedSocket */ + virtual InputResult OnSocketInput(const void *data, + size_t length) override; + virtual void OnSocketError(GError *error) override; + virtual void OnSocketClosed() override; +}; -void -client_set_expired(struct client *client); +extern unsigned int client_max_connections; +extern int client_timeout; +extern size_t client_max_command_list_size; +extern size_t client_max_output_buffer_size; /** * Schedule an "expired" check for all clients: permanently delete @@ -157,16 +139,13 @@ void client_deinit_expire(void); enum command_return -client_read(struct client *client); +client_read(Client *client); enum command_return -client_process_line(struct client *client, char *line); - -void -client_write_deferred(struct client *client); +client_process_line(Client *client, char *line); void -client_write_output(struct client *client); +client_write_output(Client *client); gboolean client_in_event(GIOChannel *source, GIOCondition condition, |