From 72bbedd13eed094bb546939d32116f78c02759f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Wed, 9 Sep 2009 21:37:40 +0000 Subject: [PATCH] Push DVR entries over HTSP (if in async mode) --- src/dvr/dvr.h | 1 + src/dvr/dvr_db.c | 6 ++++ src/htsp.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++ src/htsp.h | 5 ++++ 4 files changed, 89 insertions(+) diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index ba6e60c2..ba59629e 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -32,6 +32,7 @@ extern int dvr_flags; extern char *dvr_postproc; extern int dvr_extra_time_pre; extern int dvr_extra_time_post; +extern struct dvr_entry_list dvrentries; #define DVR_DIR_PER_DAY 0x1 #define DVR_DIR_PER_CHANNEL 0x2 diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 0bd7fb87..f23980a2 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -27,6 +27,7 @@ #include "tvhead.h" #include "dvr.h" #include "notify.h" +#include "htsp.h" char *dvr_storage; char *dvr_format; @@ -126,6 +127,7 @@ dvr_entry_link(dvr_entry_t *de) gtimer_arm_abs(&de->de_timer, dvr_timer_start_recording, de, preamble); } + htsp_dvr_entry_add(de); } @@ -210,6 +212,8 @@ dvr_entry_remove(dvr_entry_t *de) { hts_settings_remove("dvr/log/%d", de->de_id); + htsp_dvr_entry_delete(de); + gtimer_disarm(&de->de_timer); LIST_REMOVE(de, de_channel_link); @@ -372,6 +376,7 @@ dvr_stop_recording(dvr_entry_t *de, const char *errmsg) dvrdb_changed(); dvr_entry_save(de); + htsp_dvr_entry_update(de); gtimer_arm_abs(&de->de_timer, dvr_timer_expire, de, de->de_stop + dvr_retention_days * 86400); @@ -405,6 +410,7 @@ dvr_timer_start_recording(void *aux) de->de_title, de->de_channel->ch_name); dvrdb_changed(); + htsp_dvr_entry_update(de); dvr_rec_subscribe(de); diff --git a/src/htsp.c b/src/htsp.c index 6b58ae0d..3800ca9d 100644 --- a/src/htsp.c +++ b/src/htsp.c @@ -347,6 +347,45 @@ htsp_build_tag(channel_tag_t *ct, const char *method, int include_channels) } +/** + * + */ +static htsmsg_t * +htsp_build_dvrentry(dvr_entry_t *de, const char *method) +{ + htsmsg_t *out = htsmsg_create_map(); + const char *s = NULL; + + htsmsg_add_u32(out, "id", de->de_id); + htsmsg_add_u32(out, "channel", de->de_channel->ch_id); + + htsmsg_add_s32(out, "start", de->de_start); + htsmsg_add_s32(out, "stop", de->de_stop); + + htsmsg_add_str(out, "title", de->de_title); + htsmsg_add_str(out, "description", de->de_desc); + + switch(de->de_sched_state) { + case DVR_SCHEDULED: + s = "scheduled"; + break; + case DVR_RECORDING: + s = "recording"; + break; + case DVR_COMPLETED: + s = "completed"; + break; + case DVR_NOSTATE: + s = "invalid"; + break; + } + + htsmsg_add_str(out, "state", s); + htsmsg_add_str(out, "method", method); + return out; +} + + /** * Simple function to respond with an error */ @@ -382,6 +421,7 @@ htsp_method_async(htsp_connection_t *htsp, htsmsg_t *in) { channel_t *ch; channel_tag_t *ct; + dvr_entry_t *de; htsmsg_t *m; /* First, just OK the async request */ @@ -406,6 +446,10 @@ htsp_method_async(htsp_connection_t *htsp, htsmsg_t *in) if(ct->ct_enabled && !ct->ct_internal) htsp_send_message(htsp, htsp_build_tag(ct, "tagUpdate", 1), NULL); + /* Send all DVR entries */ + LIST_FOREACH(de, &dvrentries, de_global_link) + htsp_send_message(htsp, htsp_build_dvrentry(de, "dvrEntryAdd"), NULL); + /* Notify that initial sync has been completed */ m = htsmsg_create_map(); htsmsg_add_str(m, "method", "initialSyncCompleted"); @@ -1059,6 +1103,39 @@ htsp_tag_delete(channel_tag_t *ct) } +/** + * Called from dvr_db.c when a DVR entry is created + */ +void +htsp_dvr_entry_add(dvr_entry_t *de) +{ + htsp_async_send(htsp_build_dvrentry(de, "dvrEntryAdd")); +} + + +/** + * Called from dvr_db.c when a DVR entry is updated + */ +void +htsp_dvr_entry_update(dvr_entry_t *de) +{ + htsp_async_send(htsp_build_dvrentry(de, "dvrEntryUpdate")); +} + + +/** + * Called from dvr_db.c when a DVR entry is deleted + */ +void +htsp_dvr_entry_delete(dvr_entry_t *de) +{ + htsmsg_t *m = htsmsg_create_map(); + htsmsg_add_u32(m, "id", de->de_id); + htsmsg_add_str(m, "method", "dvrEntryDelete"); + htsp_async_send(m); +} + + const static char frametypearray[PKT_NTYPES] = { [PKT_I_FRAME] = 'I', [PKT_P_FRAME] = 'P', diff --git a/src/htsp.h b/src/htsp.h index 5856948d..db6ca8d7 100644 --- a/src/htsp.h +++ b/src/htsp.h @@ -20,6 +20,7 @@ #define HTSP_H_ #include "epg.h" +#include "dvr/dvr.h" void htsp_init(void); @@ -33,4 +34,8 @@ void htsp_tag_add(channel_tag_t *ct); void htsp_tag_update(channel_tag_t *ct); void htsp_tag_delete(channel_tag_t *ct); +void htsp_dvr_entry_add(dvr_entry_t *de); +void htsp_dvr_entry_update(dvr_entry_t *de); +void htsp_dvr_entry_delete(dvr_entry_t *de); + #endif /* HTSP_H_ */