cleanup PVR internal API a bit

This commit is contained in:
Andreas Öman 2008-02-13 18:55:47 +00:00
parent 23de1a66d1
commit 00b06529d3
5 changed files with 74 additions and 127 deletions

View file

@ -392,12 +392,15 @@ output_event(http_connection_t *hc, tcp_queue_t *tq, th_channel_t *ch,
event_t *cur;
tv_pvr_status_t pvrstatus;
const char *pvr_txt, *pvr_color;
pvr_rec_t *pvrr;
localtime_r(&e->e_start, &a);
stop = e->e_start + e->e_duration;
localtime_r(&stop, &b);
pvrstatus = pvr_prog_status(e);
pvrr = pvr_get_by_entry(e);
pvrstatus = pvrr != NULL ? pvrr->pvrr_status : HTSTV_PVR_STATUS_NONE;
cur = epg_event_get_current(ch);
@ -672,8 +675,8 @@ page_event(http_connection_t *hc, const char *remain, void *opaque)
struct tm a, b;
time_t stop;
char desc[4000];
recop_t cmd = -1;
tv_pvr_status_t pvrstatus;
pvr_rec_t *pvrr;
const char *pvr_txt, *pvr_color;
if(!html_verify_access(hc, "browse-events"))
@ -686,35 +689,34 @@ page_event(http_connection_t *hc, const char *remain, void *opaque)
return 404;
}
pvrr = pvr_get_by_entry(e);
if(http_arg_get(&hc->hc_url_args, "rec")) {
if(!html_verify_access(hc, "record-events")) {
epg_unlock();
return HTTP_STATUS_UNAUTHORIZED;
}
cmd = RECOP_ONCE;
pvrr = pvr_schedule_by_event(e);
}
if(http_arg_get(&hc->hc_url_args, "cancel")) {
if(pvrr != NULL && http_arg_get(&hc->hc_url_args, "cancel")) {
if(!html_verify_access(hc, "record-events")) {
epg_unlock();
return HTTP_STATUS_UNAUTHORIZED;
}
cmd = RECOP_ABORT;
pvr_abort(pvrr);
}
if(http_arg_get(&hc->hc_url_args, "clear")) {
if(pvrr != NULL && http_arg_get(&hc->hc_url_args, "clear")) {
if(!html_verify_access(hc, "record-events")) {
epg_unlock();
return HTTP_STATUS_UNAUTHORIZED;
}
cmd = RECOP_CLEAR;
pvr_clear(pvrr);
}
if(cmd != -1)
pvr_event_record_op(e->e_ch, e, cmd);
pvrstatus = pvr_prog_status(e);
pvrstatus = pvrr != NULL ? pvrr->pvrr_status : HTSTV_PVR_STATUS_NONE;
localtime_r(&e->e_start, &a);
stop = e->e_start + e->e_duration;
@ -825,7 +827,6 @@ page_pvr(http_connection_t *hc, const char *remain, void *opaque)
pvr_rec_t **pv;
int divid = 1;
int size = 600;
recop_t op;
http_arg_t *ra;
if(!html_verify_access(hc, "record-events"))
@ -835,23 +836,26 @@ page_pvr(http_connection_t *hc, const char *remain, void *opaque)
pvr_clear_all_completed();
}
op = -1;
pvrr_tgt = NULL;
LIST_FOREACH(ra, &hc->hc_url_args, link) {
c = 0;
if(!strncmp(ra->key, "clear_", 6)) {
op = RECOP_CLEAR;
txt = ra->key + 6;
} else if(!strncmp(ra->key, "desched_", 8)) {
op = RECOP_CLEAR;
txt = ra->key + 8;
} else if(!strncmp(ra->key, "abort_", 6)) {
op = RECOP_ABORT;
c = 1;
txt = ra->key + 6;
} else {
continue;
}
pvrr_tgt = pvr_get_tag_entry(atoi(txt));
pvr_do_op(pvrr_tgt, op);
if(pvrr_tgt != NULL) {
if(c)
pvr_abort(pvrr_tgt);
else
pvr_clear(pvrr_tgt);
}
break;
}

View file

@ -515,6 +515,7 @@ cr_event_info(client_t *c, char **argv, int argc)
event_t *e = NULL, *x;
uint32_t tag, prev, next;
th_channel_t *ch;
pvr_rec_t *pvrr;
if(argc < 2)
return 1;
@ -542,6 +543,8 @@ cr_event_info(client_t *c, char **argv, int argc)
x = TAILQ_NEXT(e, e_link);
next = x != NULL ? x->e_tag : 0;
pvrr = pvr_get_by_entry(e);
cprintf(c,
"start = %ld\n"
"stop = %ld\n"
@ -559,7 +562,7 @@ cr_event_info(client_t *c, char **argv, int argc)
tag,
prev,
next,
pvr_prog_status(e));
pvrr != NULL ? pvrr->pvrr_status : HTSTV_PVR_STATUS_NONE);
epg_unlock();
return 0;
@ -573,13 +576,8 @@ static int
cr_event_record(client_t *c, char **argv, int argc)
{
event_t *e;
recop_t op;
if(argc < 2)
return 1;
op = pvr_op2int(argv[1]);
if(op == -1)
if(argc < 1)
return 1;
epg_lock();
@ -590,7 +588,7 @@ cr_event_record(client_t *c, char **argv, int argc)
return 1;
}
pvr_event_record_op(e->e_ch, e, op);
pvr_schedule_by_event(e);
epg_unlock();
return 0;
@ -616,7 +614,7 @@ cr_channel_record(client_t *c, char **argv, int argc)
duration = atoi(argv[1]);
pvr_channel_record_op(ch, duration);
pvr_schedule_by_channel_and_time(ch, duration);
return 0;
}

112
pvr.c
View file

@ -73,11 +73,11 @@ pvr_init(void)
/**
* For the given event, return pvr-status (if we have a pvr recording
* entry that matches the event)
* For the given event, return pvr recording entry (if we have a pvr
* recording entry that matches the event)
*/
char
pvr_prog_status(event_t *e)
pvr_rec_t *
pvr_get_by_entry(event_t *e)
{
pvr_rec_t *pvrr;
@ -85,14 +85,13 @@ pvr_prog_status(event_t *e)
if(pvrr->pvrr_start >= e->e_start &&
pvrr->pvrr_stop <= e->e_start + e->e_duration &&
pvrr->pvrr_channel == e->e_ch) {
return pvrr->pvrr_status;
return pvrr;
}
}
return HTSTV_PVR_STATUS_NONE;
return NULL;
}
/**
* Find the pvr record entry based on increasing index
*/
@ -166,17 +165,32 @@ pvr_free(pvr_rec_t *pvrr)
/**
* Abort a current recording
*/
static void
int
pvr_abort(pvr_rec_t *pvrr)
{
if(pvrr->pvrr_status != HTSTV_PVR_STATUS_RECORDING)
return;
return -1;
pvrr->pvrr_error = HTSTV_PVR_STATUS_ABORTED;
pvr_fsm(pvrr);
pvr_database_save(pvrr);
clients_send_ref(-1);
return 0;
}
/**
* Clear current entry (only works if we are not recording)
*/
int
pvr_clear(pvr_rec_t *pvrr)
{
if(pvrr->pvrr_status == HTSTV_PVR_STATUS_RECORDING)
return -1;
pvr_database_erase(pvrr);
pvr_free(pvrr);
return 0;
}
@ -208,36 +222,11 @@ pvr_link_pvrr(pvr_rec_t *pvrr)
break;
}
pvr_inform_status_change(pvrr);
clients_send_ref(-1);
}
/**
* Execute the given 'op'
*/
void
pvr_do_op(pvr_rec_t *pvrr, recop_t op)
{
switch(op) {
case RECOP_CLEAR:
if(pvrr->pvrr_status != HTSTV_PVR_STATUS_RECORDING) {
pvr_database_erase(pvrr);
pvr_free(pvrr);
break;
}
return;
case RECOP_ABORT:
pvr_abort(pvrr);
return;
default:
break;
}
}
/**
* Remove log info about all completed recordings
*/
@ -265,9 +254,10 @@ pvr_clear_all_completed(void)
/**
* Create a PVR entry based on a given event
*/
void
pvr_event_record_op(th_channel_t *ch, event_t *e, recop_t op)
pvr_rec_t *
pvr_schedule_by_event(event_t *e)
{
th_channel_t *ch = e->e_ch;
time_t start = e->e_start;
time_t stop = e->e_start + e->e_duration;
time_t now;
@ -279,7 +269,7 @@ pvr_event_record_op(th_channel_t *ch, event_t *e, recop_t op)
event_time_txt(start, e->e_duration, buf, sizeof(buf));
if(stop < now)
return;
return NULL;
/* Try to see if we already have a scheduled or active recording */
@ -289,30 +279,9 @@ pvr_event_record_op(th_channel_t *ch, event_t *e, recop_t op)
break;
}
switch(op) {
case RECOP_CLEAR:
if(pvrr != NULL && pvrr->pvrr_status != HTSTV_PVR_STATUS_RECORDING) {
pvr_database_erase(pvrr);
pvr_free(pvrr);
break;
}
return;
if(pvrr != NULL)
return NULL; /* Already exists */
case RECOP_ABORT:
if(pvrr != NULL)
pvr_abort(pvrr);
return;
case RECOP_ONCE:
if(pvrr != NULL)
return;
break;
case RECOP_DAILY:
case RECOP_WEEKLY:
syslog(LOG_ERR,"Recording type not supported yet");
return;
}
pvrr = calloc(1, sizeof(pvr_rec_t));
pvrr->pvrr_status = HTSTV_PVR_STATUS_SCHEDULED;
@ -324,6 +293,7 @@ pvr_event_record_op(th_channel_t *ch, event_t *e, recop_t op)
pvr_link_pvrr(pvrr);
pvr_database_save(pvrr);
return pvrr;
}
@ -332,8 +302,8 @@ pvr_event_record_op(th_channel_t *ch, event_t *e, recop_t op)
/**
* Record based on a channel
*/
void
pvr_channel_record_op(th_channel_t *ch, int duration)
pvr_rec_t *
pvr_schedule_by_channel_and_time(th_channel_t *ch, int duration)
{
time_t now = dispatch_clock;
time_t start = now;
@ -350,6 +320,7 @@ pvr_channel_record_op(th_channel_t *ch, int duration)
pvr_link_pvrr(pvrr);
pvr_database_save(pvrr);
return pvrr;
}
@ -1157,20 +1128,3 @@ pvr_record_packet(pvr_rec_t *pvrr, th_pkt_t *pkt)
break;
}
}
static struct strtab recoptab[] = {
{ "once", RECOP_ONCE },
{ "daily", RECOP_DAILY },
{ "weekly", RECOP_WEEKLY },
{ "abort", RECOP_ABORT },
{ "clear", RECOP_CLEAR }
};
int
pvr_op2int(const char *op)
{
return str2val(op, recoptab);
}

30
pvr.h
View file

@ -89,34 +89,24 @@ typedef struct pvr_rec {
} pvr_rec_t;
typedef enum {
RECOP_ONCE,
RECOP_DAILY,
RECOP_WEEKLY,
RECOP_ABORT,
RECOP_CLEAR,
} recop_t;
void pvr_init(void);
void pvr_event_record_op(th_channel_t *ch, event_t *e, recop_t op);
char pvr_prog_status(event_t *e);
pvr_rec_t *pvr_get_log_entry(int e);
pvr_rec_t *pvr_get_tag_entry(int e);
void pvr_inform_status_change(pvr_rec_t *pvrr);
void pvr_channel_record_op(th_channel_t *ch, int duration);
int pvr_op2int(const char *op);
void pvr_do_op(pvr_rec_t *pvrr, recop_t op);
void pvr_clear_all_completed(void);
int pvr_clear(pvr_rec_t *pvrr);
int pvr_abort(pvr_rec_t *pvrr);
pvr_rec_t *pvr_get_by_entry(event_t *e);
pvr_rec_t *pvr_schedule_by_event(event_t *e);
pvr_rec_t *pvr_schedule_by_channel_and_time(th_channel_t *ch, int duration);
#endif /* PVR_H */

7
rpc.c
View file

@ -147,7 +147,8 @@ rpc_event_info(rpc_session_t *ses, htsmsg_t *in, void *opaque)
uint32_t u32;
const char *s, *errtxt = NULL;
event_t *e = NULL, *x;
uint32_t tag, prev, next, pvrstatus;
uint32_t tag, prev, next;
pvr_rec_t *pvrr;
out = htsmsg_create();
htsmsg_add_u32(out, "seq", ses->rs_seq);
@ -199,8 +200,8 @@ rpc_event_info(rpc_session_t *ses, htsmsg_t *in, void *opaque)
if(next)
htsmsg_add_u32(out, "next", next);
if((pvrstatus = pvr_prog_status(e)) != 0)
htsmsg_add_u32(out, "pvrstatus", pvrstatus);
if((pvrr = pvr_get_by_entry(e)) != NULL)
htsmsg_add_u32(out, "pvrstatus", pvrr->pvrr_status);
}
epg_unlock();