gboolean
ide_project_miner_mine_finish (IdeProjectMiner  *self,
                               GAsyncResult     *result,
                               GError          **error)
{
  g_return_val_if_fail (IDE_IS_PROJECT_MINER (self), FALSE);
  g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);

  return IDE_PROJECT_MINER_GET_IFACE (self)->mine_finish (self, result, error);
}
void
ide_project_miner_mine_async (IdeProjectMiner     *self,
                              GCancellable        *cancellable,
                              GAsyncReadyCallback  callback,
                              gpointer             user_data)
{
  g_return_if_fail (IDE_IS_PROJECT_MINER (self));
  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));

  IDE_PROJECT_MINER_GET_IFACE (self)->mine_async (self, cancellable, callback, user_data);
}
static void
ide_recent_projects__miner_discovered (IdeRecentProjects *self,
                                       IdeProjectInfo    *project_info,
                                       IdeProjectMiner   *miner)
{
  g_assert (IDE_IS_PROJECT_MINER (miner));
  g_assert (IDE_IS_RECENT_PROJECTS (self));
  g_assert (IDE_IS_PROJECT_INFO (project_info));

  ide_recent_projects_added (self, project_info);
}
void
ide_project_miner_emit_discovered (IdeProjectMiner *self,
                                   IdeProjectInfo  *project_info)
{
  gpointer *data;

  g_return_if_fail (IDE_IS_PROJECT_MINER (self));
  g_return_if_fail (IDE_IS_PROJECT_INFO (project_info));

  data = g_new0 (gpointer, 2);
  data[0] = g_object_ref (self);
  data[1] = g_object_ref (project_info);

  g_timeout_add (0, emit_discovered_cb, data);
}
static void
ide_recent_projects_add_miner (IdeRecentProjects *self,
                               IdeProjectMiner   *miner)
{
  g_assert (IDE_IS_RECENT_PROJECTS (self));
  g_assert (IDE_IS_PROJECT_MINER (miner));

  g_signal_connect_object (miner,
                           "discovered",
                           G_CALLBACK (ide_recent_projects__miner_discovered),
                           self,
                           G_CONNECT_SWAPPED);

  g_ptr_array_add (self->miners, g_object_ref (miner));
}
static void
foreach_miner_func (PeasExtensionSet *set,
                    PeasPluginInfo   *plugin_info,
                    PeasExtension    *exten,
                    gpointer          user_data)
{
  IdeRecentProjects *self = user_data;

  g_assert (PEAS_IS_EXTENSION_SET (set));
  g_assert (plugin_info != NULL);
  g_assert (IDE_IS_PROJECT_MINER (exten));
  g_assert (IDE_IS_RECENT_PROJECTS (self));

  ide_recent_projects_add_miner (self, IDE_PROJECT_MINER (exten));
}
static void
ide_recent_projects__miner_mine_cb (GObject      *object,
                                    GAsyncResult *result,
                                    gpointer      user_data)
{
  IdeRecentProjects *self;
  g_autoptr(GTask) task = user_data;
  IdeProjectMiner *miner = (IdeProjectMiner *)object;

  g_assert (G_IS_TASK (task));
  g_assert (IDE_IS_PROJECT_MINER (miner));
  self = g_task_get_source_object (task);
  g_assert (IDE_IS_RECENT_PROJECTS (self));

  ide_project_miner_mine_finish (miner, result, NULL);

  if (--self->active == 0)
    g_task_return_boolean (task, TRUE);
}