automatic version update by autodist [release 3.10.2-1mamba;Mon Mar 24 2014]
This commit is contained in:
parent
7f99018a54
commit
037daf710c
@ -1,2 +1,4 @@
|
||||
# libtotem-pl-parser
|
||||
|
||||
A library to parse and save playlists, as used in music and movie players.
|
||||
|
||||
|
@ -0,0 +1,584 @@
|
||||
Index: plparse/totem-pl-parser.h
|
||||
===================================================================
|
||||
--- plparse/totem-pl-parser.h (revision 255)
|
||||
+++ plparse/totem-pl-parser.h (working copy)
|
||||
@@ -248,6 +248,8 @@
|
||||
* which can be overridden by inheriting classes
|
||||
* @playlist_ended: the generic signal handler for the #TotemPlParser::playlist-ended signal,
|
||||
* which can be overridden by inheriting classes
|
||||
+ * @parsing_finished: the generic signal handler for the #TotemPlParser::parsing-finished signal,
|
||||
+ * which can be overridden by inheriting classes
|
||||
*
|
||||
* The class structure for the #TotemPlParser type.
|
||||
**/
|
||||
@@ -263,6 +265,8 @@
|
||||
GHashTable *metadata);
|
||||
void (*playlist_ended) (TotemPlParser *parser,
|
||||
const char *uri);
|
||||
+ void (*parsing_finished) (TotemPlParser *parser,
|
||||
+ TotemPlParserResult retval);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -349,10 +353,16 @@
|
||||
|
||||
TotemPlParserResult totem_pl_parser_parse (TotemPlParser *parser,
|
||||
const char *url, gboolean fallback);
|
||||
+TotemPlParserResult totem_pl_parser_parse_async (TotemPlParser *parser,
|
||||
+ const char *url, gboolean fallback);
|
||||
TotemPlParserResult totem_pl_parser_parse_with_base (TotemPlParser *parser,
|
||||
const char *url,
|
||||
const char *base,
|
||||
gboolean fallback);
|
||||
+TotemPlParserResult totem_pl_parser_parse_with_base_async (TotemPlParser *parser,
|
||||
+ const char *url,
|
||||
+ const char *base,
|
||||
+ gboolean fallback);
|
||||
|
||||
TotemPlParser *totem_pl_parser_new (void);
|
||||
|
||||
Index: plparse/totem-pl-parser-private.h
|
||||
===================================================================
|
||||
--- plparse/totem-pl-parser-private.h (revision 255)
|
||||
+++ plparse/totem-pl-parser-private.h (working copy)
|
||||
@@ -76,7 +76,12 @@
|
||||
{
|
||||
GList *ignore_schemes;
|
||||
GList *ignore_mimetypes;
|
||||
+ GMutex *ignore_mutex;
|
||||
|
||||
+ GThread *thread;
|
||||
+ GAsyncQueue *parse_queue;
|
||||
+ gboolean thread_stopping;
|
||||
+
|
||||
guint recurse_level;
|
||||
guint fallback : 1;
|
||||
guint recurse : 1;
|
||||
Index: plparse/plparser.symbols
|
||||
===================================================================
|
||||
--- plparse/plparser.symbols (revision 255)
|
||||
+++ plparse/plparser.symbols (working copy)
|
||||
@@ -14,9 +14,11 @@
|
||||
totemplparser_marshal_VOID__STRING_STRING_STRING
|
||||
totem_pl_parser_new
|
||||
totem_pl_parser_parse
|
||||
+totem_pl_parser_parse_async
|
||||
totem_pl_parser_parse_date
|
||||
totem_pl_parser_parse_duration
|
||||
totem_pl_parser_parse_with_base
|
||||
+totem_pl_parser_parse_with_base_async
|
||||
totem_pl_parser_relative
|
||||
totem_pl_parser_result_get_type
|
||||
totem_pl_parser_type_get_type
|
||||
Index: plparse/totem-pl-parser.c
|
||||
===================================================================
|
||||
--- plparse/totem-pl-parser.c (revision 255)
|
||||
+++ plparse/totem-pl-parser.c (working copy)
|
||||
@@ -31,6 +31,9 @@
|
||||
*
|
||||
* <example>
|
||||
* <title>Reading a Playlist</title>
|
||||
+ * <para>This example loads a playlist synchronously. To load a playlist asynchronously, however, you simply
|
||||
+ * need to use totem_pl_parser_parse_async(), and optionally connect to #TotemPlParser::parsing-finished
|
||||
+ * to receive the ultimate #TotemPlParserResult value for the operation.</para>
|
||||
* <programlisting>
|
||||
* TotemPlParser *pl = totem_pl_parser_new ();
|
||||
* g_object_set (pl, "recurse", FALSE, "disable-unsafe", TRUE, NULL);
|
||||
@@ -234,6 +237,7 @@
|
||||
ENTRY_PARSED,
|
||||
PLAYLIST_STARTED,
|
||||
PLAYLIST_ENDED,
|
||||
+ PARSING_FINISHED,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
@@ -244,12 +248,15 @@
|
||||
static void totem_pl_parser_class_init (TotemPlParserClass *klass);
|
||||
static void totem_pl_parser_base_class_finalize (TotemPlParserClass *klass);
|
||||
static void totem_pl_parser_init (TotemPlParser *parser);
|
||||
+static void totem_pl_parser_dispose (GObject *object);
|
||||
static void totem_pl_parser_finalize (GObject *object);
|
||||
|
||||
static void totem_pl_parser_init (TotemPlParser *self);
|
||||
static void totem_pl_parser_class_init (TotemPlParserClass *klass);
|
||||
static gpointer totem_pl_parser_parent_class = NULL;
|
||||
|
||||
+#define TOTEM_PL_PARSER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TOTEM_TYPE_PL_PARSER, TotemPlParserPrivate))
|
||||
+
|
||||
GType
|
||||
totem_pl_parser_get_type (void)
|
||||
{
|
||||
@@ -279,9 +286,13 @@
|
||||
GParamSpec *pspec;
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
+ if (!g_thread_supported ())
|
||||
+ g_thread_init (NULL);
|
||||
+
|
||||
totem_pl_parser_parent_class = g_type_class_peek_parent (klass);
|
||||
g_type_class_add_private (klass, sizeof (TotemPlParserPrivate));
|
||||
|
||||
+ object_class->dispose = totem_pl_parser_dispose;
|
||||
object_class->finalize = totem_pl_parser_finalize;
|
||||
object_class->set_property = totem_pl_parser_set_property;
|
||||
object_class->get_property = totem_pl_parser_get_property;
|
||||
@@ -360,6 +371,7 @@
|
||||
NULL, NULL,
|
||||
totemplparser_marshal_VOID__STRING_BOXED,
|
||||
G_TYPE_NONE, 2, G_TYPE_STRING, TOTEM_TYPE_PL_PARSER_METADATA);
|
||||
+
|
||||
/**
|
||||
* TotemPlParser::playlist-started:
|
||||
* @parser: the object which received the signal
|
||||
@@ -398,6 +410,24 @@
|
||||
g_cclosure_marshal_VOID__STRING,
|
||||
G_TYPE_NONE, 1, G_TYPE_STRING);
|
||||
|
||||
+ /**
|
||||
+ * TotemPlParser::parsing-finished:
|
||||
+ * @parser: the object which received the signal
|
||||
+ * @retval: the #TotemPlParserResult return value from the parse operation
|
||||
+ *
|
||||
+ * The ::parsing-finished signal is emitted after the parse operation initiated
|
||||
+ * by totem_pl_parser_parse() or totem_pl_parser_parse_with_base() has finished
|
||||
+ * (successfully or not).
|
||||
+ */
|
||||
+ totem_pl_parser_table_signals[PARSING_FINISHED] =
|
||||
+ g_signal_new ("parsing-finished",
|
||||
+ G_TYPE_FROM_CLASS (klass),
|
||||
+ G_SIGNAL_RUN_LAST,
|
||||
+ G_STRUCT_OFFSET (TotemPlParserClass, parsing_finished),
|
||||
+ NULL, NULL,
|
||||
+ g_cclosure_marshal_VOID__ENUM,
|
||||
+ G_TYPE_NONE, 1, TOTEM_TYPE_PL_PARSER_RESULT);
|
||||
+
|
||||
/* param specs */
|
||||
totem_pl_parser_pspec_pool = g_param_spec_pool_new (FALSE);
|
||||
pspec = g_param_spec_string ("url", "url",
|
||||
@@ -620,6 +650,26 @@
|
||||
return TOTEM_PL_PARSER (g_object_new (TOTEM_TYPE_PL_PARSER, NULL));
|
||||
}
|
||||
|
||||
+typedef struct {
|
||||
+ TotemPlParser *parser;
|
||||
+ char *playlist_uri;
|
||||
+} PlaylistEndedSignalData;
|
||||
+
|
||||
+static gboolean
|
||||
+emit_playlist_ended_signal (PlaylistEndedSignalData *data)
|
||||
+{
|
||||
+ g_signal_emit (data->parser,
|
||||
+ totem_pl_parser_table_signals[PLAYLIST_ENDED],
|
||||
+ 0, data->playlist_uri);
|
||||
+
|
||||
+ /* Free the data */
|
||||
+ g_object_unref (data->parser);
|
||||
+ g_free (data->playlist_uri);
|
||||
+ g_free (data);
|
||||
+
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* totem_pl_parser_playlist_end:
|
||||
* @parser: a #TotemPlParser
|
||||
@@ -631,9 +681,13 @@
|
||||
void
|
||||
totem_pl_parser_playlist_end (TotemPlParser *parser, const char *playlist_uri)
|
||||
{
|
||||
- g_signal_emit (G_OBJECT (parser),
|
||||
- totem_pl_parser_table_signals[PLAYLIST_ENDED],
|
||||
- 0, playlist_uri);
|
||||
+ PlaylistEndedSignalData *data;
|
||||
+
|
||||
+ data = g_new (PlaylistEndedSignalData, 1);
|
||||
+ data->parser = g_object_ref (parser);
|
||||
+ data->playlist_uri = g_strdup (playlist_uri);
|
||||
+
|
||||
+ g_idle_add ((GSourceFunc) emit_playlist_ended_signal, data);
|
||||
}
|
||||
|
||||
static char *
|
||||
@@ -1057,25 +1111,70 @@
|
||||
totem_pl_parser_init (TotemPlParser *parser)
|
||||
{
|
||||
parser->priv = G_TYPE_INSTANCE_GET_PRIVATE (parser, TOTEM_TYPE_PL_PARSER, TotemPlParserPrivate);
|
||||
+ parser->priv->ignore_mutex = g_mutex_new ();
|
||||
}
|
||||
|
||||
static void
|
||||
+totem_pl_parser_dispose (GObject *object)
|
||||
+{
|
||||
+ TotemPlParserPrivate *priv = TOTEM_PL_PARSER_GET_PRIVATE (object);
|
||||
+
|
||||
+ /* Tell the thread we're stopping */
|
||||
+ priv->thread_stopping = TRUE;
|
||||
+
|
||||
+ /* Wait for the thread to finish */
|
||||
+ if (priv->thread != NULL)
|
||||
+ g_thread_join (priv->thread);
|
||||
+ priv->thread = NULL;
|
||||
+
|
||||
+ /* Free the job queue */
|
||||
+ if (priv->parse_queue != NULL)
|
||||
+ g_async_queue_unref (priv->parse_queue);
|
||||
+ priv->parse_queue = NULL;
|
||||
+
|
||||
+ G_OBJECT_CLASS (totem_pl_parser_parent_class)->dispose (object);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
totem_pl_parser_finalize (GObject *object)
|
||||
{
|
||||
- TotemPlParser *parser = TOTEM_PL_PARSER (object);
|
||||
+ TotemPlParserPrivate *priv = TOTEM_PL_PARSER_GET_PRIVATE (object);
|
||||
|
||||
g_return_if_fail (object != NULL);
|
||||
- g_return_if_fail (parser->priv != NULL);
|
||||
+ g_return_if_fail (priv != NULL);
|
||||
|
||||
- g_list_foreach (parser->priv->ignore_schemes, (GFunc) g_free, NULL);
|
||||
- g_list_free (parser->priv->ignore_schemes);
|
||||
+ g_list_foreach (priv->ignore_schemes, (GFunc) g_free, NULL);
|
||||
+ g_list_free (priv->ignore_schemes);
|
||||
|
||||
- g_list_foreach (parser->priv->ignore_mimetypes, (GFunc) g_free, NULL);
|
||||
- g_list_free (parser->priv->ignore_mimetypes);
|
||||
+ g_list_foreach (priv->ignore_mimetypes, (GFunc) g_free, NULL);
|
||||
+ g_list_free (priv->ignore_mimetypes);
|
||||
|
||||
+ g_mutex_free (priv->ignore_mutex);
|
||||
+
|
||||
G_OBJECT_CLASS (totem_pl_parser_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
+typedef struct {
|
||||
+ TotemPlParser *parser;
|
||||
+ guint signal_id;
|
||||
+ char *url;
|
||||
+ GHashTable *metadata;
|
||||
+} EntryParsedSignalData;
|
||||
+
|
||||
+static gboolean
|
||||
+emit_entry_parsed_signal (EntryParsedSignalData *data)
|
||||
+{
|
||||
+ g_signal_emit (data->parser, data->signal_id, 0, data->url, data->metadata);
|
||||
+
|
||||
+ /* Free the data */
|
||||
+ g_object_unref (data->parser);
|
||||
+ g_free (data->url);
|
||||
+ g_hash_table_unref (data->metadata);
|
||||
+ g_free (data);
|
||||
+
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
static void
|
||||
totem_pl_parser_add_url_valist (TotemPlParser *parser,
|
||||
const gchar *first_property_name,
|
||||
@@ -1188,15 +1287,21 @@
|
||||
}
|
||||
|
||||
if (g_hash_table_size (metadata) > 0 || url != NULL) {
|
||||
- if (is_playlist == FALSE) {
|
||||
- g_signal_emit (G_OBJECT (parser),
|
||||
- totem_pl_parser_table_signals[ENTRY_PARSED],
|
||||
- 0, url, metadata);
|
||||
- } else {
|
||||
- g_signal_emit (G_OBJECT (parser),
|
||||
- totem_pl_parser_table_signals[PLAYLIST_STARTED],
|
||||
- 0, url, metadata);
|
||||
- }
|
||||
+ EntryParsedSignalData *data;
|
||||
+
|
||||
+ /* Make sure to emit the signals asynchronously, as we could be in the main loop
|
||||
+ * *or* a worker thread at this point. */
|
||||
+ data = g_new (EntryParsedSignalData, 1);
|
||||
+ data->parser = g_object_ref (parser);
|
||||
+ data->url = g_strdup (url);
|
||||
+ data->metadata = g_hash_table_ref (metadata);
|
||||
+
|
||||
+ if (is_playlist == FALSE)
|
||||
+ data->signal_id = totem_pl_parser_table_signals[ENTRY_PARSED];
|
||||
+ else
|
||||
+ data->signal_id = totem_pl_parser_table_signals[PLAYLIST_STARTED];
|
||||
+
|
||||
+ g_idle_add ((GSourceFunc) emit_entry_parsed_signal, data);
|
||||
}
|
||||
|
||||
g_hash_table_unref (metadata);
|
||||
@@ -1275,15 +1380,23 @@
|
||||
{
|
||||
GList *l;
|
||||
|
||||
- if (parser->priv->ignore_schemes == NULL)
|
||||
+ g_mutex_lock (parser->priv->ignore_mutex);
|
||||
+
|
||||
+ if (parser->priv->ignore_schemes == NULL) {
|
||||
+ g_mutex_unlock (parser->priv->ignore_mutex);
|
||||
return FALSE;
|
||||
+ }
|
||||
|
||||
for (l = parser->priv->ignore_schemes; l != NULL; l = l->next) {
|
||||
const char *scheme = l->data;
|
||||
- if (g_file_has_uri_scheme (file, scheme) != FALSE)
|
||||
+ if (g_file_has_uri_scheme (file, scheme) != FALSE) {
|
||||
+ g_mutex_unlock (parser->priv->ignore_mutex);
|
||||
return TRUE;
|
||||
+ }
|
||||
}
|
||||
|
||||
+ g_mutex_unlock (parser->priv->ignore_mutex);
|
||||
+
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -1293,16 +1406,24 @@
|
||||
{
|
||||
GList *l;
|
||||
|
||||
- if (parser->priv->ignore_mimetypes == NULL)
|
||||
+ g_mutex_lock (parser->priv->ignore_mutex);
|
||||
+
|
||||
+ if (parser->priv->ignore_mimetypes == NULL) {
|
||||
+ g_mutex_unlock (parser->priv->ignore_mutex);
|
||||
return FALSE;
|
||||
+ }
|
||||
|
||||
for (l = parser->priv->ignore_mimetypes; l != NULL; l = l->next)
|
||||
{
|
||||
const char *item = l->data;
|
||||
- if (strcmp (mimetype, item) == 0)
|
||||
+ if (strcmp (mimetype, item) == 0) {
|
||||
+ g_mutex_unlock (parser->priv->ignore_mutex);
|
||||
return TRUE;
|
||||
+ }
|
||||
}
|
||||
|
||||
+ g_mutex_unlock (parser->priv->ignore_mutex);
|
||||
+
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -1596,6 +1717,70 @@
|
||||
return ret;
|
||||
}
|
||||
|
||||
+typedef struct {
|
||||
+ char *url;
|
||||
+ char *base;
|
||||
+ gboolean fallback;
|
||||
+ TotemPlParserResult retval;
|
||||
+ TotemPlParser *parser;
|
||||
+} ParseQueueItem;
|
||||
+
|
||||
+static void
|
||||
+parse_queue_item_free (ParseQueueItem *item)
|
||||
+{
|
||||
+ g_free (item->url);
|
||||
+ g_free (item->base);
|
||||
+ g_object_unref (item->parser);
|
||||
+
|
||||
+ g_free (item);
|
||||
+}
|
||||
+
|
||||
+static gboolean
|
||||
+totem_pl_parser_thread_job_finished (ParseQueueItem *queue_item)
|
||||
+{
|
||||
+ g_signal_emit (queue_item->parser, totem_pl_parser_table_signals[PARSING_FINISHED], 0, queue_item->retval);
|
||||
+ parse_queue_item_free (queue_item);
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
+static gpointer
|
||||
+totem_pl_parser_thread_main (TotemPlParser *parser)
|
||||
+{
|
||||
+ while (parser->priv->thread_stopping == FALSE) {
|
||||
+ GFile *file, *base_file;
|
||||
+ TotemPlParserResult retval;
|
||||
+ ParseQueueItem *queue_item;
|
||||
+
|
||||
+ /* Get a job off the queue */
|
||||
+ queue_item = g_async_queue_pop (parser->priv->parse_queue);
|
||||
+
|
||||
+ /* Start parsing it */
|
||||
+ file = g_file_new_for_uri (queue_item->url);
|
||||
+ base_file = NULL;
|
||||
+
|
||||
+ if (totem_pl_parser_scheme_is_ignored (parser, file) != FALSE) {
|
||||
+ g_object_unref (file);
|
||||
+ retval = TOTEM_PL_PARSER_RESULT_UNHANDLED;
|
||||
+ } else {
|
||||
+ parser->priv->recurse_level = 0;
|
||||
+ parser->priv->fallback = queue_item->fallback != FALSE;
|
||||
+ if (queue_item->base != NULL)
|
||||
+ base_file = g_file_new_for_uri (queue_item->base);
|
||||
+ retval = totem_pl_parser_parse_internal (parser, file, base_file);
|
||||
+
|
||||
+ g_object_unref (file);
|
||||
+ if (base_file != NULL)
|
||||
+ g_object_unref (base_file);
|
||||
+ }
|
||||
+
|
||||
+ /* Emit the "parsing-finished" signal for this job from the main thread */
|
||||
+ queue_item->retval = retval;
|
||||
+ g_idle_add ((GSourceFunc) totem_pl_parser_thread_job_finished, queue_item);
|
||||
+ }
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* totem_pl_parser_parse_with_base:
|
||||
* @parser: a #TotemPlParser
|
||||
@@ -1605,8 +1790,14 @@
|
||||
* end of the playlist on parse failure
|
||||
*
|
||||
* Parses a playlist given by the absolute URL @url, using
|
||||
- * @base to resolve relative paths where appropriate.
|
||||
+ * @base to resolve relative paths where appropriate. This method is
|
||||
+ * synchronous, and will block on (e.g.) network requests to slow
|
||||
+ * servers. totem_pl_parser_parse_with_base_async() is recommended instead.
|
||||
*
|
||||
+ * This function will return %TOTEM_PL_PARSER_RESULT_SUCCESS on success,
|
||||
+ * and either %TOTEM_PL_PARSER_RESULT_UNHANDLED or
|
||||
+ * %TOTEM_PL_PARSER_RESULT_ERROR if the parameters were invalid.
|
||||
+ *
|
||||
* Return value: a #TotemPlParserResult
|
||||
**/
|
||||
TotemPlParserResult
|
||||
@@ -1618,8 +1809,7 @@
|
||||
|
||||
g_return_val_if_fail (TOTEM_IS_PL_PARSER (parser), TOTEM_PL_PARSER_RESULT_UNHANDLED);
|
||||
g_return_val_if_fail (url != NULL, TOTEM_PL_PARSER_RESULT_UNHANDLED);
|
||||
- g_return_val_if_fail (strstr (url, "://") != NULL,
|
||||
- TOTEM_PL_PARSER_RESULT_ERROR);
|
||||
+ g_return_val_if_fail (strstr (url, "://") != NULL, TOTEM_PL_PARSER_RESULT_ERROR);
|
||||
|
||||
file = g_file_new_for_uri (url);
|
||||
base_file = NULL;
|
||||
@@ -1643,14 +1833,77 @@
|
||||
}
|
||||
|
||||
/**
|
||||
+ * totem_pl_parser_parse_with_base_async:
|
||||
+ * @parser: a #TotemPlParser
|
||||
+ * @url: the URL of the playlist to parse
|
||||
+ * @base: the base path for relative filenames
|
||||
+ * @fallback: %TRUE if the parser should add the playlist URL to the
|
||||
+ * end of the playlist on parse failure
|
||||
+ *
|
||||
+ * Starts asynchronous parsing of a playlist given by the absolute URL @url,
|
||||
+ * using @base to resolve relative paths where appropriate.
|
||||
+ *
|
||||
+ * This method is asynchronous, and #TotemPlParser::parsing-finished will be
|
||||
+ * emitted once parsing is finished (successfully or not).
|
||||
+ *
|
||||
+ * This function will return %TOTEM_PL_PARSER_RESULT_SUCCESS if the job
|
||||
+ * was successfully added to the parse queue, and either
|
||||
+ * %TOTEM_PL_PARSER_RESULT_UNHANDLED or %TOTEM_PL_PARSER_RESULT_ERROR
|
||||
+ * if the parameters were invalid.
|
||||
+ *
|
||||
+ * Return value: a #TotemPlParserResult
|
||||
+ **/
|
||||
+TotemPlParserResult
|
||||
+totem_pl_parser_parse_with_base_async (TotemPlParser *parser, const char *url,
|
||||
+ const char *base, gboolean fallback)
|
||||
+{
|
||||
+ ParseQueueItem *queue_item;
|
||||
+
|
||||
+ g_return_val_if_fail (TOTEM_IS_PL_PARSER (parser), TOTEM_PL_PARSER_RESULT_UNHANDLED);
|
||||
+ g_return_val_if_fail (url != NULL, TOTEM_PL_PARSER_RESULT_UNHANDLED);
|
||||
+ g_return_val_if_fail (strstr (url, "://") != NULL, TOTEM_PL_PARSER_RESULT_ERROR);
|
||||
+
|
||||
+ if (parser->priv->thread == NULL) {
|
||||
+ GError *error = NULL;
|
||||
+
|
||||
+ /* Create the worker thread */
|
||||
+ parser->priv->parse_queue = g_async_queue_new_full ((GDestroyNotify) parse_queue_item_free);
|
||||
+ parser->priv->thread = g_thread_create ((GThreadFunc) totem_pl_parser_thread_main, parser, TRUE, &error);
|
||||
+
|
||||
+ if (error != NULL) {
|
||||
+ g_warning ("Failed to create TotemPlParser worker thread: %s", error->message);
|
||||
+ g_async_queue_unref (parser->priv->parse_queue);
|
||||
+ g_error_free (error);
|
||||
+
|
||||
+ return TOTEM_PL_PARSER_RESULT_ERROR;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* Thread already exists, so add the parse job to its queue */
|
||||
+ queue_item = g_new (ParseQueueItem, 1);
|
||||
+ queue_item->url = g_strdup (url);
|
||||
+ queue_item->base = g_strdup (base);
|
||||
+ queue_item->fallback = fallback;
|
||||
+ queue_item->parser = g_object_ref (parser);
|
||||
+
|
||||
+ g_async_queue_push (parser->priv->parse_queue, queue_item);
|
||||
+
|
||||
+ return TOTEM_PL_PARSER_RESULT_SUCCESS;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* totem_pl_parser_parse:
|
||||
* @parser: a #TotemPlParser
|
||||
* @url: the URL of the playlist to parse
|
||||
* @fallback: %TRUE if the parser should add the playlist URL to the
|
||||
* end of the playlist on parse failure
|
||||
*
|
||||
- * Parses a playlist given by the absolute URL @url.
|
||||
+ * Parses a playlist given by the absolute URL @url. This method is
|
||||
+ * synchronous, and will block on (e.g.) network requests to slow
|
||||
+ * servers. totem_pl_parser_parse_async() is recommended instead.
|
||||
*
|
||||
+ * Return values are as totem_pl_parser_parse_with_base().
|
||||
+ *
|
||||
* Return value: a #TotemPlParserResult
|
||||
**/
|
||||
TotemPlParserResult
|
||||
@@ -1661,6 +1914,29 @@
|
||||
}
|
||||
|
||||
/**
|
||||
+ * totem_pl_parser_parse_async:
|
||||
+ * @parser: a #TotemPlParser
|
||||
+ * @url: the URL of the playlist to parse
|
||||
+ * @fallback: %TRUE if the parser should add the playlist URL to the
|
||||
+ * end of the playlist on parse failure
|
||||
+ *
|
||||
+ * Starts asynchronous parsing of a playlist given by the absolute URL @url.
|
||||
+ *
|
||||
+ * This method is asynchronous, and #TotemPlParser::parsing-finished will be
|
||||
+ * emitted once parsing is finished (successfully or not).
|
||||
+ *
|
||||
+ * Return values are as totem_pl_parser_parse_with_base_async().
|
||||
+ *
|
||||
+ * Return value: a #TotemPlParserResult
|
||||
+ **/
|
||||
+TotemPlParserResult
|
||||
+totem_pl_parser_parse_async (TotemPlParser *parser, const char *url,
|
||||
+ gboolean fallback)
|
||||
+{
|
||||
+ return totem_pl_parser_parse_with_base_async (parser, url, NULL, fallback);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* totem_pl_parser_add_ignored_scheme:
|
||||
* @parser: a #TotemPlParser
|
||||
* @scheme: the scheme to ignore
|
||||
@@ -1676,11 +1952,15 @@
|
||||
|
||||
g_return_if_fail (TOTEM_IS_PL_PARSER (parser));
|
||||
|
||||
+ g_mutex_lock (parser->priv->ignore_mutex);
|
||||
+
|
||||
s = g_strdup (scheme);
|
||||
if (s[strlen (s) - 1] == ':')
|
||||
s[strlen (s) - 1] = '\0';
|
||||
parser->priv->ignore_schemes = g_list_prepend
|
||||
(parser->priv->ignore_schemes, s);
|
||||
+
|
||||
+ g_mutex_unlock (parser->priv->ignore_mutex);
|
||||
}
|
||||
|
||||
/**
|
190
libtotem-pl-parser.spec
Normal file
190
libtotem-pl-parser.spec
Normal file
@ -0,0 +1,190 @@
|
||||
%define majver %(echo %version | cut -d. -f 1-2)
|
||||
Name: libtotem-pl-parser
|
||||
Version: 3.10.2
|
||||
Release: 1mamba
|
||||
Summary: Totem Playlist Parser library
|
||||
Group: System/Libraries
|
||||
Vendor: openmamba
|
||||
Distribution: openmamba
|
||||
Packager: Automatic Build System <autodist@mambasoft.it>
|
||||
URL: http://www.gnome.org/projects/totem/
|
||||
Source: http://ftp.acc.umu.se/pub/GNOME/sources/totem-pl-parser/%{majver}/totem-pl-parser-%{version}.tar.xz
|
||||
# http://bugzilla.gnome.org/show_bug.cgi?id=561444
|
||||
Patch: libtotem-pl-parser-2.24.3-add-asynchronous-parsing-functions.patch
|
||||
License: LGPL
|
||||
Requires: libkrb5
|
||||
Requires: perl-XML-Parser
|
||||
Requires: gettext
|
||||
## AUTOBUILDREQ-BEGIN
|
||||
BuildRequires: GConf-devel
|
||||
BuildRequires: gettext-devel
|
||||
BuildRequires: glibc-devel
|
||||
BuildRequires: libatk-devel
|
||||
BuildRequires: libbonobo-devel
|
||||
BuildRequires: libcairo-devel
|
||||
BuildRequires: libdbus-devel
|
||||
BuildRequires: libevolution-data-server-devel
|
||||
BuildRequires: libfontconfig-devel
|
||||
BuildRequires: libfreetype-devel
|
||||
BuildRequires: libglib-devel
|
||||
BuildRequires: libgtk-devel
|
||||
BuildRequires: libkrb5-devel
|
||||
BuildRequires: libpango-devel
|
||||
BuildRequires: libsoup-devel
|
||||
BuildRequires: libsqlite-devel
|
||||
BuildRequires: libxml2-devel
|
||||
BuildRequires: libz-devel
|
||||
BuildRequires: ORBit2-devel
|
||||
BuildRequires: perl-XML-Parser
|
||||
## AUTOBUILDREQ-END
|
||||
BuildRequires: libgmime-devel
|
||||
BuildRequires: libgnome-vfs-devel
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-root
|
||||
|
||||
%description
|
||||
A library to parse and save playlists, as used in music and movie players.
|
||||
|
||||
%package devel
|
||||
Group: Development/Libraries
|
||||
Summary: Libraries and headers for %{name}
|
||||
Requires: %{name} = %{?epoch:%epoch:}%{version}-%{release}
|
||||
|
||||
%description devel
|
||||
The %{name}-devel package contains libraries and header files for
|
||||
developing applications that use %{name}.
|
||||
|
||||
%package static
|
||||
Group: Development/Libraries
|
||||
Summary: Static libraries for %{name}
|
||||
Requires: %{name} = %{?epoch:%epoch:}%{version}-%{release}
|
||||
|
||||
%description static
|
||||
This package contains static libraries need for development.
|
||||
|
||||
%prep
|
||||
%setup -q -n totem-pl-parser-%{version}
|
||||
#%patch -p0
|
||||
|
||||
%build
|
||||
%configure
|
||||
%make
|
||||
|
||||
%install
|
||||
[ "%{buildroot}" != / ] && rm -rf "%{buildroot}"
|
||||
%makeinstall
|
||||
|
||||
%find_lang totem-pl-parser
|
||||
|
||||
%clean
|
||||
[ "%{buildroot}" != / ] && rm -rf "%{buildroot}"
|
||||
|
||||
%post -p /sbin/ldconfig
|
||||
%postun -p /sbin/ldconfig
|
||||
|
||||
%files -f totem-pl-parser.lang
|
||||
%defattr(-,root,root)
|
||||
%{_libdir}/*.so.*
|
||||
%doc AUTHORS COPYING.LIB ChangeLog NEWS README
|
||||
|
||||
%files devel
|
||||
%defattr(-,root,root)
|
||||
%dir %{_includedir}/totem-pl-parser/1/plparser
|
||||
%{_includedir}/totem-pl-parser/1/plparser/totem-*.h
|
||||
%{_libdir}/*.so
|
||||
%{_libdir}/pkgconfig/*.pc
|
||||
%dir %{_datadir}/gtk-doc/html/totem-pl-parser
|
||||
%{_datadir}/gtk-doc/html/totem-pl-parser/*.png
|
||||
%{_datadir}/gtk-doc/html/totem-pl-parser/*.html
|
||||
%{_datadir}/gtk-doc/html/totem-pl-parser/index.sgml
|
||||
%{_datadir}/gtk-doc/html/totem-pl-parser/style.css
|
||||
#%{_datadir}/gtk-doc/html/totem-pl-parser/totem-pl-parser.devhelp
|
||||
%{_datadir}/gtk-doc/html/totem-pl-parser/totem-pl-parser.devhelp2
|
||||
%{_libdir}/girepository-1.0/TotemPlParser-1.0.typelib
|
||||
%{_datadir}/gir-1.0/TotemPlParser-1.0.gir
|
||||
|
||||
%files static
|
||||
%defattr(-,root,root)
|
||||
%{_libdir}/*.a
|
||||
%{_libdir}/*.la
|
||||
|
||||
%changelog
|
||||
* Mon Mar 24 2014 Automatic Build System <autodist@mambasoft.it> 3.10.2-1mamba
|
||||
- automatic version update by autodist
|
||||
|
||||
* Wed Feb 19 2014 Automatic Build System <autodist@mambasoft.it> 3.10.1-1mamba
|
||||
- automatic version update by autodist
|
||||
|
||||
* Mon Oct 28 2013 Automatic Build System <autodist@mambasoft.it> 3.10.0-1mamba
|
||||
- automatic version update by autodist
|
||||
|
||||
* Tue May 14 2013 Automatic Build System <autodist@mambasoft.it> 3.4.5-1mamba
|
||||
- automatic version update by autodist
|
||||
|
||||
* Tue Mar 26 2013 Automatic Build System <autodist@mambasoft.it> 3.4.4-1mamba
|
||||
- automatic version update by autodist
|
||||
|
||||
* Tue Sep 25 2012 Automatic Build System <autodist@mambasoft.it> 3.4.3-1mamba
|
||||
- automatic version update by autodist
|
||||
|
||||
* Tue May 15 2012 Automatic Build System <autodist@mambasoft.it> 3.4.2-1mamba
|
||||
- automatic version update by autodist
|
||||
|
||||
* Mon Apr 16 2012 Automatic Build System <autodist@mambasoft.it> 3.4.1-1mamba
|
||||
- automatic version update by autodist
|
||||
|
||||
* Mon Apr 02 2012 Automatic Build System <autodist@mambasoft.it> 3.4.0-1mamba
|
||||
- automatic version update by autodist
|
||||
|
||||
* Sat Oct 01 2011 Automatic Build System <autodist@mambasoft.it> 2.32.6-1mamba
|
||||
- update to 2.32.6
|
||||
|
||||
* Tue May 10 2011 Automatic Build System <autodist@mambasoft.it> 2.32.5-1mamba
|
||||
- automatic update by autodist
|
||||
|
||||
* Mon Mar 21 2011 Automatic Build System <autodist@mambasoft.it> 2.32.4-1mamba
|
||||
- automatic update by autodist
|
||||
|
||||
* Mon Feb 21 2011 Automatic Build System <autodist@mambasoft.it> 2.32.3-1mamba
|
||||
- automatic update by autodist
|
||||
|
||||
* Fri Jan 28 2011 Automatic Build System <autodist@mambasoft.it> 2.32.2-1mamba
|
||||
- automatic update by autodist
|
||||
|
||||
* Mon Oct 18 2010 Automatic Build System <autodist@mambasoft.it> 2.32.1-1mamba
|
||||
- automatic update to 2.32.1 by autodist
|
||||
|
||||
* Wed Sep 29 2010 Automatic Build System <autodist@mambasoft.it> 2.32.0-1mamba
|
||||
- automatic update to 2.32.0 by autodist
|
||||
|
||||
* Tue Sep 28 2010 Automatic Build System <autodist@mambasoft.it> 2.30.4-1mamba
|
||||
- automatic update to 2.30.4 by autodist
|
||||
|
||||
* Mon Sep 13 2010 Automatic Build System <autodist@mambasoft.it> 2.30.3-1mamba
|
||||
- automatic update to 2.30.3 by autodist
|
||||
|
||||
* Mon Aug 09 2010 Automatic Build System <autodist@mambasoft.it> 2.30.2-1mamba
|
||||
- automatic update to 2.30.2 by autodist
|
||||
|
||||
* Sat May 22 2010 Automatic Build System <autodist@mambasoft.it> 2.30.1-1mamba
|
||||
- update to 2.30.1
|
||||
|
||||
* Sun Mar 01 2009 Silvan Calarco <silvan.calarco@mambasoft.it> 2.24.4-1mamba
|
||||
- automatic update by autodist
|
||||
|
||||
* Fri Dec 12 2008 gil <puntogil@libero.it> 2.24.3-2mamba
|
||||
- added patch for http://bugzilla.gnome.org/show_bug.cgi?id=561444
|
||||
|
||||
* Wed Dec 10 2008 gil <puntogil@libero.it> 2.24.3-1mamba
|
||||
- update to 2.24.3
|
||||
|
||||
* Tue Oct 21 2008 Silvan Calarco <silvan.calarco@mambasoft.it> 2.24.1-1mamba
|
||||
- update to 2.24.1
|
||||
|
||||
* Tue Sep 30 2008 Silvan Calarco <silvan.calarco@mambasoft.it> 2.24.0-1mamba
|
||||
- update to 2.24.0
|
||||
|
||||
* Wed Sep 10 2008 gil <puntogil@libero.it> 2.22.2-2mamba
|
||||
- fixed some buildrequires
|
||||
|
||||
* Thu Aug 28 2008 gil <puntogil@libero.it> 2.22.2-1mamba
|
||||
- package created by autospec
|
Loading…
Reference in New Issue
Block a user