diff --git a/htmlui.c b/htmlui.c
index 65d9a451..738550af 100644
--- a/htmlui.c
+++ b/htmlui.c
@@ -654,7 +654,15 @@ page_event(http_connection_t *hc, const char *remain, void *opaque)
epg_unlock();
return HTTP_STATUS_UNAUTHORIZED;
}
- cmd = RECOP_CANCEL;
+ cmd = RECOP_ABORT;
+ }
+
+ if(http_arg_get(&hc->hc_url_args, "clear")) {
+ if(!html_verify_access(hc, "record-events")) {
+ epg_unlock();
+ return HTTP_STATUS_UNAUTHORIZED;
+ }
+ cmd = RECOP_CLEAR;
}
if(cmd != -1)
@@ -723,7 +731,7 @@ page_event(http_connection_t *hc, const char *remain, void *opaque)
default:
tcp_qprintf(&tq,
- "");
break;
diff --git a/pvr.c b/pvr.c
index 65a6e415..8b2cd569 100644
--- a/pvr.c
+++ b/pvr.c
@@ -53,7 +53,6 @@ struct pvr_rec_list pvrr_global_list;
static void pvr_database_save(pvr_rec_t *pvrr);
static void pvr_database_erase(pvr_rec_t *pvrr);
static void pvr_database_load(void);
-static void pvr_unrecord(pvr_rec_t *pvrr);
static void pvrr_fsm(pvr_rec_t *pvrr);
static void pvrr_subscription_callback(struct th_subscription *s,
subscription_event_t event,
@@ -156,15 +155,14 @@ pvr_free(pvr_rec_t *pvrr)
static void
-pvr_unrecord(pvr_rec_t *pvrr)
+pvr_abort(pvr_rec_t *pvrr)
{
- if(pvrr->pvrr_status == HTSTV_PVR_STATUS_SCHEDULED) {
- pvr_free(pvrr);
- } else {
- pvrr->pvrr_error = HTSTV_PVR_STATUS_ABORTED;
- pvrr_fsm(pvrr);
- }
-
+ if(pvrr->pvrr_status != HTSTV_PVR_STATUS_RECORDING)
+ return;
+
+ pvrr->pvrr_error = HTSTV_PVR_STATUS_ABORTED;
+ pvrr_fsm(pvrr);
+
pvr_database_save(pvrr);
clients_send_ref(-1);
}
@@ -225,31 +223,38 @@ pvr_event_record_op(th_channel_t *ch, event_t *e, recop_t op)
break;
}
- if(pvrr != NULL) {
+ if(pvrr != NULL && op == RECOP_CLEAR) {
switch(pvrr->pvrr_status) {
case HTSTV_PVR_STATUS_ABORTED:
case HTSTV_PVR_STATUS_NO_TRANSPONDER:
case HTSTV_PVR_STATUS_FILE_ERROR:
case HTSTV_PVR_STATUS_DISK_FULL:
case HTSTV_PVR_STATUS_BUFFER_ERROR:
+ case HTSTV_PVR_STATUS_SCHEDULED:
pvr_database_erase(pvrr);
pvr_free(pvrr);
- pvrr = NULL;
- break;
+ return;
}
}
switch(op) {
- case RECOP_TOGGLE:
- if(pvrr != NULL) {
- pvr_unrecord(pvrr);
- return;
+ case RECOP_CLEAR:
+ if(pvrr != NULL) switch(pvrr->pvrr_status) {
+ case HTSTV_PVR_STATUS_ABORTED:
+ case HTSTV_PVR_STATUS_NO_TRANSPONDER:
+ case HTSTV_PVR_STATUS_FILE_ERROR:
+ case HTSTV_PVR_STATUS_DISK_FULL:
+ case HTSTV_PVR_STATUS_BUFFER_ERROR:
+ case HTSTV_PVR_STATUS_SCHEDULED:
+ pvr_database_erase(pvrr);
+ pvr_free(pvrr);
+ break;
}
- break;
+ return;
- case RECOP_CANCEL:
+ case RECOP_ABORT:
if(pvrr != NULL)
- pvr_unrecord(pvrr);
+ pvr_abort(pvrr);
return;
case RECOP_ONCE:
@@ -1106,8 +1111,8 @@ static struct strtab recoptab[] = {
{ "once", RECOP_ONCE },
{ "daily", RECOP_DAILY },
{ "weekly", RECOP_WEEKLY },
- { "cancel", RECOP_CANCEL },
- { "toggle", RECOP_TOGGLE }
+ { "abort", RECOP_ABORT },
+ { "clear", RECOP_CLEAR }
};
int
diff --git a/pvr.h b/pvr.h
index b82f24dc..ccfd6410 100644
--- a/pvr.h
+++ b/pvr.h
@@ -92,11 +92,11 @@ typedef struct pvr_rec {
typedef enum {
- RECOP_TOGGLE,
RECOP_ONCE,
RECOP_DAILY,
RECOP_WEEKLY,
- RECOP_CANCEL,
+ RECOP_ABORT,
+ RECOP_CLEAR,
} recop_t;
void pvr_init(void);