Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
0
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;
}