diff --git a/htmlui.c b/htmlui.c
index bd7f0a47..62a4904d 100644
--- a/htmlui.c
+++ b/htmlui.c
@@ -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;
}
diff --git a/htsclient.c b/htsclient.c
index f4985de0..c93ac227 100644
--- a/htsclient.c
+++ b/htsclient.c
@@ -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;
}
diff --git a/pvr.c b/pvr.c
index ee0498d4..b03bdcc0 100644
--- a/pvr.c
+++ b/pvr.c
@@ -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);
-}
diff --git a/pvr.h b/pvr.h
index bacfc29e..205aacba 100644
--- a/pvr.h
+++ b/pvr.h
@@ -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 */
diff --git a/rpc.c b/rpc.c
index bc07ee02..29dacebf 100644
--- a/rpc.c
+++ b/rpc.c
@@ -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();