|
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.
|