#include "clt2png.h"
// STD-B21 p130 (144)
+// a_90-with-att.pdf p24 (29/99)
int parseDSMCChead(unsigned char *data, DSMCChead *dsmh) {
int boff = 0;
return 8;
}
+// a_90-with-att.pdf p29 (34/99)
+// 2-STD-B24v5_4-3p3.pdf p16 (30/125)
int parseDSMCCbodyDII(unsigned char *data, DSMCCbodyDII *dsmbdii) {
int boff = 0, i;
DSMCCbodyDIIModule *module;
dsmbdii->numberOfModules = getBit(data, &boff, 16);
if ( dsmbdii->numberOfModules > 0 ) {
- dsmbdii->modules = calloc(1, sizeof(DSMCCbodyDIIModule) * dsmbdii->numberOfModules);
+ dsmbdii->modules = calloc(1, sizeof(DSMCCbodyDIIModule) * dsmbdii->numberOfModules + 1000);
for (i=0; i<dsmbdii->numberOfModules; i++) {
module = dsmbdii->modules + sizeof(DSMCCbodyDIIModule) * i;
module->moduleSize = getBit(data, &boff, 32);
module->moduleVersion = getBit(data, &boff, 8);
module->moduleInfoLength = getBit(data, &boff, 8);
- module->moduleInfo = allocCopy(data, &boff, module->moduleInfoLength);
+
+ if ( *(data + boff / 8) == 0x01 ) {
+ /* Type 記述子 モジュールの型(MIME 形式等) */
+ module->descriptor_tag = getBit(data, &boff, 8);
+ module->descriptor_length = getBit(data, &boff, 8);
+ module->Type = allocCopy(data, &boff, module->descriptor_length + 1);
+ module->Type[module->descriptor_length] = '\0';
+ // +1 byte for null-terminated
+ }
+ else if ( *(data + boff / 8) == 0x02 ) {
+ /* Name 記述子 モジュール名(ファイル名) */
+ module->descriptor_tag = getBit(data, &boff, 8);
+ module->descriptor_length = getBit(data, &boff, 8);
+ module->Name = allocCopy(data, &boff, module->descriptor_length + 1);
+ module->Name[module->descriptor_length] = '\0';
+ }
+ else if ( *(data + boff / 8) == 0x03 ) {
+ /* Info 記述子 モジュール情報(文字型) */
+ module->descriptor_tag = getBit(data, &boff, 8);
+ module->descriptor_length = getBit(data, &boff, 8);
+ boff += 24; // ISO_639_language_code
+ module->Info = allocCopy(data, &boff, module->descriptor_length - 3 + 1);
+ module->Info[module->descriptor_length] = '\0';
+ }
+ else {
+ module->moduleInfo = allocCopy(data, &boff, module->moduleInfoLength);
+ }
}
}
return boff / 8;
}
+// a_90-with-att.pdf p35 (40/99)
int parseDSMCCbodyDDB(unsigned char *data, DSMCCbodyDDB *dsmbddb) {
int boff = 0;
dsmbddb->moduleVersion = getBit(data, &boff, 8);
dsmbddb->reserved2 = getBit(data, &boff, 8);
dsmbddb->blockNumber = getBit(data, &boff, 16);
- dsmbddb->blockData = allocCopy(data, &boff, dsmbddb->adaptationLength);
+ dsmbddb->blockData = allocCopy(data, &boff, dsmbddb->messageLength);
return boff / 8;
}
-void dumpDSMCC(unsigned char *ptr, STATION *station, int station_count)
+void dumpDSMCC(unsigned char *ptr, int * downloadDataId, DSM_CONTROL *dsmctl)
{
DSMCChead dsmh;
DSMCCbodyDII dsmbdii;
*/
if ( dsmh.table_id == 0x3B ) {
len = parseDSMCCbodyDII(ptr, &dsmbdii);
-#if 1
- printf("DSMCCbDDI=(%d:%d:%d:%d:%d:%d) (%d:%d:%d:%d)\n",
+#if 0
+ printf("DSMCCbDII=(%d:%d:%d:%d:%d:%d) (%d:%d:%d:%d)\n",
dsmbdii.protocolDiscriminator, dsmbdii.dsmccType,
dsmbdii.messageId, dsmbdii.transaction_id,
dsmbdii.adaptationLength, dsmbdii.messageLength,
#endif
for (i=0; i<dsmbdii.numberOfModules; i++) {
module = dsmbdii.modules + sizeof(DSMCCbodyDIIModule) * i;
- /*
- if ( *module->moduleInfo == 0x01 ) {
- printf("1 %d %s\n",module, module->moduleInfo + 2);
+ // 0x01 Type 記述子
+ // 0x02 Name 記述子
+ // 0x03 Info 記述子
+ if ( module->descriptor_tag == 0x01 ) {
+ //printf("1 %s\n", module->Type);
}
- else if ( *module->moduleInfo == 0x02 ) {
- printf("2 %s\n",module->moduleInfo + 2);
+ else if ( module->descriptor_tag == 0x02 ) {
+ //printf("2 %s\n", module->Name);
+ // is_bs_cs == 1 &&
+ if ( !strncmp( module->Name, "LOGO", 4 ) ) {
+ //printf("%s(%d) : id = %d\n", module->Name, is_bs_cs, dsmbdii.downloadId);
+ *downloadDataId = dsmbdii.downloadId;
+ }
+ // なぜかBSにCSのロゴも載ってるため
+ // is_bs_cs == 2 &&
+ else if ( !strncmp( module->Name, "CS_LOGO", 7 ) ) {
+ //printf("%s(%d) : id = %d\n", module->Name, is_bs_cs, dsmbdii.downloadId);
+ *downloadDataId = dsmbdii.downloadId;
+ }
}
- else if ( *module->moduleInfo == 0x03 ) {
- printf("3 %s\n",module->moduleInfo);
+ else if ( module->descriptor_tag == 0x03 ) {
+ //printf("3 %s\n", module->Info);
}
- */
}
}
else if ( dsmh.table_id == 0x3C ) {
len = parseDSMCCbodyDDB(ptr, &dsmbddb);
-// if ( station[0].logo_download_data_id == dsmbddb.downloadId ) {
-// if ( 151585024 == dsmbddb.downloadId ) {
-#if 1
+ if ( *downloadDataId == dsmbddb.downloadId ) {
+// if ( 33882368 == dsmbddb.downloadId ) {
+// {
+#if 0
printf("DSMCCbDDB=(%d:%d:%d:%d:%d:%d) (%d:%d:%d)\n",
dsmbddb.protocolDiscriminator, dsmbddb.dsmccType,
dsmbddb.messageId, dsmbddb.downloadId,
dsmbddb.moduleId , dsmbddb.moduleVersion , dsmbddb.blockNumber);
#endif
-// }
+
+ for (i = 0; i < 1024; i++) {
+ if ( dsmctl[i].isUsed == 0 ) {
+ // リストの終端まで来たので
+ //printf("moduleId=%d as dsmctl[%d]\n", dsmbddb.moduleId, i);
+ dsmctl[i].moduleId = dsmbddb.moduleId;
+ dsmctl[i].lastBlockNumber = -1;
+ dsmctl[i].isUsed = 1;
+ }
+ if ( dsmctl[i].moduleId == dsmbddb.moduleId ) {
+ if ( dsmctl[i].lastBlockNumber + 1 == dsmbddb.blockNumber ) {
+ dsmbddb.messageLength -= 6; // length of moduleId, moduleVersion, reserved, blockNumber
+ //printf("moduleId=%d as dsmctl[%d] size %d += %d\n", dsmbddb.moduleId, i, dsmctl[i].blockSize, dsmbddb.messageLength);
+ dsmctl[i].blockData = realloc( dsmctl[i].blockData, dsmctl[i].blockSize + dsmbddb.messageLength );
+ memcpy( dsmctl[i].blockData + dsmctl[i].blockSize, dsmbddb.blockData, dsmbddb.messageLength );
+ dsmctl[i].blockSize += dsmbddb.messageLength;
+ dsmctl[i].lastBlockNumber++;
+ }
+ else {
+ //printf("ignoring %d(max %d)\n", dsmbddb.blockNumber, dsmctl[i].lastBlockNumber);
+ }
+ break;
+ }
+ }
+ }
}
return;