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