diff -urN rhythmbox-0.11.4/configure.ac rhythmbox-0.11.4.new/configure.ac --- rhythmbox-0.11.4/configure.ac 2007-12-20 11:56:44.000000000 +0000 +++ rhythmbox-0.11.4.new/configure.ac 2008-02-06 00:57:27.000000000 +0000 @@ -441,18 +441,25 @@ dnl Check for libsoup, needed for DAAP and audioscrobbler if test "x$enable_daap" = "xyes" || test "x$enable_audioscrobbler" != "xno"; then PKG_CHECK_MODULES(SOUP, \ - libsoup-2.2, - have_libsoup=yes, - have_libsoup=no) - if test x"$have_libsoup" = "xno"; then + libsoup-2.4, + have_libsoup24=yes, + have_libsoup24=no) + if test x"$have_libsoup24" = "xno"; then PKG_CHECK_MODULES(SOUP, - libsoup-2.4, - have_libsoup=yes, - have_libsoup=no) + libsoup-2.2, + have_libsoup22=yes, + have_libsoup22=no) fi - if test x"$have_libsoup" = "xyes"; then + if test x"$have_libsoup24" = "xyes" || test x"$have_libsoup22" = "xyes"; then + have_libsoup=yes AC_DEFINE(HAVE_LIBSOUP, 1, [Define if libsoup support is enabled]) fi + if test x"$have_libsoup24" = "xyes"; then + AC_DEFINE(HAVE_LIBSOUP_2_4, 1, [Define if libsoup 2.4 support is enabled]) + fi + if test x"$have_libsoup22" = "xyes"; then + AC_DEFINE(HAVE_LIBSOUP_2_2, 1, [Define if libsoup 2.2 support is enabled]) + fi fi AM_CONDITIONAL(USE_LIBSOUP, test x"$have_libsoup" = "xyes") @@ -513,27 +520,9 @@ -AC_PATH_X - -if test x"$x_includes" != x"NONE" && test -n "$x_includes" ; then - CFLAGS=$CFLAGS -I`echo $x_includes | sed -e "s/:/ -I/g"` -fi -if test x"$x_libraries" != x"NONE" && test -n "$x_libraries" ; then - LIBS=-L`echo $x_libraries | sed -e "s/:/ -L/g"` -fi - -have_xidle=no -AC_COMPILE_IFELSE([ - #include -int main(int argc,char **argv) { - return 0; -} -], have_xidle=yes) -AC_MSG_CHECKING(for XIDLE extension) -AC_MSG_RESULT($have_xidle) -if test x"$have_xidle" = "xyes" ; then - AC_DEFINE(HAVE_XIDLE_EXTENSION, 1, [defined if you have X11/extensions/xidle.h]) -fi +AC_PATH_XTRA +CFLAGS="$CFLAGS $X_CFLAGS" +#LIBS=$X_LIBS dnl Multimedia keys have_xfree=no @@ -1167,7 +1156,11 @@ AC_MSG_NOTICE([ CD burning support disabled]) fi if test x"$enable_daap" = xyes; then - AC_MSG_NOTICE([** DAAP (music sharing) support is enabled]) + if test x"$have_libsoup24" = "xyes"; then + AC_MSG_NOTICE([** DAAP (music sharing) support is enabled (using libsoup 2.4)]) + elif test x"$have_libsoup22" = "xyes"; then + AC_MSG_NOTICE([** DAAP (music sharing) support is enabled (using libsoup 2.2)]) + fi else AC_MSG_NOTICE([ DAAP (music sharing) support is disabled]) fi @@ -1197,7 +1190,11 @@ AC_MSG_NOTICE([ gnome-keyring support disabled]) fi if test x"$enable_audioscrobbler" != xno; then - AC_MSG_NOTICE([** Audioscrobbler support enabled]) + if test x"$have_libsoup24" = "xyes"; then + AC_MSG_NOTICE([** Audioscrobbler support enabled (using libsoup 2.4)]) + elif test x"$have_libsoup22" = "xyes"; then + AC_MSG_NOTICE([** Audioscrobbler support enabled (using libsoup 2.2)]) + fi else AC_MSG_NOTICE([ Audioscrobbler support disabled]) fi diff -urN rhythmbox-0.11.4/lib/Makefile.am rhythmbox-0.11.4.new/lib/Makefile.am --- rhythmbox-0.11.4/lib/Makefile.am 2007-08-01 09:04:11.000000000 +0100 +++ rhythmbox-0.11.4.new/lib/Makefile.am 2008-02-06 00:57:27.000000000 +0000 @@ -34,7 +34,8 @@ rb-string-value-map.c \ rb-string-value-map.h \ rb-async-queue-watch.c \ - rb-async-queue-watch.h + rb-async-queue-watch.h \ + rb-soup-compat.h if WITH_INTERNAL_GSEQUENCE librb_la_SOURCES += gsequence.c gsequence.h diff -urN rhythmbox-0.11.4/lib/rb-proxy-config.c rhythmbox-0.11.4.new/lib/rb-proxy-config.c --- rhythmbox-0.11.4/lib/rb-proxy-config.c 2007-06-03 02:55:02.000000000 +0100 +++ rhythmbox-0.11.4.new/lib/rb-proxy-config.c 2008-02-06 00:57:27.000000000 +0000 @@ -231,7 +231,28 @@ } } -#if defined(HAVE_LIBSOUP) +#if defined(HAVE_LIBSOUP_2_4) +SoupURI * +rb_proxy_config_get_libsoup_uri (RBProxyConfig *config) +{ + SoupURI *uri = NULL; + + if (!config->enabled) + return NULL; + + uri = soup_uri_new (NULL); + soup_uri_set_scheme (uri, SOUP_URI_SCHEME_HTTP); + soup_uri_set_host (uri, config->host); + soup_uri_set_port (uri, config->port); + + if (config->auth_enabled) { + soup_uri_set_user (uri, config->username); + soup_uri_set_password (uri, config->password); + } + + return uri; +} +#elif defined(HAVE_LIBSOUP_2_2) SoupUri * rb_proxy_config_get_libsoup_uri (RBProxyConfig *config) { diff -urN rhythmbox-0.11.4/lib/rb-proxy-config.h rhythmbox-0.11.4.new/lib/rb-proxy-config.h --- rhythmbox-0.11.4/lib/rb-proxy-config.h 2007-06-03 02:55:02.000000000 +0100 +++ rhythmbox-0.11.4.new/lib/rb-proxy-config.h 2008-02-06 00:57:27.000000000 +0000 @@ -24,8 +24,8 @@ #include #if defined(HAVE_LIBSOUP) +#include "rb-soup-compat.h" #include -#include #endif G_BEGIN_DECLS @@ -65,9 +65,7 @@ RBProxyConfig * rb_proxy_config_new (void); -#if defined(HAVE_LIBSOUP) -SoupUri * rb_proxy_config_get_libsoup_uri (RBProxyConfig *config); -#endif +SoupURI * rb_proxy_config_get_libsoup_uri (RBProxyConfig *config); #endif /* RB_PROXY_CONFIG_H */ diff -urN rhythmbox-0.11.4/lib/rb-soup-compat.h rhythmbox-0.11.4.new/lib/rb-soup-compat.h --- rhythmbox-0.11.4/lib/rb-soup-compat.h 1970-01-01 01:00:00.000000000 +0100 +++ rhythmbox-0.11.4.new/lib/rb-soup-compat.h 2008-02-06 00:57:27.000000000 +0000 @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2008 Jonathan Matthew + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#ifndef RB_SOUP_COMPAT_H +#define RB_SOUP_COMPAT_H + +#include + +/* compatibility junk for libsoup 2.2. + * not intended to obviate the need for #ifdefs in code, but + * should remove a lot of the trivial ones and make it easier + * to drop libsoup 2.2 + */ +#if defined(HAVE_LIBSOUP_2_2) + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +typedef SoupUri SoupURI; +typedef SoupMessageCallbackFn SoupSessionCallback; +typedef SoupServerContext SoupClientContext; + +#define SOUP_MEMORY_TAKE SOUP_BUFFER_SYSTEM_OWNED +#define SOUP_MEMORY_TEMPORARY SOUP_BUFFER_USER_OWNED + +#define soup_message_headers_append soup_message_add_header +#define soup_message_headers_get soup_message_get_header + +#define soup_client_context_get_host soup_server_context_get_client_host + +#endif /* HAVE_LIBSOUP_2_2 */ + +#endif /* RB_SOUP_COMPAT_H */ + diff -urN rhythmbox-0.11.4/plugins/audioscrobbler/rb-audioscrobbler.c rhythmbox-0.11.4.new/plugins/audioscrobbler/rb-audioscrobbler.c --- rhythmbox-0.11.4/plugins/audioscrobbler/rb-audioscrobbler.c 2007-12-17 09:26:53.000000000 +0000 +++ rhythmbox-0.11.4.new/plugins/audioscrobbler/rb-audioscrobbler.c 2008-02-06 00:59:48.000000000 +0000 @@ -24,6 +24,8 @@ #define __EXTENSIONS__ +#include "config.h" + #include #include @@ -35,10 +37,9 @@ #include #include +#include "rb-soup-compat.h" #include -#include -#include "config.h" #include "eel-gconf-extensions.h" #include "rb-audioscrobbler.h" #include "rb-debug.h" @@ -193,14 +194,20 @@ static gchar * mkmd5 (char *string); static void rb_audioscrobbler_parse_response (RBAudioscrobbler *audioscrobbler, SoupMessage *msg); -static void rb_audioscrobbler_perform (RBAudioscrobbler *audioscrobbler, - char *url, - char *post_data, - SoupMessageCallbackFn response_handler); + static void rb_audioscrobbler_do_handshake (RBAudioscrobbler *audioscrobbler); -static void rb_audioscrobbler_do_handshake_cb (SoupMessage *msg, gpointer user_data); static void rb_audioscrobbler_submit_queue (RBAudioscrobbler *audioscrobbler); +static void rb_audioscrobbler_perform (RBAudioscrobbler *audioscrobbler, + char *url, + char *post_data, + SoupSessionCallback response_handler); +#if defined(HAVE_LIBSOUP_2_4) +static void rb_audioscrobbler_do_handshake_cb (SoupSession *session, SoupMessage *msg, gpointer user_data); +static void rb_audioscrobbler_submit_queue_cb (SoupSession *session, SoupMessage *msg, gpointer user_data); +#else +static void rb_audioscrobbler_do_handshake_cb (SoupMessage *msg, gpointer user_data); static void rb_audioscrobbler_submit_queue_cb (SoupMessage *msg, gpointer user_data); +#endif static void rb_audioscrobbler_import_settings (RBAudioscrobbler *audioscrobbler); static void rb_audioscrobbler_preferences_sync (RBAudioscrobbler *audioscrobbler); @@ -688,18 +695,31 @@ static void rb_audioscrobbler_parse_response (RBAudioscrobbler *audioscrobbler, SoupMessage *msg) { + gboolean successful; rb_debug ("Parsing response, status=%d", msg->status_code); - - if (SOUP_STATUS_IS_SUCCESSFUL (msg->status_code) && (msg->response).body != NULL) { - gchar *body; + + successful = FALSE; +#if defined(HAVE_LIBSOUP_2_4) + if (SOUP_STATUS_IS_SUCCESSFUL (msg->status_code) && msg->response_body->length != 0) + successful = TRUE; +#else + if (SOUP_STATUS_IS_SUCCESSFUL (msg->status_code) && (msg->response).body != NULL) + successful = TRUE; +#endif + if (successful) { gchar **breaks; + int i; +#if defined(HAVE_LIBSOUP_2_2) + gchar *body; body = g_malloc0 ((msg->response).length + 1); memcpy (body, (msg->response).body, (msg->response).length); g_strstrip (body); breaks = g_strsplit (body, "\n", 4); - int i; +#else + breaks = g_strsplit (msg->response_body->data, "\n", 4); +#endif g_free (audioscrobbler->priv->status_msg); audioscrobbler->priv->status = STATUS_OK; @@ -771,10 +791,12 @@ audioscrobbler->priv->submit_next = time(NULL) + audioscrobbler->priv->submit_interval; g_strfreev (breaks); +#if defined(HAVE_LIBSOUP_2_2) g_free (body); +#endif } else { audioscrobbler->priv->status = REQUEST_FAILED; - audioscrobbler->priv->status_msg = g_strdup (soup_status_get_phrase (msg->status_code)); + audioscrobbler->priv->status_msg = g_strdup (msg->reason_phrase); } } @@ -793,24 +815,25 @@ rb_audioscrobbler_perform (RBAudioscrobbler *audioscrobbler, char *url, char *post_data, - SoupMessageCallbackFn response_handler) + SoupSessionCallback response_handler) { SoupMessage *msg; msg = soup_message_new (post_data == NULL ? "GET" : "POST", url); + soup_message_headers_append (msg->request_headers, "User-Agent", "Rhythmbox/" VERSION); if (post_data != NULL) { rb_debug ("Submitting to Audioscrobbler: %s", post_data); soup_message_set_request (msg, "application/x-www-form-urlencoded", - SOUP_BUFFER_SYSTEM_OWNED, + SOUP_MEMORY_TAKE, post_data, strlen (post_data)); } /* create soup session, if we haven't got one yet */ if (!audioscrobbler->priv->soup_session) { - SoupUri *uri; + SoupURI *uri; uri = rb_proxy_config_get_libsoup_uri (audioscrobbler->priv->proxy_config); audioscrobbler->priv->soup_session = soup_session_async_new_with_options ( @@ -891,8 +914,13 @@ } +#if defined(HAVE_LIBSOUP_2_4) +static void +rb_audioscrobbler_do_handshake_cb (SoupSession *session, SoupMessage *msg, gpointer user_data) +#else static void rb_audioscrobbler_do_handshake_cb (SoupMessage *msg, gpointer user_data) +#endif { RBAudioscrobbler *audioscrobbler = RB_AUDIOSCROBBLER(user_data); @@ -1049,8 +1077,13 @@ } } +#if defined(HAVE_LIBSOUP_2_4) +static void +rb_audioscrobbler_submit_queue_cb (SoupSession *session, SoupMessage *msg, gpointer user_data) +#else static void rb_audioscrobbler_submit_queue_cb (SoupMessage *msg, gpointer user_data) +#endif { RBAudioscrobbler *audioscrobbler = RB_AUDIOSCROBBLER (user_data); @@ -1232,7 +1265,7 @@ rb_audioscrobbler_proxy_config_changed_cb (RBProxyConfig *config, RBAudioscrobbler *audioscrobbler) { - SoupUri *uri; + SoupURI *uri; if (audioscrobbler->priv->soup_session) { uri = rb_proxy_config_get_libsoup_uri (config); diff -urN rhythmbox-0.11.4/plugins/audioscrobbler/rb-lastfm-gst-src.c rhythmbox-0.11.4.new/plugins/audioscrobbler/rb-lastfm-gst-src.c --- rhythmbox-0.11.4/plugins/audioscrobbler/rb-lastfm-gst-src.c 2007-06-19 12:38:41.000000000 +0100 +++ rhythmbox-0.11.4.new/plugins/audioscrobbler/rb-lastfm-gst-src.c 2008-02-06 00:57:27.000000000 +0000 @@ -25,7 +25,6 @@ #include "rb-debug.h" -#include #include #define RB_TYPE_LASTFM_SRC (rb_lastfm_src_get_type()) diff -urN rhythmbox-0.11.4/plugins/audioscrobbler/rb-lastfm-source.c rhythmbox-0.11.4.new/plugins/audioscrobbler/rb-lastfm-source.c --- rhythmbox-0.11.4/plugins/audioscrobbler/rb-lastfm-source.c 2007-12-04 03:05:39.000000000 +0000 +++ rhythmbox-0.11.4.new/plugins/audioscrobbler/rb-lastfm-source.c 2008-02-06 01:01:13.000000000 +0000 @@ -42,8 +42,8 @@ #include +#include "rb-soup-compat.h" #include -#include #include "md5.h" @@ -100,8 +100,12 @@ static void rb_lastfm_perform (RBLastfmSource *lastfm, const char *url, char *post_data, /* this takes ownership */ - SoupMessageCallbackFn response_handler); + SoupSessionCallback response_handler); +#if defined(HAVE_LIBSOUP_2_4) +static void rb_lastfm_message_cb (SoupSession *session, SoupMessage *req, gpointer user_data); +#else static void rb_lastfm_message_cb (SoupMessage *req, gpointer user_data); +#endif static void rb_lastfm_change_station (RBLastfmSource *source, const char *station); static void rb_lastfm_proxy_config_changed_cb (RBProxyConfig *config, @@ -724,30 +728,29 @@ rb_lastfm_perform (RBLastfmSource *source, const char *url, char *post_data, - SoupMessageCallbackFn response_handler) + SoupSessionCallback response_handler) { SoupMessage *msg; msg = soup_message_new ("GET", url); + soup_message_headers_append (msg->request_headers, "User-Agent", "Rhythmbox/" VERSION); if (msg == NULL) return; - soup_message_set_http_version (msg, SOUP_HTTP_1_1); - rb_debug ("Last.fm communicating with %s", url); if (post_data != NULL) { rb_debug ("POST data: %s", post_data); soup_message_set_request (msg, "application/x-www-form-urlencoded", - SOUP_BUFFER_SYSTEM_OWNED, + SOUP_MEMORY_TAKE, post_data, strlen (post_data)); } /* create soup session, if we haven't got one yet */ if (!source->priv->soup_session) { - SoupUri *uri; + SoupURI *uri; uri = rb_proxy_config_get_libsoup_uri (source->priv->proxy_config); source->priv->soup_session = soup_session_async_new_with_options ( @@ -759,27 +762,45 @@ soup_session_queue_message (source->priv->soup_session, msg, - (SoupMessageCallbackFn) response_handler, + response_handler, source); source->priv->status = COMMUNICATING; rb_source_notify_status_changed (RB_SOURCE(source)); } +#if defined(HAVE_LIBSOUP_2_4) +static void +rb_lastfm_message_cb (SoupSession *session, SoupMessage *req, gpointer user_data) +#else static void rb_lastfm_message_cb (SoupMessage *req, gpointer user_data) +#endif { RBLastfmSource *source = RB_LASTFM_SOURCE (user_data); - char *body; char **pieces; int i; + const char *body; + +#if defined(HAVE_LIBSOUP_2_2) + char *free_body; if ((req->response).body == NULL) { rb_debug ("Lastfm: Server failed to respond"); return; } - body = g_malloc0 ((req->response).length + 1); - memcpy (body, (req->response).body, (req->response).length); + free_body = g_malloc0 ((req->response).length + 1); + memcpy (free_body, (req->response).body, (req->response).length); + g_strstrip (free_body); + + body = free_body; +#else + if (req->response_body->length == 0) { + rb_debug ("Lastfm: Server failed to respond"); + return; + } + body = req->response_body->data; +#endif rb_debug ("response body: %s", body); @@ -787,7 +808,6 @@ source->priv->status = NO_ARTIST; } - g_strstrip (body); pieces = g_strsplit (body, "\n", 0); for (i = 0; pieces[i] != NULL; i++) { gchar **values = g_strsplit (pieces[i], "=", 2); @@ -856,10 +876,14 @@ rhythmdb_commit (source->priv->db); } + + g_strfreev (values); } g_strfreev (pieces); - g_free (body); +#if defined(HAVE_LIBSOUP_2_2) + g_free (free_body); +#endif /* doesn't work yet if (source->priv->pending_entry) { @@ -898,7 +922,7 @@ rb_lastfm_proxy_config_changed_cb (RBProxyConfig *config, RBLastfmSource *source) { - SoupUri *uri; + SoupURI *uri; if (source->priv->soup_session) { uri = rb_proxy_config_get_libsoup_uri (config); @@ -1163,10 +1187,16 @@ g_free(title); } +#if defined(HAVE_LIBSOUP_2_4) +static void +rb_lastfm_source_metadata_cb (SoupSession *session, SoupMessage *req, RBLastfmSource *source) +#else static void rb_lastfm_source_metadata_cb (SoupMessage *req, RBLastfmSource *source) +#endif { - char *body; + const char *body; + char *free_body; char **pieces; int p; RhythmDBEntry *entry; @@ -1179,10 +1209,16 @@ } rb_debug ("got response to metadata request"); - body = g_malloc0 ((req->response).length + 1); - memcpy (body, (req->response).body, (req->response).length); +#if defined(HAVE_LIBSOUP_2_4) + body = req->response_body->data; + free_body = NULL; +#else + free_body = g_malloc0 ((req->response).length + 1); + memcpy (free_body, (req->response).body, (req->response).length); + g_strstrip (free_body); + body = free_body; +#endif - g_strstrip (body); pieces = g_strsplit (body, "\n", 0); found_cover = FALSE; @@ -1238,7 +1274,9 @@ } g_strfreev (pieces); - g_free (body); +#if defined(HAVE_LIBSOUP_2_2) + g_free (free_body); +#endif if (found_cover == FALSE) { GValue v = {0,}; @@ -1271,7 +1309,7 @@ source->priv->base_url, source->priv->base_path, source->priv->session); - rb_lastfm_perform (source, uri, NULL, (SoupMessageCallbackFn) rb_lastfm_source_metadata_cb); + rb_lastfm_perform (source, uri, NULL, (SoupSessionCallback) rb_lastfm_source_metadata_cb); g_free (uri); /* re-enable actions */ diff -urN rhythmbox-0.11.4/plugins/daap/rb-daap-connection.c rhythmbox-0.11.4.new/plugins/daap/rb-daap-connection.c --- rhythmbox-0.11.4/plugins/daap/rb-daap-connection.c 2007-11-22 08:23:50.000000000 +0000 +++ rhythmbox-0.11.4.new/plugins/daap/rb-daap-connection.c 2008-02-06 00:57:27.000000000 +0000 @@ -33,10 +33,8 @@ #include #include +#include "rb-soup-compat.h" #include -#include -#include -#include #include "rb-daap-hash.h" #include "rb-daap-connection.h" @@ -84,7 +82,7 @@ gboolean is_connecting; SoupSession *session; - SoupUri *base_uri; + SoupURI *base_uri; gchar *daap_base_uri; gdouble daap_version; @@ -329,7 +327,7 @@ { RBDAAPConnectionPrivate *priv = connection->priv; SoupMessage *message = NULL; - SoupUri *uri = NULL; + SoupURI *uri = NULL; uri = soup_uri_new_with_base (priv->base_uri, path); if (uri == NULL) { @@ -337,14 +335,13 @@ } message = soup_message_new_from_uri (SOUP_METHOD_GET, uri); - soup_message_set_http_version (message, SOUP_HTTP_1_1); - soup_message_add_header (message->request_headers, "Client-DAAP-Version", "3.0"); - soup_message_add_header (message->request_headers, "Accept-Language", "en-us, en;q=5.0"); + soup_message_headers_append (message->request_headers, "Client-DAAP-Version", "3.0"); + soup_message_headers_append (message->request_headers, "Accept-Language", "en-us, en;q=5.0"); #ifdef HAVE_LIBZ - soup_message_add_header (message->request_headers, "Accept-Encoding", "gzip"); + soup_message_headers_append (message->request_headers, "Accept-Encoding", "gzip"); #endif - soup_message_add_header (message->request_headers, "Client-DAAP-Access-Index", "2"); + soup_message_headers_append (message->request_headers, "Client-DAAP-Access-Index", "2"); if (priv->password_protected) { char *h; @@ -352,13 +349,17 @@ char *token; user_pass = g_strdup_printf ("%s:%s", priv->username, priv->password); +#if defined(HAVE_LIBSOUP_2_4) + token = g_base64_encode ((guchar *)user_pass, strlen (user_pass)); +#else token = soup_base64_encode (user_pass, strlen (user_pass)); +#endif h = g_strdup_printf ("Basic %s", token); g_free (token); g_free (user_pass); - soup_message_add_header (message->request_headers, "Authorization", h); + soup_message_headers_append (message->request_headers, "Authorization", h); g_free (h); } @@ -372,10 +373,10 @@ rb_daap_hash_generate ((short)floor (version), (const guchar*)no_daap_path, 2, (guchar*)hash, req_id); - soup_message_add_header (message->request_headers, "Client-DAAP-Validation", hash); + soup_message_headers_append (message->request_headers, "Client-DAAP-Validation", hash); } if (send_close) { - soup_message_add_header (message->request_headers, "Connection", "close"); + soup_message_headers_append (message->request_headers, "Connection", "close"); } soup_uri_free (uri); @@ -425,16 +426,22 @@ { RBDAAPConnectionPrivate *priv; GNode *structure; - char *response; + char *new_response = NULL; + const char *response; const char *encoding_header; char *message_path; int response_length; priv = data->connection->priv; structure = NULL; - response = data->message->response.body; encoding_header = NULL; +#if defined(HAVE_LIBSOUP_2_4) + response = data->message->response_body->data; + response_length = data->message->response_body->length; +#else + response = data->message->response.body; response_length = data->message->response.length; +#endif message_path = soup_uri_to_string (soup_message_get_uri (data->message), FALSE); @@ -444,13 +451,12 @@ data->message->reason_phrase); if (data->message->response_headers) { - encoding_header = soup_message_get_header (data->message->response_headers, "Content-Encoding"); + encoding_header = soup_message_headers_get (data->message->response_headers, "Content-Encoding"); } if (SOUP_STATUS_IS_SUCCESSFUL (data->status) && encoding_header && strcmp (encoding_header, "gzip") == 0) { #ifdef HAVE_LIBZ z_stream stream; - char *new_response; unsigned int factor = 4; unsigned int unc_size = response_length * factor; @@ -575,19 +581,23 @@ rb_daap_structure_destroy (structure); } - if (response != data->message->response.body) { - g_free (response); - } - + g_free (new_response); g_free (message_path); g_object_unref (G_OBJECT (data->connection)); g_object_unref (G_OBJECT (data->message)); g_free (data); } +#if defined(HAVE_LIBSOUP_2_4) +static void +http_response_handler (SoupSession *session, + SoupMessage *message, + RBDAAPConnection *connection) +#else static void http_response_handler (SoupMessage *message, RBDAAPConnection *connection) +#endif { DAAPResponseData *data; int response_length; @@ -599,7 +609,11 @@ data = g_new0 (DAAPResponseData, 1); data->status = message->status_code; +#if defined(HAVE_LIBSOUP_2_4) + response_length = message->response_body->length; +#else response_length = message->response.length; +#endif g_object_ref (G_OBJECT (connection)); data->connection = connection; @@ -655,7 +669,7 @@ priv->use_response_handler_thread = use_thread; priv->response_handler = handler; soup_session_queue_message (priv->session, message, - (SoupMessageCallbackFn) http_response_handler, + (SoupSessionCallback) http_response_handler, connection); rb_debug ("Queued message for http://%s:%d/%s", priv->base_uri->host, @@ -1662,7 +1676,11 @@ char *token; user_pass = g_strdup_printf ("%s:%s", priv->username, priv->password); +#if defined(HAVE_LIBSOUP_2_4) + token = g_base64_encode ((guchar *)user_pass, strlen (user_pass)); +#else token = soup_base64_encode (user_pass, strlen (user_pass)); +#endif g_string_append_printf (headers, "Authentication: Basic %s\r\n", token); g_free (token); g_free (user_pass); diff -urN rhythmbox-0.11.4/plugins/daap/rb-daap-plugin.c rhythmbox-0.11.4.new/plugins/daap/rb-daap-plugin.c --- rhythmbox-0.11.4/plugins/daap/rb-daap-plugin.c 2007-09-03 08:24:09.000000000 +0100 +++ rhythmbox-0.11.4.new/plugins/daap/rb-daap-plugin.c 2008-02-06 00:57:27.000000000 +0000 @@ -29,8 +29,8 @@ #include #include +#include "rb-soup-compat.h" #include -#include #include "rb-daap-plugin.h" #include "rb-debug.h" @@ -647,6 +647,9 @@ g_free (host); soup_address_resolve_async (addr, +#if defined(HAVE_LIBSOUP_2_4) + NULL, NULL, +#endif (SoupAddressCallback) new_daap_share_resolve_cb, data); } diff -urN rhythmbox-0.11.4/plugins/daap/rb-daap-share.c rhythmbox-0.11.4.new/plugins/daap/rb-daap-share.c --- rhythmbox-0.11.4/plugins/daap/rb-daap-share.c 2007-11-08 13:09:20.000000000 +0000 +++ rhythmbox-0.11.4.new/plugins/daap/rb-daap-share.c 2008-02-06 00:57:27.000000000 +0000 @@ -27,13 +27,9 @@ #include #include + +#include "rb-soup-compat.h" #include -#include -#include -#include -#include -#include -#include #include #include "rb-daap-share.h" @@ -513,20 +509,22 @@ static void message_add_standard_headers (SoupMessage *message) { +#if defined(HAVE_LIBSOUP_2_2) gchar *s; time_t t; struct tm *tm; - soup_message_add_header (message->response_headers, "DAAP-Server", "Rhythmbox " VERSION); - - soup_message_add_header (message->response_headers, "Content-Type", "application/x-dmap-tagged"); - t = time (NULL); tm = gmtime (&t); s = g_new (gchar, 100); strftime (s, 100, "%a, %d %b %Y %T GMT", tm); - soup_message_add_header (message->response_headers, "Date", s); + soup_message_headers_append (message->response_headers, "Date", s); g_free (s); +#endif + + soup_message_headers_append (message->response_headers, "DAAP-Server", "Rhythmbox " VERSION); + + soup_message_headers_append (message->response_headers, "Content-Type", "application/x-dmap-tagged"); } static void @@ -543,14 +541,15 @@ return; } - message->response.owner = SOUP_BUFFER_SYSTEM_OWNED; - message->response.length = length; - message->response.body = resp; + soup_message_set_response (message, "application/x-dmap-tagged", SOUP_MEMORY_TAKE, resp, length); + +#if defined(HAVE_LIBSOUP_2_2) + soup_server_message_set_encoding (SOUP_SERVER_MESSAGE (message), SOUP_TRANSFER_CONTENT_LENGTH); +#endif message_add_standard_headers (message); soup_message_set_status (message, SOUP_STATUS_OK); - soup_server_message_set_encoding (SOUP_SERVER_MESSAGE (message), SOUP_TRANSFER_CONTENT_LENGTH); } #define DMAP_STATUS_OK 200 @@ -559,10 +558,20 @@ #define DAAP_VERSION 3.0 #define DMAP_TIMEOUT 1800 +#if defined(HAVE_LIBSOUP_2_4) +static void +server_info_cb (SoupServer *server, + SoupMessage *message, + const char *path, + GHashTable *query, + SoupClientContext *context, + RBDAAPShare *share) +#else static void server_info_cb (RBDAAPShare *share, SoupServerContext *context, SoupMessage *message) +#endif { /* MSRV server info response * MSTT status @@ -619,10 +628,20 @@ rb_daap_structure_destroy (msrv); } +#if defined(HAVE_LIBSOUP_2_4) +static void +content_codes_cb (SoupServer *server, + SoupMessage *message, + const char *path, + GHashTable *query, + SoupClientContext *context, + RBDAAPShare *share) +#else static void content_codes_cb (RBDAAPShare *share, SoupServerContext *context, SoupMessage *message) +#endif { /* MCCR content codes response * MSTT status @@ -656,6 +675,48 @@ rb_daap_structure_destroy (mccr); } +#if defined(HAVE_LIBSOUP_2_4) +static gboolean +get_session_id (GHashTable *query, + guint32 *id) +{ + char *session_id_str; + guint32 session_id; + + session_id_str = g_hash_table_lookup (query, "session-id"); + if (session_id_str == NULL) { + rb_debug ("session id not found"); + return FALSE; + } + + session_id = (guint32) strtoul (session_id_str, NULL, 10); + if (id != NULL) { + *id = session_id; + } + return TRUE; +} + +static gboolean +get_revision_number (GHashTable *query, + guint *number) +{ + char *revision_number_str; + guint revision_number; + + revision_number_str = g_hash_table_lookup (query, "revision-number"); + if (revision_number_str == NULL) { + rb_debug ("client asked for an update without a revision number?!?"); + return FALSE; + } + + revision_number = strtoul (revision_number_str, NULL, 10); + if (number != NULL) { + *number = revision_number; + } + return TRUE; +} + +#else static gboolean message_get_session_id (SoupMessage *message, guint32 *id) @@ -729,11 +790,13 @@ return TRUE; } +#endif static gboolean session_id_validate (RBDAAPShare *share, - SoupServerContext *context, + SoupClientContext *context, SoupMessage *message, + GHashTable *query, /* NULL w/ libsoup 2.2 */ guint32 *id) { guint32 session_id; @@ -745,7 +808,11 @@ *id = 0; } +#if defined(HAVE_LIBSOUP_2_4) + res = get_session_id (query, &session_id); +#else res = message_get_session_id (message, &session_id); +#endif if (! res) { rb_debug ("Validation failed: Unable to parse session id from message"); return FALSE; @@ -758,7 +825,7 @@ return FALSE; } - remote_address = soup_server_context_get_client_host (context); + remote_address = soup_client_context_get_host (context); rb_debug ("Validating session id %u from %s matches %s", session_id, remote_address, addr); if (remote_address == NULL || strcmp (addr, remote_address) != 0) { @@ -775,7 +842,7 @@ static guint32 session_id_generate (RBDAAPShare *share, - SoupServerContext *context) + SoupClientContext *context) { guint32 id; @@ -786,7 +853,7 @@ static guint32 session_id_create (RBDAAPShare *share, - SoupServerContext *context) + SoupClientContext *context) { guint32 id; const char *addr; @@ -802,7 +869,7 @@ } while (addr != NULL); /* store session id and remote address */ - remote_address = g_strdup (soup_server_context_get_client_host (context)); + remote_address = g_strdup (soup_client_context_get_host (context)); g_hash_table_insert (share->priv->session_ids, GUINT_TO_POINTER (id), remote_address); return id; @@ -810,16 +877,26 @@ static void session_id_remove (RBDAAPShare *share, - SoupServerContext *context, + SoupClientContext *context, guint32 id) { g_hash_table_remove (share->priv->session_ids, GUINT_TO_POINTER (id)); } +#if defined(HAVE_LIBSOUP_2_4) static void -login_cb (RBDAAPShare *share, +login_cb (SoupServer *server, + SoupMessage *message, + const char *path, + GHashTable *query, + SoupClientContext *context, + RBDAAPShare *share) +#else +static void +login_cb (RBDAAPShare *share, SoupServerContext *context, - SoupMessage *message) + SoupMessage *message) +#endif { /* MLOG login response * MSTT status @@ -840,15 +917,28 @@ rb_daap_structure_destroy (mlog); } +#if defined(HAVE_LIBSOUP_2_4) +static void +logout_cb (SoupServer *server, + SoupMessage *message, + const char *path, + GHashTable *query, + SoupClientContext *context, + RBDAAPShare *share) +#else static void logout_cb (RBDAAPShare *share, SoupServerContext *context, SoupMessage *message) +#endif { int status; guint32 id; +#if defined(HAVE_LIBSOUP_2_2) + GHashTable *query = NULL; +#endif - if (session_id_validate (share, context, message, &id)) { + if (session_id_validate (share, context, message, query, &id)) { rb_debug ("Handling logout session id %u", id); session_id_remove (share, context, id); @@ -858,18 +948,34 @@ } soup_message_set_status (message, status); +#if defined(HAVE_LIBSOUP_2_2) soup_server_message_set_encoding (SOUP_SERVER_MESSAGE (message), SOUP_TRANSFER_CONTENT_LENGTH); +#endif } +#if defined(HAVE_LIBSOUP_2_4) +static void +update_cb (SoupServer *server, + SoupMessage *message, + const char *path, + GHashTable *query, + SoupClientContext *context, + RBDAAPShare *share) +#else static void update_cb (RBDAAPShare *share, SoupServerContext *context, SoupMessage *message) +#endif { guint revision_number; gboolean res; +#if defined(HAVE_LIBSOUP_2_4) + res = get_revision_number (query, &revision_number); +#else res = message_get_revision_number (message, &revision_number); +#endif if (res && revision_number != share->priv->revision_number) { /* MUPD update response @@ -885,8 +991,15 @@ message_set_from_rb_daap_structure (message, mupd); rb_daap_structure_destroy (mupd); } else { + /* FIXME: This seems like a bug. It just leaks the + * message (and socket) without ever replying. + */ g_object_ref (message); +#if defined(HAVE_LIBSOUP_2_4) + soup_server_pause_message (server, message); +#else soup_message_io_pause (message); +#endif } } @@ -1148,14 +1261,47 @@ } static bitwise +parse_meta_str (const char *attrs) +{ + gchar **attrsv; + guint i; + bitwise bits = 0; + + attrsv = g_strsplit (attrs, ",", -1); + + for (i = 0; attrsv[i]; i++) { + guint j; + + for (j = 0; j < G_N_ELEMENTS (meta_data_map); j++) { + if (strcmp (meta_data_map[j].tag, attrsv[i]) == 0) { + bits |= (((bitwise) 1) << meta_data_map[j].md); + } + } + } + + g_strfreev (attrsv); + + return bits; +} + +#if defined(HAVE_LIBSOUP_2_4) +static bitwise +parse_meta (GHashTable *query) +{ + const gchar *attrs; + + attrs = g_hash_table_lookup (query, "meta"); + return parse_meta_str (attrs); +} + +#else +static bitwise parse_meta (const gchar *s) { + bitwise bits; gchar *start_of_attrs; gchar *end_of_attrs; gchar *attrs; - gchar **attrsv; - guint i; - bitwise bits = 0; start_of_attrs = strstr (s, "meta="); if (start_of_attrs == NULL) { @@ -1170,23 +1316,12 @@ attrs = g_strdup (start_of_attrs); } - attrsv = g_strsplit (attrs,",",-1); - - for (i = 0; attrsv[i]; i++) { - guint j; - - for (j = 0; j < G_N_ELEMENTS (meta_data_map); j++) { - if (strcmp (meta_data_map[j].tag, attrsv[i]) == 0) { - bits |= (((bitwise) 1) << meta_data_map[j].md); - } - } - } - + bits = parse_meta_str (attrs); g_free (attrs); - g_strfreev (attrsv); return bits; } +#endif static void write_next_chunk (SoupMessage *message, GnomeVFSHandle *handle) @@ -1197,10 +1332,18 @@ result = gnome_vfs_read (handle, chunk, DAAP_SHARE_CHUNK_SIZE, &read_size); if (result == GNOME_VFS_OK && read_size > 0) { +#if defined(HAVE_LIBSOUP_2_4) + soup_message_body_append (message->response_body, SOUP_MEMORY_TAKE, chunk, read_size); +#else soup_message_add_chunk (message, SOUP_BUFFER_SYSTEM_OWNED, chunk, read_size); +#endif } else { g_free (chunk); +#if defined(HAVE_LIBSOUP_2_4) + soup_message_body_complete (message->response_body); +#else soup_message_add_final_chunk (message); +#endif } } @@ -1238,7 +1381,11 @@ file_size -= offset; } +#if defined(HAVE_LIBSOUP_2_4) + soup_message_headers_set_encoding (message->response_headers, SOUP_ENCODING_CHUNKED); +#else soup_server_message_set_encoding (SOUP_SERVER_MESSAGE (message), SOUP_TRANSFER_CHUNKED); +#endif g_signal_connect (message, "wrote_chunk", G_CALLBACK (write_next_chunk), handle); g_signal_connect (message, "finished", G_CALLBACK (chunked_message_finished), handle); @@ -1268,11 +1415,14 @@ g_warning ("Unable to map file %s: %s", path, error->message); soup_message_set_status (message, SOUP_STATUS_INTERNAL_SERVER_ERROR); } else { - message->response.owner = SOUP_BUFFER_USER_OWNED; - message->response.length = file_size; - message->response.body = g_mapped_file_get_contents (mapped_file) + offset; + soup_message_set_response (message, "application/x-dmap-tagged", + SOUP_MEMORY_TEMPORARY, + g_mapped_file_get_contents (mapped_file) + offset, + file_size); +#if defined(HAVE_LIBSOUP_2_2) soup_server_message_set_encoding (SOUP_SERVER_MESSAGE (message), SOUP_TRANSFER_CONTENT_LENGTH); +#endif g_signal_connect (message, "finished", @@ -1283,22 +1433,40 @@ } #endif +#if defined(HAVE_LIBSOUP_2_4) +static void +databases_cb (SoupServer *server, + SoupMessage *message, + const char *path, + GHashTable *query, + SoupClientContext *context, + RBDAAPShare *share) + +#else static void databases_cb (RBDAAPShare *share, SoupServerContext *context, SoupMessage *message) +#endif { - gchar *path; - gchar *rest_of_path; + const char *rest_of_path; /*guint revision_number;*/ +#if defined(HAVE_LIBSOUP_2_2) + GHashTable *query = NULL; + gchar *path; +#endif - if (! session_id_validate (share, context, message, NULL)) { + if (! session_id_validate (share, context, message, query, NULL)) { soup_message_set_status (message, SOUP_STATUS_FORBIDDEN); +#if defined(HAVE_LIBSOUP_2_2) soup_server_message_set_encoding (SOUP_SERVER_MESSAGE (message), SOUP_TRANSFER_CONTENT_LENGTH); +#endif return; } +#if defined(HAVE_LIBSOUP_2_2) path = soup_uri_to_string (soup_message_get_uri (message), TRUE); +#endif rest_of_path = strchr (path + 1, '/'); @@ -1335,7 +1503,11 @@ message_set_from_rb_daap_structure (message, avdb); rb_daap_structure_destroy (avdb); +#if defined(HAVE_LIBSOUP_2_4) + } else if (g_ascii_strcasecmp ("/1/items", rest_of_path) == 0) { +#else } else if (g_ascii_strncasecmp ("/1/items?", rest_of_path, 9) == 0) { +#endif /* ADBS database songs * MSTT status * MUTY update type @@ -1351,7 +1523,11 @@ gint32 num_songs = rhythmdb_entry_count_by_type (share->priv->db, share->priv->entry_type); struct MLCL_Bits mb = {NULL,0}; +#if defined(HAVE_LIBSOUP_2_4) + mb.bits = parse_meta (query); +#else mb.bits = parse_meta (rest_of_path); +#endif adbs = rb_daap_structure_add (NULL, RB_DAAP_CC_ADBS); rb_daap_structure_add (adbs, RB_DAAP_CC_MSTT, (gint32) DMAP_STATUS_OK); @@ -1365,7 +1541,11 @@ message_set_from_rb_daap_structure (message, adbs); rb_daap_structure_destroy (adbs); adbs = NULL; +#if defined(HAVE_LIBSOUP_2_4) + } else if (g_ascii_strcasecmp ("/1/containers", rest_of_path) == 0) { +#else } else if (g_ascii_strncasecmp ("/1/containers?", rest_of_path, 14) == 0) { +#endif /* APLY database playlists * MSTT status * MUTY update type @@ -1402,6 +1582,7 @@ message_set_from_rb_daap_structure (message, aply); rb_daap_structure_destroy (aply); + } else if (g_ascii_strncasecmp ("/1/containers/", rest_of_path, 14) == 0) { /* APSO playlist songs * MSTT status @@ -1420,7 +1601,11 @@ struct MLCL_Bits mb = {NULL,0}; gint pl_id = atoi (rest_of_path + 14); +#if defined(HAVE_LIBSOUP_2_4) + mb.bits = parse_meta (query); +#else mb.bits = parse_meta (rest_of_path); +#endif apso = rb_daap_structure_add (NULL, RB_DAAP_CC_APSO); rb_daap_structure_add (apso, RB_DAAP_CC_MSTT, (gint32) DMAP_STATUS_OK); @@ -1447,9 +1632,11 @@ _find_by_id); if (idl == NULL) { soup_message_set_status (message, SOUP_STATUS_NOT_FOUND); +#if defined(HAVE_LIBSOUP_2_2) soup_server_message_set_encoding (SOUP_SERVER_MESSAGE (message), SOUP_TRANSFER_CONTENT_LENGTH); soup_message_set_response (message, "text/plain", SOUP_BUFFER_USER_OWNED, "", 0); +#endif goto out; } id = (RBPlaylistID *)idl->data; @@ -1470,7 +1657,7 @@ rb_daap_structure_destroy (apso); } else if (g_ascii_strncasecmp ("/1/items/", rest_of_path, 9) == 0) { /* just the file :) */ - gchar *id_str; + const gchar *id_str; gint id; RhythmDBEntry *entry; const gchar *location; @@ -1486,9 +1673,9 @@ file_size = rhythmdb_entry_get_uint64 (entry, RHYTHMDB_PROP_FILE_SIZE); message_add_standard_headers (message); - soup_message_add_header (message->response_headers, "Accept-Ranges", "bytes"); + soup_message_headers_append (message->response_headers, "Accept-Ranges", "bytes"); - range_header = soup_message_get_header (message->request_headers, "Range"); + range_header = soup_message_headers_get (message->request_headers, "Range"); if (range_header) { const gchar *s; gchar *content_range; @@ -1497,7 +1684,7 @@ offset = atoll (s); content_range = g_strdup_printf ("bytes %" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT "/%" G_GUINT64_FORMAT, offset, file_size, file_size); - soup_message_add_header (message->response_headers, "Content-Range", content_range); + soup_message_headers_append (message->response_headers, "Content-Range", content_range); g_free (content_range); soup_message_set_status (message, SOUP_STATUS_PARTIAL_CONTENT); @@ -1522,9 +1709,92 @@ } out: +#if defined(HAVE_LIBSOUP_2_2) g_free (path); +#else + ; +#endif +} + +static void +db_entry_added_cb (RhythmDB *db, + RhythmDBEntry *entry, + RBDAAPShare *share) +{ + /* TODO: update our db version number? */ +} + +static void +add_db_entry (RhythmDBEntry *entry, + RBDAAPShare *share) +{ + db_entry_added_cb (share->priv->db, entry, share); +} + +static void +db_entry_deleted_cb (RhythmDB *db, + RhythmDBEntry *entry, + RBDAAPShare *share) +{ + /* TODO: update our db version number? */ +} + +static void +db_entry_changed_cb (RhythmDB *db, + RhythmDBEntry *entry, + GSList *changes, + RBDAAPShare *share) +{ + if (rhythmdb_entry_get_boolean (entry, RHYTHMDB_PROP_HIDDEN)) { + db_entry_deleted_cb (db, entry, share); + } else { + db_entry_added_cb (db, entry, share); + } +} + +#if defined(HAVE_LIBSOUP_2_4) + +static gboolean +soup_auth_filter (SoupAuthDomain *auth_domain, + SoupMessage *msg, + gpointer user_data) +{ + const char *path; + + path = soup_message_get_uri (msg)->path; + if (g_str_has_prefix (path, "/databases/")) { + /* Subdirectories of /databases don't actually require + * authentication + */ + return FALSE; + } else { + /* Everything else in auth_domain's paths, including + * /databases itself, does require auth. + */ + return TRUE; + } } +static gboolean +soup_auth_callback (SoupAuthDomain *auth_domain, + SoupMessage *msg, + const char *username, + gpointer password, + RBDAAPShare *share) +{ + gboolean allowed; + const char *path; + + path = soup_message_get_uri (msg)->path; + rb_debug ("Auth request for %s, user %s", path, username); + + allowed = !strcmp (password, share->priv->password); + rb_debug ("Auth request: %s", allowed ? "ALLOWED" : "DENIED"); + + return allowed; +} + +#else typedef void (* DAAPPathFunction) (RBDAAPShare *share, SoupServerContext *context, SoupMessage *message); @@ -1567,42 +1837,6 @@ g_free (path); } -static void -db_entry_added_cb (RhythmDB *db, - RhythmDBEntry *entry, - RBDAAPShare *share) -{ - /* TODO: update our db version number? */ -} - -static void -add_db_entry (RhythmDBEntry *entry, - RBDAAPShare *share) -{ - db_entry_added_cb (share->priv->db, entry, share); -} - -static void -db_entry_deleted_cb (RhythmDB *db, - RhythmDBEntry *entry, - RBDAAPShare *share) -{ - /* TODO: update our db version number? */ -} - -static void -db_entry_changed_cb (RhythmDB *db, - RhythmDBEntry *entry, - GSList *changes, - RBDAAPShare *share) -{ - if (rhythmdb_entry_get_boolean (entry, RHYTHMDB_PROP_HIDDEN)) { - db_entry_deleted_cb (db, entry, share); - } else { - db_entry_added_cb (db, entry, share); - } -} - static gboolean soup_auth_callback (SoupServerAuthContext *auth_ctx, SoupServerAuth *auth, @@ -1642,12 +1876,14 @@ return allowed; } +#endif + + static gboolean rb_daap_share_server_start (RBDAAPShare *share) { int port = STANDARD_DAAP_PORT; gboolean password_required; - SoupServerAuthContext auth_ctx = { 0 }; share->priv->server = soup_server_new (SOUP_SERVER_PORT, port, NULL); if (share->priv->server == NULL) { @@ -1666,6 +1902,22 @@ password_required = (share->priv->auth_method != RB_DAAP_SHARE_AUTH_METHOD_NONE); if (password_required) { +#if defined(HAVE_LIBSOUP_2_4) + SoupAuthDomain *auth_domain; + + auth_domain = soup_auth_domain_basic_new (SOUP_AUTH_DOMAIN_REALM, "Music Sharing", + SOUP_AUTH_DOMAIN_ADD_PATH, "/login", + SOUP_AUTH_DOMAIN_ADD_PATH, "/update", + SOUP_AUTH_DOMAIN_ADD_PATH, "/database", + SOUP_AUTH_DOMAIN_FILTER, soup_auth_filter, + NULL); + soup_auth_domain_basic_set_auth_callback (auth_domain, + (SoupAuthDomainBasicAuthCallback)soup_auth_callback, + g_object_ref (share), + g_object_unref); + soup_server_add_auth_domain (share->priv->server, auth_domain); +#else + SoupServerAuthContext auth_ctx = { 0 }; auth_ctx.types = SOUP_AUTH_TYPE_BASIC; auth_ctx.callback = (SoupServerAuthCallbackFn)soup_auth_callback; auth_ctx.user_data = share; @@ -1689,14 +1941,36 @@ (SoupServerCallbackFn)server_cb, NULL, share); +#endif } +#if defined(HAVE_LIBSOUP_2_4) + soup_server_add_handler (share->priv->server, "/server-info", + (SoupServerCallback) server_info_cb, + share, NULL); + soup_server_add_handler (share->priv->server, "/content-codes", + (SoupServerCallback) content_codes_cb, + share, NULL); + soup_server_add_handler (share->priv->server, "/login", + (SoupServerCallback) login_cb, + share, NULL); + soup_server_add_handler (share->priv->server, "/logout", + (SoupServerCallback) logout_cb, + share, NULL); + soup_server_add_handler (share->priv->server, "/update", + (SoupServerCallback) update_cb, + share, NULL); + soup_server_add_handler (share->priv->server, "/databases", + (SoupServerCallback) databases_cb, + share, NULL); +#else soup_server_add_handler (share->priv->server, NULL, NULL, (SoupServerCallbackFn)server_cb, NULL, share); +#endif soup_server_run_async (share->priv->server); /* using direct since there is no g_uint_hash or g_uint_equal */ diff -urN rhythmbox-0.11.4/plugins/daap/rb-daap-src.c rhythmbox-0.11.4.new/plugins/daap/rb-daap-src.c --- rhythmbox-0.11.4/plugins/daap/rb-daap-src.c 2007-06-17 12:56:21.000000000 +0100 +++ rhythmbox-0.11.4.new/plugins/daap/rb-daap-src.c 2008-02-06 00:57:27.000000000 +0000 @@ -34,8 +34,8 @@ #include #include -#include -#include +#include "rb-soup-compat.h" +#include #include #include @@ -432,7 +432,12 @@ gchar *host; guint port; gchar *path; +#if defined(HAVE_LIBSOUP_2_4) + SoupMessageHeaders *header_table; +#else GHashTable *header_table; + char *dup_headers; +#endif gchar *request; gchar *response; gchar *end_headers; @@ -441,7 +446,6 @@ guint http_status; gchar *http_status_phrase = NULL; gboolean parse_result; - char *dup_headers; if (src->buffer_base) { g_free (src->buffer_base); @@ -536,6 +540,15 @@ return FALSE; } +#if defined(HAVE_LIBSOUP_2_4) + header_table = soup_message_headers_new (SOUP_MESSAGE_HEADERS_RESPONSE); + parse_result = soup_headers_parse_response (response, + ((end_headers+2) - response), + header_table, + NULL, + &http_status, + &http_status_phrase); +#else /* for compatibility with older versions of libsoup, we may need to retry * the soup_headers_parse_response call with slightly different arguments. * since this function modifies the string passed in, we need to copy it @@ -567,28 +580,42 @@ &http_status, &http_status_phrase); } +#endif if (parse_result) { if (http_status == 200 || http_status == 206) { + const char *enc_str = NULL; + const char *len_str = NULL; +#if defined(HAVE_LIBSOUP_2_4) + enc_str = soup_message_headers_get (header_table, "Transfer-Encoding"); + len_str = soup_message_headers_get (header_table, "Content-Length"); +#else GSList *val; - val = g_hash_table_lookup (header_table, "Transfer-Encoding"); if (val) { - if (g_strcasecmp ((gchar *)val->data, "chunked") == 0) { + enc_str = ((const char *)val->data); + } + val = g_hash_table_lookup (header_table, "Content-Length"); + if (val) { + len_str = ((const char *)val->data); + } +#endif + + if (enc_str) { + if (g_strcasecmp (enc_str, "chunked") == 0) { src->chunked = TRUE; } else { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), - ("Unknown HTTP transfer encoding \"%s\"", val->data)); + ("Unknown HTTP transfer encoding \"%s\"", enc_str)); } } else { src->chunked = FALSE; - val = g_hash_table_lookup (header_table, "Content-Length"); - if (val) { + if (len_str) { char *e; - src->size = strtoul ((char *)val->data, &e, 10); - if (e == val->data) { + src->size = strtoul (len_str, &e, 10); + if (e == len_str) { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), - ("Couldn't read HTTP content length \"%s\"", val->data)); + ("Couldn't read HTTP content length \"%s\"", len_str)); ok = FALSE; } } else { @@ -609,8 +636,13 @@ ok = FALSE; } g_free (http_status_phrase); + +#if defined(HAVE_LIBSOUP_2_4) + soup_message_headers_free (header_table); +#else soup_message_clear_headers (header_table); g_hash_table_destroy (header_table); +#endif end_headers += 4;