Esempio n. 1
0
static GnomeVFSResult
do_tell (GnomeVFSMethod *method,
	 GnomeVFSMethodHandle *method_handle,
	 GnomeVFSFileSize *offset_return)
{
	PERFORM_OPERATION_NO_URI (tell, gnome_vfs_tell ((GnomeVFSHandle *) method_handle, offset_return));
}
static GstFlowReturn
gst_gnome_vfs_sink_render (GstBaseSink * basesink, GstBuffer * buf)
{
    GnomeVFSFileSize written, cur_pos;
    GstGnomeVFSSink *sink;
    GnomeVFSResult result;
    GstFlowReturn ret;

    sink = GST_GNOME_VFS_SINK (basesink);

    if (gnome_vfs_tell (sink->handle, &cur_pos) == GNOME_VFS_OK) {
        /* bring up to date with current position for proper reporting */
        sink->current_pos = cur_pos;
    }

    result = gnome_vfs_write (sink->handle, GST_BUFFER_DATA (buf),
                              GST_BUFFER_SIZE (buf), &written);

    switch (result) {
    case GNOME_VFS_OK: {
        GST_DEBUG_OBJECT (sink, "wrote %" G_GINT64_FORMAT " bytes at %"
                          G_GINT64_FORMAT, (gint64) written, (gint64) cur_pos);

        if (written < GST_BUFFER_SIZE (buf)) {
            /* FIXME: what to do here? (tpm) */
            g_warning ("%s: %d bytes should be written, only %"
                       G_GUINT64_FORMAT " bytes written", G_STRLOC,
                       GST_BUFFER_SIZE (buf), written);
        }

        sink->current_pos += GST_BUFFER_SIZE (buf);
        ret = GST_FLOW_OK;
        break;
    }
    case GNOME_VFS_ERROR_NO_SPACE: {
        /* TODO: emit signal/send msg on out-of-diskspace and
         * handle this gracefully (see open bug) (tpm) */
        GST_ELEMENT_ERROR (sink, RESOURCE, NO_SPACE_LEFT, (NULL),
                           ("bufsize=%u, written=%u", GST_BUFFER_SIZE (buf), (guint) written));
        ret = GST_FLOW_ERROR;
        break;
    }
    default: {
        gchar *filename = gnome_vfs_uri_to_string (sink->uri,
                          GNOME_VFS_URI_HIDE_PASSWORD);

        GST_ELEMENT_ERROR (sink, RESOURCE, WRITE,
                           (_("Error while writing to file \"%s\"."), filename),
                           ("%s, bufsize=%u, written=%u", gnome_vfs_result_to_string (result),
                            GST_BUFFER_SIZE (buf), (guint) written));

        g_free (filename);
        ret = GST_FLOW_ERROR;
        break;
    }
    }

    return GST_FLOW_OK;
}