38 static uint32_t
crc32(
const unsigned char *data,
int len);
47 { return car->m_id == carouselId; });
71 car->
m_id = carouselId;
75 std::vector<unsigned short>::iterator it;
76 for (it = car->
m_Tags.begin(); it != car->
m_Tags.end(); ++it)
78 if (*it == componentTag)
83 car->
m_Tags.push_back(componentTag);
84 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] Adding tap for stream "
85 "tag %1 with carousel %2")
86 .arg(componentTag).arg(carouselId));
92 const unsigned char *data,
int length)
102 if (((header->
m_flags[0] & 0x80) == 0) || (header->
m_flags[0] & 0x40) != 0)
104 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] Invalid section");
114 crc_offset = length - 4 - 1;
137 for (off = 0; off < 20; ++off)
139 if (data[off] != 0xff)
141 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] DSI invalid serverID"
142 " index %1: 0x%2").arg(off).arg(data[off],0,16));
148 if (data[off] != 0 || data[off+1] != 0)
150 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI non zero compatibilityDescriptorLen");
156 int data_len = (data[off] << 8) | data[off+1];
158 if (data_len + off > length)
160 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI ServiceGatewayInfo too big");
170 if (strcmp(gatewayProfile.
m_typeId,
"srg") != 0)
172 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] IOR unexpected type_id: '%1'")
176 if (ret + 4 > data_len)
178 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI IOP:IOR too big");
185 gatewayProfile.
AddTap(
this);
195 LOG(VB_DSMCC, LOG_DEBUG, QString(
"[dsmcc] DSI ServiceGateway"
196 " carousel %1 tag %2 module %3 key %4")
197 .arg(carouselId).arg(full->m_dsmConn.m_tap.m_assocTag)
201 car =
AddTap(full->m_dsmConn.m_tap.m_assocTag, carouselId);
205 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] DSI ServiceGateway"
206 " carousel %1 module %2 key %3")
218 unsigned short downloadTapsCount = data[off];
220 if (downloadTapsCount)
222 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI unexpected downloadTap");
226 unsigned short serviceContextListCount = data[off];
228 if (serviceContextListCount)
230 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI unexpected serviceContextList");
234 unsigned short userInfoLength = (data[off] << 8) | data[off+1];
238 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI unexpected userInfo");
244 unsigned short streamTag)
255 LOG(VB_DSMCC, LOG_ERR, QString(
"[dsmcc] Section Info for "
256 "unknown carousel %1")
285 LOG(VB_DSMCC, LOG_DEBUG, QString(
"[dsmcc] Module %1 -> "
286 "Size = %2 Version = %3")
310 int length,
unsigned short streamTag)
318 unsigned char protocol = hdrData[0];
319 if (protocol != 0x11)
321 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Server/Info invalid protocol %1")
326 unsigned char header_type = hdrData[1];
327 if (header_type != 0x03)
329 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Server/Info invalid header type %1")
334 unsigned message_id = (hdrData[2] << 8) | hdrData[3];
342 unsigned message_len = (hdrData[10] << 8) | hdrData[11];
343 if (message_len > 4076)
345 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Server/Info invalid length %1")
352 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Server Gateway");
363 LOG(VB_DSMCC, LOG_WARNING,
364 QString(
"[dsmcc] Discarding DSI from tag %1") .arg(streamTag));
370 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Module Info");
375 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] Unknown section");
390 unsigned char protocol = hdrData[0];
391 if (protocol != 0x11)
393 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Data invalid protocol %1")
398 unsigned char header_type = hdrData[1];
399 if (header_type != 0x03)
401 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Data invalid header type %1")
406 unsigned message_id = (hdrData[2] << 8) | hdrData[3];
409 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] Data unknown section");
413 unsigned long download_id =
COMBINE32(hdrData, 4);
416 unsigned message_len = (hdrData[10] << 8) | hdrData[11];
421 ddb.
m_moduleId = (blockData[0] << 8) | blockData[1];
425 ddb.
m_len = message_len - 6;
427 LOG(VB_DSMCC, LOG_DEBUG,
428 QString(
"[dsmcc] Data Block ModID %1 Pos %2 Version %3")
436 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Data Block ModID %1 Pos %2"
437 " unknown carousel %3")
452 int componentTag,
unsigned carouselId,
456 LOG(VB_DSMCC, LOG_DEBUG, QString(
"[dsmcc] Read block size %1 from tag %2 "
457 "carousel id %3 data broadcast Id %4")
458 .arg(length).arg(componentTag)
459 .arg(carouselId).arg(dataBroadcastId,0,16));
465 std::vector<unsigned short>::iterator it2;
466 for (it2 = car->m_Tags.begin(); it2 != car->m_Tags.end(); ++it2)
468 if (*it2 == componentTag)
477 if (!found && dataBroadcastId == 0x0106)
482 if (
AddTap(componentTag, carouselId))
484 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] Initial stream tag %1").arg(componentTag));
492 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] Dropping block size %1 with tag %2"
493 ", carouselID %3, dataBroadcastID 0x%4")
494 .arg(length).arg(componentTag).arg(carouselId)
495 .arg(dataBroadcastId,0,16));
500 unsigned short section_len = ((data[1] & 0xF) << 8) | (data[2]);
502 if (section_len > length)
504 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] section length > data length");
509 unsigned long crc32_decode =
crc32(data, section_len);
511 if (crc32_decode != 0)
513 LOG(VB_DSMCC, LOG_WARNING,
514 QString(
"[dsmcc] Dropping corrupt section (Got %1)")
522 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Server/Info Section");
526 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Data Section");
530 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Descriptor Section");
534 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Unknown Section %1")
543 LOG(VB_DSMCC, LOG_INFO,
"[dsmcc] Resetting carousel");
559 int res = (*it)->m_fileCache.GetDSMObject(objectPath, result);
570 static const std::array<const uint32_t,256>
crc_table
572 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
573 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
574 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
575 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
576 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
577 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
578 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
579 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
580 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
581 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
582 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
583 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
584 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
585 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
586 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
587 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
588 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
589 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
590 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
591 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
592 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
593 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
594 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
595 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
596 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
597 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
598 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
599 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
600 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
601 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
602 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
603 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
604 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
605 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
606 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
607 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
608 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
609 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
610 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
611 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
612 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
613 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
614 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
617 static uint32_t
crc32(
const unsigned char *data,
int len)
619 uint32_t crc = 0xffffffff;
621 for (
int i = 0; i < len; i++)
622 crc = (crc << 8) ^
crc_table[((crc >> 24) ^ *data++) & 0xff];