* Copyright (C) 2011-2020 Gary Kramlich <grim@reaperworld.com> * 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 <https://www.gnu.org/licenses/>. #include "gplugin-python3-plugin.h" /****************************************************************************** *****************************************************************************/ struct _GPluginPython3Plugin { GPluginPluginState state; /****************************************************************************** *****************************************************************************/ PROP_FILENAME = N_PROPERTIES, static GParamSpec *properties[N_PROPERTIES] = { /* I hate forward declarations... */ static void gplugin_python3_plugin_iface_init(GPluginPluginInterface *iface); G_DEFINE_DYNAMIC_TYPE_EXTENDED( gplugin_python3_plugin_iface_init)); /****************************************************************************** * GPluginPlugin Implementation *****************************************************************************/ gplugin_python3_plugin_iface_init(G_GNUC_UNUSED GPluginPluginInterface *iface) /****************************************************************************** *****************************************************************************/ gplugin_python3_plugin_set_module( GPluginPython3Plugin *plugin, g_return_if_fail(GPLUGIN_IS_PLUGIN(plugin)); g_return_if_fail(module); Py_CLEAR(plugin->module); gplugin_python3_plugin_get_load_func(GPluginPython3Plugin *plugin) g_return_val_if_fail(GPLUGIN_PYTHON3_IS_PLUGIN(plugin), NULL); gplugin_python3_plugin_set_load_func( GPluginPython3Plugin *plugin, g_return_if_fail(GPLUGIN_PYTHON3_IS_PLUGIN(plugin)); g_return_if_fail(func != NULL); gplugin_python3_plugin_get_unload_func(GPluginPython3Plugin *plugin) g_return_val_if_fail(GPLUGIN_PYTHON3_IS_PLUGIN(plugin), NULL); gplugin_python3_plugin_set_unload_func( GPluginPython3Plugin *plugin, g_return_if_fail(GPLUGIN_PYTHON3_IS_PLUGIN(plugin)); g_return_if_fail(func != NULL); Py_CLEAR(plugin->unload); /****************************************************************************** *****************************************************************************/ gplugin_python3_plugin_get_property( GPluginPython3Plugin *plugin = GPLUGIN_PYTHON3_PLUGIN(obj); g_value_set_pointer(value, plugin->module); gplugin_python3_plugin_get_load_func(plugin)); gplugin_python3_plugin_get_unload_func(plugin)); g_value_set_string(value, plugin->filename); g_value_set_object(value, plugin->loader); g_value_set_object(value, plugin->info); g_value_set_enum(value, plugin->state); g_value_set_boxed(value, plugin->error); G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); gplugin_python3_plugin_set_property( GPluginPython3Plugin *plugin = GPLUGIN_PYTHON3_PLUGIN(obj); gplugin_python3_plugin_set_module( g_value_get_pointer(value)); gplugin_python3_plugin_set_load_func( g_value_get_pointer(value)); gplugin_python3_plugin_set_unload_func( g_value_get_pointer(value)); plugin->filename = g_value_dup_string(value); plugin->loader = g_value_dup_object(value); plugin->info = g_value_dup_object(value); plugin->state = g_value_get_enum(value); plugin->error = g_value_dup_boxed(value); G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); gplugin_python3_plugin_finalize(GObject *obj) GPluginPython3Plugin *plugin = GPLUGIN_PYTHON3_PLUGIN(obj); Py_CLEAR(plugin->module); Py_CLEAR(plugin->unload); g_clear_pointer(&plugin->filename, g_free); g_clear_object(&plugin->loader); g_clear_object(&plugin->info); g_clear_error(&plugin->error); G_OBJECT_CLASS(gplugin_python3_plugin_parent_class)->finalize(obj); gplugin_python3_plugin_init(G_GNUC_UNUSED GPluginPython3Plugin *plugin) gplugin_python3_plugin_class_finalize( G_GNUC_UNUSED GPluginPython3PluginClass *klass) gplugin_python3_plugin_class_init(GPluginPython3PluginClass *klass) GObjectClass *obj_class = G_OBJECT_CLASS(klass); obj_class->get_property = gplugin_python3_plugin_get_property; obj_class->set_property = gplugin_python3_plugin_set_property; obj_class->finalize = gplugin_python3_plugin_finalize; properties[PROP_MODULE] = g_param_spec_pointer( "The python module object", G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); properties[PROP_LOAD_FUNC] = g_param_spec_pointer( "The python load function", G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); properties[PROP_UNLOAD_FUNC] = g_param_spec_pointer( "The python unload function", G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_properties(obj_class, N_PROPERTIES, properties); g_object_class_override_property(obj_class, PROP_FILENAME, "filename"); g_object_class_override_property(obj_class, PROP_LOADER, "loader"); g_object_class_override_property(obj_class, PROP_INFO, "info"); g_object_class_override_property(obj_class, PROP_STATE, "state"); g_object_class_override_property(obj_class, PROP_ERROR, "error"); /****************************************************************************** *****************************************************************************/ gplugin_python3_plugin_register(GTypeModule *module) gplugin_python3_plugin_register_type(module);