/* open the file, do stuff necessary to go to PAUSED state */ static gboolean gst_gnome_vfs_src_start (GstBaseSrc * basesrc) { GnomeVFSResult res; GstGnomeVFSSrc *src; src = GST_GNOME_VFS_SRC (basesrc); gst_gnome_vfs_src_push_callbacks (src); if (src->uri != NULL) { GnomeVFSOpenMode mode = GNOME_VFS_OPEN_READ; /* this can block... */ res = gnome_vfs_open_uri (&src->handle, src->uri, mode); if (res != GNOME_VFS_OK) goto open_failed; src->own_handle = TRUE; } else if (!src->handle) { goto no_filename; } else { src->own_handle = FALSE; } if (gnome_vfs_seek (src->handle, GNOME_VFS_SEEK_CURRENT, 0) == GNOME_VFS_OK) { src->seekable = TRUE; } else { src->seekable = FALSE; } return TRUE; /* ERRORS */ open_failed: { gchar *filename = gnome_vfs_uri_to_string (src->uri, GNOME_VFS_URI_HIDE_PASSWORD); gst_gnome_vfs_src_pop_callbacks (src); if (res == GNOME_VFS_ERROR_NOT_FOUND || res == GNOME_VFS_ERROR_HOST_NOT_FOUND || res == GNOME_VFS_ERROR_SERVICE_NOT_AVAILABLE) { GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, (NULL), ("Could not open vfs file \"%s\" for reading: %s (%d)", filename, gnome_vfs_result_to_string (res), res)); } else { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), ("Could not open vfs file \"%s\" for reading: %s (%d)", filename, gnome_vfs_result_to_string (res), res)); } g_free (filename); return FALSE; } no_filename: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), ("No filename given")); return FALSE; } }
static gboolean gst_gnome_vfs_src_stop (GstBaseSrc * basesrc) { GstGnomeVFSSrc *src; src = GST_GNOME_VFS_SRC (basesrc); gst_gnome_vfs_src_pop_callbacks (src); if (src->own_handle) { GnomeVFSResult res; res = gnome_vfs_close (src->handle); if (res != GNOME_VFS_OK) { GST_ELEMENT_ERROR (src, RESOURCE, CLOSE, (NULL), ("Could not close vfs handle: %s", gnome_vfs_result_to_string (res))); } src->handle = NULL; } src->curoffset = 0; src->interrupted = FALSE; gnome_vfs_context_free (src->context); src->context = NULL; return TRUE; }