inline int8_t cacheex_match_alias(struct s_client *cl, ECM_REQUEST *er, ECM_REQUEST *ecm) { if(check_client(cl) && cl->account && cl->account->cacheex.mode == 1) { struct s_cacheex_matcher *entry = is_cacheex_matcher_matching(ecm, er); if(entry) { int32_t diff = comp_timeb(&er->tps, &ecm->tps); if(diff > entry->valid_from && diff < entry->valid_to) { #ifdef WITH_DEBUG if(D_CACHEEX & cs_dblevel) { char result[CXM_FMT_LEN] = { 0 }; int32_t s, size = CXM_FMT_LEN; s = ecmfmt(entry->caid, 0, entry->provid, entry->chid, entry->pid, entry->srvid, entry->ecmlen, 0, 0, 0, result, size, 0, 0); s += snprintf(result + s, size - s, " = "); s += ecmfmt(entry->to_caid, 0, entry->to_provid, entry->to_chid, entry->to_pid, entry->to_srvid, entry->to_ecmlen, 0, 0, 0, result + s, size - s, 0, 0); s += snprintf(result + s, size - s, " valid %d/%d", entry->valid_from, entry->valid_to); cs_debug_mask(D_CACHEEX, "cacheex-matching for: %s", result); } #endif return 1; } } } return 0; }
int32_t dvbapi_edit_channel_cache(int32_t demux_id, int32_t pidindex, uint8_t add) { struct s_ecmpids *p = &demux[demux_id].ECMpids[pidindex]; struct s_channel_cache *c; LL_ITER it; int32_t count = 0; if(!channel_cache) { channel_cache = ll_create("channel cache"); } it = ll_iter_create(channel_cache); while((c = ll_iter_next(&it))) { if(demux[demux_id].program_number == c->srvid && p->CAID == c->caid && p->ECM_PID == c->pid && (p->PROVID == c->prid || p->PROVID == 0)) { if(add && p->CHID == c->chid) { return 0; //already added } ll_iter_remove_data(&it); count++; } } if(add) { if(!cs_malloc(&c, sizeof(struct s_channel_cache))) { return count; } c->srvid = demux[demux_id].program_number; c->caid = p->CAID; c->pid = p->ECM_PID; c->prid = p->PROVID; c->chid = p->CHID; ll_append(channel_cache, c); #ifdef WITH_DEBUG char buf[ECM_FMT_LEN]; ecmfmt(c->caid, 0, c->prid, c->chid, c->pid, c->srvid, 0, 0, 0, 0, buf, ECM_FMT_LEN, 0, 0); cs_debug_mask(D_DVBAPI, "[DVBAPI] added to channel cache: %s", buf); #endif count++; } return count; }
struct s_channel_cache *dvbapi_find_channel_cache(int32_t demux_id, int32_t pidindex, int8_t caid_and_prid_only) { struct s_ecmpids *p = &demux[demux_id].ECMpids[pidindex]; struct s_channel_cache *c; LL_ITER it; if(!channel_cache) { channel_cache = ll_create("channel cache"); } it = ll_iter_create(channel_cache); while((c = ll_iter_next(&it))) { if(caid_and_prid_only) { if(p->CAID == c->caid && (p->PROVID == c->prid || p->PROVID == 0)) // PROVID ==0 some provider no provid in PMT table { return c; } } else { if(demux[demux_id].program_number == c->srvid && p->CAID == c->caid && p->ECM_PID == c->pid && (p->PROVID == c->prid || p->PROVID == 0)) // PROVID ==0 some provider no provid in PMT table { #ifdef WITH_DEBUG char buf[ECM_FMT_LEN]; ecmfmt(c->caid, 0, c->prid, c->chid, c->pid, c->srvid, 0, 0, 0, 0, buf, ECM_FMT_LEN, 0, 0); cs_debug_mask(D_DVBAPI, "[DVBAPI] found in channel cache: %s", buf); #endif return c; } } } return NULL; }