Issue #19: Add property shared-object-path to ExternalRenderer

This commit is contained in:
Mario Hüttel 2019-06-18 21:08:29 +02:00
parent 7b10d41160
commit f224b28613
1 changed files with 67 additions and 3 deletions

View File

@ -35,7 +35,12 @@
struct _ExternalRenderer {
GdsOutputRenderer parent;
const char *shared_object_path;
char *shared_object_path;
};
enum {
PROP_SO_PATH = 1, /**< @brief Shared object path property */
N_PROPERTIES /**< @brief Used to get property count */
};
G_DEFINE_TYPE(ExternalRenderer, external_renderer, GDS_RENDER_TYPE_OUTPUT_RENDERER)
@ -56,8 +61,13 @@ static int external_renderer_render_cell(struct gds_cell *toplevel_cell, GList *
char *error_msg;
int ret = 0;
if (!so_path) {
g_error("Path to shared object not set!");
return -3000;
}
/* Check parameter sanity */
if (!output_file || !so_path || !toplevel_cell || !layer_info_list)
if (!output_file || !toplevel_cell || !layer_info_list)
return -3000;
/* Load shared object */
@ -95,14 +105,65 @@ static int external_renderer_render_output(GdsOutputRenderer *renderer,
return external_renderer_render_cell(cell, layer_infos, output_file, scale, ext_renderer->shared_object_path);
}
static void external_renderer_get_property(GObject *obj, guint property_id, GValue *value, GParamSpec *pspec)
{
ExternalRenderer *self;
self = GDS_RENDER_EXTERNAL_RENDERER(obj);
switch (property_id) {
case PROP_SO_PATH:
g_value_set_string(value, self->shared_object_path);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
break;
}
}
static void external_renderer_set_property(GObject *obj, guint property_id, const GValue *value, GParamSpec *pspec)
{
ExternalRenderer *self;
self = GDS_RENDER_EXTERNAL_RENDERER(obj);
switch (property_id) {
case PROP_SO_PATH:
if (self->shared_object_path)
g_free(self->shared_object_path);
self->shared_object_path = g_value_dup_string(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec);
break;
}
}
static GParamSpec *external_renderer_properties[N_PROPERTIES] = {NULL};
static void external_renderer_class_init(ExternalRendererClass *klass)
{
GdsOutputRendererClass *inherited_parent_class;
GObjectClass *oclass;
inherited_parent_class = GDS_RENDER_OUTPUT_RENDERER_CLASS(klass);
oclass = G_OBJECT_CLASS(oclass);
/* Override virtual function */
inherited_parent_class->render_output = external_renderer_render_output;
/* Setup property callbacks */
oclass->set_property = external_renderer_set_property;
oclass->get_property = external_renderer_get_property;
/* Setup properties */
external_renderer_properties[PROP_SO_PATH] =
g_param_spec_string("shared-object-path",
"Shared object file path",
"Path to the shared object to search rendering function in.",
NULL,
G_PARAM_READWRITE);
g_object_class_install_properties(oclass, N_PROPERTIES, external_renderer_properties);
}
static void external_renderer_init(ExternalRenderer *self)
@ -110,6 +171,9 @@ static void external_renderer_init(ExternalRenderer *self)
self->shared_object_path = NULL;
}
ExternalRenderer *external_renderer_new()
{
return g_object_new(GDS_RENDER_TYPE_EXTERNAL_RENDERER, NULL);
}
/** @} */