guint64 rb_media_player_source_get_free_space (RBMediaPlayerSource *source) { RBMediaPlayerSourceClass *klass = RB_MEDIA_PLAYER_SOURCE_GET_CLASS (source); return klass->get_free_space (source); }
guint64 rb_media_player_source_get_capacity (RBMediaPlayerSource *source) { RBMediaPlayerSourceClass *klass = RB_MEDIA_PLAYER_SOURCE_GET_CLASS (source); return klass->impl_get_capacity (source); }
/** * rb_media_player_source_get_entries: * @source: the #RBMediaPlayerSource * @category: the sync category name * @map: (element-type utf8 RB.RhythmDBEntry): map to hold the entries */ void rb_media_player_source_get_entries (RBMediaPlayerSource *source, const char *category, GHashTable *map) { RBMediaPlayerSourceClass *klass = RB_MEDIA_PLAYER_SOURCE_GET_CLASS (source); klass->get_entries (source, category, map); }
/** * rb_media_player_source_delete_entries: * @source: the #RBMediaPlayerSource * @entries: (element-type RB.RhythmDBEntry) (transfer full): list of entries to delete * @callback: callback to call on completion * @data: (closure) (scope notified): data for callback * @destroy_data: callback to free the callback data */ void rb_media_player_source_delete_entries (RBMediaPlayerSource *source, GList *entries, RBMediaPlayerSourceDeleteCallback callback, gpointer data, GDestroyNotify destroy_data) { RBMediaPlayerSourceClass *klass = RB_MEDIA_PLAYER_SOURCE_GET_CLASS (source); klass->delete_entries (source, entries, callback, data, destroy_data); }
static void sync_playlists (RBMediaPlayerSource *source) { RBMediaPlayerSourcePrivate *priv = MEDIA_PLAYER_SOURCE_GET_PRIVATE (source); RBMediaPlayerSourceClass *klass = RB_MEDIA_PLAYER_SOURCE_GET_CLASS (source); RBPlaylistManager *playlist_manager; RBShell *shell; GHashTable *device; GList *all_playlists; GList *l; if (klass->add_playlist == NULL || klass->remove_playlists == NULL) { rb_debug ("source class doesn't support playlists"); return; } /* build an updated device contents map, so we can find the device entries * corresponding to the entries in the local playlists. */ device = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)rhythmdb_entry_unref); rb_media_player_source_get_entries (source, SYNC_CATEGORY_MUSIC, device); /* remove all playlists from the device, then add the synced playlists. */ klass->remove_playlists (source); /* get all local playlists */ g_object_get (source, "shell", &shell, NULL); g_object_get (shell, "playlist-manager", &playlist_manager, NULL); all_playlists = rb_playlist_manager_get_playlists (playlist_manager); g_object_unref (playlist_manager); g_object_unref (shell); for (l = all_playlists; l != NULL; l = l->next) { char *name; RBSource *playlist_source = RB_SOURCE (l->data); RhythmDBQueryModel *model; GList *tracks = NULL; GtkTreeIter iter; /* is this playlist selected for syncing? */ g_object_get (playlist_source, "name", &name, NULL); if (rb_sync_settings_sync_group (priv->sync_settings, SYNC_CATEGORY_MUSIC, name) == FALSE) { rb_debug ("not syncing playlist %s", name); g_free (name); continue; } /* match playlist entries to entries on the device */ g_object_get (playlist_source, "base-query-model", &model, NULL); if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter) == FALSE) { rb_debug ("not syncing empty playlist %s", name); g_free (name); g_object_unref (model); continue; } do { char *trackid; RhythmDBEntry *entry; RhythmDBEntry *device_entry; entry = rhythmdb_query_model_iter_to_entry (model, &iter); trackid = rb_sync_state_make_track_uuid (entry); device_entry = g_hash_table_lookup (device, trackid); if (device_entry != NULL) { tracks = g_list_prepend (tracks, device_entry); } else { rb_debug ("unable to find entry on device for track %s (id %s)", rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION), trackid); } g_free (trackid); } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter)); tracks = g_list_reverse (tracks); /* transfer the playlist to the device */ rb_debug ("syncing playlist %s", name); klass->add_playlist (source, name, tracks); g_free (name); g_list_free (tracks); g_object_unref (model); } g_hash_table_destroy (device); }
void rb_media_player_source_show_properties (RBMediaPlayerSource *source) { RBMediaPlayerSourcePrivate *priv = MEDIA_PLAYER_SOURCE_GET_PRIVATE (source); RBMediaPlayerSourceClass *klass = RB_MEDIA_PLAYER_SOURCE_GET_CLASS (source); GtkBuilder *builder; GtkContainer *container; const char *ui_file; char *name; char *text; if (priv->properties_dialog != NULL) { gtk_window_present (GTK_WINDOW (priv->properties_dialog)); return; } /* load dialog UI */ ui_file = rb_file ("media-player-properties.ui"); if (ui_file == NULL) { g_warning ("Couldn't find media-player-properties.ui"); return; } builder = rb_builder_load (ui_file, NULL); if (builder == NULL) { g_warning ("Couldn't load media-player-properties.ui"); return; } priv->properties_dialog = GTK_DIALOG (gtk_builder_get_object (builder, "media-player-properties")); g_object_ref (priv->properties_dialog); g_signal_connect_object (priv->properties_dialog, "response", G_CALLBACK (properties_dialog_response_cb), source, 0); g_object_get (source, "name", &name, NULL); text = g_strdup_printf (_("%s Properties"), name); gtk_window_set_title (GTK_WINDOW (priv->properties_dialog), text); g_free (text); g_free (name); /* ensure device usage information is available and up to date */ update_sync (source); /* * fill in some common details: * - volume usage (need to hook up signals etc. to update this live) */ rb_sync_state_ui_create_bar (&priv->volume_usage, rb_media_player_source_get_capacity (source), NULL); rb_sync_state_ui_update_volume_usage (&priv->volume_usage, priv->sync_state); gtk_widget_show_all (priv->volume_usage.widget); container = GTK_CONTAINER (gtk_builder_get_object (builder, "device-usage-container")); gtk_container_add (container, priv->volume_usage.widget); /* let the subclass fill in device type specific details (model names, device names, * .. battery levels?) and add more tabs to the notebook to display 'advanced' stuff. */ if (klass->show_properties) { klass->show_properties (source, GTK_WIDGET (gtk_builder_get_object (builder, "device-info-box")), GTK_WIDGET (gtk_builder_get_object (builder, "media-player-notebook"))); } /* create sync UI */ container = GTK_CONTAINER (gtk_builder_get_object (builder, "sync-settings-ui-container")); gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (container), rb_sync_settings_ui_new (source, priv->sync_settings)); container = GTK_CONTAINER (gtk_builder_get_object (builder, "sync-state-ui-container")); gtk_box_pack_start (GTK_BOX (container), rb_sync_state_ui_new (priv->sync_state), TRUE, TRUE, 0); gtk_widget_show_all (GTK_WIDGET (container)); /* create encoding settings UI */ if (priv->encoding_settings) { container = GTK_CONTAINER (gtk_builder_get_object (builder, "encoding-settings-container")); gtk_container_add (container, rb_encoding_settings_new (priv->encoding_settings, priv->encoding_target, TRUE)); gtk_widget_show_all (GTK_WIDGET (container)); } else { container = GTK_CONTAINER (gtk_builder_get_object (builder, "encoding-settings-frame")); gtk_widget_hide (GTK_WIDGET (container)); gtk_widget_set_no_show_all (GTK_WIDGET (container), TRUE); } gtk_widget_show (GTK_WIDGET (priv->properties_dialog)); g_object_unref (builder); }