[Mt-daapd-cvs] mt-daapd/tools decodeflow.c,1.2,1.3
Status: Beta
Brought to you by:
andrew40
From: Ron P. <rp...@us...> - 2006-03-14 07:29:07
|
Update of /cvsroot/mt-daapd/mt-daapd/tools In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21757/tools Modified Files: decodeflow.c Log Message: new dmap atoms Index: decodeflow.c =================================================================== RCS file: /cvsroot/mt-daapd/mt-daapd/tools/decodeflow.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** decodeflow.c 12 Jan 2006 08:11:36 -0000 1.2 --- decodeflow.c 14 Mar 2006 07:28:59 -0000 1.3 *************** *** 119,129 **** { 0x05, "aeSF", "com.apple.iTunes.itms-storefrontid" }, ! /* iTunes 5.0+ */ ! { 0x01, "ascr", "daap.songcontentrating" }, ! { 0x05, "f" "\x8d" "ch", "dmap.haschildcontainers" }, /* wtf - content codes says it's 1 */ ! ! /* iTunes 6.0.2+ */ ! { 0x01, "aeHV", "com.apple.itunes.has-video" }, /* mt-daapd specific */ { 0x09, "MSPS", "org.mt-daapd.smart-playlist-spec" }, --- 119,146 ---- { 0x05, "aeSF", "com.apple.iTunes.itms-storefrontid" }, ! /* iTunes 5.0+ */ ! { 0x01, "ascr", "daap.songcontentrating" }, ! { 0x01, "f" "\x8d" "ch", "dmap.haschildcontainers" }, /* was 5? */ ! ! /* iTunes 6.0.2+ */ ! { 0x01, "aeHV", "com.apple.itunes.has-video" }, + /* iTunes 6.0.4+ */ + { 0x05, "msas", "dmap.authenticationschemes" }, + { 0x09, "asct", "daap.songcategory" }, + { 0x09, "ascn", "daap.songcontentdescription" }, + { 0x09, "aslc", "daap.songlongcontentdescription" }, + { 0x09, "asky", "daap.songkeywords" }, + { 0x01, "apsm", "daap.playlistshufflemode" }, + { 0x01, "aprm", "daap.playlistrepeatmode" }, + { 0x01, "aePC", "com.apple.itunes.is-podcast" }, + { 0x01, "aePP", "com.apple.itunes.is-podcast-playlist" }, + { 0x01, "aeMK", "com.apple.itunes.mediakind" }, + { 0x09, "aeSN", "com.apple.itunes.series-name" }, + { 0x09, "aeNN", "com.apple.itunes.network-name" }, + { 0x09, "aeEN", "com.apple.itunes.episode-num-str" }, + { 0x05, "aeES", "com.apple.itunes.episode-sort" }, + { 0x05, "aeSU", "com.apple.itunes.season-num" }, + /* mt-daapd specific */ { 0x09, "MSPS", "org.mt-daapd.smart-playlist-spec" }, *************** *** 141,151 **** while((current->tag) && (strcasecmp(current->tag,tag))) { ! current++; } if(current->tag) { ! strcpy(descr,current->description); ! *type = current->type; ! return 1; } --- 158,168 ---- while((current->tag) && (strcasecmp(current->tag,tag))) { ! current++; } if(current->tag) { ! strcpy(descr,current->description); ! *type = current->type; ! return 1; } *************** *** 164,286 **** while(len) { ! memset(tag,0,sizeof(tag)); ! memcpy(tag,current,4); ! current += 4; ! len -= 4; ! memcpy((char*)&subtag_len,current,4); ! current += 4; ! len -= 4; ! if(lookup_tag(tag,descr,&type)) { ! memset(line,' ',sizeof(line)); ! sprintf((char*)&line[level * 2],"%02x %s (%s) - ", ! type,tag,descr); ! switch(type) { ! case 0x01: /* byte */ ! case 0x02: /* unsigned byte */ ! if(subtag_len != 1) { ! printf("Foo! %s should have tag len 1, has %d\n", ! tag,subtag_len); ! exit(EXIT_FAILURE); ! } ! sprintf(templine,"%02x (%d)\n",*((char*)current),(int)(*((char*)current))); ! current += 1; ! len -= 1; ! break; ! case 0x03: ! if(subtag_len != 2) { ! printf("Foo! %s should have tag len 2, has %d\n", ! tag,subtag_len); ! exit(EXIT_FAILURE); ! } ! sprintf(templine,"%02x %d\n",*((short int*)current),(int)(*((short int *)current))); ! current += 2; ! len -= 2; ! break; ! ! break; ! case 0x0A: ! case 0x05: ! if(subtag_len != 4) { ! printf("Foo! %s should have tag len 4, has %d\n", ! tag,subtag_len); ! exit(EXIT_FAILURE); ! } ! sprintf(templine,"%04x (%d)\n",*((int*)current),*((int*)current)); ! current += 4; ! len -= 4; ! break; ! case 0x07: ! if(subtag_len != 8) { ! printf("Foo! %s should have tag len 8, has %d\n", ! tag,subtag_len); ! exit(EXIT_FAILURE); ! } ! sprintf(templine,"%04x%04x (%lu)\n",*((int*)current),*((int*)current+4),*((long long*)current)); ! current += 8; ! len -= 8; ! break; ! case 0x09: ! if(subtag_len == 0) { ! strcpy(templine,"(empty)\n"); ! } else { ! memset(templine,0,sizeof(templine)); ! memcpy(templine,current,subtag_len); ! strcat(templine,"\n"); ! } ! current += subtag_len; ! len -= subtag_len; ! break; ! case 0x0B: ! if(subtag_len != 4) { ! printf("Foo! %s should have tag len 4, has %d\n", ! tag,subtag_len); ! exit(EXIT_FAILURE); ! } ! tempint = *((int*)current); ! sprintf(templine,"%d.%d\n",tempint >> 16 & 0xFFFF, ! tempint & 0xFFFF); ! current += 4; ! len -= 4; ! break; ! ! case 0x0C: ! sprintf(templine,"<container>\n"); ! break; ! default: ! printf("Foo! Bad tag: type %d\n",type); ! exit(EXIT_FAILURE); ! } ! fprintf(fout,"%s%s",line,templine); ! if(type == 0x0c) { ! if(decode_tag(fout, current,level+1,subtag_len)) { ! current += subtag_len; ! len -= subtag_len; ! } else { ! return 0; ! } ! } ! } else { ! printf("Bad tag: %s (%02x%02x%02x%02x)\n",tag,(unsigned char)tag[0],(unsigned char)tag[1], ! (unsigned char)tag[2],(unsigned char)tag[3]); ! exit(EXIT_FAILURE); ! return 0; ! } ! } --- 181,312 ---- while(len) { ! memset(tag,0,sizeof(tag)); ! memcpy(tag,current,4); ! current += 4; ! len -= 4; ! memcpy((char*)&subtag_len,current,4); ! current += 4; ! len -= 4; ! if(lookup_tag(tag,descr,&type)) { ! memset(line,' ',sizeof(line)); ! sprintf((char*)&line[level * 2],"%02x %s (%s) - ", ! type,tag,descr); ! switch(type) { ! case 0x01: /* byte */ ! case 0x02: /* unsigned byte */ ! if(subtag_len != 1) { ! printf("Foo! %s should have tag len 1, has %d\n", ! tag,subtag_len); ! exit(EXIT_FAILURE); ! } ! sprintf(templine,"%02x (%d)\n",*((char*)current),(int)(*((char*)current))); ! current += 1; ! len -= 1; ! break; ! case 0x03: ! if(subtag_len != 2) { ! printf("Foo! %s should have tag len 2, has %d\n", ! tag,subtag_len); ! exit(EXIT_FAILURE); ! } ! sprintf(templine,"%02x %d\n",*((short int*)current),(int)(*((short int *)current))); ! current += 2; ! len -= 2; ! break; ! ! break; ! case 0x0A: ! case 0x05: ! if(subtag_len != 4) { ! printf("Foo! %s should have tag len 4, has %d\n", ! tag,subtag_len); ! exit(EXIT_FAILURE); ! } ! if(strcmp(tag,"mcnm") == 0) { ! sprintf(templine,"%c%c%c%c (%04x)\n", ! *((char*)current), ! *((char*)current+1), ! *((char*)current+2), ! *((char*)current+3), ! *((int*)current)); ! } else { ! sprintf(templine,"%04x (%d)\n",*((int*)current),*((int*)current)); ! } ! current += 4; ! len -= 4; ! break; ! case 0x07: ! if(subtag_len != 8) { ! printf("Foo! %s should have tag len 8, has %d\n", ! tag,subtag_len); ! exit(EXIT_FAILURE); ! } ! sprintf(templine,"%04x%04x (%lu)\n",*((int*)current),*((int*)current+4),*((long long*)current)); ! current += 8; ! len -= 8; ! break; ! case 0x09: ! if(subtag_len == 0) { ! strcpy(templine,"(empty)\n"); ! } else { ! memset(templine,0,sizeof(templine)); ! memcpy(templine,current,subtag_len); ! strcat(templine,"\n"); ! } ! current += subtag_len; ! len -= subtag_len; ! break; ! case 0x0B: ! if(subtag_len != 4) { ! printf("Foo! %s should have tag len 4, has %d\n", ! tag,subtag_len); ! exit(EXIT_FAILURE); ! } ! tempint = *((int*)current); ! sprintf(templine,"%d.%d\n",tempint >> 16 & 0xFFFF, ! tempint & 0xFFFF); ! current += 4; ! len -= 4; ! break; ! ! case 0x0C: ! sprintf(templine,"<container>\n"); ! break; ! default: ! printf("Foo! Bad tag: type %d\n",type); ! exit(EXIT_FAILURE); ! } ! fprintf(fout,"%s%s",line,templine); ! if(type == 0x0c) { ! if(decode_tag(fout, current,level+1,subtag_len)) { ! current += subtag_len; ! len -= subtag_len; ! } else { ! return 0; ! } ! } ! } else { ! printf("Bad tag: %s (%02x%02x%02x%02x)\n",tag,(unsigned char)tag[0],(unsigned char)tag[1], ! (unsigned char)tag[2],(unsigned char)tag[3]); ! exit(EXIT_FAILURE); ! return 0; ! } ! } *************** *** 298,302 **** if(!decode_tag(fout,uncompressed,0,uncompressed_size)) { ! printf("Foo! All screwed up!\n"); } fclose(fout); --- 324,328 ---- if(!decode_tag(fout,uncompressed,0,uncompressed_size)) { ! printf("Foo! All screwed up!\n"); } fclose(fout); *************** *** 310,323 **** current=buffer; while(read(fd,&inchar,1) == 1) { ! switch(inchar) { ! case '\r': ! break; ! case '\n': ! *current='\0'; ! return 0; ! default: ! *current++ = inchar; ! break; ! } } --- 336,349 ---- current=buffer; while(read(fd,&inchar,1) == 1) { ! switch(inchar) { ! case '\r': ! break; ! case '\n': ! *current='\0'; ! return 0; ! default: ! *current++ = inchar; ! break; ! } } *************** *** 353,498 **** while((option=getopt(argc, argv, "d")) != -1) { ! switch(option) { ! case 'd': ! dmap=1; ! break; ! default: ! usage(); ! break; ! } } if(optind == argc) { ! usage(); } fd=open(argv[optind],O_RDONLY); if(fd == -1) { ! perror("open"); ! exit(EXIT_FAILURE); } if(dmap) { ! out=fdopen(STDOUT_FILENO,"w"); ! uncompressed_size=lseek(fd,0,SEEK_END); ! lseek(fd,0,SEEK_SET); ! uncompressed=(char*)malloc(uncompressed_size); ! read(fd,uncompressed,uncompressed_size); ! decode_tag(out,uncompressed,0,uncompressed_size); ! exit(EXIT_SUCCESS); } while(!done) { ! /* read in the headers */ ! is_compressed=0; ! printf("Reading headers for conv %d\n",conversation); ! while(1) { ! if(readline(fd,buffer)) { ! done=1; ! break; ! } ! ! printf("got %s\n",buffer); ! ! if(!strlen(buffer)) ! break; ! ! if(strncasecmp(buffer,"Content-Encoding:",17) == 0) { ! loc=buffer+17; ! while(*loc==' ') { ! loc++; ! } ! ! if(strncasecmp(loc,"gzip",4) == 0) { ! is_compressed=1; ! } ! } ! ! if(strncasecmp(buffer,"Content-Length:",15) == 0) { ! compressed_size=atol((char*)&buffer[15]); ! printf("Size of conv %d is %d\n",conversation,compressed_size); ! } ! } ! ! if(done) ! break; ! printf("Headers complete for conversation %d\n",conversation); ! printf("Flow %s compressed\n",is_compressed ? "IS" : "IS NOT"); ! ! uncompressed_size = 10 * compressed_size; ! ! compressed=(char*)malloc(compressed_size); ! uncompressed=(char*)malloc(uncompressed_size); ! ! if((!compressed) || (!uncompressed)) { ! perror("malloc"); ! exit(EXIT_FAILURE); ! } ! ! if(read(fd,compressed,compressed_size) != compressed_size) { ! perror("read"); ! exit(EXIT_FAILURE); ! } ! ! /* dump the compressed data */ ! sprintf(file,"compressed.%d",conversation); ! out_fd=open(file,O_CREAT | O_RDWR,0666); ! if(out_fd == -1) { ! perror("open"); ! exit(EXIT_FAILURE); ! } ! ! write(out_fd,compressed,compressed_size); ! close(out_fd); ! ! if(is_compressed) { ! sprintf(file,"/sw/bin/zcat compressed.%d",conversation); ! stream=popen(file,"r"); ! if(!stream) { ! perror("popen"); ! exit(EXIT_FAILURE); ! } ! ! ! err=fread(uncompressed,1,uncompressed_size,stream); ! if(err == -1) { ! perror("fread"); ! exit(EXIT_FAILURE); ! } ! ! if(err == uncompressed_size) { ! printf("Error: buffer too small\n"); ! exit(EXIT_FAILURE); ! } ! ! uncompressed_size = err; ! pclose(stream); ! } else { ! uncompressed_size=compressed_size; ! memcpy(uncompressed,compressed,compressed_size); ! } ! /* dump the uncompressed data */ ! sprintf(file,"uncompressed.%d",conversation); ! out_fd=open(file,O_CREAT | O_RDWR,0666); ! if(out_fd == -1) { ! perror("open"); ! exit(EXIT_FAILURE); ! } ! write(out_fd,uncompressed,uncompressed_size); ! close(out_fd); ! printf("Uncompressed size: %d\n",uncompressed_size); ! /* now decode and print */ ! decode_dmap(conversation, uncompressed, uncompressed_size); ! ! free(compressed); ! free(uncompressed); ! conversation++; } --- 379,524 ---- while((option=getopt(argc, argv, "d")) != -1) { ! switch(option) { ! case 'd': ! dmap=1; ! break; ! default: ! usage(); ! break; ! } } if(optind == argc) { ! usage(); } fd=open(argv[optind],O_RDONLY); if(fd == -1) { ! perror("open"); ! exit(EXIT_FAILURE); } if(dmap) { ! out=fdopen(STDOUT_FILENO,"w"); ! uncompressed_size=lseek(fd,0,SEEK_END); ! lseek(fd,0,SEEK_SET); ! uncompressed=(char*)malloc(uncompressed_size); ! read(fd,uncompressed,uncompressed_size); ! decode_tag(out,uncompressed,0,uncompressed_size); ! exit(EXIT_SUCCESS); } while(!done) { ! /* read in the headers */ ! is_compressed=0; ! printf("Reading headers for conv %d\n",conversation); ! while(1) { ! if(readline(fd,buffer)) { ! done=1; ! break; ! } ! ! printf("got %s\n",buffer); ! ! if(!strlen(buffer)) ! break; ! ! if(strncasecmp(buffer,"Content-Encoding:",17) == 0) { ! loc=buffer+17; ! while(*loc==' ') { ! loc++; ! } ! ! if(strncasecmp(loc,"gzip",4) == 0) { ! is_compressed=1; ! } ! } ! ! if(strncasecmp(buffer,"Content-Length:",15) == 0) { ! compressed_size=atol((char*)&buffer[15]); ! printf("Size of conv %d is %d\n",conversation,compressed_size); ! } ! } ! ! if(done) ! break; ! printf("Headers complete for conversation %d\n",conversation); ! printf("Flow %s compressed\n",is_compressed ? "IS" : "IS NOT"); ! ! uncompressed_size = 10 * compressed_size; ! ! compressed=(char*)malloc(compressed_size); ! uncompressed=(char*)malloc(uncompressed_size); ! ! if((!compressed) || (!uncompressed)) { ! perror("malloc"); ! exit(EXIT_FAILURE); ! } ! ! if(read(fd,compressed,compressed_size) != compressed_size) { ! perror("read"); ! exit(EXIT_FAILURE); ! } ! ! /* dump the compressed data */ ! sprintf(file,"compressed.%d",conversation); ! out_fd=open(file,O_CREAT | O_RDWR,0666); ! if(out_fd == -1) { ! perror("open"); ! exit(EXIT_FAILURE); ! } ! ! write(out_fd,compressed,compressed_size); ! close(out_fd); ! ! if(is_compressed) { ! sprintf(file,"/sw/bin/zcat compressed.%d",conversation); ! stream=popen(file,"r"); ! if(!stream) { ! perror("popen"); ! exit(EXIT_FAILURE); ! } ! ! ! err=fread(uncompressed,1,uncompressed_size,stream); ! if(err == -1) { ! perror("fread"); ! exit(EXIT_FAILURE); ! } ! ! if(err == uncompressed_size) { ! printf("Error: buffer too small\n"); ! exit(EXIT_FAILURE); ! } ! ! uncompressed_size = err; ! pclose(stream); ! } else { ! uncompressed_size=compressed_size; ! memcpy(uncompressed,compressed,compressed_size); ! } ! /* dump the uncompressed data */ ! sprintf(file,"uncompressed.%d",conversation); ! out_fd=open(file,O_CREAT | O_RDWR,0666); ! if(out_fd == -1) { ! perror("open"); ! exit(EXIT_FAILURE); ! } ! write(out_fd,uncompressed,uncompressed_size); ! close(out_fd); ! printf("Uncompressed size: %d\n",uncompressed_size); ! /* now decode and print */ ! decode_dmap(conversation, uncompressed, uncompressed_size); ! ! free(compressed); ! free(uncompressed); ! conversation++; } |