/* 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 * * PikaRc serialization routines * Copyright (C) 2001-2005 Sven Neumann * * 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 #include #include "libpikabase/pikabase.h" #include "libpikaconfig/pikaconfig.h" #include "config-types.h" #include "pikarc.h" #include "pikarc-serialize.h" #include "pikarc-unknown.h" static gboolean pika_rc_serialize_properties_diff (PikaConfig *config, PikaConfig *compare, PikaConfigWriter *writer); static gboolean pika_rc_serialize_unknown_tokens (PikaConfig *config, PikaConfigWriter *writer); gboolean pika_rc_serialize (PikaConfig *config, PikaConfigWriter *writer, gpointer data) { if (data && PIKA_IS_RC (data)) { if (! pika_rc_serialize_properties_diff (config, data, writer)) return FALSE; } else { if (! pika_config_serialize_properties (config, writer)) return FALSE; } return pika_rc_serialize_unknown_tokens (config, writer); } static gboolean pika_rc_serialize_properties_diff (PikaConfig *config, PikaConfig *compare, PikaConfigWriter *writer) { GList *diff; GList *list; gboolean retval = TRUE; g_return_val_if_fail (G_IS_OBJECT (config), FALSE); g_return_val_if_fail (G_IS_OBJECT (compare), FALSE); g_return_val_if_fail (G_TYPE_FROM_INSTANCE (config) == G_TYPE_FROM_INSTANCE (compare), FALSE); diff = pika_config_diff (G_OBJECT (config), G_OBJECT (compare), PIKA_CONFIG_PARAM_SERIALIZE); for (list = diff; list; list = g_list_next (list)) { GParamSpec *prop_spec = list->data; if (! (prop_spec->flags & PIKA_CONFIG_PARAM_SERIALIZE)) continue; if (! pika_config_serialize_property (config, prop_spec, writer)) { retval = FALSE; break; } } g_list_free (diff); return retval; } static void serialize_unknown_token (const gchar *key, const gchar *value, gpointer data) { PikaConfigWriter *writer = data; pika_config_writer_open (writer, key); pika_config_writer_string (writer, value); pika_config_writer_close (writer); } static gboolean pika_rc_serialize_unknown_tokens (PikaConfig *config, PikaConfigWriter *writer) { g_return_val_if_fail (G_IS_OBJECT (config), FALSE); pika_config_writer_linefeed (writer); pika_rc_foreach_unknown_token (config, serialize_unknown_token, writer); return TRUE; }