Blame src/goabackend/goaproviderfactory.c

Packit Service c6b9b0
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
Packit Service c6b9b0
/*
Packit Service c6b9b0
 * Copyright © 2013 Intel Corporation
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * This library is free software; you can redistribute it and/or
Packit Service c6b9b0
 * modify it under the terms of the GNU Lesser General Public
Packit Service c6b9b0
 * License as published by the Free Software Foundation; either
Packit Service c6b9b0
 * version 2 of the License, or (at your option) any later version.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * This library is distributed in the hope that it will be useful,
Packit Service c6b9b0
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service c6b9b0
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service c6b9b0
 * Lesser General Public License for more details.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * You should have received a copy of the GNU Lesser General
Packit Service c6b9b0
 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
Packit Service c6b9b0
 */
Packit Service c6b9b0
Packit Service c6b9b0
#include "config.h"
Packit Service c6b9b0
Packit Service c6b9b0
#include "goaproviderfactory.h"
Packit Service c6b9b0
Packit Service c6b9b0
/*
Packit Service c6b9b0
 * SECTION:goaproviderfactory
Packit Service c6b9b0
 * @title: GoaProviderFactory
Packit Service c6b9b0
 * @short_description: Abstract base class for provider factories
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * #GoaProviderFactory implementations are used to dynamically create #GoaProvider instances.
Packit Service c6b9b0
 */
Packit Service c6b9b0
Packit Service c6b9b0
G_DEFINE_ABSTRACT_TYPE (GoaProviderFactory, goa_provider_factory, G_TYPE_OBJECT);
Packit Service c6b9b0
Packit Service c6b9b0
/* ---------------------------------------------------------------------------------------------------- */
Packit Service c6b9b0
Packit Service c6b9b0
/*
Packit Service c6b9b0
 * goa_provider_factory_get_provider:
Packit Service c6b9b0
 * @factory: A #GoaProviderFactory.
Packit Service c6b9b0
 * @provider_name: A provider type identifier (ie. IM protocol names in #GoaTelepathyFactory)
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * Create a dynamic #GoaProvider for the subclass-specific @provider_name.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * Returns: (transfer full): A #GoaProvider (that must be freed
Packit Service c6b9b0
 * with g_object_unref()) or %NULL if not found.
Packit Service c6b9b0
 */
Packit Service c6b9b0
GoaProvider *
Packit Service c6b9b0
goa_provider_factory_get_provider (GoaProviderFactory  *factory,
Packit Service c6b9b0
                                   const gchar         *provider_name)
Packit Service c6b9b0
{
Packit Service c6b9b0
  GoaProviderFactoryClass *klass;
Packit Service c6b9b0
Packit Service c6b9b0
  g_return_val_if_fail (GOA_IS_PROVIDER_FACTORY (factory), NULL);
Packit Service c6b9b0
  g_return_val_if_fail (provider_name != NULL, NULL);
Packit Service c6b9b0
Packit Service c6b9b0
  klass = GOA_PROVIDER_FACTORY_GET_CLASS (factory);
Packit Service c6b9b0
  g_return_val_if_fail (klass->get_provider != NULL, NULL);
Packit Service c6b9b0
Packit Service c6b9b0
  return klass->get_provider (factory, provider_name);
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
/* ---------------------------------------------------------------------------------------------------- */
Packit Service c6b9b0
Packit Service c6b9b0
/*
Packit Service c6b9b0
 * goa_provider_factory_get_providers:
Packit Service c6b9b0
 * @factory: A #GoaProviderFactory.
Packit Service c6b9b0
 * @callback: The function to call when the request is satisfied.
Packit Service c6b9b0
 * @user_data: Pointer to pass to @callback.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * Get asynchronously a list of #GoaProvider instances handled by @factory.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * When the result is ready, @callback will be called in the the 
Packit Service c6b9b0
 * linkend="g-main-context-push-thread-default">thread-default main
Packit Service c6b9b0
 * loop</link> this function was called from. You can then call
Packit Service c6b9b0
 * goa_provider_factory_get_providers_finish() to get the result
Packit Service c6b9b0
 * of the operation.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * This is a virtual method that must be implemented by subclasses.
Packit Service c6b9b0
 */
Packit Service c6b9b0
void
Packit Service c6b9b0
goa_provider_factory_get_providers (GoaProviderFactory  *factory,
Packit Service c6b9b0
                                    GAsyncReadyCallback  callback,
Packit Service c6b9b0
                                    gpointer             user_data)
Packit Service c6b9b0
{
Packit Service c6b9b0
  GoaProviderFactoryClass *klass;
Packit Service c6b9b0
Packit Service c6b9b0
  g_return_if_fail (GOA_IS_PROVIDER_FACTORY (factory));
Packit Service c6b9b0
Packit Service c6b9b0
  klass = GOA_PROVIDER_FACTORY_GET_CLASS (factory);
Packit Service c6b9b0
  g_return_if_fail (klass->get_providers != NULL);
Packit Service c6b9b0
Packit Service c6b9b0
  return klass->get_providers (factory, callback, user_data);
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
/*
Packit Service c6b9b0
 * goa_provider_factory_get_providers_finish:
Packit Service c6b9b0
 * @factory: A #GoaProviderFactory.
Packit Service c6b9b0
 * @out_providers: (out): Return location for a list of #GoaProvider instances handled by @factory.
Packit Service c6b9b0
 * @result: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to goa_provider_factory_get_providers().
Packit Service c6b9b0
 * @error: Return location for error or %NULL.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * Finishes an operation started with goa_provider_factory_get_providers()
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * This is a virtual method that subclasses may implement. The default implementation is suitable for
Packit Service c6b9b0
 * an implementation of goa_provider_factory_get_providers() using #GTask.
Packit Service c6b9b0
 *
Packit Service c6b9b0
 * Returns: %TRUE if the list was successfully retrieved, %FALSE if @error is set.
Packit Service c6b9b0
 */
Packit Service c6b9b0
gboolean
Packit Service c6b9b0
goa_provider_factory_get_providers_finish (GoaProviderFactory  *factory,
Packit Service c6b9b0
                                           GList              **out_providers,
Packit Service c6b9b0
                                           GAsyncResult        *result,
Packit Service c6b9b0
                                           GError             **error)
Packit Service c6b9b0
{
Packit Service c6b9b0
  GoaProviderFactoryClass *klass;
Packit Service c6b9b0
Packit Service c6b9b0
  g_return_val_if_fail (GOA_IS_PROVIDER_FACTORY (factory), FALSE);
Packit Service c6b9b0
  g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
Packit Service c6b9b0
  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
Packit Service c6b9b0
Packit Service c6b9b0
  klass = GOA_PROVIDER_FACTORY_GET_CLASS (factory);
Packit Service c6b9b0
  return klass->get_providers_finish (factory, out_providers, result, error);
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
static gboolean
Packit Service c6b9b0
get_providers_finish_default (GoaProviderFactory  *factory,
Packit Service c6b9b0
                              GList              **out_providers,
Packit Service c6b9b0
                              GAsyncResult        *result,
Packit Service c6b9b0
                              GError             **error)
Packit Service c6b9b0
{
Packit Service c6b9b0
  GTask *task;
Packit Service c6b9b0
  GList *providers;
Packit Service c6b9b0
  gboolean had_error;
Packit Service c6b9b0
Packit Service c6b9b0
  g_return_val_if_fail (g_task_is_valid (result, factory), FALSE);
Packit Service c6b9b0
  task = G_TASK (result);
Packit Service c6b9b0
Packit Service c6b9b0
  /* Workaround for bgo#764163 */
Packit Service c6b9b0
  had_error = g_task_had_error (task);
Packit Service c6b9b0
  providers = g_task_propagate_pointer (task, error);
Packit Service c6b9b0
  if (had_error)
Packit Service c6b9b0
    return FALSE;
Packit Service c6b9b0
Packit Service c6b9b0
  if (out_providers != NULL)
Packit Service c6b9b0
    {
Packit Service c6b9b0
      *out_providers = providers;
Packit Service c6b9b0
      providers = NULL;
Packit Service c6b9b0
    }
Packit Service c6b9b0
Packit Service c6b9b0
  g_list_free_full (providers, g_object_unref);
Packit Service c6b9b0
  return TRUE;
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
/* ---------------------------------------------------------------------------------------------------- */
Packit Service c6b9b0
Packit Service c6b9b0
static void
Packit Service c6b9b0
goa_provider_factory_init (GoaProviderFactory *provider)
Packit Service c6b9b0
{
Packit Service c6b9b0
}
Packit Service c6b9b0
Packit Service c6b9b0
static void
Packit Service c6b9b0
goa_provider_factory_class_init (GoaProviderFactoryClass *klass)
Packit Service c6b9b0
{
Packit Service c6b9b0
  klass->get_providers_finish = get_providers_finish_default;
Packit Service c6b9b0
}