1
0
mirror of https://gitlab.xiph.org/xiph/icecast-server.git synced 2024-06-16 06:15:24 +00:00

Feature: Added support for a navigation (mountpoint) history

This commit is contained in:
Philipp Schafft 2020-10-24 08:54:48 +00:00
parent 31659b3ed1
commit 965c5e52d0
2 changed files with 106 additions and 2 deletions

View File

@ -10,8 +10,6 @@
#include <config.h>
#endif
#include <string.h>
#include "common/avl/avl.h"
#include "navigation.h"
@ -67,3 +65,88 @@ int mount_identifier_compare(mount_identifier_t *a, mount_id
{
return mount_identifier_compare__for_tree(NULL, a, b);
}
static inline int navigation_history_pop(navigation_history_t *history)
{
if (history->fill == 0)
return 0;
history->fill--;
refobject_unref(history->history[history->fill]);
history->history[history->fill] = NULL;
return 1;
}
static inline int navigation_history_push(navigation_history_t *history, mount_identifier_t *identifier)
{
if (refobject_ref(identifier) != 0)
return -1;
if (history->fill == (sizeof(history->history)/sizeof(*history->history))) {
refobject_unref(history->history[0]);
memmove(history->history, &(history->history[1]), sizeof(history->history) - sizeof(*history->history));
history->fill--;
}
history->history[history->fill++] = identifier;
return 0;
}
void navigation_history_clear(navigation_history_t *history)
{
if (!history)
return;
while (navigation_history_pop(history));
}
mount_identifier_t * navigation_history_get_up(navigation_history_t *history)
{
if (!history)
return NULL;
if (history->fill < 2)
return NULL;
if (refobject_ref(history->history[history->fill - 2]) != 0)
return NULL;
return history->history[history->fill - 2];
}
int navigation_history_navigate_to(navigation_history_t *history, mount_identifier_t *identifier, navigation_direction_t direction)
{
if (!history || !identifier)
return -1;
switch (direction) {
case NAVIGATION_DIRECTION_UP:
if (history->fill < 2)
return -1;
if (mount_identifier_compare(history->history[history->fill - 2], identifier) != 0)
return -1;
return navigation_history_pop(history);
break;
case NAVIGATION_DIRECTION_DOWN:
return navigation_history_push(history, identifier);
break;
case NAVIGATION_DIRECTION_REPLACE_CURRENT:
if (history->fill == 0) {
return navigation_history_push(history, identifier);
} else {
if (refobject_ref(identifier) != 0)
return -1;
refobject_unref(history->history[history->fill - 1]);
history->history[history->fill - 1] = identifier;
return 0;
}
break;
case NAVIGATION_DIRECTION_REPLACE_ALL:
navigation_history_clear(history);
if (history->fill != 0)
return -1;
return navigation_history_push(history, identifier);
break;
}
return -1;
}

View File

@ -9,8 +9,24 @@
#ifndef __NAVIGATION_H__
#define __NAVIGATION_H__
#include <string.h>
#include "refobject.h"
#define MAX_NAVIGATION_HISTORY_SIZE 8
typedef struct {
mount_identifier_t *history[MAX_NAVIGATION_HISTORY_SIZE];
size_t fill;
} navigation_history_t;
typedef enum {
NAVIGATION_DIRECTION_UP,
NAVIGATION_DIRECTION_DOWN,
NAVIGATION_DIRECTION_REPLACE_CURRENT,
NAVIGATION_DIRECTION_REPLACE_ALL
} navigation_direction_t;
REFOBJECT_FORWARD_TYPE(mount_identifier_t);
void navigation_initialize(void);
@ -20,4 +36,9 @@ mount_identifier_t * mount_identifier_new(const char *mount);
#define mount_identifier_get_mount(identifier) refobject_get_name((identifier))
int mount_identifier_compare(mount_identifier_t *a, mount_identifier_t *b);
#define navigation_history_init(history) memset((history), 0, sizeof(navigation_history_t))
void navigation_history_clear(navigation_history_t *history);
mount_identifier_t * navigation_history_get_up(navigation_history_t *history);
int navigation_history_navigate_to(navigation_history_t *history, mount_identifier_t *identifier, navigation_direction_t direction);
#endif