[brasero: 17/18] 2009-05-04 Philippe Rouquier <bonfire-app wanadoo fr>



commit 495f8c2d757c3962233fb52daadcf41b541a76b5
Author: Philippe Rouquier <bonfire-app wanadoo fr>
Date:   Mon May 4 19:59:59 2009 +0200

    2009-05-04  Philippe Rouquier  <bonfire-app wanadoo fr>
    
    	Added a new track type fot stream type
    	and slightly modify the image one by adding virtual functions
---
 ChangeLog                                  |   15 ++
 libbrasero-burn/Makefile.am                |    5 +-
 libbrasero-burn/brasero-track-image-cfg.c  |   22 ++-
 libbrasero-burn/brasero-track-image.c      |   70 +++++++--
 libbrasero-burn/brasero-track-image.h      |   10 +-
 libbrasero-burn/brasero-track-stream-cfg.c |  246 ++++++++++++++++++++++++++++
 libbrasero-burn/brasero-track-stream-cfg.h |   64 +++++++
 libbrasero-burn/brasero-track-stream.c     |   95 +++++++++--
 libbrasero-burn/brasero-track-stream.h     |   12 ++
 9 files changed, 496 insertions(+), 43 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 5c59679..4504c5e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2009-05-04  Philippe Rouquier  <bonfire-app wanadoo fr>
+
+	Added a new track type fot stream type
+	and slightly modify the image one by adding virtual functions
+
+	* libbrasero-burn/brasero-track-stream-cfg.c
+	(brasero_video_project_result_cb),
+	(brasero_track_stream_cfg_get_info),
+	(brasero_track_stream_cfg_set_source),
+	(brasero_track_stream_cfg_get_status),
+	(brasero_track_stream_cfg_init),
+	(brasero_track_stream_cfg_finalize),
+	(brasero_track_stream_cfg_class_init):
+	* libbrasero-burn/brasero-track-stream-cfg.h:
+
 2009-04-23  Philippe Rouquier  <bonfire-app wanadoo fr>
 
 	A few fixes for libunique recent patch (problems with building)
diff --git a/libbrasero-burn/Makefile.am b/libbrasero-burn/Makefile.am
index 32bfcfc..be7a0ba 100644
--- a/libbrasero-burn/Makefile.am
+++ b/libbrasero-burn/Makefile.am
@@ -42,6 +42,7 @@ libbraseroburninclude_HEADERS =					\
 	brasero-track-data-cfg.h				\
 	brasero-track-disc.h                 			\
 	brasero-track-stream.h                 			\
+	brasero-track-stream-cfg.h             			\
 	brasero-track-image.h					\
 	brasero-track-image-cfg.h				\
 	brasero-session.h                 			\
@@ -187,7 +188,9 @@ libbrasero_burn_la_SOURCES = 		\
 	brasero-track-data-cfg.c                 \
 	brasero-track-data-cfg.h                 \
 	brasero-filtered-uri.c                 \
-	brasero-filtered-uri.h
+	brasero-filtered-uri.h                 \
+	brasero-track-stream-cfg.c                 \
+	brasero-track-stream-cfg.h
 
 if BUILD_INOTIFY
 libbrasero_burn_la_SOURCES += brasero-file-monitor.c brasero-file-monitor.h
diff --git a/libbrasero-burn/brasero-track-image-cfg.c b/libbrasero-burn/brasero-track-image-cfg.c
index ae94e28..0688944 100644
--- a/libbrasero-burn/brasero-track-image-cfg.c
+++ b/libbrasero-burn/brasero-track-image-cfg.c
@@ -74,18 +74,18 @@ brasero_track_image_cfg_set_uri (BraseroTrackImageCfg *track,
 	switch (format) {
 	case BRASERO_IMAGE_FORMAT_NONE:
 	case BRASERO_IMAGE_FORMAT_BIN:
-		brasero_track_image_set_source (BRASERO_TRACK_IMAGE (track),
-						uri,
-						NULL,
-						format);
+		BRASERO_TRACK_IMAGE_CLASS (brasero_track_image_cfg_parent_class)->set_source (BRASERO_TRACK_IMAGE (track),
+											      uri,
+											      NULL,
+											      format);
 		break;
 	case BRASERO_IMAGE_FORMAT_CLONE:
 	case BRASERO_IMAGE_FORMAT_CUE:
 	case BRASERO_IMAGE_FORMAT_CDRDAO:
-		brasero_track_image_set_source (BRASERO_TRACK_IMAGE (track),
-						NULL,
-						uri,
-						format);
+		BRASERO_TRACK_IMAGE_CLASS (brasero_track_image_cfg_parent_class)->set_source (BRASERO_TRACK_IMAGE (track),
+											      NULL,
+											      uri,
+											      format);
 		break;
 
 	default:
@@ -124,7 +124,8 @@ brasero_track_image_cfg_get_info_cb (GObject *object,
 						 info->uri,
 						 info->format);
 
-	brasero_track_image_set_block_num (BRASERO_TRACK_IMAGE (object), info->blocks);
+	BRASERO_TRACK_IMAGE_CLASS (brasero_track_image_cfg_parent_class)->set_block_num (BRASERO_TRACK_IMAGE (object), info->blocks);
+	brasero_track_changed (BRASERO_TRACK (object));
 }
 
 static void
@@ -288,8 +289,9 @@ brasero_track_image_cfg_set_source (BraseroTrackImageCfg *track,
 
 	/* Update the image info container values. If it was invalid then */
 	/* NOTE: this resets the size as well */
-	brasero_track_image_set_block_num (BRASERO_TRACK_IMAGE (track), 0);
+	BRASERO_TRACK_IMAGE_CLASS (brasero_track_image_cfg_parent_class)->set_block_num (BRASERO_TRACK_IMAGE (track), 0);
 	brasero_track_image_cfg_set_uri (track, uri, priv->format);
+	brasero_track_changed (BRASERO_TRACK (track));
 
 	return BRASERO_BURN_OK;
 }
diff --git a/libbrasero-burn/brasero-track-image.c b/libbrasero-burn/brasero-track-image.c
index 5608aad..0d2182d 100644
--- a/libbrasero-burn/brasero-track-image.c
+++ b/libbrasero-burn/brasero-track-image.c
@@ -57,16 +57,14 @@ struct _BraseroTrackImagePrivate
 
 G_DEFINE_TYPE (BraseroTrackImage, brasero_track_image, BRASERO_TYPE_TRACK);
 
-BraseroBurnResult
-brasero_track_image_set_source (BraseroTrackImage *track,
-				const gchar *image,
-				const gchar *toc,
-				BraseroImageFormat format)
+static BraseroBurnResult
+brasero_track_image_set_source_real (BraseroTrackImage *track,
+				     const gchar *image,
+				     const gchar *toc,
+				     BraseroImageFormat format)
 {
 	BraseroTrackImagePrivate *priv;
 
-	g_return_val_if_fail (BRASERO_IS_TRACK_IMAGE (track), BRASERO_BURN_ERR);
-
 	priv = BRASERO_TRACK_IMAGE_PRIVATE (track);
 
 	priv->format = format;
@@ -80,26 +78,71 @@ brasero_track_image_set_source (BraseroTrackImage *track,
 	priv->image = g_strdup (image);
 	priv->toc = g_strdup (toc);
 
+	return BRASERO_BURN_OK;
+}
+
+BraseroBurnResult
+brasero_track_image_set_source (BraseroTrackImage *track,
+				const gchar *image,
+				const gchar *toc,
+				BraseroImageFormat format)
+{
+	BraseroTrackImagePrivate *priv;
+	BraseroTrackImageClass *klass;
+	BraseroBurnResult res;
+
+	g_return_val_if_fail (BRASERO_IS_TRACK_IMAGE (track), BRASERO_BURN_ERR);
+
+	/* See if it has changed */
+	priv = BRASERO_TRACK_IMAGE_PRIVATE (track);
+
+	klass = BRASERO_TRACK_IMAGE_GET_CLASS (track);
+	if (!klass->set_source)
+		return BRASERO_BURN_ERR;
+
+	res = klass->set_source (track, image, toc, format);
+	if (res != BRASERO_BURN_OK)
+		return res;
+
 	brasero_track_changed (BRASERO_TRACK (track));
+	return BRASERO_BURN_OK;
+}
+
+static BraseroBurnResult
+brasero_track_image_set_block_num_real (BraseroTrackImage *track,
+					goffset blocks)
+{
+	BraseroTrackImagePrivate *priv;
 
+	priv = BRASERO_TRACK_IMAGE_PRIVATE (track);
+	priv->blocks = blocks;
 	return BRASERO_BURN_OK;
 }
 
-void
+BraseroBurnResult
 brasero_track_image_set_block_num (BraseroTrackImage *track,
 				   goffset blocks)
 {
 	BraseroTrackImagePrivate *priv;
+	BraseroTrackImageClass *klass;
+	BraseroBurnResult res;
 
-	g_return_if_fail (BRASERO_IS_TRACK_IMAGE (track));
+	g_return_val_if_fail (BRASERO_IS_TRACK_IMAGE (track), BRASERO_BURN_ERR);
 
 	priv = BRASERO_TRACK_IMAGE_PRIVATE (track);
-
 	if (priv->blocks == blocks)
-		return;
+		return BRASERO_BURN_OK;
+
+	klass = BRASERO_TRACK_IMAGE_GET_CLASS (track);
+	if (!klass->set_block_num)
+		return BRASERO_BURN_ERR;
+
+	res = klass->set_block_num (track, blocks);
+	if (res != BRASERO_BURN_OK)
+		return res;
 
-	priv->blocks = blocks;
 	brasero_track_changed (BRASERO_TRACK (track));
+	return BRASERO_BURN_OK;
 }
 
 gchar *
@@ -261,6 +304,9 @@ brasero_track_image_class_init (BraseroTrackImageClass *klass)
 
 	track_class->get_size = brasero_track_image_get_size;
 	track_class->get_type = brasero_track_image_get_track_type;
+
+	klass->set_source = brasero_track_image_set_source_real;
+	klass->set_block_num = brasero_track_image_set_block_num_real;
 }
 
 BraseroTrackImage *
diff --git a/libbrasero-burn/brasero-track-image.h b/libbrasero-burn/brasero-track-image.h
index cc85acf..b24bc27 100644
--- a/libbrasero-burn/brasero-track-image.h
+++ b/libbrasero-burn/brasero-track-image.h
@@ -51,6 +51,14 @@ typedef struct _BraseroTrackImage BraseroTrackImage;
 struct _BraseroTrackImageClass
 {
 	BraseroTrackClass parent_class;
+
+	BraseroBurnResult	(*set_source)		(BraseroTrackImage *track,
+							 const gchar *image,
+							 const gchar *toc,
+							 BraseroImageFormat format);
+
+	BraseroBurnResult       (*set_block_num)	(BraseroTrackImage *track,
+							 goffset blocks);
 };
 
 struct _BraseroTrackImage
@@ -69,7 +77,7 @@ brasero_track_image_set_source (BraseroTrackImage *track,
 				const gchar *toc,
 				BraseroImageFormat format);
 
-void
+BraseroBurnResult
 brasero_track_image_set_block_num (BraseroTrackImage *track,
 				   goffset blocks);
 
diff --git a/libbrasero-burn/brasero-track-stream-cfg.c b/libbrasero-burn/brasero-track-stream-cfg.c
new file mode 100644
index 0000000..fab7516
--- /dev/null
+++ b/libbrasero-burn/brasero-track-stream-cfg.c
@@ -0,0 +1,246 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * Libbrasero-burn
+ * Copyright (C) Philippe Rouquier 2005-2009 <bonfire-app wanadoo fr>
+ *
+ * Libbrasero-burn is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * The Libbrasero-burn authors hereby grant permission for non-GPL compatible
+ * GStreamer plugins to be used and distributed together with GStreamer
+ * and Libbrasero-burn. This permission is above and beyond the permissions granted
+ * by the GPL license by which Libbrasero-burn is covered. If you modify this code
+ * you may extend this exception to your version of the code, but you are not
+ * obligated to do so. If you do not wish to do so, delete this exception
+ * statement from your version.
+ * 
+ * Libbrasero-burn is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Library General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to:
+ * 	The Free Software Foundation, Inc.,
+ * 	51 Franklin Street, Fifth Floor
+ * 	Boston, MA  02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <glib.h>
+#include <glib/gi18n-lib.h>
+#include <glib-object.h>
+
+#include "brasero-track-stream-cfg.h"
+#include "brasero-io.h"
+#include "brasero-tags.h"
+
+typedef struct _BraseroTrackStreamCfgPrivate BraseroTrackStreamCfgPrivate;
+struct _BraseroTrackStreamCfgPrivate
+{
+	BraseroIO *io;
+	BraseroIOJobBase *load_uri;
+
+	GError *error;
+
+	guint loading:1;
+};
+
+#define BRASERO_TRACK_STREAM_CFG_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_TRACK_STREAM_CFG, BraseroTrackStreamCfgPrivate))
+
+G_DEFINE_TYPE (BraseroTrackStreamCfg, brasero_track_stream_cfg, BRASERO_TYPE_TRACK_STREAM);
+
+
+static void
+brasero_video_project_result_cb (GObject *obj,
+				 GError *error,
+				 const gchar *uri,
+				 GFileInfo *info,
+				 gpointer user_data)
+{
+	guint64 len;
+	BraseroTrackStreamCfgPrivate *priv;
+
+	priv = BRASERO_TRACK_STREAM_CFG_PRIVATE (obj);
+	priv->loading = FALSE;
+
+	/* Check the return status for this file */
+	if (error) {
+		priv->error = g_error_copy (error);
+		brasero_track_changed (BRASERO_TRACK (obj));
+		return;
+	}
+
+	if (g_file_info_get_file_type (info) != G_FILE_TYPE_REGULAR
+	|| !g_file_info_get_attribute_boolean (info, BRASERO_IO_HAS_VIDEO)) {
+		priv->error = g_error_new (BRASERO_BURN_ERROR,
+					   BRASERO_BURN_ERR,
+					   _(" "));
+
+		brasero_track_changed (BRASERO_TRACK (obj));
+		return;
+	}
+
+	if (g_file_info_get_is_symlink (info)) {
+		gchar *sym_uri;
+
+		sym_uri = g_strconcat ("file://", g_file_info_get_symlink_target (info), NULL);
+		if (BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_source)
+			BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_source (BRASERO_TRACK_STREAM (obj), sym_uri);
+
+		g_free (sym_uri);
+	}
+
+	if (BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_format)
+		BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_format (BRASERO_TRACK_STREAM (obj),
+												(g_file_info_get_attribute_boolean (info, BRASERO_IO_HAS_VIDEO)?
+												 BRASERO_VIDEO_FORMAT_UNDEFINED:BRASERO_AUDIO_FORMAT_NONE)|
+												(g_file_info_get_attribute_boolean (info, BRASERO_IO_HAS_AUDIO)?
+												 BRASERO_AUDIO_FORMAT_UNDEFINED:BRASERO_AUDIO_FORMAT_NONE)|
+												BRASERO_METADATA_INFO);
+
+	/* size */
+	len = g_file_info_get_attribute_uint64 (info, BRASERO_IO_LEN);
+	if (BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_boundaries)
+		BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_boundaries (BRASERO_TRACK_STREAM (obj),
+												    0,
+												    len,
+												    0);
+					     
+	/* Get the song info */
+	if (g_file_info_get_attribute_string (info, BRASERO_IO_TITLE))
+		brasero_track_tag_add_string (BRASERO_TRACK (obj),
+					      BRASERO_TRACK_STREAM_TITLE_TAG,
+					      g_file_info_get_attribute_string (info, BRASERO_IO_TITLE));
+	if (g_file_info_get_attribute_string (info, BRASERO_IO_ARTIST))
+		brasero_track_tag_add_string (BRASERO_TRACK (obj),
+					      BRASERO_TRACK_STREAM_ARTIST_TAG,
+					      g_file_info_get_attribute_string (info, BRASERO_IO_ARTIST));
+	if (g_file_info_get_attribute_string (info, BRASERO_IO_COMPOSER))
+		brasero_track_tag_add_string (BRASERO_TRACK (obj),
+					      BRASERO_TRACK_STREAM_COMPOSER_TAG,
+					      g_file_info_get_attribute_string (info, BRASERO_IO_COMPOSER));
+	if (g_file_info_get_attribute_int32 (info, BRASERO_IO_ISRC))
+		brasero_track_tag_add_int (BRASERO_TRACK (obj),
+					   BRASERO_TRACK_STREAM_ISRC_TAG,
+					   g_file_info_get_attribute_int32 (info, BRASERO_IO_ISRC));
+
+	brasero_track_changed (BRASERO_TRACK (obj));
+}
+
+static void
+brasero_track_stream_cfg_get_info (BraseroTrackStreamCfg *track)
+{
+	BraseroTrackStreamCfgPrivate *priv;
+	gchar *uri;
+
+	priv = BRASERO_TRACK_STREAM_CFG_PRIVATE (track);
+
+	if (priv->error) {
+		g_error_free (priv->error);
+		priv->error = NULL;
+	}
+
+	/* get info async for the file */
+	if (!priv->io)
+		priv->io = brasero_io_get_default ();
+
+	if (!priv->load_uri)
+		priv->load_uri = brasero_io_register (G_OBJECT (track),
+						      brasero_video_project_result_cb,
+						      NULL,
+						      NULL);
+
+	priv->loading = TRUE;
+	uri = brasero_track_stream_get_source (BRASERO_TRACK_STREAM (track), TRUE);
+	brasero_io_get_file_info (priv->io,
+				  uri,
+				  priv->load_uri,
+				  BRASERO_IO_INFO_PERM|
+				  BRASERO_IO_INFO_MIME|
+				  BRASERO_IO_INFO_URGENT|
+				  BRASERO_IO_INFO_METADATA|
+				  BRASERO_IO_INFO_METADATA_MISSING_CODEC|
+				  BRASERO_IO_INFO_METADATA_THUMBNAIL,
+				  track);
+}
+
+static BraseroBurnResult
+brasero_track_stream_cfg_set_source (BraseroTrackStream *track,
+				     const gchar *uri)
+{
+	if (BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_source)
+		BRASERO_TRACK_STREAM_CLASS (brasero_track_stream_cfg_parent_class)->set_source (track, uri);
+
+	brasero_track_stream_cfg_get_info (BRASERO_TRACK_STREAM_CFG (track));
+	brasero_track_changed (BRASERO_TRACK (track));
+	return BRASERO_BURN_OK;
+}
+
+static BraseroBurnResult
+brasero_track_stream_cfg_get_status (BraseroTrack *track,
+				     BraseroStatus *status)
+{
+	BraseroTrackStreamCfgPrivate *priv;
+
+	priv = BRASERO_TRACK_STREAM_CFG_PRIVATE (track);
+
+	if (priv->error) {
+		brasero_status_set_error (status, g_error_copy (priv->error));
+		return BRASERO_BURN_ERR;
+	}
+
+	if (priv->loading) {
+		if (status)
+			brasero_status_set_not_ready (status,
+						      -1.0,
+						      _("Analysing video files"));
+
+		return BRASERO_BURN_NOT_READY;
+	}
+
+	if (status)
+		brasero_status_set_completed (status);
+
+	return BRASERO_BURN_OK;
+}
+
+static void
+brasero_track_stream_cfg_init (BraseroTrackStreamCfg *object)
+{ }
+
+static void
+brasero_track_stream_cfg_finalize (GObject *object)
+{
+	BraseroTrackStreamCfgPrivate *priv;
+
+	priv = BRASERO_TRACK_STREAM_CFG_PRIVATE (object);
+	if (priv->error) {
+		g_error_free (priv->error);
+		priv->error = NULL;
+	}
+
+	G_OBJECT_CLASS (brasero_track_stream_cfg_parent_class)->finalize (object);
+}
+
+static void
+brasero_track_stream_cfg_class_init (BraseroTrackStreamCfgClass *klass)
+{
+	GObjectClass* object_class = G_OBJECT_CLASS (klass);
+	BraseroTrackClass* track_class = BRASERO_TRACK_CLASS (klass);
+	BraseroTrackStreamClass *parent_class = BRASERO_TRACK_STREAM_CLASS (klass);
+
+	g_type_class_add_private (klass, sizeof (BraseroTrackStreamCfgPrivate));
+
+	object_class->finalize = brasero_track_stream_cfg_finalize;
+
+	track_class->get_status = brasero_track_stream_cfg_get_status;
+
+	parent_class->set_source = brasero_track_stream_cfg_set_source;
+}
+
diff --git a/libbrasero-burn/brasero-track-stream-cfg.h b/libbrasero-burn/brasero-track-stream-cfg.h
new file mode 100644
index 0000000..12f8dbb
--- /dev/null
+++ b/libbrasero-burn/brasero-track-stream-cfg.h
@@ -0,0 +1,64 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * Libbrasero-burn
+ * Copyright (C) Philippe Rouquier 2005-2009 <bonfire-app wanadoo fr>
+ *
+ * Libbrasero-burn is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * The Libbrasero-burn authors hereby grant permission for non-GPL compatible
+ * GStreamer plugins to be used and distributed together with GStreamer
+ * and Libbrasero-burn. This permission is above and beyond the permissions granted
+ * by the GPL license by which Libbrasero-burn is covered. If you modify this code
+ * you may extend this exception to your version of the code, but you are not
+ * obligated to do so. If you do not wish to do so, delete this exception
+ * statement from your version.
+ * 
+ * Libbrasero-burn is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Library General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to:
+ * 	The Free Software Foundation, Inc.,
+ * 	51 Franklin Street, Fifth Floor
+ * 	Boston, MA  02110-1301, USA.
+ */
+
+#ifndef _BRASERO_TRACK_STREAM_CFG_H_
+#define _BRASERO_TRACK_STREAM_CFG_H_
+
+#include <glib-object.h>
+
+#include <brasero-track-stream.h>
+
+G_BEGIN_DECLS
+
+#define BRASERO_TYPE_TRACK_STREAM_CFG             (brasero_track_stream_cfg_get_type ())
+#define BRASERO_TRACK_STREAM_CFG(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), BRASERO_TYPE_TRACK_STREAM_CFG, BraseroTrackStreamCfg))
+#define BRASERO_TRACK_STREAM_CFG_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), BRASERO_TYPE_TRACK_STREAM_CFG, BraseroTrackStreamCfgClass))
+#define BRASERO_IS_TRACK_STREAM_CFG(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BRASERO_TYPE_TRACK_STREAM_CFG))
+#define BRASERO_IS_TRACK_STREAM_CFG_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), BRASERO_TYPE_TRACK_STREAM_CFG))
+#define BRASERO_TRACK_STREAM_CFG_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), BRASERO_TYPE_TRACK_STREAM_CFG, BraseroTrackStreamCfgClass))
+
+typedef struct _BraseroTrackStreamCfgClass BraseroTrackStreamCfgClass;
+typedef struct _BraseroTrackStreamCfg BraseroTrackStreamCfg;
+
+struct _BraseroTrackStreamCfgClass
+{
+	BraseroTrackStreamClass parent_class;
+};
+
+struct _BraseroTrackStreamCfg
+{
+	BraseroTrackStream parent_instance;
+};
+
+GType brasero_track_stream_cfg_get_type (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* _BRASERO_TRACK_STREAM_CFG_H_ */
diff --git a/libbrasero-burn/brasero-track-stream.c b/libbrasero-burn/brasero-track-stream.c
index edf429d..4e3238d 100644
--- a/libbrasero-burn/brasero-track-stream.c
+++ b/libbrasero-burn/brasero-track-stream.c
@@ -56,22 +56,39 @@ struct _BraseroTrackStreamPrivate
 
 G_DEFINE_TYPE (BraseroTrackStream, brasero_track_stream, BRASERO_TYPE_TRACK);
 
-BraseroBurnResult
-brasero_track_stream_set_source (BraseroTrackStream *track,
-				 const gchar *uri)
+static BraseroBurnResult
+brasero_track_stream_set_source_real (BraseroTrackStream *track,
+				      const gchar *uri)
 {
 	BraseroTrackStreamPrivate *priv;
 
-	g_return_val_if_fail (BRASERO_IS_TRACK_STREAM (track), BRASERO_BURN_ERR);
-
 	priv = BRASERO_TRACK_STREAM_PRIVATE (track);
 
 	if (priv->uri)
 		g_free (priv->uri);
 
 	priv->uri = g_strdup (uri);
-	brasero_track_changed (BRASERO_TRACK (track));
+	return BRASERO_BURN_OK;
+}
+
+BraseroBurnResult
+brasero_track_stream_set_source (BraseroTrackStream *track,
+				 const gchar *uri)
+{
+	BraseroTrackStreamClass *klass;
+	BraseroBurnResult res;
+
+	g_return_val_if_fail (BRASERO_IS_TRACK_STREAM (track), BRASERO_BURN_ERR);
 
+	klass = BRASERO_TRACK_STREAM_GET_CLASS (track);
+	if (!klass->set_source)
+		return BRASERO_BURN_ERR;
+
+	res = klass->set_source (track, uri);
+	if (res != BRASERO_BURN_OK)
+		return res;
+
+	brasero_track_changed (BRASERO_TRACK (track));
 	return BRASERO_BURN_OK;
 }
 
@@ -87,35 +104,50 @@ brasero_track_stream_get_format (BraseroTrackStream *track)
 	return priv->format;
 }
 
-BraseroBurnResult
-brasero_track_stream_set_format (BraseroTrackStream *track,
-				 BraseroStreamFormat format)
+static BraseroBurnResult
+brasero_track_stream_set_format_real (BraseroTrackStream *track,
+				      BraseroStreamFormat format)
 {
 	BraseroTrackStreamPrivate *priv;
 
-	g_return_val_if_fail (BRASERO_IS_TRACK_STREAM (track), BRASERO_BURN_ERR);
-
 	priv = BRASERO_TRACK_STREAM_PRIVATE (track);
 
 	if (format == BRASERO_AUDIO_FORMAT_NONE)
 		BRASERO_BURN_LOG ("Setting a NONE audio format with a valid uri");
 
 	priv->format = format;
-	brasero_track_changed (BRASERO_TRACK (track));
-
 	return BRASERO_BURN_OK;
 }
 
 BraseroBurnResult
-brasero_track_stream_set_boundaries (BraseroTrackStream *track,
-				     guint64 start,
-				     guint64 end,
-				     guint64 gap)
+brasero_track_stream_set_format (BraseroTrackStream *track,
+				 BraseroStreamFormat format)
 {
-	BraseroTrackStreamPrivate *priv;
+	BraseroTrackStreamClass *klass;
+	BraseroBurnResult res;
 
 	g_return_val_if_fail (BRASERO_IS_TRACK_STREAM (track), BRASERO_BURN_ERR);
 
+	klass = BRASERO_TRACK_STREAM_GET_CLASS (track);
+	if (!klass->set_format)
+		return BRASERO_BURN_ERR;
+
+	res = klass->set_format (track, format);
+	if (res != BRASERO_BURN_OK)
+		return res;
+
+	brasero_track_changed (BRASERO_TRACK (track));
+	return BRASERO_BURN_OK;
+}
+
+static BraseroBurnResult
+brasero_track_stream_set_boundaries_real (BraseroTrackStream *track,
+					  guint64 start,
+					  guint64 end,
+					  guint64 gap)
+{
+	BraseroTrackStreamPrivate *priv;
+
 	priv = BRASERO_TRACK_STREAM_PRIVATE (track);
 
 	if (gap >= 0)
@@ -127,8 +159,29 @@ brasero_track_stream_set_boundaries (BraseroTrackStream *track,
 	if (start >= 0)
 		priv->start = start;
 
-	brasero_track_changed (BRASERO_TRACK (track));
+	return BRASERO_BURN_OK;
+}
+
+BraseroBurnResult
+brasero_track_stream_set_boundaries (BraseroTrackStream *track,
+				     guint64 start,
+				     guint64 end,
+				     guint64 gap)
+{
+	BraseroTrackStreamClass *klass;
+	BraseroBurnResult res;
 
+	g_return_val_if_fail (BRASERO_IS_TRACK_STREAM (track), BRASERO_BURN_ERR);
+
+	klass = BRASERO_TRACK_STREAM_GET_CLASS (track);
+	if (!klass->set_boundaries)
+		return BRASERO_BURN_ERR;
+
+	res = klass->set_boundaries (track, start, end, gap);
+	if (res != BRASERO_BURN_OK)
+		return res;
+
+	brasero_track_changed (BRASERO_TRACK (track));
 	return BRASERO_BURN_OK;
 }
 
@@ -288,6 +341,10 @@ brasero_track_stream_class_init (BraseroTrackStreamClass *klass)
 	track_class->get_size = brasero_track_stream_get_size;
 	track_class->get_status = brasero_track_stream_get_status;
 	track_class->get_type = brasero_track_stream_get_track_type;
+
+	klass->set_source = brasero_track_stream_set_source_real;
+	klass->set_format = brasero_track_stream_set_format_real;
+	klass->set_boundaries = brasero_track_stream_set_boundaries_real;
 }
 
 BraseroTrackStream *
diff --git a/libbrasero-burn/brasero-track-stream.h b/libbrasero-burn/brasero-track-stream.h
index 1a5a60c..e588737 100644
--- a/libbrasero-burn/brasero-track-stream.h
+++ b/libbrasero-burn/brasero-track-stream.h
@@ -51,6 +51,18 @@ typedef struct _BraseroTrackStream BraseroTrackStream;
 struct _BraseroTrackStreamClass
 {
 	BraseroTrackClass parent_class;
+
+	/* Virtual functions */
+	BraseroBurnResult       (*set_source)		(BraseroTrackStream *track,
+							 const gchar *uri);
+
+	BraseroBurnResult       (*set_format)		(BraseroTrackStream *track,
+							 BraseroStreamFormat format);
+
+	BraseroBurnResult       (*set_boundaries)       (BraseroTrackStream *track,
+							 guint64 start,
+							 guint64 end,
+							 guint64 gap);
 };
 
 struct _BraseroTrackStream



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]