project: Add a method to create assets synchronously
authorThibault Saunier <tsaunier@gnome.org>
Mon, 3 Nov 2014 10:54:10 +0000 (11:54 +0100)
committerThibault Saunier <tsaunier@gnome.org>
Sat, 6 Dec 2014 09:34:15 +0000 (10:34 +0100)
This allows to create a add an asset to a project in a
synchronous way.

API:
  ges_project_create_asset_sync

https://bugzilla.gnome.org/show_bug.cgi?id=740716

ges/ges-project.c
ges/ges-project.h

index 6147b5026c0115bd304140cecbc241314dbc6c68..5d7cdc130fcdb6b283a73a6e97f429e572843b54 100644 (file)
@@ -709,6 +709,80 @@ ges_project_create_asset (GESProject * project, const gchar * id,
   return TRUE;
 }
 
+/**
+ * ges_project_create_asset_sync:
+ * @project: A #GESProject
+ * @id: (allow-none): The id of the asset to create and add to @project
+ * @extractable_type: The #GType of the asset to create
+ * @error: A #GError to be set in case of error
+ *
+ * Create and add a #GESAsset to @project. You should connect to the
+ * "asset-added" signal to get the asset when it finally gets added to
+ * @project
+ *
+ * Returns: The newly created #GESAsset
+ */
+GESAsset *
+ges_project_create_asset_sync (GESProject * project, const gchar * id,
+    GType extractable_type, GError ** error)
+{
+  GESAsset *asset;
+  gchar *possible_id = NULL;
+  gboolean retry = TRUE;
+
+  g_return_val_if_fail (GES_IS_PROJECT (project), FALSE);
+  g_return_val_if_fail (g_type_is_a (extractable_type, GES_TYPE_EXTRACTABLE),
+      FALSE);
+
+  if (id == NULL)
+    id = g_type_name (extractable_type);
+
+  if ((asset = g_hash_table_lookup (project->priv->assets, id)))
+    return asset;
+  else if (g_hash_table_lookup (project->priv->loading_assets, id) ||
+      g_hash_table_lookup (project->priv->loaded_with_error, id))
+    return NULL;
+
+  /* TODO Add a GCancellable somewhere in our API */
+  while (retry) {
+
+    if (g_type_is_a (extractable_type, GES_TYPE_URI_CLIP)) {
+      asset = GES_ASSET (ges_uri_clip_asset_request_sync (id, error));
+    } else {
+      asset = ges_asset_request (extractable_type, id, error);
+    }
+
+    if (asset) {
+      retry = FALSE;
+
+      if (possible_id) {
+        g_free (possible_id);
+        ges_uri_assets_validate_uri (id);
+      }
+
+      break;
+    } else {
+      GESAsset *tmpasset;
+
+      tmpasset = ges_asset_cache_lookup (extractable_type, id);
+      possible_id = ges_project_try_updating_id (project, tmpasset, *error);
+
+      if (possible_id == NULL)
+        return NULL;
+
+      g_clear_error (error);
+      if (error)
+        *error = NULL;
+
+      id = possible_id;
+    }
+  }
+
+  ges_project_add_asset (project, asset);
+
+  return asset;
+}
+
 /**
  * ges_project_add_asset:
  * @project: A #GESProject
index e5cec0181fb3a06f0a537cb889b6b5cb82e0c034..689752ef1d4a942557ce52f57ebc1f861508f5fe 100644 (file)
@@ -96,6 +96,10 @@ gboolean ges_project_create_asset  (GESProject * project,
                                     const gchar *id,
                                     GType extractable_type);
 
+GESAsset * ges_project_create_asset_sync        (GESProject * project,
+                                                 const gchar * id,
+                                                 GType extractable_type,
+                                                 GError **error);
 GList * ges_project_get_loading_assets          (GESProject * project);
 
 gboolean ges_project_add_encoding_profile       (GESProject *project,