[Rhythmbox-devel] [Weekly Report] Week 4: Rhythmbox iPod/MTP Syncing

This last week I have been working on the Syncing function for the iPod. I am using the iPod plugin as a way to prototype the syncing function before moving the appropriate code up to the RBMediaPlayerSource, and into the MTP plugin.

The big victory for me last week was to get the GKeyFile saving data for the different iPods. In order to associate the preferences (auto-sync, sync podcasts?, what to sync, etc...) with the device, the plugin saves a GKeyFile ipod-prefs.conf. The file is not created/loaded until it is needed. In the file there is a group for each iPod, which stores all it's properties, and a list of playlists selected for syncing. In order to parse this file and pass it nicely between the plugin and each RBiPodSource, a new GObject was needed, RBiPodPrefs. When a new RBiPodSource is being constructed the plugin will pass it a pointer to the plugin's keyfile. The RBiPodPrefs is created in RBiPodSourcePrivate->prefs, and if/when the prefs are accessed RBiPodPrefs loads/saves the file as needed. There was a bit of debugging to do with this, (functions which return errors, calling other sub-functions which return errors), and so I was learning about GError objects. To have a unique device identifier, I got the rb_ipod_helpers_get_serial() function working, so now the identifier in the GKeyFile is the serial number for the device. Last week, I also started on the hashing stuff, for comparison between the itinerary (what is to be synced) and the ipod database. I created two functions for the hash table (a hashing one, and a comparison one). The hashing one does a g_str_hash ( Title + Artist + Duration + Album ), where the plus signs are appending. The plan for comparison between the databases is to have two GHashTables, one populated from the itinerary, and one from the iPod, that we can compare between and figure out what needs addition and what needs removal.

A few entries from my work log:
   : wrote hashing and equality functions.
- The equality function simply calls a hash on both, then compares that - The hashing function has a comment which could be added to increase specificity for podcasts if needed. : Added rb-ipod-prefs.h and rb-ipod-prefs.c, to help passing preferences between the rb-ipod-source and the rb-ipod-plugin : Worked on rb-ipod-prefs. got it being used by RBiPodSource and RBIpodPlugin, and building.
   : Fixed rb-ipod-prefs
       - Ignores it if it can't find the file.
       - File will be created at first save.
: Fixed the rb_ipod_helpers_get_serial() function, now queries Hal for parent_udi->storage.serial

This coming week I will be continuing work on the syncing mechanisms, focusing on populating the GHashTables. I have already got the ipod_sync_hash populated from ipod_db->entry_map. However, I am a bit stuck on how to populate the itinerary_sync_hash. It will get a list of playlist names from the GKeyFile, and has a pointer to the RhythmDB for the library (passed via the 'shell' object). However, I am not sure how to get from the playlist names, to a list of the entries in that playlist. The current method is something similar to:
#    // Get all the names of the playlists
# rb_playlist_manager_get_playlist_names ((RBPlaylistManager *) rb_shell_get_playlist_manager (shell),
#                        &playlists,
#                        NULL);
#    // for each entry in the GKeyFile
# for ( iter = (const gchar **) rb_ipod_prefs_get_entries( ipod_priv->prefs );
#          *iter != NULL;
#          iter++ )
#    {
#        // get playlist with matching name.
# for (playlist_iter = (const gchar **) playlists; playlist_iter != NULL; playlist_iter++ ) {
#            if ( playlist_iter == iter  ) {
# // Get it's RBPlaylistSourcePrivate so we can get at it's entries. # pl_priv = PLAYLIST_SOURCE_GET_PRIVATE ((RBPlaylistSource *) _get_playlist_by_name ((RBPlaylistManager *) rb_shell_get_playlist_manager (shell), playlist_iter)); # // Insert the entres for this playlist into the itinerary_sync_hash # g_hash_table_foreach ( pl_priv->entries, rb_ipod_helpers_hash_table_insert, itinerary_sync_hash );
#                break;
#            }
#        }
#    }

Obviously, the above will not quite work. If anyone has any advice on how to do this in a better way I would *really* appreciate it.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]