From: Louis A. <net...@gm...> - 2009-11-29 20:33:55
|
Hi all, actually after reading this, my conclusion is, if I'm going to use svn-code, I better fix it myself... but for Christophe who's git-commit I downloaded it might be of interest... and hello to everyone, this is my second post, first message follows :) Actually I have another question, is FireWireGuid the first 16 bytes of the iPhone's UDID? Yours, Louis ---- Hi all, I'm a newbie to the list, I've been trying to get libgpod to run on the jailbroken iPhone device itself, well actually I've succeeded in doing that minus the gdk-pixbuf, first with the 0.7.2 build that apparently doesn't have support for the sqlite3 format (yeah, what a waste of time that was...), and then downloading a git-commit from http://gitorious.org/~teuf/libgpod/teuf-sandbox/commits/iphone30 ... Anyway, I've got so far as building the sqlite files, but apparently it fails when trying to build Locations.itdb.cbk ... The function calls are: mk_Locations_cbk -> itdb_hash72_compute_hash_for_sha1 --> read_hash_info The function read_hash_info then tries to read the file (mountpoint)/iTunes_Control/Device/HashInfo ... a file is supposed to be generated by: write_hash_info() which is only called by: itdb_hash72_extract_hash_info() which is only ever called by: itdb_parse_internal() which is called by either itdb_parse or itdb_parse_file() Or in reverse: itdb_parse -> itdb_parse_internal --> itdb_hash72_extract_hash_info ---> write_hash_info Now itdb_hash72_extract_hash_info has this line: if (itdb_device_get_checksum_type (device) != ITDB_CHECKSUM_HASH72) { return FALSE } which stops the function from continuing if it thinks the required device checksum algorithm is other than hash72. But to determine the checksum type, itdb_device_get_checksum_type needs either sysinfo_extended or a valid ipod_info from itdb->device. itdb_parse creates a new Itdb_iTunesDB (via itdb_new()), which in turns calls itdb_device_new(), which calls itdb_device_reset_sysinfo, which seems to do nothing more than initiate a new hash table. itdb_parse -> itdb_new --------- generates new Itdb_iTunesDB itdb --> itdb_device_new ---- sets itdb->device ---> itdb_device_reset_sysinfo ---- sets itdb->device->extended_sysinfo to an empty hash table -> itdb_parse_internal --> itdb_hash72_extract_hash_info --- always end at return FALSE above ---> write_hash_info --- never gets called. So the HashInfo file never gets created, and mk_Locations_cbk will always fail. Or am I not seeing something? |
From: Christophe F. <te...@gn...> - 2009-11-29 20:56:57
|
Hey, Didn't get the message you quote in that one, not sure why. Basically, the HashInfo file is indeed generated when the database is parsed (itdb_parse) if needed. And to know the checksum type, we need to know the iPod model somehow, this is either done thanks to a ModelNumStr entry in Device/SysInfo (deprecated) or by parsing a SysInfoExtended file in Device/ (itdb_device_read_sysinfo calls itdb_device_read_sysinfo_extended). I think this is the part you missed during your investigation. The Itdb_Device::sysinfo hash is deprecated at this point. In short, I think all you are missing is a SysInfoExtended file on your iTouch. You can get it using tools/ipod-read-sysinfo-extended. Hope that helps, Christophe |
From: Louis A. <net...@gm...> - 2009-11-30 04:15:30
|
Hi Christophe, thanks for the quick response. Actually I wrote the top part right after I wrote the bottom one, never sending the bottom one, that's why you never saw the 1st email. Well, the conclusion is, I managed to insert a song into the device Database. The iPod app crashed the 1st time around, with syslog saying: Nov 30 04:25:03 iphone MobileMusicPlayer[494]: *** Terminating app due to uncaught exception 'ML3QuerySQLError', reason: 'SELECT COUNT(item_artist.ROWID), item_artist.sort_name_section FROM item_artist WHERE ((item_artist.has_song = ?) AND (item_artist.name_blank = ?)) GROUP BY item_artist.sort_name_section ORDER BY item_artist.sort_name_section: no such table: item_artist' And on the 2nd launch it said "Updating Database" (or something similar) during which the Library.itdb grew, in the end it launched, and the song I've been trying to insert was listed. Success! But if you care, here's how I got there (actually this is mostly for me documenting my stupid hack for next time): I had started with tests/itdb_main.c and that one uses a itdb_parse_file(), which doesn't set the mountpoint, so it doesn't read the sysinfo, etc, etc.. I realized after your email that itdb_parse() asks for a mountpoint, and it calls itdb_set_mountpoint, which in turn calls the itdb_device_read_sysinfo. Unfortunately trying to compile on Linux with libiphone (from Ubuntu 9.10, probably not the latest and greatest) failed, besides if I want to make everything run on the device itself I can't depend on a library that talks to the USB device... so I looked for an example SysInfoExtended and made my own (containing only FireWireGUID and DBVersion in the beginning). It still did not want to work the first time I tried it... as we recall: itdb_parse -> itdb_parse_internal --> itdb_hash72_extract_hash_info ---> itdb_device_get_checksum_type ----> itdb_sysinfo_properties_get_db_version Strangely it still fails for me here. Anyway, I guess the sysinfo/sysinfo_extended never got initialized correctly. Better look into it tomorrow. Maybe it needs ModelNumStr? After a bit of delving into ARM assembly and gdb, I changed one register so itdb_device_get_checksum_type() returns ITDB_CHECKSUM_HASH72, it generated the HashInfo file, and the checksum was calculated correctly! So far I've been refusing to modify libgpod itself, which is a bit foolish, because it would have been easier than what I just did tonight. But the compilation to make a library that works on the iPhone needs a bit of manual work. In conclusion... I guess I really should modify the library so that it doesn't depend on the SysInfoExtended file which doesn't seem to originally exist on iPhones, to make installation on a user device easier. Because it'll be running on the device itself, it has access to some internal functions that gets the serial number, like [UIDevice uniqueIdentifier] and probably an OS version number, using this class: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIDevice_Class/Reference/UIDevice.html Well, that certainly wasn't worth your time reading it was it. -Louis On Sun, Nov 29, 2009 at 9:56 PM, Christophe Fergeau <te...@gn...> wrote: > Hey, > > Didn't get the message you quote in that one, not sure why. Basically, > the HashInfo file is indeed generated when the database is parsed > (itdb_parse) if needed. And to know the checksum type, we need to know > the iPod model somehow, this is either done thanks to a ModelNumStr > entry in Device/SysInfo (deprecated) or by parsing a SysInfoExtended > file in Device/ (itdb_device_read_sysinfo calls > itdb_device_read_sysinfo_extended). I think this is the part you > missed during your investigation. The Itdb_Device::sysinfo hash is > deprecated at this point. > > In short, I think all you are missing is a SysInfoExtended file on > your iTouch. You can get it using tools/ipod-read-sysinfo-extended. > > Hope that helps, > > Christophe > |
From: Christophe F. <te...@gn...> - 2009-11-30 10:02:42
|
2009/11/30 Louis Adiputra <net...@gm...>: > In conclusion... I guess I really should modify the library so that > it doesn't depend on the SysInfoExtended file which doesn't seem to > originally exist on iPhones, to make installation on a user device > easier. Because it'll be running on the device itself, it has access > to some internal functions that gets the serial number, like [UIDevice > uniqueIdentifier] and probably an OS version number, using this class: > http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIDevice_Class/Reference/UIDevice.html > > Well, that certainly wasn't worth your time reading it was it. Nope, your use case was interesting :) Though with 3.x firmwares, Apple provides an API to access the phone music database so maybe you don't need to fight with libgpod? SysInfoExtended on the iphone can be found in /System/Library/Lockdown/Checkpoint.xml (on jailbroken devices), dunno if in your usecase you can get access to it. fwiw, I'd like itdb_parse_file to die but it's still in use by gtkpod. And the Itdb_Device struct will probably need some rework at some point. Thanks for the thorough explanations of what you are trying to achieve :) Christophe |