Remove libevent 1 support in httpd_dacp

This commit is contained in:
ejurgensen 2015-07-30 22:50:11 +02:00
parent 3ba76e8f40
commit 1fe6521aff
2 changed files with 47 additions and 30 deletions

View File

@ -37,6 +37,9 @@
# include <sys/eventfd.h> # include <sys/eventfd.h>
#endif #endif
#include <event2/event.h>
#include <event2/buffer.h>
#include "logger.h" #include "logger.h"
#include "misc.h" #include "misc.h"
#include "conffile.h" #include "conffile.h"
@ -140,14 +143,14 @@ static int update_efd;
#else #else
static int update_pipe[2]; static int update_pipe[2];
#endif #endif
static struct event updateev; static struct event *updateev;
static int current_rev; static int current_rev;
/* Play status update requests */ /* Play status update requests */
static struct dacp_update_request *update_requests; static struct dacp_update_request *update_requests;
/* Seek timer */ /* Seek timer */
static struct event seek_timer; static struct event *seek_timer;
static int seek_target; static int seek_target;
@ -336,7 +339,7 @@ playstatusupdate_cb(int fd, short what, void *arg)
out_free_evbuf: out_free_evbuf:
evbuffer_free(evbuf); evbuffer_free(evbuf);
readd: readd:
ret = event_add(&updateev, NULL); ret = event_add(updateev, NULL);
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_DACP, "Couldn't re-add event for playstatusupdate\n"); DPRINTF(E_LOG, L_DACP, "Couldn't re-add event for playstatusupdate\n");
} }
@ -578,9 +581,6 @@ dacp_propset_playingtime(const char *value, struct evkeyvalq *query)
struct timeval tv; struct timeval tv;
int ret; int ret;
if (event_initialized(&seek_timer))
event_del(&seek_timer);
ret = safe_atoi32(value, &seek_target); ret = safe_atoi32(value, &seek_target);
if (ret < 0) if (ret < 0)
{ {
@ -589,11 +589,9 @@ dacp_propset_playingtime(const char *value, struct evkeyvalq *query)
return; return;
} }
evtimer_set(&seek_timer, seek_timer_cb, NULL);
event_base_set(evbase_httpd, &seek_timer);
evutil_timerclear(&tv); evutil_timerclear(&tv);
tv.tv_usec = 200 * 1000; tv.tv_usec = 200 * 1000;
evtimer_add(&seek_timer, &tv); evtimer_add(seek_timer, &tv);
} }
static void static void
@ -1238,10 +1236,11 @@ dacp_reply_playqueuecontents(struct evhttp_request *req, struct evbuffer *evbuf,
struct player_history *history; struct player_history *history;
struct player_queue *queue; struct player_queue *queue;
const char *param; const char *param;
size_t songlist_length;
size_t playlist_length;
int span; int span;
int i; int i;
int n; int n;
int songlist_length;
int ret; int ret;
int start_index; int start_index;
@ -1359,19 +1358,20 @@ dacp_reply_playqueuecontents(struct evhttp_request *req, struct evbuffer *evbuf,
dmap_add_string(playlists, "ceQl", "Up Next"); /* 15 = 8 + 7 */ dmap_add_string(playlists, "ceQl", "Up Next"); /* 15 = 8 + 7 */
dmap_add_string(playlists, "ceQh", "from Music"); /* 18 = 8 + 10 */ dmap_add_string(playlists, "ceQh", "from Music"); /* 18 = 8 + 10 */
songlist_length = EVBUFFER_LENGTH(songlist); songlist_length = evbuffer_get_length(songlist);
} }
else else
songlist_length = 0; songlist_length = 0;
/* Final construction of reply */ /* Final construction of reply */
dmap_add_container(evbuf, "ceQR", 79 + EVBUFFER_LENGTH(playlists) + songlist_length); /* size of entire container */ playlist_length = evbuffer_get_length(playlists);
dmap_add_container(evbuf, "ceQR", 79 + playlist_length + songlist_length); /* size of entire container */
dmap_add_int(evbuf, "mstt", 200); /* 12, dmap.status */ dmap_add_int(evbuf, "mstt", 200); /* 12, dmap.status */
dmap_add_int(evbuf, "mtco", abs(span)); /* 12 */ dmap_add_int(evbuf, "mtco", abs(span)); /* 12 */
dmap_add_int(evbuf, "mrco", n); /* 12 */ dmap_add_int(evbuf, "mrco", n); /* 12 */
dmap_add_char(evbuf, "ceQu", 0); /* 9 */ dmap_add_char(evbuf, "ceQu", 0); /* 9 */
dmap_add_container(evbuf, "mlcl", 8 + EVBUFFER_LENGTH(playlists) + songlist_length); /* 8 */ dmap_add_container(evbuf, "mlcl", 8 + playlist_length + songlist_length); /* 8 */
dmap_add_container(evbuf, "ceQS", EVBUFFER_LENGTH(playlists)); /* 8 */ dmap_add_container(evbuf, "ceQS", playlist_length); /* 8 */
ret = evbuffer_add_buffer(evbuf, playlists); ret = evbuffer_add_buffer(evbuf, playlists);
evbuffer_free(playlists); evbuffer_free(playlists);
if (ret < 0) if (ret < 0)
@ -1789,6 +1789,7 @@ dacp_reply_nowplayingartwork(struct evhttp_request *req, struct evbuffer *evbuf,
struct evkeyvalq *headers; struct evkeyvalq *headers;
const char *param; const char *param;
char *ctype; char *ctype;
size_t len;
uint32_t id; uint32_t id;
int max_w; int max_w;
int max_h; int max_h;
@ -1839,6 +1840,8 @@ dacp_reply_nowplayingartwork(struct evhttp_request *req, struct evbuffer *evbuf,
goto no_artwork; goto no_artwork;
ret = artwork_get_item(evbuf, id, max_w, max_h); ret = artwork_get_item(evbuf, id, max_w, max_h);
len = evbuffer_get_length(evbuf);
switch (ret) switch (ret)
{ {
case ART_FMT_PNG: case ART_FMT_PNG:
@ -1850,8 +1853,8 @@ dacp_reply_nowplayingartwork(struct evhttp_request *req, struct evbuffer *evbuf,
break; break;
default: default:
if (EVBUFFER_LENGTH(evbuf) > 0) if (len > 0)
evbuffer_drain(evbuf, EVBUFFER_LENGTH(evbuf)); evbuffer_drain(evbuf, len);
goto no_artwork; goto no_artwork;
} }
@ -1859,7 +1862,7 @@ dacp_reply_nowplayingartwork(struct evhttp_request *req, struct evbuffer *evbuf,
headers = evhttp_request_get_output_headers(req); headers = evhttp_request_get_output_headers(req);
evhttp_remove_header(headers, "Content-Type"); evhttp_remove_header(headers, "Content-Type");
evhttp_add_header(headers, "Content-Type", ctype); evhttp_add_header(headers, "Content-Type", ctype);
snprintf(clen, sizeof(clen), "%ld", (long)EVBUFFER_LENGTH(evbuf)); snprintf(clen, sizeof(clen), "%ld", (long)len);
evhttp_add_header(headers, "Content-Length", clen); evhttp_add_header(headers, "Content-Length", clen);
/* No gzip compression for artwork */ /* No gzip compression for artwork */
@ -1882,6 +1885,7 @@ dacp_reply_getproperty(struct evhttp_request *req, struct evbuffer *evbuf, char
char *ptr; char *ptr;
char *prop; char *prop;
char *propstr; char *propstr;
size_t len;
int ret; int ret;
s = daap_session_find(req, query, evbuf); s = daap_session_find(req, query, evbuf);
@ -1953,7 +1957,8 @@ dacp_reply_getproperty(struct evhttp_request *req, struct evbuffer *evbuf, char
if (mfi) if (mfi)
free_mfi(mfi, 0); free_mfi(mfi, 0);
dmap_add_container(evbuf, "cmgt", 12 + EVBUFFER_LENGTH(proplist)); /* 8 + len */ len = evbuffer_get_length(proplist);
dmap_add_container(evbuf, "cmgt", 12 + len);
dmap_add_int(evbuf, "mstt", 200); /* 12 */ dmap_add_int(evbuf, "mstt", 200); /* 12 */
ret = evbuffer_add_buffer(evbuf, proplist); ret = evbuffer_add_buffer(evbuf, proplist);
@ -2051,6 +2056,7 @@ dacp_reply_getspeakers(struct evhttp_request *req, struct evbuffer *evbuf, char
{ {
struct daap_session *s; struct daap_session *s;
struct evbuffer *spklist; struct evbuffer *spklist;
size_t len;
s = daap_session_find(req, query, evbuf); s = daap_session_find(req, query, evbuf);
if (!s) if (!s)
@ -2068,7 +2074,8 @@ dacp_reply_getspeakers(struct evhttp_request *req, struct evbuffer *evbuf, char
player_speaker_enumerate(speaker_enum_cb, spklist); player_speaker_enumerate(speaker_enum_cb, spklist);
dmap_add_container(evbuf, "casp", 12 + EVBUFFER_LENGTH(spklist)); /* 8 + len */ len = evbuffer_get_length(spklist);
dmap_add_container(evbuf, "casp", 12 + len);
dmap_add_int(evbuf, "mstt", 200); /* 12 */ dmap_add_int(evbuf, "mstt", 200); /* 12 */
evbuffer_add_buffer(evbuf, spklist); evbuffer_add_buffer(evbuf, spklist);
@ -2421,12 +2428,25 @@ dacp_init(void)
} }
#ifdef USE_EVENTFD #ifdef USE_EVENTFD
event_set(&updateev, update_efd, EV_READ, playstatusupdate_cb, NULL); updateev = event_new(evbase_httpd, update_efd, EV_READ, playstatusupdate_cb, NULL);
#else #else
event_set(&updateev, update_pipe[0], EV_READ, playstatusupdate_cb, NULL); updateev = event_new(evbase_httpd, update_pipe[0], EV_READ, playstatusupdate_cb, NULL);
#endif #endif
event_base_set(evbase_httpd, &updateev); if (!updateev)
event_add(&updateev, NULL); {
DPRINTF(E_LOG, L_DACP, "Could not create update event\n");
return -1;
}
event_add(updateev, NULL);
seek_timer = evtimer_new(evbase_httpd, seek_timer_cb, NULL);
if (!seek_timer)
{
DPRINTF(E_LOG, L_DACP, "Could not create seek_timer event\n");
return -1;
}
listener_add(dacp_playstatus_update_handler, LISTENER_PLAYER); listener_add(dacp_playstatus_update_handler, LISTENER_PLAYER);
@ -2451,6 +2471,8 @@ dacp_deinit(void)
listener_remove(dacp_playstatus_update_handler); listener_remove(dacp_playstatus_update_handler);
event_free(seek_timer);
for (i = 0; dacp_handlers[i].handler; i++) for (i = 0; dacp_handlers[i].handler; i++)
regfree(&dacp_handlers[i].preg); regfree(&dacp_handlers[i].preg);
@ -2468,7 +2490,7 @@ dacp_deinit(void)
free(ur); free(ur);
} }
event_del(&updateev); event_free(updateev);
#ifdef USE_EVENTFD #ifdef USE_EVENTFD
close(update_efd); close(update_efd);

View File

@ -2,12 +2,7 @@
#ifndef __HTTPD_DACP_H__ #ifndef __HTTPD_DACP_H__
#define __HTTPD_DACP_H__ #define __HTTPD_DACP_H__
#include <event.h> #include <event2/http.h>
#ifdef HAVE_LIBEVENT2
# include <event2/http.h>
#else
# include "evhttp/evhttp_compat.h"
#endif
int int
dacp_init(void); dacp_init(void);