Newer
Older
/* WirePlumber
*
* Copyright © 2019 Collabora Ltd.
* @author George Kiagiadakis <george.kiagiadakis@collabora.com>
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
#include "factory.h"

George Kiagiadakis
committed
struct _WpFactory
{
GObject parent;

George Kiagiadakis
committed
gchar *name;
GQuark name_quark;
WpFactoryFunc create_object;
};
G_DEFINE_TYPE (WpFactory, wp_factory, G_TYPE_OBJECT)
static void
wp_factory_init (WpFactory * self)
{
}
static void
wp_factory_finalize (GObject * obj)
{
WpFactory * self = WP_FACTORY (obj);
g_weak_ref_clear (&self->core);
g_free (self->name);
G_OBJECT_CLASS (wp_factory_parent_class)->finalize (obj);
}
static void
wp_factory_class_init (WpFactoryClass * klass)
{
GObjectClass *object_class = (GObjectClass *) klass;
object_class->finalize = wp_factory_finalize;
}
WpFactory *

George Kiagiadakis
committed
wp_factory_new (WpCore * core, const gchar * name, WpFactoryFunc func)
WpFactory *f = NULL;
g_return_val_if_fail (name != NULL && *name != '\0', NULL);
g_return_val_if_fail (func != NULL, NULL);
f = g_object_new (WP_TYPE_FACTORY, NULL);
g_weak_ref_init (&f->core, core);
f->name = g_strdup (name);
f->name_quark = g_quark_from_string (f->name);
f->create_object = func;

George Kiagiadakis
committed
if (!wp_core_register_global (core, f->name_quark, f, g_object_unref))
return NULL;

George Kiagiadakis
committed
const gchar *
wp_factory_get_name (WpFactory * self)
{
return self->name;
}
/**
* wp_factory_get_core:
* @self: the factory
*
* Returns: (transfer full): the core on which this factory is registered
*/
WpCore *
wp_factory_get_core (WpFactory * self)
{
return g_weak_ref_get (&self->core);
}

George Kiagiadakis
committed
gpointer
wp_factory_create_object (WpFactory * self, GType type, GVariant * properties)
{
return self->create_object (self, type, properties);
}
WpFactory *
wp_factory_find (WpCore * core, const gchar * name)
{
return wp_core_get_global (core, g_quark_from_string (name));
}
gpointer
wp_factory_make (WpCore * core, const gchar * name, GType type,
GVariant * properties)
{
WpFactory *f = wp_factory_find (core, name);
if (!f) return NULL;
return wp_factory_create_object (f, type, properties);
}