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++] != 0)
150 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI non zero compatibilityDescriptorLen");
155 int data_len = (data[off] << 8) | data[off+1];
157 if (data_len + off > length)
159 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI ServiceGatewayInfo too big");
169 if (strcmp(gatewayProfile.
m_typeId,
"srg") != 0)
171 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] IOR unexpected type_id: '%1'")
175 if (ret + 4 > data_len)
177 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI IOP:IOR too big");
184 gatewayProfile.
AddTap(
this);
194 LOG(VB_DSMCC, LOG_DEBUG, QString(
"[dsmcc] DSI ServiceGateway"
195 " carousel %1 tag %2 module %3 key %4")
196 .arg(carouselId).arg(full->m_dsmConn.m_tap.m_assocTag)
200 car =
AddTap(full->m_dsmConn.m_tap.m_assocTag, carouselId);
204 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] DSI ServiceGateway"
205 " carousel %1 module %2 key %3")
217 unsigned short downloadTapsCount = data[off];
219 if (downloadTapsCount)
221 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI unexpected downloadTap");
225 unsigned short serviceContextListCount = data[off];
227 if (serviceContextListCount)
229 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI unexpected serviceContextList");
233 unsigned short userInfoLength = (data[off] << 8) | data[off+1];
237 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] DSI unexpected userInfo");
243 unsigned short streamTag)
254 LOG(VB_DSMCC, LOG_ERR, QString(
"[dsmcc] Section Info for "
255 "unknown carousel %1")
284 LOG(VB_DSMCC, LOG_DEBUG, QString(
"[dsmcc] Module %1 -> "
285 "Size = %2 Version = %3")
309 int length,
unsigned short streamTag)
317 unsigned char protocol = hdrData[0];
318 if (protocol != 0x11)
320 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Server/Info invalid protocol %1")
325 unsigned char header_type = hdrData[1];
326 if (header_type != 0x03)
328 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Server/Info invalid header type %1")
333 unsigned message_id = (hdrData[2] << 8) | hdrData[3];
341 unsigned message_len = (hdrData[10] << 8) | hdrData[11];
342 if (message_len > 4076)
344 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Server/Info invalid length %1")
351 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Server Gateway");
362 LOG(VB_DSMCC, LOG_WARNING,
363 QString(
"[dsmcc] Discarding DSI from tag %1") .arg(streamTag));
369 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Module Info");
374 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] Unknown section");
389 unsigned char protocol = hdrData[0];
390 if (protocol != 0x11)
392 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Data invalid protocol %1")
397 unsigned char header_type = hdrData[1];
398 if (header_type != 0x03)
400 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Data invalid header type %1")
405 unsigned message_id = (hdrData[2] << 8) | hdrData[3];
408 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] Data unknown section");
412 unsigned long download_id =
COMBINE32(hdrData, 4);
415 unsigned message_len = (hdrData[10] << 8) | hdrData[11];
420 ddb.
m_moduleId = (blockData[0] << 8) | blockData[1];
424 ddb.
m_len = message_len - 6;
426 LOG(VB_DSMCC, LOG_DEBUG,
427 QString(
"[dsmcc] Data Block ModID %1 Pos %2 Version %3")
435 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Data Block ModID %1 Pos %2"
436 " unknown carousel %3")
451 int componentTag,
unsigned carouselId,
455 LOG(VB_DSMCC, LOG_DEBUG, QString(
"[dsmcc] Read block size %1 from tag %2 "
456 "carousel id %3 data broadcast Id %4")
457 .arg(length).arg(componentTag)
458 .arg(carouselId).arg(dataBroadcastId,0,16));
464 std::vector<unsigned short>::iterator it2;
465 for (it2 = car->m_Tags.begin(); it2 != car->m_Tags.end(); ++it2)
467 if (*it2 == componentTag)
476 if (!found && dataBroadcastId == 0x0106)
481 if (
AddTap(componentTag, carouselId))
483 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] Initial stream tag %1").arg(componentTag));
491 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] Dropping block size %1 with tag %2"
492 ", carouselID %3, dataBroadcastID 0x%4")
493 .arg(length).arg(componentTag).arg(carouselId)
494 .arg(dataBroadcastId,0,16));
499 unsigned short section_len = ((data[1] & 0xF) << 8) | (data[2]);
501 if (section_len > length)
503 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] section length > data length");
508 unsigned long crc32_decode =
crc32(data, section_len);
510 if (crc32_decode != 0)
512 LOG(VB_DSMCC, LOG_WARNING,
513 QString(
"[dsmcc] Dropping corrupt section (Got %1)")
521 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Server/Info Section");
525 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Data Section");
529 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Descriptor Section");
533 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Unknown Section %1")
542 LOG(VB_DSMCC, LOG_INFO,
"[dsmcc] Resetting carousel");
558 int res = (*it)->m_fileCache.GetDSMObject(objectPath, result);
569 static const std::array<const uint32_t,256>
crc_table
571 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
572 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
573 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
574 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
575 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
576 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
577 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
578 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
579 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
580 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
581 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
582 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
583 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
584 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
585 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
586 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
587 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
588 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
589 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
590 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
591 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
592 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
593 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
594 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
595 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
596 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
597 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
598 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
599 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
600 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
601 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
602 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
603 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
604 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
605 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
606 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
607 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
608 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
609 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
610 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
611 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
612 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
613 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
616 static uint32_t
crc32(
const unsigned char *data,
int len)
618 uint32_t crc = 0xffffffff;
620 for (
int i = 0; i < len; i++)
621 crc = (crc << 8) ^
crc_table[((crc >> 24) ^ *data++) & 0xff];