예제 #1
0
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;
}
예제 #2
0
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;
}