|
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 |
}
|