X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/4265e5d362914f3732b4035dcf67162e525e0142..19007e89957054b4af8667f85c0ec8d95f2001d6:/server/queue-ops.c diff --git a/server/queue-ops.c b/server/queue-ops.c index ed97c0c..f2b3457 100644 --- a/server/queue-ops.c +++ b/server/queue-ops.c @@ -48,9 +48,23 @@ static void queue_id(struct queue_entry *q) { q->id = id; } +/** @brief Add a track to the queue + * @param track Track to add + * @param submitter Who added it, or NULL + * @param where Where to add it + * @param target ID to add after for @ref WHERE_AFTER + * @param origin Track origin + * @return New queue entry or NULL + * + * The queue is NOT saved to disk. + * + * NULL can only be returned if @ref WHERE_AFTER is used with an invalid + * queue ID. + */ struct queue_entry *queue_add(const char *track, const char *submitter, - int where, enum track_origin origin) { - struct queue_entry *q, *beforeme; + int where, const char *target, + enum track_origin origin) { + struct queue_entry *q, *beforeme, *afterme; q = xmalloc(sizeof *q); q->track = xstrdup(track); @@ -76,6 +90,20 @@ struct queue_entry *queue_add(const char *track, const char *submitter, beforeme = beforeme->prev; queue_insert_entry(beforeme->prev, q); break; + case WHERE_AFTER: + if(!*target) + /* Insert at start of queue */ + afterme = &qhead; + else { + /* Insert after a specific track */ + afterme = qhead.next; + while(afterme != &qhead && strcmp(afterme->id, target)) + afterme = afterme->next; + if(afterme == &qhead) + return NULL; + } + queue_insert_entry(afterme, q); + break; } /* submitter will be a null pointer for a scratch */ if(submitter)