39static uint32_t
crc32(
const unsigned char *data,
int len);
70 car->
m_id = carouselId;
74 std::vector<unsigned short>::iterator it;
75 for (it = car->
m_Tags.begin(); it != car->
m_Tags.end(); ++it)
77 if (*it == componentTag)
82 car->
m_Tags.push_back(componentTag);
83 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] Adding tap for stream "
84 "tag %1 with carousel %2")
85 .arg(componentTag).arg(carouselId));
91 const unsigned char *data,
int length)
101 if (((header->
m_flags[0] & 0x80) == 0) || (header->
m_flags[0] & 0x40) != 0)
103 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] Invalid section");
113 crc_offset = length - 4 - 1;
136 for (off = 0; off < 20; ++off)
138 if (data[off] != 0xff)
140 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] DSI invalid serverID"
141 " index %1: 0x%2").arg(off).arg(data[off],0,16));
147 if (data[off] != 0 || data[off+1] != 0)
149 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 (gatewayProfile.
m_typeId !=
"srg")
171 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] IOR unexpected type_id: '%1'")
172 .arg(QString::fromStdString(gatewayProfile.
m_typeId)));
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")
437 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Data Block ModID %1 Pos %2"
438 " unknown carousel %3")
453 int componentTag,
unsigned carouselId,
457 LOG(VB_DSMCC, LOG_DEBUG, QString(
"[dsmcc] Read block size %1 from tag %2 "
458 "carousel id %3 data broadcast Id %4")
459 .arg(length).arg(componentTag)
460 .arg(carouselId).arg(dataBroadcastId,0,16));
466 std::vector<unsigned short>::iterator it2;
467 for (it2 = car->m_Tags.begin(); it2 != car->m_Tags.end(); ++it2)
469 if (*it2 == componentTag)
478 if (!found && dataBroadcastId == 0x0106)
483 if (
AddTap(componentTag, carouselId))
485 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] Initial stream tag %1").arg(componentTag));
493 LOG(VB_DSMCC, LOG_INFO, QString(
"[dsmcc] Dropping block size %1 with tag %2"
494 ", carouselID %3, dataBroadcastID 0x%4")
495 .arg(length).arg(componentTag).arg(carouselId)
496 .arg(dataBroadcastId,0,16));
501 unsigned short section_len = ((data[1] & 0xF) << 8) | (data[2]);
503 if (section_len > length)
505 LOG(VB_DSMCC, LOG_WARNING,
"[dsmcc] section length > data length");
510 unsigned long crc32_decode =
crc32(data, section_len);
512 if (crc32_decode != 0)
514 LOG(VB_DSMCC, LOG_WARNING,
515 QString(
"[dsmcc] Dropping corrupt section (Got %1)")
523 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Server/Info Section");
527 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Data Section");
531 LOG(VB_DSMCC, LOG_DEBUG,
"[dsmcc] Descriptor Section");
535 LOG(VB_DSMCC, LOG_WARNING, QString(
"[dsmcc] Unknown Section %1")
544 LOG(VB_DSMCC, LOG_INFO,
"[dsmcc] Resetting carousel");
560 int res = (*it)->m_fileCache.GetDSMObject(objectPath, result);
573 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
574 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
575 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
576 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
577 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
578 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
579 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
580 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
581 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
582 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
583 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
584 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
585 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
586 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
587 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
588 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
589 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
590 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
591 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
592 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
593 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
594 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
595 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
596 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
597 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
598 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
599 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
600 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
601 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
602 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
603 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
604 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
605 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
606 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
607 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
608 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
609 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
610 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
611 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
612 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
613 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
614 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
615 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
618static uint32_t
crc32(
const unsigned char *data,
int len)
620 uint32_t crc = 0xffffffff;
622 for (
int i = 0; i < len; i++)
623 crc = (crc << 8) ^
crc_table[((crc >> 24) ^ *data++) & 0xff];
void AddTap(Dsmcc *pStatus) const
int Process(const unsigned char *data)
ProfileBody * m_profileBody
int Process(const unsigned char *Data)
QString toString(void) const
unsigned short m_nModuleId
unsigned long m_nCarouselId
void SetGateway(const DSMCCCacheReference &ref)
unsigned short m_blockNumber
unsigned short m_moduleId
unsigned char m_moduleVersion
unsigned short m_privateDataLen
unsigned short m_numberModules
unsigned short m_blockSize
DsmccModuleInfo * m_modules
unsigned long m_tcDownloadScenario
unsigned long m_downloadId
unsigned char m_moduleVersion
unsigned short m_moduleId
unsigned char m_moduleInfoLen
unsigned long m_moduleSize
void ProcessDownloadInfoIndication(const unsigned char *data, unsigned short streamTag)
void ProcessDownloadServerInitiate(const unsigned char *data, int length)
Process a DSI message.
static void ProcessSectionDesc(const unsigned char *data, int length)
int GetDSMCCObject(QStringList &objectPath, QByteArray &result)
std::list< ObjCarousel * > m_carousels
void ProcessSectionData(const unsigned char *data, int length)
ObjCarousel * GetCarouselById(unsigned int carouselId)
Returns a carousel with the given ID.
unsigned short m_startTag
static bool ProcessSectionHeader(DsmccSectionHeader *header, const unsigned char *data, int length)
void ProcessSection(const unsigned char *data, int length, int componentTag, unsigned carouselId, int dataBroadcastId)
ObjCarousel * AddTap(unsigned short componentTag, unsigned carouselId)
Add a tap.
void ProcessSectionIndication(const unsigned char *data, int length, unsigned short streamTag)
void AddModuleData(DsmccDb *ddb, const unsigned char *data)
We have received a block for a module.
void AddModuleInfo(DsmccDii *dii, Dsmcc *status, unsigned short streamTag)
std::vector< unsigned short > m_Tags
Component tags matched to this carousel.
virtual DSMCCCacheReference * GetReference()=0
static constexpr ptrdiff_t DSMCC_DII_OFFSET
static uint32_t crc32(const unsigned char *data, int len)
static const std::array< const uint32_t, 256 > crc_table
static constexpr ptrdiff_t DSMCC_SECTION_OFFSET
static constexpr ptrdiff_t DSMCC_DATAHDR_OFFSET
@ DSMCC_SECTION_INDICATION
static constexpr ptrdiff_t DSMCC_DDB_OFFSET
static constexpr ptrdiff_t DSMCC_MSGHDR_OFFSET
static constexpr ptrdiff_t DSMCC_BIOP_OFFSET
static constexpr ptrdiff_t DSMCC_DSI_OFFSET
static constexpr uint32_t COMBINE32(const uint8_t *data, int idx)
static pid_list_t::iterator find(const PIDInfoMap &map, pid_list_t &list, pid_list_t::iterator begin, pid_list_t::iterator end, bool find_open)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)