LIST_REMOVE(dae, dae_channel_tag_link);
if(dae->dae_brand)
- dae->dae_brand->putref(dae->dae_brand);
+ dae->dae_brand->ops->putref(dae->dae_brand);
if(dae->dae_season)
- dae->dae_season->putref(dae->dae_season);
+ dae->dae_season->ops->putref(dae->dae_season);
if(dae->dae_serieslink)
- dae->dae_serieslink->putref(dae->dae_serieslink);
+ dae->dae_serieslink->ops->putref(dae->dae_serieslink);
free(dae);
}
brand = v ? epg_brand_find_by_uri(v, NULL, 1, &save, NULL) : NULL;
if (brand && dae->dae_brand != brand) {
if (dae->dae_brand)
- dae->dae_brand->putref((epg_object_t*)dae->dae_brand);
- brand->getref((epg_object_t*)brand);
+ dae->dae_brand->ops->putref((epg_object_t*)dae->dae_brand);
+ brand->ops->getref((epg_object_t*)brand);
dae->dae_brand = brand;
return 1;
} else if (brand == NULL && dae->dae_brand) {
- dae->dae_brand->putref((epg_object_t*)dae->dae_brand);
+ dae->dae_brand->ops->putref((epg_object_t*)dae->dae_brand);
dae->dae_brand = NULL;
return 1;
}
season = v ? epg_season_find_by_uri(v, NULL, 1, &save, NULL) : NULL;
if (season && dae->dae_season != season) {
if (dae->dae_season)
- dae->dae_season->putref((epg_object_t*)dae->dae_season);
- season->getref((epg_object_t*)season);
+ dae->dae_season->ops->putref((epg_object_t*)dae->dae_season);
+ season->ops->getref((epg_object_t*)season);
dae->dae_season = season;
return 1;
} else if (season == NULL && dae->dae_season) {
- dae->dae_season->putref((epg_object_t*)dae->dae_season);
+ dae->dae_season->ops->putref((epg_object_t*)dae->dae_season);
dae->dae_season = NULL;
return 1;
}
sl = v ? epg_serieslink_find_by_uri(v, NULL, 1, &save, NULL) : NULL;
if (sl && dae->dae_serieslink != sl) {
if (dae->dae_serieslink)
- dae->dae_serieslink->putref((epg_object_t*)dae->dae_season);
- sl->getref((epg_object_t*)sl);
+ dae->dae_serieslink->ops->putref((epg_object_t*)dae->dae_season);
+ sl->ops->getref((epg_object_t*)sl);
dae->dae_serieslink = sl;
return 1;
} else if (sl == NULL && dae->dae_serieslink) {
- dae->dae_season->putref((epg_object_t*)dae->dae_season);
+ dae->dae_season->ops->putref((epg_object_t*)dae->dae_season);
dae->dae_season = NULL;
return 1;
}
tvhtrace(LS_EPG,
"unref'd object %u (%s) created during update", eo->id, eo->uri);
LIST_REMOVE(eo, un_link);
- eo->destroy(eo);
+ eo->ops->destroy(eo);
}
// Note: we do things this way around since unref'd objects are not likely
// to be useful to DVR since they will relate to episode/seasons/brands
/* Update updated */
while ((eo = LIST_FIRST(&epg_object_updated))) {
- eo->update(eo);
+ eo->ops->update(eo);
LIST_REMOVE(eo, up_link);
eo->_updated = 0;
eo->_created = 1;
assert(eo->refcount>0);
eo->refcount--;
if (!eo->refcount) {
- eo->destroy(eo);
+ eo->ops->destroy(eo);
return 1;
}
return 0;
uint32_t id = eo->id;
if (!id) eo->id = ++_epg_object_idx;
if (!eo->id) eo->id = ++_epg_object_idx;
- if (!eo->getref) eo->getref = _epg_object_getref;
- if (!eo->putref) eo->putref = _epg_object_putref;
tvhtrace(LS_EPG, "eo [%p, %u, %d, %s] created",
eo, eo->id, eo->type, eo->uri);
_epg_object_set_updated(eo);
dvr_autorec_check_brand((epg_brand_t*)o);
}
+static epg_object_ops_t _epg_brand_ops = {
+ .getref = _epg_object_getref,
+ .putref = _epg_object_putref,
+ .destroy = _epg_brand_destroy,
+ .update = _epg_brand_updated,
+};
+
static epg_object_t **_epg_brand_skel ( void )
{
static epg_object_t *skel = NULL;
if (!skel) {
skel = calloc(1, sizeof(epg_brand_t));
- skel->type = EPG_BRAND;
- skel->destroy = _epg_brand_destroy;
- skel->update = _epg_brand_updated;
+ skel->type = EPG_BRAND;
+ skel->ops = &_epg_brand_ops;
}
return &skel;
}
dvr_autorec_check_season((epg_season_t*)eo);
}
+static epg_object_ops_t _epg_season_ops = {
+ .getref = _epg_object_getref,
+ .putref = _epg_object_putref,
+ .destroy = _epg_season_destroy,
+ .update = _epg_season_updated,
+};
+
static epg_object_t **_epg_season_skel ( void )
{
static epg_object_t *skel = NULL;
if (!skel) {
skel = calloc(1, sizeof(epg_season_t));
- skel->type = EPG_SEASON;
- skel->destroy = _epg_season_destroy;
- skel->update = _epg_season_updated;
+ skel->type = EPG_SEASON;
+ skel->ops = &_epg_season_ops;
}
return &skel;
}
{
}
+static epg_object_ops_t _epg_episode_ops = {
+ .getref = _epg_object_getref,
+ .putref = _epg_object_putref,
+ .destroy = _epg_episode_destroy,
+ .update = _epg_episode_updated,
+};
+
static epg_object_t **_epg_episode_skel ( void )
{
static epg_object_t *skel = NULL;
if (!skel) {
skel = calloc(1, sizeof(epg_episode_t));
- skel->type = EPG_EPISODE;
- skel->destroy = _epg_episode_destroy;
- skel->update = _epg_episode_updated;
+ skel->type = EPG_EPISODE;
+ skel->ops = &_epg_episode_ops;
}
return &skel;
}
dvr_autorec_check_serieslink((epg_serieslink_t*)eo);
}
+static epg_object_ops_t _epg_serieslink_ops = {
+ .getref = _epg_object_getref,
+ .putref = _epg_object_putref,
+ .destroy = _epg_serieslink_destroy,
+ .update = _epg_serieslink_updated,
+};
+
static epg_object_t **_epg_serieslink_skel ( void )
{
static epg_object_t *skel = NULL;
if (!skel) {
skel = calloc(1, sizeof(epg_serieslink_t));
- skel->type = EPG_SERIESLINK;
- skel->destroy = _epg_serieslink_destroy;
- skel->update = _epg_serieslink_updated;
+ skel->type = EPG_SERIESLINK;
+ skel->ops = &_epg_serieslink_ops;
}
return &skel;
}
gtimer_arm_rel(&ch->ch_epg_timer, _epg_channel_timer_callback, ch, 2);
return;
}
- cur->getref(cur);
+ cur->ops->getref(cur);
}
if ((nxt = ch->ch_epg_next))
- nxt->getref(nxt);
+ nxt->ops->getref(nxt);
ch->ch_epg_now = ch->ch_epg_next = NULL;
/* Check events */
}
/* Remove refs */
- if (cur) cur->putref(cur);
- if (nxt) nxt->putref(nxt);
+ if (cur) cur->ops->putref(cur);
+ if (nxt) nxt->ops->putref(nxt);
}
static epg_broadcast_t *_epg_channel_add_broadcast
}
/* Reset timer - it might free return event! */
- ret->getref(ret);
+ ret->ops->getref(ret);
if (timer) _epg_channel_timer_callback(ch);
- if (ret->putref(ret)) return NULL;
+ if (ret->ops->putref(ret)) return NULL;
return ret;
}
}
}
+static epg_object_ops_t _epg_broadcast_ops = {
+ .getref = _epg_object_getref,
+ .putref = _epg_object_putref,
+ .destroy = _epg_broadcast_destroy,
+ .update = _epg_broadcast_updated,
+};
+
static epg_broadcast_t **_epg_broadcast_skel ( void )
{
static epg_broadcast_t *skel = NULL;
if (!skel) {
skel = calloc(1, sizeof(epg_broadcast_t));
- skel->type = EPG_BROADCAST;
- skel->destroy = _epg_broadcast_destroy;
- skel->update = _epg_broadcast_updated;
+ skel->type = EPG_BROADCAST;
+ skel->ops = &_epg_broadcast_ops;
}
return &skel;
}