Permalink
Browse files

support the client-to-client protocol

Implemented in MPD 0.17.
  • Loading branch information...
1 parent 0fe3b92 commit 721bc25416311ea8b201ec56cb821c0c48d8c18d @MaxKellermann MaxKellermann committed Feb 21, 2011
Showing with 518 additions and 0 deletions.
  1. +3 −0 Makefile.am
  2. +1 −0 NEWS
  3. +6 −0 include/mpd/idle.h
  4. +210 −0 include/mpd/message.h
  5. +16 −0 libmpdclient.ld
  6. +134 −0 src/cmessage.c
  7. +43 −0 src/example.c
  8. +2 −0 src/idle.c
  9. +103 −0 src/message.c
View
@@ -34,6 +34,7 @@ mpdinclude_HEADERS = \
include/mpd/song.h \
include/mpd/sticker.h \
include/mpd/settings.h \
+ include/mpd/message.h \
include/mpd/version.h
AM_CPPFLAGS += -I$(srcdir)/include -Iinclude
@@ -84,6 +85,8 @@ src_libmpdclient_la_SOURCES = \
src/tag.c \
src/sticker.c \
src/settings.c \
+ src/message.c \
+ src/cmessage.c \
src/uri.h
src_libmpdclient_la_LDFLAGS = -version-info @LIBMPDCLIENT_LIBTOOL_VERSION@ \
View
@@ -1,6 +1,7 @@
libmpdclient 2.5 (2010/??/??)
* playlist: implement the command "listplaylists"
* idle: support event "sticker"
+* support the client-to-client protocol (MPD 0.17)
libmpdclient 2.4 (2011/01/03)
View
@@ -80,6 +80,12 @@ enum mpd_idle {
/** a sticker has been modified. */
MPD_IDLE_STICKER = 0x100,
+
+ /** a client has subscribed or unsubscribed to/from a channel */
+ MPD_IDLE_SUBSCRIPTION = 0x200,
+
+ /** a message on the subscribed channel was receivedd */
+ MPD_IDLE_MESSAGE = 0x400,
};
#ifdef __cplusplus
View
@@ -0,0 +1,210 @@
+/* libmpdclient
+ (c) 2003-2010 The Music Player Daemon Project
+ This project's homepage is: http://www.musicpd.org
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*! \file
+ * \brief MPD client library
+ *
+ * Do not include this header directly. Use mpd/client.h instead.
+ */
+
+#ifndef MPD_MESSAGE_H
+#define MPD_MESSAGE_H
+
+#include <mpd/recv.h>
+#include <mpd/compiler.h>
+
+#include <stdbool.h>
+
+struct mpd_pair;
+struct mpd_message;
+struct mpd_connection;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Begins parsing a new message.
+ *
+ * @param pair the first pair in this message (name must be "channel")
+ * @return the new #mpd_entity object, or NULL on error (out of
+ * memory, or pair name is not "channel")
+ */
+mpd_malloc
+struct mpd_message *
+mpd_message_begin(const struct mpd_pair *pair);
+
+/**
+ * Parses the pair, adding its information to the specified
+ * #mpd_message object.
+ *
+ * @return true if the pair was parsed and added to the message (or if
+ * the pair was not understood and ignored), false if this pair is the
+ * beginning of the next message
+ */
+bool
+mpd_message_feed(struct mpd_message *output, const struct mpd_pair *pair);
+
+/**
+ * Frees a #mpd_message object.
+ */
+void
+mpd_message_free(struct mpd_message *message);
+
+/**
+ * Returns the channel name.
+ */
+mpd_pure
+const char *
+mpd_message_get_channel(const struct mpd_message *message);
+
+/**
+ * Returns the message text.
+ */
+mpd_pure
+const char *
+mpd_message_get_text(const struct mpd_message *message);
+
+/**
+ * Sends the "subscribe" command: subscribe to a message channel.
+ *
+ * @param connection the connection to MPD
+ * @param channel the channel name
+ * @return true on success
+ */
+bool
+mpd_send_subscribe(struct mpd_connection *connection, const char *channel);
+
+/**
+ * Shortcut for mpd_send_subscribe() and mpd_response_finish().
+ *
+ * @param connection the connection to MPD
+ * @param channel the channel name
+ * @return true on success
+ */
+bool
+mpd_run_subscribe(struct mpd_connection *connection, const char *channel);
+
+/**
+ * Sends the "unsubscribe" command: unsubscribe from a message
+ * channel.
+ *
+ * @param connection the connection to MPD
+ * @param channel the channel name
+ * @return true on success
+ */
+bool
+mpd_send_unsubscribe(struct mpd_connection *connection, const char *channel);
+
+/**
+ * Shortcut for mpd_send_unsubscribe() and mpd_response_finish().
+ *
+ * @param connection the connection to MPD
+ * @param channel the channel name
+ * @return true on success
+ */
+bool
+mpd_run_unsubscribe(struct mpd_connection *connection, const char *channel);
+
+/**
+ * Sends the "sendmessage" command: send a message to a channel.
+ *
+ * @param connection the connection to MPD
+ * @param channel the channel name
+ * @param text the message text
+ * @return true on success
+ */
+bool
+mpd_send_send_message(struct mpd_connection *connection,
+ const char *channel, const char *text);
+
+/**
+ * Shortcut for mpd_send_send_message() and mpd_response_finish().
+ *
+ * @param connection the connection to MPD
+ * @param channel the channel name
+ * @param text the message text
+ * @return true on success
+ */
+bool
+mpd_run_send_message(struct mpd_connection *connection,
+ const char *channel, const char *text);
+
+/**
+ * Sends the "readmessages" command: send a message to a channel.
+ *
+ * @param connection the connection to MPD
+ * @param channel the channel name
+ * @param message the message text
+ * @return true on success
+ */
+bool
+mpd_send_read_messages(struct mpd_connection *connection);
+
+/**
+ * Reads the next mpd_message from the MPD response. Free the return
+ * value with mpd_message_free().
+ *
+ * @return a mpd_message object on success, NULL on error or
+ * end-of-response
+ */
+mpd_malloc
+struct mpd_message *
+mpd_recv_message(struct mpd_connection *connection);
+
+/**
+ * Sends the "channels" command: get a list of all channels.
+ *
+ * @param connection the connection to MPD
+ * @return true on success
+ */
+bool
+mpd_send_channels(struct mpd_connection *connection);
+
+/**
+ * Receives the next channel name. Call this in a loop after
+ * mpd_send_channels().
+ *
+ * Free the return value with mpd_return_pair().
+ *
+ * @param connection a #mpd_connection
+ * @returns a "channel" pair, or NULL on error or if the end of the
+ * response is reached
+ */
+mpd_malloc
+static inline struct mpd_pair *
+mpd_recv_channel_pair(struct mpd_connection *connection)
+{
+ return mpd_recv_pair_named(connection, "channel");
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
View
@@ -80,6 +80,22 @@ global:
mpd_command_list_begin;
mpd_command_list_end;
+ /* mpd/message.h */
+ mpd_message_begin;
+ mpd_message_feed;
+ mpd_message_free;
+ mpd_message_get_channel;
+ mpd_message_get_text;
+ mpd_send_subscribe;
+ mpd_run_subscribe;
+ mpd_send_unsubscribe;
+ mpd_run_unsubscribe;
+ mpd_send_send_message;
+ mpd_run_send_message;
+ mpd_send_read_messages;
+ mpd_recv_message;
+ mpd_send_channels;
+
/* mpd/mixer.h */
mpd_send_set_volume;
mpd_run_set_volume;
Oops, something went wrong.

0 comments on commit 721bc25

Please sign in to comment.