uint16_t Extract_cdTOCrawdata(CFDataRef cdTOCdata, char* cdTOCrawdata) { CFRange cdrange; CFIndex cdTOClen = CFDataGetLength (cdTOCdata); cdTOCrawdata = (char*)calloc(1, sizeof(char)*cdTOClen+1); cdrange = CFRangeMake(0, cdTOClen+1); CFDataGetBytes(cdTOCdata, cdrange, (unsigned char*)cdTOCrawdata); cdTOC = (CD_TOC_*)calloc(1, sizeof(CD_TOC_)); cdTOC->toc_length = UInt16FromBigEndian(cdTOCrawdata); cdTOC->first_session = cdTOCrawdata[2]; cdTOC->first_session = cdTOCrawdata[3]; cdTOC->track_description = NULL; CD_TDesc* a_TOC_desc = NULL; CD_TDesc* prev_desc = NULL; uint16_t toc_offset = 0; for (toc_offset = 4; toc_offset <= cdTOClen; toc_offset +=11) { if (cdTOC->track_description == NULL) { cdTOC->track_description = (CD_TDesc*)calloc(1, (sizeof(CD_TDesc))); a_TOC_desc = cdTOC->track_description; prev_desc = a_TOC_desc; } else { prev_desc->next_description = (CD_TDesc*)calloc(1, (sizeof(CD_TDesc))); a_TOC_desc = (CD_TDesc*)prev_desc->next_description; prev_desc = a_TOC_desc; } a_TOC_desc->session = cdTOCrawdata[toc_offset]; a_TOC_desc->controladdress = cdTOCrawdata[toc_offset+1]; a_TOC_desc->unused1 = cdTOCrawdata[toc_offset+2]; a_TOC_desc->tracknumber = cdTOCrawdata[toc_offset+3]; a_TOC_desc->rel_minutes = cdTOCrawdata[toc_offset+4]; a_TOC_desc->rel_seconds = cdTOCrawdata[toc_offset+5]; a_TOC_desc->rel_frames = cdTOCrawdata[toc_offset+6]; a_TOC_desc->zero_space = 0; a_TOC_desc->abs_minutes = cdTOCrawdata[toc_offset+8]; a_TOC_desc->abs_seconds = cdTOCrawdata[toc_offset+9]; a_TOC_desc->abs_frames = cdTOCrawdata[toc_offset+10]; } return (uint16_t)cdTOClen; }
void APar_ExtractDataAtomXML(int this_atom_number,char *name,char *reverseDNSdomain=NULL, char *reverseDNSname=NULL) { if ( source_file != NULL ) { AtomicInfo* thisAtom = &parsedAtoms[this_atom_number]; uint32_t min_atom_datasize = 12; uint32_t atom_header_size = 16; if (thisAtom->AtomicClassification == EXTENDED_ATOM) { if (thisAtom->uuid_style == UUID_DEPRECATED_FORM) { min_atom_datasize +=4; atom_header_size +=4; } else { min_atom_datasize = 36; atom_header_size = 36; } } if (thisAtom->AtomicLength > min_atom_datasize ) { char* data_payload = (char*)malloc( sizeof(char) * (thisAtom->AtomicLength - atom_header_size +1) ); memset(data_payload, 0, sizeof(char) * (thisAtom->AtomicLength - atom_header_size +1) ); APar_readX(data_payload, source_file, thisAtom->AtomicStart + atom_header_size, thisAtom->AtomicLength - atom_header_size); if (thisAtom->AtomicVerFlags == AtomFlags_Data_Text) { if (thisAtom->AtomicLength < (atom_header_size + 4) ) { //tvnn was showing up with 4 chars instead of 3; easier to null it out for now data_payload[thisAtom->AtomicLength - atom_header_size] = '\00'; } fprintf(stdout," <atomString name=\""); APar_PrintName(name); fprintf(stdout,"\""); if (reverseDNSdomain!=NULL) { fprintf(stdout," reverseDNSdomain=\"%s\"",reverseDNSdomain); } if (reverseDNSname!=NULL) { fprintf(stdout," reverseDNSname=\"%s\"",reverseDNSname); } fprintf(stdout,"><![CDATA["); APar_fprintf_UTF8_data(data_payload); fprintf(stdout,"]]></atomString>\n"); } else { if ( (memcmp(name, "trkn", 4) == 0) || (memcmp(name, "disk", 4) == 0) ) { fprintf(stdout, " <atomRange name=\""); APar_PrintName(name); fprintf(stdout, "\" count=\"%hu\"",UInt16FromBigEndian(data_payload+2)); if (UInt16FromBigEndian(data_payload+4) != 0) { fprintf(stdout, " max=\"%hu\"",UInt16FromBigEndian(data_payload+4)); } fprintf(stdout,"/>\n"); } else if (strncmp(name, "gnre", 4) == 0) { fprintf(stdout, " <atomNumber name=\""); APar_PrintName(name); fprintf(stdout, "\" value=\"%hu\"/>\n",UInt16FromBigEndian(data_payload)); } else if ( (strncmp(name, "purl", 4) == 0) || (strncmp(name, "egid", 4) == 0) ) { fprintf(stdout, " <atom name=\""); APar_PrintName(name); fprintf(stdout,"\" value=\"%s\"/>\n", data_payload); } else { if (thisAtom->AtomicVerFlags == AtomFlags_Data_UInt && (thisAtom->AtomicLength <= 20 || thisAtom->AtomicLength == 24) ) { uint8_t bytes_rep = (uint8_t) (thisAtom->AtomicLength-atom_header_size); switch(bytes_rep) { case 1 : { if ( (memcmp(name, "cpil", 4) == 0) || (memcmp(name, "pcst", 4) == 0) || (memcmp(name, "pgap", 4) == 0)) { fprintf(stdout, " <atomBoolean name=\""); APar_PrintName(name); if (data_payload[0] == 1) { fprintf(stdout, "\" value=\"true\"/>\n"); } else { fprintf(stdout, "\" value=\"false\"/>\n"); } } else if (strncmp(name, "stik", 4) == 0) { fprintf(stdout, " <atomNumber name=\""); APar_PrintName(name); fprintf(stdout, "\" value=\"%hhu\"/>\n",data_payload[0]); } else if (strncmp(name, "rtng", 4) == 0) { //okay, this is definitely an 8-bit number fprintf(stdout, " <atomNumber name=\""); APar_PrintName(name); fprintf(stdout, "\" value=\"%hhu\"/>\n",data_payload[0]); } else { fprintf(stdout, " <atomNumber name=\""); APar_PrintName(name); fprintf(stdout, "\" value=\"%hhu\"/>\n",data_payload[0]); } break; } case 2 : { //tmpo fprintf(stdout, " <atomNumber name=\""); APar_PrintName(name); fprintf(stdout, "\""); if (reverseDNSdomain!=NULL) { fprintf(stdout," reverseDNSdomain=\"%s\"",reverseDNSdomain); } if (reverseDNSname!=NULL) { fprintf(stdout," reverseDNSname=\"%s\"",reverseDNSname); } fprintf(stdout," value=\"%hu\"/>\n",UInt16FromBigEndian(data_payload) ); break; } case 4 : { //tves, tvsn fprintf(stdout, " <atomNumber name=\""); APar_PrintName(name); fprintf(stdout, "\""); if (reverseDNSdomain!=NULL) { fprintf(stdout," reverseDNSdomain=\"%s\"",reverseDNSdomain); } if (reverseDNSname!=NULL) { fprintf(stdout," reverseDNSname=\"%s\"",reverseDNSname); } fprintf(stdout," value=\"%u\"/>\n",UInt32FromBigEndian(data_payload) ); break; } case 8 : { fprintf(stdout, " <atomNumber name=\""); APar_PrintName(name); fprintf(stdout, "\""); if (reverseDNSdomain!=NULL) { fprintf(stdout," reverseDNSdomain=\"%s\"",reverseDNSdomain); } if (reverseDNSname!=NULL) { fprintf(stdout," reverseDNSname=\"%s\"",reverseDNSname); } fprintf(stdout," value=\"%" PRIu64 "\"/>\n",UInt64FromBigEndian(data_payload) ); break; } } } } free(data_payload); data_payload = NULL; } } } return; }