From: <ny...@us...> - 2007-10-06 01:17:50
|
Revision: 422 http://pmplib.svn.sourceforge.net/pmplib/?rev=422&view=rev Author: nyaochi Date: 2007-10-05 18:17:54 -0700 (Fri, 05 Oct 2007) Log Message: ----------- Obtain serial IDs from iPod device information. We don't have to query USB serial directly to the USB port driver. Modified Paths: -------------- trunk/pmplib/lib/pmp_ipod/ipod.c trunk/pmplib/lib/pmp_ipod/ipod.h trunk/pmplib/lib/pmp_ipod/itunesdb.c trunk/pmplib/lib/pmp_ipod/itunesdb.h trunk/pmplib/lib/pmp_ipod/pmp_ipod.c trunk/pmplib/lib/pmp_ipod/pmp_ipod.vcproj Modified: trunk/pmplib/lib/pmp_ipod/ipod.c =================================================================== --- trunk/pmplib/lib/pmp_ipod/ipod.c 2007-10-05 17:13:21 UTC (rev 421) +++ trunk/pmplib/lib/pmp_ipod/ipod.c 2007-10-06 01:17:54 UTC (rev 422) @@ -40,7 +40,6 @@ #include "util.h" #include "ipod.h" #include "ipodprop.h" -#include "ipodserial.h" #include "chunk.h" #include "itunesdb.h" #include "artworkdb.h" @@ -94,6 +93,14 @@ return IPODE_DEVICEINFO; } +static uint8_t get_uint8(const char *str, int begin) +{ + char value[] = {'0','x','0','0',0}; + value[2] = str[begin]; + value[3] = str[begin+1]; + return (uint8_t)strtoul(value, NULL, 16); +} + static int detect_model( const ucs2char_t* path_to_device, const ipod_descriptor_t* md, @@ -164,20 +171,50 @@ } } -int ipod_init(ipod_t* ipod) +int ipod_init(ipod_t* ipod, const ucs2char_t* path_to_device) { + int i; + ipodprop_t ip; + char *path = ucs2dupmbs(path_to_device); + + memset(ipod, 0, sizeof(*ipod)); + + /* Obtain the device information. */ + ipodprop_init(&ip); + if (ipodprop_get(path, &ip) == 0) { + if (ip.vendor && strncmp(ip.vendor, "Apple", 5) == 0 && + ip.product && strncmp(ip.product, "iPod", 4) == 0) { + + char serial[128]; + + if (ip.info) { + ipod->xml = strdup(ip.info); + + get_string_value(ip.info, "FireWireGUID", (char*)serial, sizeof(serial)); + for (i = 0;i < 8;++i) { + ipod->serial[i] = get_uint8(serial, 2*i); + } + } + } + } + ipodprop_finish(&ip); + ucs2free(path); + ipod->itunesdb = (itunes_chunk_t*)calloc(1, sizeof(itunes_chunk_t)); if (!ipod->itunesdb) { return IPODE_OUTOFMEMORY; } + ipod->artworkdb = (itunes_chunk_t*)calloc(1, sizeof(itunes_chunk_t)); if (!ipod->artworkdb) { return IPODE_OUTOFMEMORY; } + ipod->pcs = (playcounts_t*)calloc(1, sizeof(playcounts_t)); if (!ipod->pcs) { return IPODE_OUTOFMEMORY; } + return 0; } @@ -188,6 +225,7 @@ itunesdb_finish(artworkdb_cds, ipod->artworkdb); free(ipod->pcs); free(ipod->itunesdb); + free(ipod->xml); } int ipod_read(ipod_t* ipod, const ucs2char_t* itunesdb, const ucs2char_t* artworkdb, const ucs2char_t* playcounts) @@ -284,7 +322,7 @@ fp = ucs2fopen(itunesdb, "wb"); if (fp) { /* Finalize the database (fill the hash58 value). */ - itunesdb_finalize(sio.base, sio.offset); + itunesdb_finalize(sio.base, sio.offset, ipod->serial); if (fwrite(sio.base, 1, sio.offset, fp) != sio.offset) { return (IPODC_ITUNESDB|IPODE_FILEWRITEERROR); Modified: trunk/pmplib/lib/pmp_ipod/ipod.h =================================================================== --- trunk/pmplib/lib/pmp_ipod/ipod.h 2007-10-05 17:13:21 UTC (rev 421) +++ trunk/pmplib/lib/pmp_ipod/ipod.h 2007-10-06 01:17:54 UTC (rev 422) @@ -53,13 +53,14 @@ itunes_chunk_t* itunesdb; itunes_chunk_t* artworkdb; playcounts_t* pcs; + char *xml; uint8_t serial[8]; } ipod_t; const ipod_descriptor_t* ipod_detect(const ucs2char_t* path_to_device, const char *id, pmp_device_information_t* ptr_info); const ipod_descriptor_t* ipod_next_descriptor(const ipod_descriptor_t* md); -int ipod_init(ipod_t* ipod); +int ipod_init(ipod_t* ipod, const ucs2char_t* path_to_device); void ipod_finish(ipod_t* ipod); int ipod_read(ipod_t* ipod, const ucs2char_t* itunesdb, const ucs2char_t* artworkdb, const ucs2char_t* playcounts); int ipod_write(ipod_t* ipod, const ucs2char_t* itunesdb, const ucs2char_t* artworkdb, const ucs2char_t* playcounts); Modified: trunk/pmplib/lib/pmp_ipod/itunesdb.c =================================================================== --- trunk/pmplib/lib/pmp_ipod/itunesdb.c 2007-10-05 17:13:21 UTC (rev 421) +++ trunk/pmplib/lib/pmp_ipod/itunesdb.c 2007-10-06 01:17:54 UTC (rev 422) @@ -822,13 +822,10 @@ -int itunesdb_finalize(uint8_t* buffer, size_t size) +int itunesdb_finalize(uint8_t* buffer, size_t size, uint8_t fwid[8]) { uint8_t* src = NULL; uint8_t hash58[20]; - uint8_t fwid[8] = { - 0x00, 0x0A, 0x27, 0x00, 0x1A, 0x1D, 0x72, 0xF1 - }; /* iPod nano 3rd gen only for now. */ src = (uint8_t*)malloc(size); if (src == NULL) { Modified: trunk/pmplib/lib/pmp_ipod/itunesdb.h =================================================================== --- trunk/pmplib/lib/pmp_ipod/itunesdb.h 2007-10-05 17:13:21 UTC (rev 421) +++ trunk/pmplib/lib/pmp_ipod/itunesdb.h 2007-10-06 01:17:54 UTC (rev 422) @@ -311,7 +311,7 @@ */ int itunesdb_set_mhod_playlist_order(itunes_chunk_t* chunk, uint32_t order); -int itunesdb_finalize(uint8_t* buffer, size_t size); +int itunesdb_finalize(uint8_t* buffer, size_t size, uint8_t fwid[8]); int itunesdb_mhod_init(itunes_chunk_t* chunk, const char *name); int itunesdb_is_mhodchunk(itunes_chunk_t* chunk, const char *type); Modified: trunk/pmplib/lib/pmp_ipod/pmp_ipod.c =================================================================== --- trunk/pmplib/lib/pmp_ipod/pmp_ipod.c 2007-10-05 17:13:21 UTC (rev 421) +++ trunk/pmplib/lib/pmp_ipod/pmp_ipod.c 2007-10-06 01:17:54 UTC (rev 422) @@ -341,7 +341,7 @@ ucs2char_t itunesdb[MAX_PATH], artworkdb[MAX_PATH], playcounts[MAX_PATH]; // Initialize ipod library. - ipod_init(&ipod); + ipod_init(&ipod, pmp->info.path_to_root); // Read the music database. set_filenames(itunesdb, artworkdb, playcounts, music->pmp); @@ -403,7 +403,7 @@ ucs2char_t itunesdb[MAX_PATH], artworkdb[MAX_PATH], playcounts[MAX_PATH]; // Initialize ipod library. - ipod_init(&ipod); + ipod_init(&ipod, pmp->info.path_to_root); // Read the music database. set_filenames(itunesdb, artworkdb, playcounts, music->pmp); @@ -454,10 +454,11 @@ { ipod_t ipod; result_t ret = 0; + pmp_t* pmp = music->pmp; ucs2char_t itunesdb[MAX_PATH], artworkdb[MAX_PATH], playcounts[MAX_PATH]; // Initialize IP3DB. - ipod_init(&ipod); + ipod_init(&ipod, pmp->info.path_to_root); // Read the music database. set_filenames(itunesdb, artworkdb, playcounts, music->pmp); Modified: trunk/pmplib/lib/pmp_ipod/pmp_ipod.vcproj =================================================================== --- trunk/pmplib/lib/pmp_ipod/pmp_ipod.vcproj 2007-10-05 17:13:21 UTC (rev 421) +++ trunk/pmplib/lib/pmp_ipod/pmp_ipod.vcproj 2007-10-06 01:17:54 UTC (rev 422) @@ -195,10 +195,6 @@ > </File> <File - RelativePath=".\ipodserial_win32.c" - > - </File> - <File RelativePath=".\itunesdb.c" > </File> @@ -245,14 +241,6 @@ > </File> <File - RelativePath=".\ipodprop.h" - > - </File> - <File - RelativePath=".\ipodserial.h" - > - </File> - <File RelativePath=".\itunesdb.h" > </File> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |