16968N/A--- gvfs-1.1.6/configure.ac.old 2009-02-17 12:51:28.708111000 +0800
16968N/A+++ gvfs-1.1.6/configure.ac 2009-02-17 12:51:51.196942000 +0800
16968N/A@@ -311,10 +311,10 @@
16968N/A CDDA_CFLAGS=
16968N/A
16968N/A if test "x$enable_cdda" != "xno" -a \( "x$msg_hal" = "xyes" -o "x$msg_gudev" = "xyes" \); then
16968N/A- PKG_CHECK_EXISTS(libcdio_paranoia >= 0.78.2, msg_cdda=yes)
16968N/A+ PKG_CHECK_EXISTS(hal >= $HAL_REQUIRED, msg_cdda=yes)
16968N/A
16968N/A if test "x$msg_cdda" = "xyes"; then
16968N/A- PKG_CHECK_MODULES(CDDA, libcdio_paranoia)
16968N/A+ PKG_CHECK_MODULES(CDDA, hal >= $HAL_REQUIRED)
16968N/A AC_DEFINE(HAVE_CDDA, 1, [Define to 1 if CDDA is going to be built])
16968N/A fi
16968N/A fi
16968N/A
16855N/Adiff -urN -x'*.rej' -x'*.orig' gvfs-1.3.2/daemon/cdda.mount.in ../SUNWgnome-gvfs-2.26.1.changed/gvfs-1.3.2/daemon/cdda.mount.in
16855N/A--- gvfs-1.3.2/daemon/cdda.mount.in 2009-05-01 20:50:01.000000000 +0100
16855N/A+++ ../SUNWgnome-gvfs-2.26.1.changed/gvfs-1.3.2/daemon/cdda.mount.in 2009-07-23 18:19:28.188809476 +0100
16793N/A@@ -1,4 +1,4 @@
16793N/A [Mount]
16793N/A Type=cdda
16793N/A Exec=@libexecdir@/gvfsd-cdda
16793N/A-AutoMount=false
16793N/A+AutoMount=true
16855N/Adiff -urN -x'*.rej' -x'*.orig' gvfs-1.3.2/daemon/gvfsbackendcdda.c ../SUNWgnome-gvfs-2.26.1.changed/gvfs-1.3.2/daemon/gvfsbackendcdda.c
16855N/A--- gvfs-1.3.2/daemon/gvfsbackendcdda.c 2009-07-08 18:08:27.000000000 +0100
16855N/A+++ ../SUNWgnome-gvfs-2.26.1.changed/gvfs-1.3.2/daemon/gvfsbackendcdda.c 2009-07-23 18:36:32.145085560 +0100
16855N/A@@ -54,9 +54,11 @@
13796N/A #include "gvfsjobqueryinfo.h"
13796N/A #include "gvfsjobenumerate.h"
12961N/A
13796N/A+#ifdef HAVE_CDIO
12961N/A #define DO_NOT_WANT_PARANOIA_COMPATIBILITY
12961N/A #include <cdio/paranoia.h>
15558N/A #include <cdio/cdio.h>
12961N/A+#endif
12961N/A
12961N/A /* TODO:
12961N/A *
16855N/A@@ -109,14 +111,18 @@
12961N/A guint64 size;
12961N/A
12961N/A char *device_path;
12961N/A+#ifdef HAVE_CDIO
12961N/A cdrom_drive_t *drive;
12961N/A+#endif
12961N/A int num_open_files;
12961N/A
15558N/A /* Metadata from CD-Text */
16793N/A char *album_title;
16793N/A char *album_artist;
16793N/A+ guint track_num;
16793N/A char *genre;
16793N/A GList *tracks; /* a GList of GVfsBackendCddaTrack */
16793N/A+
16793N/A };
16793N/A
16793N/A G_DEFINE_TYPE (GVfsBackendCdda, g_vfs_backend_cdda, G_VFS_TYPE_BACKEND)
16855N/A@@ -127,11 +133,13 @@
12961N/A g_free (cdda_backend->device_path);
12961N/A cdda_backend->device_path = NULL;
12961N/A
12961N/A+#ifdef HAVE_CDIO
12961N/A if (cdda_backend->drive != NULL)
12961N/A {
12961N/A cdio_cddap_close (cdda_backend->drive);
12961N/A cdda_backend->drive = NULL;
12961N/A }
12961N/A+#endif
12961N/A }
12961N/A
15558N/A /* Metadata related functions */
16855N/A@@ -157,10 +165,73 @@
16793N/A g_list_free (cdda_backend->tracks);
16793N/A cdda_backend->tracks = NULL;
16793N/A }
16793N/A+static boolean_t
16793N/A+cdda2wav_read_toc (GVfsBackendCdda *cdda_backend)
16793N/A+{
16793N/A+ gchar *command;
16793N/A+ char buf[BUFSIZ];
16793N/A+ guint leadout;
16793N/A+ int track_num;
16793N/A+ uint_t i;
16793N/A+ FILE *f;
16793N/A+
16793N/A+ /* Open the connection to cdda2wav */
16793N/A+ gchar* device_path = g_strdup_printf("/dev/rdsk/%s", cdda_backend->device_path + strlen("/dev/dsk/"));
16793N/A+ command = g_strdup_printf (
16793N/A+ "/usr/bin/cdda2wav -q dev=%s --info-only -vtoc --no-infofile --gui 2>&1",
16793N/A+ device_path);
16793N/A+ f = popen (command, "r");
16793N/A+ g_free (command);
16793N/A+ if (f == NULL)
16793N/A+ return (FALSE);
16793N/A+
16793N/A+ track_num = 0;
16793N/A+ leadout = 0;
16793N/A+
16793N/A+ i = 0;
16793N/A+ /* the line looks like
16793N/A+ T01: 0 3:48.47 audio linear copydenied stereo title '' from ''
16793N/A+ */
16793N/A+
16793N/A+ while (fgets (buf, BUFSIZ, f) != NULL) {
16793N/A+ char *endptr;
16793N/A+ g_strchomp (buf);
16793N/A+ if ((strlen (buf) > 12) &&
16793N/A+ g_strrstr(buf, "audio") != NULL &&
16793N/A+ (buf[0] == 'T') &&
16793N/A+ (g_ascii_isdigit(buf[1])) &&
16793N/A+ (g_ascii_isdigit(buf[2])) &&
16793N/A+ (buf[3] == ':')) {
16793N/A+
16793N/A+ i++;
16793N/A+ track_num = buf[2] - '0' + (buf[1] - '0') * 10;
16793N/A+ gchar** temp_str = g_strsplit(g_strchug(buf + 12),":",10);
16793N/A+ guint min = (guint) (g_ascii_strtod(temp_str[0],&endptr));
16793N/A+ guint second = (guint) (g_ascii_strtod(g_strndup(temp_str[1],2),&endptr));
16793N/A+
16793N/A+ GVfsBackendCddaTrack *track;
16793N/A+ track = g_new0 (GVfsBackendCddaTrack, 1);
16793N/A+ track->title = g_strdup_printf("No %d Track", i);
16793N/A+ track->duration = min * 60 + second;
16793N/A+ cdda_backend->tracks = g_list_append (cdda_backend->tracks, track);
16793N/A+
16793N/A+ }
16793N/A+
16793N/A+ }
16793N/A+ track_num = i;
16793N/A+ pclose (f);
16793N/A+
16793N/A+ cdda_backend->track_num = track_num;
16793N/A+ g_free (device_path);
16793N/A+
16793N/A+ return (TRUE);
16793N/A+}
16793N/A+
16793N/A
16059N/A static void
16059N/A fetch_metadata (GVfsBackendCdda *cdda_backend)
16059N/A {
16059N/A+#ifdef HAVE_CDIO
16059N/A CdIo *cdio;
16059N/A track_t cdtrack, last_cdtrack;
16059N/A const cdtext_t *cdtext;
16855N/A@@ -193,6 +264,10 @@
16059N/A }
16059N/A
16059N/A cdio_destroy (cdio);
16793N/A+#else
16855N/A+ /* get CD tracks information using cdda2wav command */
16855N/A+ cdda2wav_read_toc(cdda_backend);
16059N/A+#endif
16059N/A }
16059N/A
16855N/A #ifdef HAVE_GUDEV
16855N/A@@ -398,7 +473,11 @@
12961N/A return;
12961N/A }
12961N/A
12961N/A+#ifdef __sun
16968N/A+ cdda_backend->device_path = g_strdup_printf ("/dev/dsk/%s", host);
12961N/A+#else
12961N/A cdda_backend->device_path = g_strdup_printf ("/dev/%s", host);
12961N/A+#endif
12961N/A
16855N/A #ifdef HAVE_GUDEV
16855N/A gudev_device = g_udev_client_query_by_device_file (cdda_backend->gudev_client, cdda_backend->device_path);
16855N/A@@ -410,6 +489,7 @@
12961N/A find_udi_for_device (cdda_backend);
16855N/A #endif
12961N/A
12961N/A+#ifdef HAVE_CDIO
12961N/A cdda_backend->drive = cdio_cddap_identify (cdda_backend->device_path, 0, NULL);
12961N/A if (cdda_backend->drive == NULL)
12961N/A {
16855N/A@@ -435,6 +515,24 @@
12961N/A return;
12961N/A }
16350N/A
16350N/A+#else
16350N/A+ //to prevent gvfs-mount cdda://1 to create a disc icon here
16350N/A+ if (cdda_backend->hal_udi== NULL)
16350N/A+ {
16350N/A+ g_set_error (&error, G_IO_ERROR, G_IO_ERROR_FAILED,
16350N/A+ _("Cannot find drive %s"), cdda_backend->device_path);
16350N/A+ g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
16350N/A+ g_error_free (error);
16350N/A+ release_device (cdda_backend);
16350N/A+ release_metadata (cdda_backend);
16350N/A+ return;
16350N/A+ }
16793N/A+
16793N/A+ fetch_metadata (cdda_backend);
16793N/A+
16350N/A+
12961N/A+#endif
16350N/A+
12961N/A /* Translator: %s is the device the disc is inserted into */
12961N/A fuse_name = g_strdup_printf (_("cdda mount on %s"), host);
16350N/A display_name = g_strdup_printf (_("Audio Disc"));
16855N/A@@ -535,7 +633,9 @@
12961N/A }
12961N/A
12961N/A typedef struct {
12961N/A+#ifdef HAVE_CDIO
12961N/A cdrom_paranoia_t *paranoia;
12961N/A+#endif
12961N/A
12961N/A long size; /* size of file being read */
12961N/A long header_size; /* size of the header */
16855N/A@@ -553,15 +653,19 @@
12961N/A * is to avoid seeking back if fewer bytes than whole sector is requested.
12961N/A */
12961N/A long buf_at_sector_num; /* the sector that is cached */
12961N/A+#ifdef HAVE_CDIO
12961N/A char buf_at_sector[CDIO_CD_FRAMESIZE_RAW]; /* the data of the sector */
12961N/A+#endif
12961N/A
12961N/A } ReadHandle;
12961N/A
12961N/A static void
12961N/A free_read_handle (ReadHandle *read_handle)
12961N/A {
12961N/A+#ifdef HAVE_CDIO
12961N/A if (read_handle->paranoia != NULL)
12961N/A cdio_paranoia_free (read_handle->paranoia);
12961N/A+#endif
12961N/A g_free (read_handle->header);
12961N/A g_free (read_handle);
12961N/A }
16855N/A@@ -595,7 +699,11 @@
12961N/A /* TODO: fill in from metadata */
12961N/A artist = NULL;
12961N/A title = NULL;
12961N/A+#ifdef HAVE_CDIO
12961N/A software = "gvfs-cdda using libcdio " CDIO_VERSION;
12961N/A+#else
12961N/A+ software = "gvfs-cdda not using libcdio ";
12961N/A+#endif
12961N/A
12961N/A artist_len = 0;
12961N/A title_len = 0;
16855N/A@@ -698,20 +806,25 @@
12961N/A return;
12961N/A }
12961N/A
12961N/A-
12961N/A+#ifdef HAVE_CDIO
12961N/A read_handle->first_sector = cdio_cddap_track_firstsector (cdda_backend->drive, track_num);
12961N/A read_handle->last_sector = cdio_cddap_track_lastsector (cdda_backend->drive, track_num);
12961N/A+#endif
12961N/A read_handle->sector_cursor = -1;
12961N/A
12961N/A read_handle->cursor = 0;
12961N/A read_handle->buf_at_sector_num = -1;
12961N/A+#ifdef HAVE_CDIO
12961N/A read_handle->content_size = ((read_handle->last_sector - read_handle->first_sector) + 1) * CDIO_CD_FRAMESIZE_RAW;
12961N/A+#endif
12961N/A
12961N/A read_handle->header = create_header (cdda_backend, &(read_handle->header_size), read_handle->content_size);
12961N/A read_handle->size = read_handle->header_size + read_handle->content_size;
12961N/A
12961N/A+#ifdef HAVE_CDIO
12961N/A read_handle->paranoia = cdio_paranoia_init (cdda_backend->drive);
12961N/A cdio_paranoia_modeset (read_handle->paranoia, PARANOIA_MODE_DISABLE);
12961N/A+#endif
12961N/A
12961N/A cdda_backend->num_open_files++;
12961N/A
16855N/A@@ -721,10 +834,12 @@
12961N/A }
12961N/A
12961N/A /* We have to pass in a callback to paranoia_read, even though we don't use it */
12961N/A+#ifdef HAVE_CDIO
12961N/A static void
12961N/A paranoia_callback (long int inpos, paranoia_cb_mode_t function)
12961N/A {
12961N/A }
12961N/A+#endif
12961N/A
12961N/A
12961N/A static void
16855N/A@@ -765,16 +880,20 @@
12961N/A
12961N/A cursor_in_stream = read_handle->cursor - read_handle->header_size;
12961N/A
12961N/A+#ifdef HAVE_CDIO
12961N/A desired_sector = cursor_in_stream / CDIO_CD_FRAMESIZE_RAW + read_handle->first_sector;
12961N/A+#endif
12961N/A
12961N/A if (desired_sector == read_handle->buf_at_sector_num)
12961N/A {
12961N/A /* got it cached */
12961N/A
12961N/A /* skip some bytes */
12961N/A+#ifdef HAVE_CDIO
12961N/A skip_bytes = cursor_in_stream - (desired_sector - read_handle->first_sector) * CDIO_CD_FRAMESIZE_RAW;
12961N/A readbuf = read_handle->buf_at_sector + skip_bytes;
12961N/A bytes_read = CDIO_CD_FRAMESIZE_RAW - skip_bytes;
12961N/A+#endif
12961N/A
12961N/A //g_warning ("read from cache for cursor @ %ld", read_handle->buf_at_sector_num);
12961N/A }
16855N/A@@ -783,16 +902,20 @@
12961N/A /* first check that we're at the right sector */
12961N/A if (desired_sector != read_handle->sector_cursor)
12961N/A {
12961N/A+#ifdef HAVE_CDIO
12961N/A cdio_paranoia_seek (read_handle->paranoia, desired_sector, SEEK_SET);
12961N/A+#endif
12961N/A read_handle->sector_cursor = desired_sector;
12961N/A //g_warning ("seeking cursor to %ld", read_handle->sector_cursor);
12961N/A }
12961N/A
12961N/A /* skip some bytes */
12961N/A+#ifdef HAVE_CDIO
12961N/A skip_bytes = cursor_in_stream - (read_handle->sector_cursor - read_handle->first_sector) * CDIO_CD_FRAMESIZE_RAW;
12961N/A //g_warning ("advanced cursor to %ld", read_handle->sector_cursor);
12961N/A
12961N/A readbuf = (char *) cdio_paranoia_read (read_handle->paranoia, paranoia_callback);
12961N/A+#endif
12961N/A
12961N/A if (readbuf == NULL)
12961N/A {
16855N/A@@ -806,12 +929,14 @@
12961N/A }
12961N/A
12961N/A read_handle->buf_at_sector_num = read_handle->sector_cursor;
12961N/A+#ifdef HAVE_CDIO
12961N/A memcpy (read_handle->buf_at_sector, readbuf, CDIO_CD_FRAMESIZE_RAW);
12961N/A
12961N/A read_handle->sector_cursor++;
12961N/A
12961N/A readbuf += skip_bytes;
12961N/A bytes_read = CDIO_CD_FRAMESIZE_RAW - skip_bytes;
12961N/A+#endif
12961N/A
12961N/A
12961N/A }
16855N/A@@ -904,9 +1029,11 @@
12961N/A GIcon *icon;
15558N/A GVfsBackendCddaTrack *track;
12961N/A
12961N/A+#ifdef HAVE_CDIO
12961N/A first = cdio_cddap_track_firstsector (cdda_backend->drive, track_num);
12961N/A last = cdio_cddap_track_lastsector (cdda_backend->drive, track_num);
12961N/A content_size = (last - first + 1) * CDIO_CD_FRAMESIZE_RAW;
12961N/A+#endif
12961N/A
12961N/A header = create_header (cdda_backend, &header_size, content_size);
12961N/A g_free (header);
16855N/A@@ -954,6 +1081,7 @@
16793N/A
16793N/A //g_warning ("get_file_info (%s)", filename);
16793N/A
16793N/A+
16793N/A if (strcmp (filename, "/") == 0)
16793N/A {
16793N/A GIcon *icon;
16855N/A@@ -981,19 +1109,23 @@
12961N/A return;
12961N/A }
12961N/A
12961N/A+#ifdef HAVE_CDIO
12961N/A if (track_num > cdda_backend->drive->tracks)
12961N/A {
12961N/A error = g_error_new (G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("File doesn't exist"));
12961N/A g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
12961N/A return;
12961N/A }
12961N/A+#endif
12961N/A
12961N/A+#ifdef HAVE_CDIO
12961N/A if (! cdio_cddap_track_audiop (cdda_backend->drive, track_num))
12961N/A {
12961N/A error = g_error_new (G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("The file does not exist or isn't an audio track"));
12961N/A g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
12961N/A return;
12961N/A }
12961N/A+#endif
12961N/A
12961N/A set_info_for_track (cdda_backend, info, track_num);
12961N/A }
16855N/A@@ -1017,6 +1149,7 @@
12961N/A //g_warning ("enumerate (%s)", filename);
12961N/A
12961N/A l = NULL;
12961N/A+#ifdef HAVE_CDIO
12961N/A for (n = 1; n <= cdda_backend->drive->tracks; n++)
12961N/A {
12961N/A char *name;
16855N/A@@ -1036,6 +1169,20 @@
12961N/A
12961N/A l = g_list_append (l, info);
12961N/A }
16793N/A+#else
16793N/A+ for (n = 1; n <= cdda_backend->track_num; n++)
16793N/A+ {
16793N/A+ char *name;
16793N/A+
16793N/A+ info = g_file_info_new ();
16793N/A+ name = g_strdup_printf ("Track %d.wav", n);
16793N/A+ g_file_info_set_name (info, name);
16793N/A+ g_file_info_set_display_name (info, name);
16793N/A+ g_free (name);
16793N/A+ set_info_for_track (cdda_backend, info, n);
16793N/A+ l = g_list_append (l, info);
16793N/A+ }
12961N/A+#endif
12961N/A
12961N/A g_vfs_job_succeeded (G_VFS_JOB (job));
16350N/A