From a01aa55fada72e214a0005a7e0b0d6cb502741fe Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Fri, 10 Mar 2023 17:42:23 -0600 Subject: Make PurpleRequestFieldDatasheet into a GObject Not sure that we want to keep all of this, but probably we don't need this extra wrapper object long term, and `PurpleRequestDatasheet` (once made into a `GObject`) and `PurpleRequestFieldDatasheet` could merge. Testing Done: Compiled only. Reviewed at https://reviews.imfreedom.org/r/2340/ --- libpurple/meson.build | 2 + libpurple/purplerequestfield.c | 41 ------- libpurple/purplerequestfield.h | 30 ----- libpurple/request/purplerequestfielddatasheet.c | 153 ++++++++++++++++++++++++ libpurple/request/purplerequestfielddatasheet.h | 77 ++++++++++++ 5 files changed, 232 insertions(+), 71 deletions(-) create mode 100644 libpurple/request/purplerequestfielddatasheet.c create mode 100644 libpurple/request/purplerequestfielddatasheet.h (limited to 'libpurple') diff --git a/libpurple/meson.build b/libpurple/meson.build index 14b4614d7e..f1ce3c47a9 100644 --- a/libpurple/meson.build +++ b/libpurple/meson.build @@ -100,6 +100,7 @@ purple_coresources = [ 'request/purplerequestfieldaccount.c', 'request/purplerequestfieldbool.c', 'request/purplerequestfieldchoice.c', + 'request/purplerequestfielddatasheet.c', 'request/purplerequestfieldimage.c', 'request/purplerequestfieldint.c', 'request/purplerequestfieldlabel.c', @@ -231,6 +232,7 @@ purple_request_headers = [ 'request/purplerequestfieldaccount.h', 'request/purplerequestfieldbool.h', 'request/purplerequestfieldchoice.h', + 'request/purplerequestfielddatasheet.h', 'request/purplerequestfieldimage.h', 'request/purplerequestfieldint.h', 'request/purplerequestfieldlabel.h', diff --git a/libpurple/purplerequestfield.c b/libpurple/purplerequestfield.c index 2ecddbec81..40238897ef 100644 --- a/libpurple/purplerequestfield.c +++ b/libpurple/purplerequestfield.c @@ -40,12 +40,6 @@ typedef struct { gboolean required; gboolean sensitive; - union { - struct { - PurpleRequestDatasheet *sheet; - } datasheet; - } u; - void *ui_data; char *tooltip; @@ -189,10 +183,6 @@ purple_request_field_finalize(GObject *obj) { g_free(priv->type_hint); g_free(priv->tooltip); - if(priv->type == PURPLE_REQUEST_FIELD_DATASHEET) { - purple_request_datasheet_free(priv->u.datasheet.sheet); - } - G_OBJECT_CLASS(purple_request_field_parent_class)->finalize(obj); } @@ -624,34 +614,3 @@ purple_request_field_is_sensitive(PurpleRequestField *field) return priv->sensitive; } - -PurpleRequestField * -purple_request_field_datasheet_new(const char *id, - const gchar *text, PurpleRequestDatasheet *sheet) -{ - PurpleRequestField *field; - PurpleRequestFieldPrivate *priv = NULL; - - g_return_val_if_fail(id != NULL, NULL); - g_return_val_if_fail(sheet != NULL, NULL); - - field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_DATASHEET); - priv = purple_request_field_get_instance_private(field); - - priv->u.datasheet.sheet = sheet; - - return field; -} - -PurpleRequestDatasheet * -purple_request_field_datasheet_get_sheet(PurpleRequestField *field) -{ - PurpleRequestFieldPrivate *priv = NULL; - - g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), NULL); - - priv = purple_request_field_get_instance_private(field); - g_return_val_if_fail(priv->type == PURPLE_REQUEST_FIELD_DATASHEET, NULL); - - return priv->u.datasheet.sheet; -} diff --git a/libpurple/purplerequestfield.h b/libpurple/purplerequestfield.h index 7e858c6dea..83f07ff86e 100644 --- a/libpurple/purplerequestfield.h +++ b/libpurple/purplerequestfield.h @@ -64,14 +64,12 @@ struct _PurpleRequestFieldClass { /** * PurpleRequestFieldType: * @PURPLE_REQUEST_FIELD_NONE: No field. - * @PURPLE_REQUEST_FIELD_DATASHEET: Datasheet field. * * A type of field. */ typedef enum { PURPLE_REQUEST_FIELD_NONE, - PURPLE_REQUEST_FIELD_DATASHEET } PurpleRequestFieldType; @@ -304,34 +302,6 @@ void purple_request_field_set_sensitive(PurpleRequestField *field, */ gboolean purple_request_field_is_sensitive(PurpleRequestField *field); -/**************************************************************************/ -/* Datasheet Field API */ -/**************************************************************************/ - -/** - * purple_request_field_datasheet_new: - * @id: The field ID. - * @text: The label of the field, may be %NULL. - * @sheet: The datasheet. - * - * Creates a datasheet item field. - * - * Returns: (transfer full): The new field. - */ -PurpleRequestField *purple_request_field_datasheet_new(const char *id, - const gchar *text, PurpleRequestDatasheet *sheet); - -/** - * purple_request_field_datasheet_get_sheet: - * @field: The field. - * - * Returns a datasheet for a field. - * - * Returns: (transfer none): The datasheet object. - */ -PurpleRequestDatasheet *purple_request_field_datasheet_get_sheet( - PurpleRequestField *field); - /**************************************************************************/ /* Validators for request fields. */ /**************************************************************************/ diff --git a/libpurple/request/purplerequestfielddatasheet.c b/libpurple/request/purplerequestfielddatasheet.c new file mode 100644 index 0000000000..72a212b068 --- /dev/null +++ b/libpurple/request/purplerequestfielddatasheet.c @@ -0,0 +1,153 @@ +/* purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 2 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA + */ + +#include + +#include "glibcompat.h" +#include "purplerequestfield.h" +#include "purplerequestfielddatasheet.h" + +struct _PurpleRequestFieldDatasheet { + PurpleRequestField parent; + + PurpleRequestDatasheet *sheet; +}; + +enum { + PROP_0, + PROP_SHEET, + N_PROPERTIES, +}; +static GParamSpec *properties[N_PROPERTIES] = {NULL, }; + +/****************************************************************************** + * Helpers + *****************************************************************************/ +static void +purple_request_field_datasheet_set_sheet(PurpleRequestFieldDatasheet *field, + PurpleRequestDatasheet *sheet) +{ + g_clear_pointer(&field->sheet, purple_request_datasheet_free); + field->sheet = sheet; + + g_object_notify_by_pspec(G_OBJECT(field), properties[PROP_SHEET]); +} + +/****************************************************************************** + * GObject Implementation + *****************************************************************************/ +G_DEFINE_TYPE(PurpleRequestFieldDatasheet, purple_request_field_datasheet, + PURPLE_TYPE_REQUEST_FIELD) + +static void +purple_request_field_datasheet_get_property(GObject *obj, guint param_id, + GValue *value, GParamSpec *pspec) +{ + PurpleRequestFieldDatasheet *field = PURPLE_REQUEST_FIELD_DATASHEET(obj); + + switch(param_id) { + case PROP_SHEET: + g_value_set_pointer(value, + purple_request_field_datasheet_get_sheet(field)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); + break; + } +} + +static void +purple_request_field_datasheet_set_property(GObject *obj, guint param_id, + const GValue *value, + GParamSpec *pspec) +{ + PurpleRequestFieldDatasheet *field = PURPLE_REQUEST_FIELD_DATASHEET(obj); + + switch(param_id) { + case PROP_SHEET: + purple_request_field_datasheet_set_sheet(field, + g_value_get_pointer(value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); + break; + } +} + +static void +purple_request_field_datasheet_finalize(GObject *obj) { + PurpleRequestFieldDatasheet *field = PURPLE_REQUEST_FIELD_DATASHEET(obj); + + g_clear_pointer(&field->sheet, purple_request_datasheet_free); + + G_OBJECT_CLASS(purple_request_field_datasheet_parent_class)->finalize(obj); +} + +static void +purple_request_field_datasheet_init(G_GNUC_UNUSED PurpleRequestFieldDatasheet *field) { +} + +static void +purple_request_field_datasheet_class_init(PurpleRequestFieldDatasheetClass *klass) { + GObjectClass *obj_class = G_OBJECT_CLASS(klass); + + obj_class->finalize = purple_request_field_datasheet_finalize; + obj_class->get_property = purple_request_field_datasheet_get_property; + obj_class->set_property = purple_request_field_datasheet_set_property; + + /** + * PurpleRequestFieldDatasheet:sheet: + * + * The datasheet of the field. + * + * Since: 3.0.0 + */ + properties[PROP_SHEET] = g_param_spec_pointer( + "sheet", "sheet", + "The datasheet of the field.", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties(obj_class, N_PROPERTIES, properties); +} + +/****************************************************************************** + * Public API + *****************************************************************************/ +PurpleRequestField * +purple_request_field_datasheet_new(const char *id, const char *text, + PurpleRequestDatasheet *sheet) +{ + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(sheet != NULL, NULL); + + return g_object_new(PURPLE_TYPE_REQUEST_FIELD_DATASHEET, + "id", id, + "label", text, + "sheet", sheet, + NULL); +} + +PurpleRequestDatasheet * +purple_request_field_datasheet_get_sheet(PurpleRequestFieldDatasheet *field) { + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_DATASHEET(field), NULL); + + return field->sheet; +} diff --git a/libpurple/request/purplerequestfielddatasheet.h b/libpurple/request/purplerequestfielddatasheet.h new file mode 100644 index 0000000000..8f7dee6e9b --- /dev/null +++ b/libpurple/request/purplerequestfielddatasheet.h @@ -0,0 +1,77 @@ +/* + * Purple - Internet Messaging Library + * Copyright (C) Pidgin Developers + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 2 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 . + */ + +#if !defined(PURPLE_GLOBAL_HEADER_INSIDE) && !defined(PURPLE_COMPILATION) +# error "only may be included directly" +#endif + +#ifndef PURPLE_REQUEST_FIELD_DATASHEET_H +#define PURPLE_REQUEST_FIELD_DATASHEET_H + +#include + +#include +#include + +/** + * PurpleRequestField: + * + * A request field. + */ +typedef struct _PurpleRequestField PurpleRequestField; + +#include "request.h" +#include "request-datasheet.h" + +#define PURPLE_DEFAULT_ACTION_NONE -1 + +G_BEGIN_DECLS + +#define PURPLE_TYPE_REQUEST_FIELD_DATASHEET (purple_request_field_datasheet_get_type()) +G_DECLARE_FINAL_TYPE(PurpleRequestFieldDatasheet, purple_request_field_datasheet, + PURPLE, REQUEST_FIELD_DATASHEET, PurpleRequestField) + +/** + * purple_request_field_datasheet_new: + * @id: The field ID. + * @text: The label of the field, may be %NULL. + * @sheet: The datasheet. + * + * Creates a datasheet item field. + * + * Returns: (transfer full): The new field. + */ +PurpleRequestField *purple_request_field_datasheet_new(const char *id, const gchar *text, PurpleRequestDatasheet *sheet); + +/** + * purple_request_field_datasheet_get_sheet: + * @field: The field. + * + * Returns a datasheet for a field. + * + * Returns: (transfer none): The datasheet object. + */ +PurpleRequestDatasheet *purple_request_field_datasheet_get_sheet(PurpleRequestFieldDatasheet *field); + +G_END_DECLS + +#endif /* PURPLE_REQUEST_FIELD_DATASHEET_H */ -- cgit v1.2.1