/******************************************************** * check if a device is Apple device *******************************************************/ static int check_device(int fd, struct usb_device_descriptor *desc) { int ret; ret = read(fd, desc, sizeof (*desc)); if (ret < 0) { INFO("Failed to read device descriptor!\n"); return 0; } debug_device_info(desc); if (desc->idVendor == VENDOR_ID_APPLE) return 1; return 0; }
static void get_device_info (RBGenericPlayerSource *source) { RBGenericPlayerSourcePrivate *priv = GENERIC_PLAYER_SOURCE_GET_PRIVATE (source); GMount *mount; GFile *is_audio_player; GError *error = NULL; #ifdef HAVE_HAL LibHalContext *ctx; #endif g_object_get (source, "mount", &mount, NULL); #ifdef HAVE_HAL ctx = get_hal_context (); if (ctx != NULL) { char *udi; udi = get_hal_udi_for_player (ctx, mount); if (udi != NULL) { DBusError error; char *prop; char **proplist; int value; /* get audio folders */ dbus_error_init (&error); proplist = libhal_device_get_property_strlist (ctx, udi, "portable_audio_player.audio_folders", &error); if (proplist) { if (!dbus_error_is_set (&error)) { priv->audio_folders = g_strdupv (proplist); } libhal_free_string_array (proplist); } free_dbus_error ("getting audio folder list", &error); /* get supported mime-types */ dbus_error_init (&error); proplist = libhal_device_get_property_strlist (ctx, udi, "portable_audio_player.output_formats", &error); if (proplist) { if (!dbus_error_is_set (&error)) { priv->output_mime_types = g_strdupv (proplist); } libhal_free_string_array (proplist); } free_dbus_error ("getting supported mime-type list", &error); /* get playlist format */ dbus_error_init (&error); proplist = libhal_device_get_property_strlist (ctx, udi, "portable_audio_player.playlist_format", &error); if (proplist) { if (!dbus_error_is_set (&error)) { set_playlist_formats (source, proplist); } libhal_free_string_array (proplist); } free_dbus_error ("getting playlist format", &error); /* get playlist path - in current hal-info packages, this is sometimes a string * and sometimes a strlist, so try both. * http://bugs.freedesktop.org/show_bug.cgi?id=19961 */ dbus_error_init (&error); proplist = libhal_device_get_property_strlist (ctx, udi, "portable_audio_player.playlist_path", &error); if (proplist && !dbus_error_is_set (&error)) { set_playlist_path (source, proplist[0]); libhal_free_string_array (proplist); } free_dbus_error ("getting playlist path (strlist)", &error); dbus_error_init (&error); prop = libhal_device_get_property_string (ctx, udi, "portable_audio_player.playlist_path", &error); if (prop && !dbus_error_is_set (&error)) { set_playlist_path (source, prop); libhal_free_string (prop); } free_dbus_error ("getting playlist path (string)", &error); /* get max folder depth */ dbus_error_init (&error); value = libhal_device_get_property_int (ctx, udi, "portable_audio_player.folder_depth", &error); if (!dbus_error_is_set (&error)) { priv->folder_depth = value; } free_dbus_error ("getting max folder depth", &error); debug_device_info (source, mount, "HAL"); } else { rb_debug ("no player info available (HAL doesn't recognise it as a player"); } g_free (udi); } cleanup_hal_context (ctx); #endif /* allow HAL info to be overridden with .is_audio_player file */ is_audio_player = get_is_audio_player_file (mount); if (is_audio_player != NULL) { char *data = NULL; gsize data_size = 0; rb_debug ("reading .is_audio_player file"); g_file_load_contents (is_audio_player, NULL, &data, &data_size, NULL, &error); if (error != NULL) { /* can we sensibly report this anywhere? */ rb_debug ("error reading .is_audio_player file: %s", error->message); g_clear_error (&error); } else { GKeyFile *keyfile; GError *error = NULL; char *munged; gsize munged_size; const char *fake_group = "[x-rb-data]\n"; char *group; /* prepend a group name to the file contents */ munged_size = data_size + strlen (fake_group); munged = g_malloc0 (munged_size + 1); strcpy (munged, fake_group); memcpy (munged + strlen (fake_group), data, data_size); keyfile = g_key_file_new (); g_key_file_set_list_separator (keyfile, ','); if (g_key_file_load_from_data (keyfile, munged, munged_size, G_KEY_FILE_NONE, &error) == FALSE) { /* and this */ rb_debug ("error loading .is_audio_player file: %s", error->message); g_error_free (error); } else { char *value; char **list; group = g_key_file_get_start_group (keyfile); list = g_key_file_get_string_list (keyfile, group, "audio_folders", NULL, NULL); if (list != NULL) { g_strfreev (priv->audio_folders); priv->audio_folders = list; } list = g_key_file_get_string_list (keyfile, group, "output_formats", NULL, NULL); if (list != NULL) { g_strfreev (priv->output_mime_types); priv->output_mime_types = list; } list = g_key_file_get_string_list (keyfile, group, "playlist_format", NULL, NULL); if (list != NULL) { set_playlist_formats (source, list); g_strfreev (list); } value = g_key_file_get_string (keyfile, group, "playlist_path", NULL); if (value != NULL) { set_playlist_path (source, value); g_free (value); } if (g_key_file_has_key (keyfile, group, "folder_depth", NULL)) { priv->folder_depth = g_key_file_get_integer (keyfile, group, "folder_depth", NULL); } g_free (group); } g_key_file_free (keyfile); g_free (munged); debug_device_info (source, mount, ".is_audio_player file"); } g_free (data); g_object_unref (is_audio_player); } else { rb_debug ("no .is_audio_player file found on this device"); } g_object_unref (mount); }