/* PIKA - Photo and Image Kooker Application * a rebranding of The GNU Image Manipulation Program (created with heckimp) * A derived work which may be trivial. However, any changes may be (C)2023 by Aldercone Studio * * Original copyright, applying to most contents (license remains unchanged): * Copyright (C) 1995 Spencer Kimball and Peter Mattis * * pikapdbprocedure.c * Copyright (C) 2019 Michael Natterer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "config.h" #include "pika.h" #include "pikapdb-private.h" #include "pikapdb_pdb.h" #include "pikapdbprocedure.h" enum { PROP_0, PROP_PDB, N_PROPS }; struct _PikaPDBProcedurePrivate { PikaPDB *pdb; }; static void pika_pdb_procedure_constructed (GObject *object); static void pika_pdb_procedure_finalize (GObject *object); static void pika_pdb_procedure_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec); static void pika_pdb_procedure_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec); static void pika_pdb_procedure_install (PikaProcedure *procedure); static void pika_pdb_procedure_uninstall (PikaProcedure *procedure); static PikaValueArray * pika_pdb_procedure_run (PikaProcedure *procedure, const PikaValueArray *args); G_DEFINE_TYPE_WITH_PRIVATE (PikaPDBProcedure, _pika_pdb_procedure, PIKA_TYPE_PROCEDURE) #define parent_class _pika_pdb_procedure_parent_class static GParamSpec *props[N_PROPS] = { NULL, }; static void _pika_pdb_procedure_class_init (PikaPDBProcedureClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); PikaProcedureClass *procedure_class = PIKA_PROCEDURE_CLASS (klass); object_class->constructed = pika_pdb_procedure_constructed; object_class->finalize = pika_pdb_procedure_finalize; object_class->set_property = pika_pdb_procedure_set_property; object_class->get_property = pika_pdb_procedure_get_property; procedure_class->install = pika_pdb_procedure_install; procedure_class->uninstall = pika_pdb_procedure_uninstall; procedure_class->run = pika_pdb_procedure_run; props[PROP_PDB] = g_param_spec_object ("pdb", "PDB", "The PikaPDB of this plug-in process", PIKA_TYPE_PDB, PIKA_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_properties (object_class, N_PROPS, props); } static void _pika_pdb_procedure_init (PikaPDBProcedure *procedure) { procedure->priv = _pika_pdb_procedure_get_instance_private (procedure); } static void pika_pdb_procedure_constructed (GObject *object) { PikaPDBProcedure *procedure = PIKA_PDB_PROCEDURE (object); G_OBJECT_CLASS (parent_class)->constructed (object); g_assert (PIKA_IS_PDB (procedure->priv->pdb)); } static void pika_pdb_procedure_finalize (GObject *object) { PikaPDBProcedure *procedure = PIKA_PDB_PROCEDURE (object); g_clear_object (&procedure->priv->pdb); G_OBJECT_CLASS (parent_class)->finalize (object); } static void pika_pdb_procedure_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { PikaPDBProcedure *procedure = PIKA_PDB_PROCEDURE (object); switch (property_id) { case PROP_PDB: g_set_object (&procedure->priv->pdb, g_value_get_object (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void pika_pdb_procedure_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { PikaPDBProcedure *procedure = PIKA_PDB_PROCEDURE (object); switch (property_id) { case PROP_PDB: g_value_set_object (value, procedure->priv->pdb); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void pika_pdb_procedure_install (PikaProcedure *procedure) { g_warning ("Cannot install a PikaPDBProcedure"); } static void pika_pdb_procedure_uninstall (PikaProcedure *procedure) { g_warning ("Cannot uninstall a PikaPDBProcedure"); } static PikaValueArray * pika_pdb_procedure_run (PikaProcedure *procedure, const PikaValueArray *args) { PikaPDBProcedure *pdb_procedure = PIKA_PDB_PROCEDURE (procedure); return _pika_pdb_run_procedure_array (pdb_procedure->priv->pdb, pika_procedure_get_name (procedure), (PikaValueArray *) args); } /* public functions */ PikaProcedure * _pika_pdb_procedure_new (PikaPDB *pdb, const gchar *name) { PikaProcedure *procedure; gchar *blurb; gchar *help; gchar *help_id; gchar *authors; gchar *copyright; gchar *date; PikaPDBProcType type; gint n_args; gint n_return_vals; gint i; g_return_val_if_fail (PIKA_IS_PDB (pdb), NULL); g_return_val_if_fail (pika_is_canonical_identifier (name), NULL); _pika_pdb_get_proc_info (name, &type, &n_args, &n_return_vals); procedure = g_object_new (PIKA_TYPE_PDB_PROCEDURE, "plug-in", _pika_pdb_get_plug_in (pdb), "name", name, "procedure-type", type, "pdb", pdb, NULL); _pika_pdb_get_proc_documentation (name, &blurb, &help, &help_id); pika_procedure_set_documentation (procedure, blurb, help, help_id); g_free (blurb); g_free (help); g_free (help_id); _pika_pdb_get_proc_attribution (name, &authors, ©right, &date); pika_procedure_set_attribution (procedure, authors, copyright, date); g_free (authors); g_free (copyright); g_free (date); for (i = 0; i < n_args; i++) { GParamSpec *pspec = _pika_pdb_get_proc_argument (name, i); pika_procedure_add_argument (procedure, pspec); } for (i = 0; i < n_return_vals; i++) { GParamSpec *pspec = _pika_pdb_get_proc_return_value (name, i); pika_procedure_add_return_value (procedure, pspec); } if (type != PIKA_PDB_PROC_TYPE_INTERNAL) { gchar *string; gchar **menu_paths; gchar **path; string = _pika_pdb_get_proc_image_types (name); if (string) { pika_procedure_set_image_types (procedure, string); g_free (string); } string = _pika_pdb_get_proc_menu_label (name); if (string) { pika_procedure_set_menu_label (procedure, string); g_free (string); } menu_paths = _pika_pdb_get_proc_menu_paths (name); for (path = menu_paths; path && *path; path++) pika_procedure_add_menu_path (procedure, *path); g_strfreev (menu_paths); } return procedure; }