From 62982acaa4258b26324a9e7ee395814c279be2cc Mon Sep 17 00:00:00 2001 From: Elliott Sales de Andrade Date: Fri, 10 Mar 2023 01:42:06 -0600 Subject: Make PurpleRequestFieldInt into a GObject This also does an `hg cp`, though with all the renaming of the parameter names, maybe that wasn't as useful for tracking the diff. Note, I didn't bother re-indenting some of the blocks, because they'll all eventually be moved when everything is subclassed. Testing Done: Compiled and opened Request Fields from Demo protocol. Reviewed at https://reviews.imfreedom.org/r/2334/ --- libpurple/meson.build | 2 + libpurple/purplerequestfield.c | 136 -------------- libpurple/purplerequestfield.h | 98 ---------- libpurple/purplerequestpage.c | 6 +- libpurple/request/purplerequestfieldint.c | 288 ++++++++++++++++++++++++++++++ libpurple/request/purplerequestfieldint.h | 142 +++++++++++++++ 6 files changed, 436 insertions(+), 236 deletions(-) create mode 100644 libpurple/request/purplerequestfieldint.c create mode 100644 libpurple/request/purplerequestfieldint.h (limited to 'libpurple') diff --git a/libpurple/meson.build b/libpurple/meson.build index 9b255c195c..824bcb64cc 100644 --- a/libpurple/meson.build +++ b/libpurple/meson.build @@ -99,6 +99,7 @@ purple_coresources = [ 'request.c', 'request/purplerequestfieldaccount.c', 'request/purplerequestfieldbool.c', + 'request/purplerequestfieldint.c', 'request/purplerequestfieldstring.c', 'request-datasheet.c', 'roomlist.c', @@ -225,6 +226,7 @@ purple_coreheaders = [ purple_request_headers = [ 'request/purplerequestfieldaccount.h', 'request/purplerequestfieldbool.h', + 'request/purplerequestfieldint.h', 'request/purplerequestfieldstring.h', ] diff --git a/libpurple/purplerequestfield.c b/libpurple/purplerequestfield.c index 78e00ed138..39479867cb 100644 --- a/libpurple/purplerequestfield.c +++ b/libpurple/purplerequestfield.c @@ -41,13 +41,6 @@ typedef struct { gboolean sensitive; union { - struct { - int default_value; - int value; - int lower_bound; - int upper_bound; - } integer; - struct { gpointer default_value; gpointer value; @@ -667,135 +660,6 @@ purple_request_field_is_sensitive(PurpleRequestField *field) return priv->sensitive; } -PurpleRequestField * -purple_request_field_int_new(const char *id, const char *text, - int default_value, int lower_bound, int upper_bound) -{ - PurpleRequestField *field; - - g_return_val_if_fail(id != NULL, NULL); - g_return_val_if_fail(text != NULL, NULL); - - field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_INTEGER); - - purple_request_field_int_set_lower_bound(field, lower_bound); - purple_request_field_int_set_upper_bound(field, upper_bound); - purple_request_field_int_set_default_value(field, default_value); - purple_request_field_int_set_value(field, default_value); - - return field; -} - -void -purple_request_field_int_set_default_value(PurpleRequestField *field, - int default_value) -{ - PurpleRequestFieldPrivate *priv = NULL; - - g_return_if_fail(PURPLE_IS_REQUEST_FIELD(field)); - - priv = purple_request_field_get_instance_private(field); - g_return_if_fail(priv->type == PURPLE_REQUEST_FIELD_INTEGER); - - priv->u.integer.default_value = default_value; -} - -void -purple_request_field_int_set_lower_bound(PurpleRequestField *field, - int lower_bound) -{ - PurpleRequestFieldPrivate *priv = NULL; - - g_return_if_fail(PURPLE_IS_REQUEST_FIELD(field)); - - priv = purple_request_field_get_instance_private(field); - g_return_if_fail(priv->type == PURPLE_REQUEST_FIELD_INTEGER); - - priv->u.integer.lower_bound = lower_bound; -} - -void -purple_request_field_int_set_upper_bound(PurpleRequestField *field, - int upper_bound) -{ - PurpleRequestFieldPrivate *priv = NULL; - - g_return_if_fail(PURPLE_IS_REQUEST_FIELD(field)); - - priv = purple_request_field_get_instance_private(field); - g_return_if_fail(priv->type == PURPLE_REQUEST_FIELD_INTEGER); - - priv->u.integer.upper_bound = upper_bound; -} - -void -purple_request_field_int_set_value(PurpleRequestField *field, int value) -{ - PurpleRequestFieldPrivate *priv = NULL; - - g_return_if_fail(PURPLE_IS_REQUEST_FIELD(field)); - - priv = purple_request_field_get_instance_private(field); - g_return_if_fail(priv->type == PURPLE_REQUEST_FIELD_INTEGER); - - if(value < priv->u.integer.lower_bound || - value > priv->u.integer.upper_bound) - { - purple_debug_error("request", "Int value out of bounds\n"); - return; - } - - priv->u.integer.value = value; -} - -int -purple_request_field_int_get_default_value(PurpleRequestField *field) { - PurpleRequestFieldPrivate *priv = NULL; - - g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), 0); - - priv = purple_request_field_get_instance_private(field); - g_return_val_if_fail(priv->type == PURPLE_REQUEST_FIELD_INTEGER, 0); - - return priv->u.integer.default_value; -} - -int -purple_request_field_int_get_lower_bound(PurpleRequestField *field) { - PurpleRequestFieldPrivate *priv = NULL; - - g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), 0); - - priv = purple_request_field_get_instance_private(field); - g_return_val_if_fail(priv->type == PURPLE_REQUEST_FIELD_INTEGER, 0); - - return priv->u.integer.lower_bound; -} - -int -purple_request_field_int_get_upper_bound(PurpleRequestField *field) { - PurpleRequestFieldPrivate *priv = NULL; - - g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), 0); - - priv = purple_request_field_get_instance_private(field); - g_return_val_if_fail(priv->type == PURPLE_REQUEST_FIELD_INTEGER, 0); - - return priv->u.integer.upper_bound; -} - -int -purple_request_field_int_get_value(PurpleRequestField *field) { - PurpleRequestFieldPrivate *priv = NULL; - - g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), 0); - - priv = purple_request_field_get_instance_private(field); - g_return_val_if_fail(priv->type == PURPLE_REQUEST_FIELD_INTEGER, 0); - - return priv->u.integer.value; -} - PurpleRequestField * purple_request_field_choice_new(const char *id, const char *text, gpointer default_value) diff --git a/libpurple/purplerequestfield.h b/libpurple/purplerequestfield.h index 21765c76ee..9828758d91 100644 --- a/libpurple/purplerequestfield.h +++ b/libpurple/purplerequestfield.h @@ -64,7 +64,6 @@ struct _PurpleRequestFieldClass { /** * PurpleRequestFieldType: * @PURPLE_REQUEST_FIELD_NONE: No field. - * @PURPLE_REQUEST_FIELD_INTEGER: Integer field. * @PURPLE_REQUEST_FIELD_CHOICE: Choice field (dropdown?). * @PURPLE_REQUEST_FIELD_LIST: List field. * @PURPLE_REQUEST_FIELD_LABEL: Label field. @@ -76,7 +75,6 @@ struct _PurpleRequestFieldClass { typedef enum { PURPLE_REQUEST_FIELD_NONE, - PURPLE_REQUEST_FIELD_INTEGER, PURPLE_REQUEST_FIELD_CHOICE, PURPLE_REQUEST_FIELD_LIST, PURPLE_REQUEST_FIELD_LABEL, @@ -314,102 +312,6 @@ void purple_request_field_set_sensitive(PurpleRequestField *field, */ gboolean purple_request_field_is_sensitive(PurpleRequestField *field); -/**************************************************************************/ -/* Integer Field API */ -/**************************************************************************/ - -/** - * purple_request_field_int_new: - * @id: The field ID. - * @text: The text label of the field. - * @default_value: The default value. - * @lower_bound: The lower bound. - * @upper_bound: The upper bound. - * - * Creates an integer field. - * - * Returns: (transfer full): The new field. - */ -PurpleRequestField *purple_request_field_int_new(const char *id, - const char *text, int default_value, int lower_bound, int upper_bound); - -/** - * purple_request_field_int_set_default_value: - * @field: The field. - * @default_value: The default value. - * - * Sets the default value in an integer field. - */ -void purple_request_field_int_set_default_value(PurpleRequestField *field, - int default_value); - -/** - * purple_request_field_int_set_lower_bound: - * @field: The field. - * @lower_bound: The lower bound. - * - * Sets the lower bound in an integer field. - */ -void purple_request_field_int_set_lower_bound(PurpleRequestField *field, int lower_bound); - -/** - * purple_request_field_int_set_upper_bound: - * @field: The field. - * @upper_bound: The upper bound. - * - * Sets the upper bound in an integer field. - */ -void purple_request_field_int_set_upper_bound(PurpleRequestField *field, int upper_bound); - -/** - * purple_request_field_int_set_value: - * @field: The field. - * @value: The value. - * - * Sets the value in an integer field. - */ -void purple_request_field_int_set_value(PurpleRequestField *field, int value); - -/** - * purple_request_field_int_get_default_value: - * @field: The field. - * - * Returns the default value in an integer field. - * - * Returns: The default value. - */ -int purple_request_field_int_get_default_value(PurpleRequestField *field); - -/** - * purple_request_field_int_get_lower_bound: - * @field: The field. - * - * Returns the lower bound in an integer field. - * - * Returns: The lower bound. - */ -int purple_request_field_int_get_lower_bound(PurpleRequestField *field); - -/** - * purple_request_field_int_get_upper_bound: - * @field: The field. - * - * Returns the upper bound in an integer field. - * - * Returns: The upper bound. - */ -int purple_request_field_int_get_upper_bound(PurpleRequestField *field); - -/** - * purple_request_field_int_get_value: - * @field: The field. - * - * Returns the user-entered value in an integer field. - * - * Returns: The value. - */ -int purple_request_field_int_get_value(PurpleRequestField *field); - /**************************************************************************/ /* Choice Field API */ /**************************************************************************/ diff --git a/libpurple/purplerequestpage.c b/libpurple/purplerequestpage.c index d8ac50b7cc..858dc0b7df 100644 --- a/libpurple/purplerequestpage.c +++ b/libpurple/purplerequestpage.c @@ -25,6 +25,7 @@ #include "purplerequestpage.h" #include "request/purplerequestfieldaccount.h" #include "request/purplerequestfieldbool.h" +#include "request/purplerequestfieldint.h" #include "request/purplerequestfieldstring.h" #include "purpleprivate.h" @@ -313,11 +314,12 @@ purple_request_page_get_integer(PurpleRequestPage *page, const char *id) { g_return_val_if_fail(PURPLE_IS_REQUEST_PAGE(page), 0); g_return_val_if_fail(id != NULL, 0); - if((field = purple_request_page_get_field(page, id)) == NULL) { + field = purple_request_page_get_field(page, id); + if(!PURPLE_IS_REQUEST_FIELD_INT(field)) { return 0; } - return purple_request_field_int_get_value(field); + return purple_request_field_int_get_value(PURPLE_REQUEST_FIELD_INT(field)); } gboolean diff --git a/libpurple/request/purplerequestfieldint.c b/libpurple/request/purplerequestfieldint.c new file mode 100644 index 0000000000..19616146ed --- /dev/null +++ b/libpurple/request/purplerequestfieldint.c @@ -0,0 +1,288 @@ +/* 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 "request.h" +#include "request/purplerequestfieldint.h" +#include "debug.h" +#include "purplekeyvaluepair.h" +#include "purpleprivate.h" + +struct _PurpleRequestFieldInt { + PurpleRequestField parent; + + int default_value; + int value; + int lower_bound; + int upper_bound; +}; + +enum { + PROP_0, + PROP_DEFAULT_VALUE, + PROP_VALUE, + PROP_LOWER_BOUND, + PROP_UPPER_BOUND, + N_PROPERTIES, +}; +static GParamSpec *properties[N_PROPERTIES] = {NULL, }; + +/****************************************************************************** + * GObject Implementation + *****************************************************************************/ +G_DEFINE_TYPE(PurpleRequestFieldInt, purple_request_field_int, + PURPLE_TYPE_REQUEST_FIELD) + +static void +purple_request_field_int_get_property(GObject *obj, guint param_id, + GValue *value, GParamSpec *pspec) +{ + PurpleRequestFieldInt *field = PURPLE_REQUEST_FIELD_INT(obj); + + switch(param_id) { + case PROP_DEFAULT_VALUE: + g_value_set_int(value, + purple_request_field_int_get_default_value(field)); + break; + case PROP_VALUE: + g_value_set_int(value, purple_request_field_int_get_value(field)); + break; + case PROP_LOWER_BOUND: + g_value_set_int(value, + purple_request_field_int_get_lower_bound(field)); + break; + case PROP_UPPER_BOUND: + g_value_set_int(value, + purple_request_field_int_get_upper_bound(field)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); + break; + } +} + +static void +purple_request_field_int_set_property(GObject *obj, guint param_id, + const GValue *value, GParamSpec *pspec) +{ + PurpleRequestFieldInt *field = PURPLE_REQUEST_FIELD_INT(obj); + + switch(param_id) { + case PROP_DEFAULT_VALUE: + purple_request_field_int_set_default_value(field, + g_value_get_int(value)); + break; + case PROP_VALUE: + purple_request_field_int_set_value(field, g_value_get_int(value)); + break; + case PROP_LOWER_BOUND: + purple_request_field_int_set_lower_bound(field, + g_value_get_int(value)); + break; + case PROP_UPPER_BOUND: + purple_request_field_int_set_upper_bound(field, + g_value_get_int(value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); + break; + } +} + +static void +purple_request_field_int_init(G_GNUC_UNUSED PurpleRequestFieldInt *field) { +} + +static void +purple_request_field_int_class_init(PurpleRequestFieldIntClass *klass) { + GObjectClass *obj_class = G_OBJECT_CLASS(klass); + + obj_class->get_property = purple_request_field_int_get_property; + obj_class->set_property = purple_request_field_int_set_property; + + /** + * PurpleRequestFieldInt:default-value: + * + * The default value of the field. + * + * Since: 3.0.0 + */ + properties[PROP_DEFAULT_VALUE] = g_param_spec_int( + "default-value", "default-value", + "The default value of the field.", + G_MININT, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + /** + * PurpleRequestFieldInt:value: + * + * The value of the field. + * + * Since: 3.0.0 + */ + properties[PROP_VALUE] = g_param_spec_int( + "value", "value", + "The value of the field.", + G_MININT, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + /** + * PurpleRequestFieldInt:lower-bound: + * + * The lower bound of the field. + * + * Since: 3.0.0 + */ + properties[PROP_LOWER_BOUND] = g_param_spec_int( + "lower-bound", "lower-bound", + "The lower bound of the field.", + G_MININT, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + /** + * PurpleRequestFieldInt:upper-bound: + * + * The upper bound of the field. + * + * Since: 3.0.0 + */ + properties[PROP_UPPER_BOUND] = g_param_spec_int( + "upper-bound", "upper-bound", + "The upper bound of the field.", + G_MININT, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties(obj_class, N_PROPERTIES, properties); +} + +/****************************************************************************** + * Public API + *****************************************************************************/ +PurpleRequestField * +purple_request_field_int_new(const char *id, const char *text, + int default_value, int lower_bound, + int upper_bound) +{ + g_return_val_if_fail(id != NULL, NULL); + g_return_val_if_fail(text != NULL, NULL); + + return g_object_new(PURPLE_TYPE_REQUEST_FIELD_INT, + "id", id, + "label", text, + "lower-bound", lower_bound, + "upper-bound", upper_bound, + "default-value", default_value, + "value", default_value, + NULL); +} + +void +purple_request_field_int_set_default_value(PurpleRequestFieldInt *field, + int default_value) +{ + g_return_if_fail(PURPLE_IS_REQUEST_FIELD_INT(field)); + + if(field->default_value == default_value) { + return; + } + + field->default_value = default_value; + + g_object_notify_by_pspec(G_OBJECT(field), properties[PROP_DEFAULT_VALUE]); +} + +void +purple_request_field_int_set_lower_bound(PurpleRequestFieldInt *field, + int lower_bound) +{ + g_return_if_fail(PURPLE_IS_REQUEST_FIELD_INT(field)); + + if(field->lower_bound == lower_bound) { + return; + } + + field->lower_bound = lower_bound; + + g_object_notify_by_pspec(G_OBJECT(field), properties[PROP_LOWER_BOUND]); +} + +void +purple_request_field_int_set_upper_bound(PurpleRequestFieldInt *field, + int upper_bound) +{ + g_return_if_fail(PURPLE_IS_REQUEST_FIELD_INT(field)); + + if(field->upper_bound == upper_bound) { + return; + } + + field->upper_bound = upper_bound; + + g_object_notify_by_pspec(G_OBJECT(field), properties[PROP_UPPER_BOUND]); +} + +void +purple_request_field_int_set_value(PurpleRequestFieldInt *field, int value) { + g_return_if_fail(PURPLE_IS_REQUEST_FIELD_INT(field)); + + if(value < field->lower_bound || value > field->upper_bound) { + purple_debug_error("request", "Int value out of bounds\n"); + return; + } + + if(field->value == value) { + return; + } + + field->value = value; + + g_object_notify_by_pspec(G_OBJECT(field), properties[PROP_VALUE]); +} + +int +purple_request_field_int_get_default_value(PurpleRequestFieldInt *field) { + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_INT(field), 0); + + return field->default_value; +} + +int +purple_request_field_int_get_lower_bound(PurpleRequestFieldInt *field) { + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_INT(field), 0); + + return field->lower_bound; +} + +int +purple_request_field_int_get_upper_bound(PurpleRequestFieldInt *field) { + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_INT(field), 0); + + return field->upper_bound; +} + +int +purple_request_field_int_get_value(PurpleRequestFieldInt *field) { + g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_INT(field), 0); + + return field->value; +} diff --git a/libpurple/request/purplerequestfieldint.h b/libpurple/request/purplerequestfieldint.h new file mode 100644 index 0000000000..89fb4c72c5 --- /dev/null +++ b/libpurple/request/purplerequestfieldint.h @@ -0,0 +1,142 @@ +/* + * 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_INT_H +#define PURPLE_REQUEST_FIELD_INT_H + +#include + +#include +#include + +/** + * PurpleRequestFieldInt: + * + * An integer request field. + */ +typedef struct _PurpleRequestFieldInt PurpleRequestFieldInt; + +#include "purplerequestfield.h" + +G_BEGIN_DECLS + +#define PURPLE_TYPE_REQUEST_FIELD_INT (purple_request_field_int_get_type()) +G_DECLARE_FINAL_TYPE(PurpleRequestFieldInt, purple_request_field_int, + PURPLE, REQUEST_FIELD_INT, PurpleRequestField) + +/** + * purple_request_field_int_new: + * @id: The field ID. + * @text: The text label of the field. + * @default_value: The default value. + * @lower_bound: The lower bound. + * @upper_bound: The upper bound. + * + * Creates an integer field. + * + * Returns: (transfer full): The new field. + */ +PurpleRequestField *purple_request_field_int_new(const char *id, const char *text, int default_value, int lower_bound, int upper_bound); + +/** + * purple_request_field_int_set_default_value: + * @field: The field. + * @default_value: The default value. + * + * Sets the default value in an integer field. + */ +void purple_request_field_int_set_default_value(PurpleRequestFieldInt *field, int default_value); + +/** + * purple_request_field_int_set_lower_bound: + * @field: The field. + * @lower_bound: The lower bound. + * + * Sets the lower bound in an integer field. + */ +void purple_request_field_int_set_lower_bound(PurpleRequestFieldInt *field, int lower_bound); + +/** + * purple_request_field_int_set_upper_bound: + * @field: The field. + * @upper_bound: The upper bound. + * + * Sets the upper bound in an integer field. + */ +void purple_request_field_int_set_upper_bound(PurpleRequestFieldInt *field, int upper_bound); + +/** + * purple_request_field_int_set_value: + * @field: The field. + * @value: The value. + * + * Sets the value in an integer field. + */ +void purple_request_field_int_set_value(PurpleRequestFieldInt *field, int value); + +/** + * purple_request_field_int_get_default_value: + * @field: The field. + * + * Returns the default value in an integer field. + * + * Returns: The default value. + */ +int purple_request_field_int_get_default_value(PurpleRequestFieldInt *field); + +/** + * purple_request_field_int_get_lower_bound: + * @field: The field. + * + * Returns the lower bound in an integer field. + * + * Returns: The lower bound. + */ +int purple_request_field_int_get_lower_bound(PurpleRequestFieldInt *field); + +/** + * purple_request_field_int_get_upper_bound: + * @field: The field. + * + * Returns the upper bound in an integer field. + * + * Returns: The upper bound. + */ +int purple_request_field_int_get_upper_bound(PurpleRequestFieldInt *field); + +/** + * purple_request_field_int_get_value: + * @field: The field. + * + * Returns the user-entered value in an integer field. + * + * Returns: The value. + */ +int purple_request_field_int_get_value(PurpleRequestFieldInt *field); + +G_END_DECLS + +#endif /* PURPLE_REQUEST_FIELD_INT_H */ -- cgit v1.2.1