} cwc_viaccess_emm;
#define cwc_cryptoworks_emm cwc_viaccess_emm
+ /* one update id */
+ int64_t cwc_update_time;
+ void *cwc_update_id;
+
/* Card type */
card_type_t cwc_card_type;
int cwc_port;
char *cwc_id;
int cwc_emm;
+ int cwc_emmex;
const char *cwc_errtxt;
void cwc_emm_irdeto(cwc_t *cwc, uint8_t *data, int len);
void cwc_emm_dre(cwc_t *cwc, uint8_t *data, int len);
void cwc_emm_seca(cwc_t *cwc, uint8_t *data, int len);
-void cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int len, void *ca_update_id);
+void cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int len);
void cwc_emm_nagra(cwc_t *cwc, uint8_t *data, int len);
void cwc_emm_nds(cwc_t *cwc, uint8_t *data, int len);
-void cwc_emm_cryptoworks(cwc_t *cwc, uint8_t *data, int len, void *ca_update_id);
+void cwc_emm_cryptoworks(cwc_t *cwc, uint8_t *data, int len);
/**
TAILQ_FOREACH(cwc, &cwcs, cwc_link) {
if(cwc->cwc_caid == caid &&
cwc->cwc_forward_emm && cwc->cwc_writer_running) {
+ if (cwc->cwc_emmex) {
+ if (cwc->cwc_update_id != ca_update_id) {
+ int64_t delta = getmonoclock() - cwc->cwc_update_time;
+ if (delta < 25000000UL) /* 25 seconds */
+ continue;
+ }
+ cwc->cwc_update_time = getmonoclock();
+ }
+ cwc->cwc_update_id = ca_update_id;
switch (cwc->cwc_card_type) {
case CARD_CONAX:
cwc_emm_conax(cwc, data, len);
cwc_emm_seca(cwc, data, len);
break;
case CARD_VIACCESS:
- cwc_emm_viaccess(cwc, data, len, ca_update_id);
+ cwc_emm_viaccess(cwc, data, len);
break;
case CARD_DRE:
cwc_emm_dre(cwc, data, len);
cwc_emm_nds(cwc, data, len);
break;
case CARD_CRYPTOWORKS:
- cwc_emm_cryptoworks(cwc, data, len, ca_update_id);
+ cwc_emm_cryptoworks(cwc, data, len);
break;
case CARD_UNKNOWN:
break;
void
-cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int mlen, void *ca_update_id)
+cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int mlen)
{
/* Get SCT len */
int len = 3 + ((data[1] & 0x0f) << 8) + data[2];
if (cwc->cwc_viaccess_emm.shared_emm) {
cwc->cwc_viaccess_emm.shared_len = len;
memcpy(cwc->cwc_viaccess_emm.shared_emm, data, len);
- cwc->cwc_viaccess_emm.ca_update_id = ca_update_id;
+ cwc->cwc_viaccess_emm.ca_update_id = cwc->cwc_update_id;
}
cwc->cwc_viaccess_emm.shared_toggle = data[0];
}
break;
case 0x8e:
if (cwc->cwc_viaccess_emm.shared_emm &&
- cwc->cwc_viaccess_emm.ca_update_id == ca_update_id) {
+ cwc->cwc_viaccess_emm.ca_update_id == cwc->cwc_update_id) {
int match = 0;
int i;
/* Match SA and provider in shared */
}
void
-cwc_emm_cryptoworks(cwc_t *cwc, uint8_t *data, int len, void *ca_update_id)
+cwc_emm_cryptoworks(cwc_t *cwc, uint8_t *data, int len)
{
int match = 0;
if (cwc->cwc_cryptoworks_emm.shared_emm) {
cwc->cwc_cryptoworks_emm.shared_len = len;
memcpy(cwc->cwc_cryptoworks_emm.shared_emm, data, len);
- cwc->cwc_cryptoworks_emm.ca_update_id = ca_update_id;
+ cwc->cwc_cryptoworks_emm.ca_update_id = cwc->cwc_update_id;
}
}
break;
case 0x86: /* emm-sb */
if (cwc->cwc_cryptoworks_emm.shared_emm &&
- cwc->cwc_cryptoworks_emm.ca_update_id == ca_update_id) {
+ cwc->cwc_cryptoworks_emm.ca_update_id == cwc->cwc_update_id) {
/* python: EMM_SH[0:12] + EMM_SB[5:-1] + EMM_SH[12:-1] */
uint32_t elen = len - 5 + cwc->cwc_cryptoworks_emm.shared_len - 12;
uint8_t *tmp = malloc(elen);
htsmsg_add_str(e, "deskey", buf);
htsmsg_add_u32(e, "emm", cwc->cwc_emm);
+ htsmsg_add_u32(e, "emmex", cwc->cwc_emmex);
htsmsg_add_str(e, "comment", cwc->cwc_comment ?: "");
return e;
if(!htsmsg_get_u32(values, "emm", &u32))
cwc->cwc_emm = u32;
+ if(!htsmsg_get_u32(values, "emmex", &u32))
+ cwc->cwc_emmex = u32;
+
cwc->cwc_reconfigure = 1;
if(cwc->cwc_fd != -1)
width: 100
});
+ var emmexColumn = new Ext.grid.CheckColumn({
+ header: "Update One",
+ dataIndex: 'emmex',
+ width: 100
+ });
+
function setMetaAttr(meta, record){
var enabled = record.get('enabled');
if(!enabled) return;
editor: new fm.TextField({allowBlank: false})
},
emmColumn,
+ emmexColumn,
{
header: "Comment",
dataIndex: 'comment',
var rec = Ext.data.Record.create([
'enabled', 'connected', 'hostname', 'port', 'username',
- 'password', 'deskey', 'emm', 'comment'
+ 'password', 'deskey', 'emm', 'emmex', 'comment'
]);
var store = new Ext.data.JsonStore({
});
var grid = new tvheadend.tableEditor('Code Word Client', 'cwc', cm, rec,
- [enabledColumn, emmColumn], store,
+ [enabledColumn, emmColumn, emmexColumn], store,
'config_cwc.html', 'key');
tvheadend.comet.on('cwcStatus', function(msg) {